Files
ConformalLabpp/doc/reviewer/hub.html
Tarik Moussa 11d660af49
Some checks failed
C++ Tests / test-fast (pull_request) Successful in 2m20s
API Docs / doc-build (pull_request) Successful in 49s
C++ Tests / test-cgal (pull_request) Failing after 8m18s
C++ Tests / quality-gates (pull_request) Successful in 1m52s
fix(hub): correct double-branch/branch/main URL prefix + v0.10.0 badge
Two bugs in the reviewer hub HTML:

1. The earlier sed-rewrite that lifted the hub from
   `preview/reviewer-snapshot-v6` into `branch/main` accidentally
   produced `branch/branch/main` — sed pattern matched the
   `preview/reviewer-snapshot-v6` slug but the surrounding URL
   already had `/src/branch/` prefix.  All 25 in-hub links to the
   repo were broken with 404 on codeberg.org.

   Fix: `s|/src/branch/branch/main/|/src/branch/main/|g`.

2. The version pill in the badge strip still read v0.9.0 (stale
   from the original v0.9.0-era hub template).  Updated to v0.10.0.

The fix is in this in-repo source-of-truth file so any future manual
republication of the pages branch picks up the corrected hub.  The
just-pushed pages branch already has the fix applied; codeberg's
`tmoussa.codeberg.page` frontend cache (max-age=600 s) will refresh
over the next 10 minutes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 11:50:59 +02:00

530 lines
32 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>conformallab++ — Reviewer Preview</title>
<style>
:root {
--c-primary: #2e86c1;
--c-primary-dark: #1f618d;
--c-bg-soft: #f8fbfd;
--c-border: #d6eaf8;
--c-text: #2c3e50;
--c-muted: #7b8a8b;
--c-green-bg: #d5f5e3; --c-green-fg: #186a3b;
--c-yellow-bg: #fcf3cf; --c-yellow-fg: #7d6608;
--c-skip-bg: #ebdef0; --c-skip-fg: #6c3483;
--c-new-bg: #fdebd0; --c-new-fg: #6e2c00;
--c-research-bg: #ebf5fb; --c-research-fg: #1b4f72;
}
* { box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
max-width: 1100px; margin: 0 auto; padding: 0;
color: var(--c-text); line-height: 1.55;
background: var(--c-bg-soft); }
main { padding: 2em 1.5em 5em 1.5em; background: #fff; }
/* ── Sticky TOC nav ───────────────────────────────────────────────── */
nav.toc {
position: sticky; top: 0; z-index: 10;
background: var(--c-primary); color: #fff;
padding: 0.7em 1.5em; font-size: 0.92em;
border-bottom: 3px solid var(--c-primary-dark);
display: flex; flex-wrap: wrap; gap: 0.4em 1.2em;
box-shadow: 0 2px 6px rgba(0,0,0,0.08);
}
nav.toc a { color: #fff; text-decoration: none; font-weight: 500; padding: 2px 6px;
border-radius: 3px; transition: background 0.15s; }
nav.toc a:hover { background: rgba(255,255,255,0.2); }
nav.toc strong { color: #fce4a6; font-weight: 700; margin-right: 0.6em; }
nav.toc .skim a { background: rgba(255,255,255,0.15); }
/* ── Headings ────────────────────────────────────────────────────── */
h1 { color: var(--c-primary-dark); border-bottom: 3px solid var(--c-primary);
padding-bottom: 0.3em; margin: 0.2em 0 0.5em 0; font-size: 1.8em; }
h2 { color: var(--c-primary-dark); margin-top: 2.5em;
padding: 0.5em 0.8em; background: var(--c-border);
border-left: 5px solid var(--c-primary); border-radius: 3px;
font-size: 1.25em; scroll-margin-top: 4em; }
h2 .anchor { color: var(--c-primary); opacity: 0.4; font-size: 0.7em;
margin-left: 0.4em; text-decoration: none; }
h2:hover .anchor { opacity: 1; }
h3 { color: var(--c-primary-dark); margin-top: 1.5em; font-size: 1.05em; }
/* ── Badges + status pills ───────────────────────────────────────── */
.badges { margin: 1em 0 1.5em 0; }
.badges img { margin: 2px 6px 2px 0; vertical-align: middle; }
.pill { display: inline-block; padding: 2px 8px; border-radius: 4px;
font-size: 0.85em; margin-right: 4px; font-weight: 600;
white-space: nowrap; }
.green { background: var(--c-green-bg); color: var(--c-green-fg); }
.yellow { background: var(--c-yellow-bg); color: var(--c-yellow-fg); }
.skip { background: var(--c-skip-bg); color: var(--c-skip-fg); }
.new { background: var(--c-new-bg); color: var(--c-new-fg); }
.research{ background: var(--c-research-bg); color: var(--c-research-fg); }
/* ── Tables ──────────────────────────────────────────────────────── */
table { border-collapse: collapse; width: 100%; margin: 1em 0;
font-size: 0.95em; }
th, td { text-align: left; padding: 8px 12px; border-bottom: 1px solid #e8e8e8;
vertical-align: top; }
th { background: #ecf0f1; font-weight: 600; color: var(--c-primary-dark); }
tr:hover { background: #fafcfe; }
/* ── Boxes ───────────────────────────────────────────────────────── */
.box { padding: 0.8em 1.1em; margin: 1.2em 0; border-radius: 4px;
border-left-width: 5px; border-left-style: solid; }
.box-tldr { background: #fff; border: 1px solid var(--c-border);
border-left-color: var(--c-primary); }
.box-result { background: #eafaf1; border-left-color: #28b463; }
.box-delta { background: #fdf2e9; border-left-color: #e67e22; }
.box-note { background: #fef9e7; border-left-color: #f1c40f; }
/* ── Code & details ──────────────────────────────────────────────── */
code { background: #f4f4f4; padding: 1px 5px; border-radius: 3px;
font-size: 0.92em; }
pre { background: #f4f4f4; padding: 0.8em 1em; border-radius: 4px;
overflow-x: auto; font-size: 0.88em; line-height: 1.45; }
details { margin: 0.8em 0; }
details summary { cursor: pointer; padding: 0.4em 0.6em;
background: #ecf0f1; border-radius: 3px;
font-weight: 600; color: var(--c-primary-dark); }
details[open] summary { border-bottom: 1px solid var(--c-border); margin-bottom: 0.5em; }
/* ── Time-budget grid ────────────────────────────────────────────── */
.time-grid { display: grid; grid-template-columns: repeat(3, 1fr);
gap: 1em; margin: 1.2em 0; }
.time-card { background: #fff; border: 1px solid var(--c-border);
border-top: 4px solid var(--c-primary); border-radius: 4px;
padding: 0.9em 1em; }
.time-card h3 { margin: 0 0 0.4em 0; font-size: 1em; color: var(--c-primary-dark); }
.time-card ul { margin: 0; padding-left: 1.2em; font-size: 0.92em; }
.time-card li { margin: 0.2em 0; }
@media (max-width: 700px) {
.time-grid { grid-template-columns: 1fr; }
}
/* ── Question table compact ──────────────────────────────────────── */
table.qtable td:first-child { width: 50px; font-weight: 700;
color: var(--c-primary-dark); }
table.qtable td:last-child { width: 110px; }
/* ── Footer ──────────────────────────────────────────────────────── */
footer { margin-top: 3em; padding-top: 1em; border-top: 1px solid #e8e8e8;
font-size: 0.88em; color: var(--c-muted); }
/* ── Small helpers ───────────────────────────────────────────────── */
.small { color: var(--c-muted); font-size: 0.9em; }
.lead { font-size: 1.05em; }
.topshift { scroll-margin-top: 4em; }
</style>
</head>
<body>
<nav class="toc">
<strong>Jump to:</strong>
<a href="#tldr">TL;DR</a>
<a href="#alignments">1. Alignments</a>
<a href="#questions">2. Questions</a>
<a href="#new">3. What's new</a>
<a href="#use">4. How to use</a>
<a href="#docs">5. Documents</a>
<a href="#proof">6. Proof</a>
<a href="#source">7. Source</a>
<span class="skim"><a href="#tldr">⏱ skim path</a></span>
</nav>
<main>
<h1 id="top">conformallab++ — Reviewer Preview</h1>
<p class="lead">
A C++17 header-only implementation of discrete conformal equivalence
solvers on triangle meshes, built around CGAL's <code>Surface_mesh</code>
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.
</p>
<p>
<b>Audience.</b> Active researcher in discrete differential geometry —
specifically the <b>decorated DCE</b> / <b>Penner coordinates</b> /
<b>canonical Delaunay tessellations</b> / <b>hyperideal polyhedra</b>
line — treated as a peer most likely to <i>use</i> conformallab++ as
numerical infrastructure for their own future experiments, not merely
to evaluate it.
</p>
<div class="box box-note">
<b>This page is a temporary preview</b> combining two unmerged PRs so
the integrated state is reviewable before any merge happens. Once the
PRs land on <code>main</code>, the publish URL serves the <code>main</code>-branch view.
</div>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="tldr">TL;DR — orient yourself <a class="anchor" href="#tldr">#</a></h2>
<p class="badges">
<img src="https://img.shields.io/badge/tests-259%20%2F%20259-brightgreen?style=flat-square" alt="Tests 259/259">
<img src="https://img.shields.io/badge/skipped-0-brightgreen?style=flat-square" alt="Skipped 0">
<img src="https://img.shields.io/badge/doxygen-100%25-brightgreen?style=flat-square" alt="Doxygen 100%">
<img src="https://img.shields.io/badge/quality%20gates-14%2F15%20PASS-brightgreen?style=flat-square" alt="Quality">
<img src="https://img.shields.io/badge/roadmap-5%20ported%20%2B%2011%20planned%20%2B%203%20research-blue?style=flat-square" alt="Roadmap">
<img src="https://img.shields.io/badge/literature-13%20Tier--1%20%26%20Tier--2-blue?style=flat-square" alt="Lit">
<img src="https://img.shields.io/badge/license-MIT-yellow?style=flat-square" alt="License">
<img src="https://img.shields.io/badge/header--only-yes-blue?style=flat-square" alt="Header-only">
<img src="https://img.shields.io/badge/version-v0.10.0-blue?style=flat-square" alt="v0.9.0">
</p>
<div class="box box-result">
<b>Headline.</b> 259/259 tests pass (0 skipped); 100&nbsp;% 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).
</div>
<p>Pick a time budget; each path is a sequence of anchor links.</p>
<div class="time-grid">
<div class="time-card">
<h3>⏱ 5 minutes — minimum to know what's here</h3>
<ul>
<li><a href="#alignments">§1 Research alignments</a> (10-row table)</li>
<li><a href="#new">§3 What's new</a> (delta since last publish)</li>
<li><a href="doxygen.html">→ Doxygen HTML index</a></li>
</ul>
</div>
<div class="time-card">
<h3>📖 20 minutes — to prepare for the meeting</h3>
<ul>
<li>5-min path above, plus:</li>
<li><a href="#questions">§2 Seven questions at a glance</a></li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/briefing.md">briefing.md</a> (1 page)</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/questions.md">questions.md</a> (the full text of Q1Q7)</li>
<li><a href="#use">§4 How to actually use this</a></li>
</ul>
</div>
<div class="time-card">
<h3>🔬 60+ minutes — deep dive</h3>
<ul>
<li>20-min path above, plus:</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/phases.md">roadmap/phases.md</a> (full per-phase plan)</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/math/hyperideal-hessian-derivation.md">hyperideal-hessian-derivation.md</a> (805-line Schläfli derivation)</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/architecture/locked-vs-flexible.md">locked-vs-flexible.md</a> (12 architecture decisions to push back on)</li>
<li><a href="#proof">§6 Quality + test proof points</a></li>
</ul>
</div>
</div>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="alignments">1. Research alignments — where this could be infrastructure for your work <a class="anchor" href="#alignments">#</a></h2>
<p>Most rows match an active publication line in discrete differential
geometry. Rows marked <i>no Java parent</i> are research-only phases
the reader can shape at design stage. The Phase column links to the
per-phase entry in <code>doc/roadmap/</code>.</p>
<table>
<thead><tr><th>Reader's research thread</th><th>What this snapshot has</th><th>Phase</th></tr></thead>
<tbody>
<tr><td>Decorated DCE in non-Euclidean geometries</td>
<td>five DCE solvers + traits scaffolding; non-Euclidean cone extension scoped in research-track with acceptance criteria</td>
<td><span class="pill research">9d.2</span> RESEARCH</td></tr>
<tr><td>Canonical Delaunay tessellations of decorated hyperbolic surfaces</td>
<td>cut-graph + period matrix + hyperbolic-disk layout as scaffolding; canonical-tessellation algorithm itself outlined</td>
<td><span class="pill new">10c</span> planned</td></tr>
<tr><td>Hyperideal polyhedra rigidity</td>
<td>HyperIdeal functional + 805-line analytic Hessian derivation note (Schläfli identity)</td>
<td><span class="pill new">9b-analytic</span> derived; <span class="pill new">10c</span> KAT planned</td></tr>
<tr><td>Optimal cone placement / non-Euclidean cone metrics</td>
<td>cone-singularity port via <code>ConesUtility</code> scoped; non-Euclidean extension is the research delta</td>
<td><span class="pill new">9d.1</span> port + <span class="pill research">9d.2</span> RESEARCH</td></tr>
<tr><td>Polygon Laplacian on general (non-triangular) meshes</td>
<td><i>no Java parent</i> — first phase the reader can influence at design stage</td>
<td><span class="pill research">9f</span> RESEARCH</td></tr>
<tr><td>Quasi-isothermic maps (Lawson correspondence, ~800 lines, discrete Beltrami-field solver)</td>
<td>scoped as a 6-class Java port: <code>QuasiisothermicLayout</code>, <code>DBFSolution</code>, <code>SinConditionApplication</code>, <code>QuasiisothermicDelaunay</code>, <code>QuasiisothermicUtility</code>, <code>ConformalStructureUtility</code></td>
<td><span class="pill new">10e</span> planned</td></tr>
<tr><td>Higher-genus + hyperelliptic surfaces (BobenkoBücking 2009; block-diagonal period matrices with Z₂ symmetry)</td>
<td>port of <code>HyperellipticUtility</code> + <code>HyperIdealHyperellipticUtility</code> scoped; existing period-matrix code as scaffolding</td>
<td><span class="pill new">10b</span> planned</td></tr>
<tr><td>Möbius centring as a variational problem (Lorentz energy, full gradient + Hessian)</td>
<td>currently iterative Fréchet mean in <code>normalise_hyperbolic()</code>; the principled variational alternative is scoped via the Java <code>MobiusCenteringFunctional</code> port</td>
<td><span class="pill new">9d.4</span> planned</td></tr>
<tr><td>Boundary-First / interactive flattening (Crane et al. 2017 BFF; Bonneel et al. 2015 <i>Stripe Patterns</i>)</td>
<td>not on the roadmap as ports; documented in <code>references.md</code> as comparison points / inspiration</td>
<td></td></tr>
<tr><td>Schläfli-based variational machinery (RivinSpringborn 1999)</td>
<td>derivation done; implementation gated on the reader's view of whether the ~6× speedup over our block-FD path matters at their mesh sizes</td>
<td><span class="pill new">9b-analytic</span> ready</td></tr>
</tbody>
</table>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="questions">2. Seven questions at a glance <a class="anchor" href="#questions">#</a></h2>
<p>The full text of each question lives in
<a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/questions.md">questions.md</a>.
The first two are research-oriented and benefit most from this
specific reader; the rest are scoped so &quot;A / B / either&quot; is a
sufficient answer.</p>
<table class="qtable">
<thead><tr><th>Q</th><th>Topic</th><th>Track</th></tr></thead>
<tbody>
<tr><td>Q1</td>
<td>Research-track alignment — which of 6 candidate phases (9d.2 / 9f / 10c+10c / 10e / 10b / 9d.4) would unblock concrete experiments you want to run?</td>
<td><span class="pill research">research</span></td></tr>
<tr><td>Q2</td>
<td>Decorated-DCE API surface — named parameter, separate <code>decorated_*</code> solvers, or property-map auto-detect?</td>
<td><span class="pill research">research</span></td></tr>
<tr><td>Q3</td>
<td>Phase 9b-analytic Hessian — is the ~6× speedup worth ~2 weeks at your mesh sizes?</td>
<td><span class="pill new">porting</span></td></tr>
<tr><td>Q4</td>
<td>Phase 9c (4g-polygon canonical form) — port literally or re-derive from Springborn 2020 §5?</td>
<td><span class="pill new">porting</span></td></tr>
<tr><td>Q5</td>
<td>geometry-central cross-validation (GC-1) — would you co-author?</td>
<td>collaboration</td></tr>
<tr><td>Q6</td>
<td>CGAL submission packaging — one package or several?</td>
<td>process</td></tr>
<tr><td>Q7</td>
<td>The &quot;no&quot; question — is there one of the 12 architecture decisions you would push back on?</td>
<td>process</td></tr>
</tbody>
</table>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="new">3. What's new on this snapshot <a class="anchor" href="#new">#</a></h2>
<div class="box box-delta">
<p><b>Since the previous publish</b>, four threads converged:</p>
<ul>
<li><span class="pill new">+6 phases</span> 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
<a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/java-parity.md">java-parity.md</a>
for the reverse table.</li>
<li><span class="pill new">+13 literature citations</span> integrated
into the per-phase roadmap with explicit acceptance criteria.
Decorated-DCE / canonical-tessellation / hyperideal line:
BobenkoLutz 2024 IMRN; BobenkoLutz 2025 <i>DCG</i>; Lutz 2023
<i>Geom. Dedicata</i>; Lutz 2024 PhD; BowersBowersLutz 2026.
Cones, polyhedra, period matrices: Crane et al. 2018;
Springborn 2019; BobenkoBücking 2009; RivinSpringborn 1999.
Polygon Laplacians: AlexaWardetzky 2011; Alexa 2020. Integrable
and practical-flattening context: SpringbornVeselov 2015;
Crane et al. 2017 (BFF); Bonneel et al. 2015 (Stripe Patterns).
</li>
<li><span class="pill research">+1 RESEARCH phase</span> 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.</li>
<li><span class="pill new">output_uv_map</span> now covers 4 of 5 DCE
solvers (Inversive-Distance added; CP-Euclidean deferred to
Phase 9c with a clear runtime error).</li>
</ul>
</div>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="use">4. How you'd actually use this <a class="anchor" href="#use">#</a></h2>
<p>The library is header-only and standalone. Two-minute build + smoke
test:</p>
<pre><code>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</code></pre>
<p>One-call entry to compute a Euclidean discrete conformal map and a
UV-layout in a single shot:</p>
<pre><code>#include &lt;CGAL/Surface_mesh.h&gt;
#include &lt;CGAL/Discrete_conformal_map.h&gt;
CGAL::Surface_mesh&lt;K::Point_3&gt; mesh = ...; // your mesh
auto uv = mesh.add_property_map&lt;V_idx, K::Point_2&gt;("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.</code></pre>
<details>
<summary>For adding your own functional or layout — pointer chain</summary>
<ul>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/tutorials/add-inversive-distance.md">add-inversive-distance.md</a>
— step-by-step recipe for a sixth DCE model, used in real for the existing 9a.2 port.</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/tutorials/block-fd-hessian.md">block-fd-hessian.md</a>
— per-face block-FD pattern (96× over full-FD).</li>
<li><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/tutorials/add-output-uv-map.md">add-output-uv-map.md</a>
<code>output_uv_map</code> named parameter + pipe-operator chaining.</li>
<li><b>For your decorated-DCE work specifically</b>: see
<a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/questions.md#q2--decorated-dce-api-surface-what-would-you-need-from-us-to-use-the-library-for-penner-coordinate-work">Q2 of the reviewer questions</a>
— three candidate API shapes, picking one would let us sketch a prototype in the week after the meeting.</li>
</ul>
</details>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="docs">5. Documents to read next <a class="anchor" href="#docs">#</a></h2>
<p>The four document folders most useful to a researcher. Click each
folder for the per-document table.</p>
<details open>
<summary>📋 Meeting materials — <code>doc/reviewer/</code> (read first)</summary>
<table>
<tr><th>Document</th><th>What it covers</th></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/briefing.md"><code>briefing.md</code></a></td>
<td>One-page orientation: research alignments (10-row table), what's new on this snapshot, the seven questions.</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/reviewer/questions.md"><code>questions.md</code></a></td>
<td>Full text of Q1Q7. Q1 lists 6 candidate phases (9d.2 / 9f / 10c+10c / 10e / 10b / 9d.4); Q2 covers the decorated-DCE API surface; Q3Q4 are porting decisions; Q5Q6 project management; Q7 the open invitation to push back.</td></tr>
</table>
</details>
<details>
<summary>🗺️ Roadmap — <code>doc/roadmap/</code> (where everything fits)</summary>
<table>
<tr><th>Document</th><th>What it covers</th></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/phases.md"><code>phases.md</code></a> <span class="pill new">+6 phases</span></td>
<td>Per-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).</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/research-track.md"><code>research-track.md</code></a> <span class="pill research">+2 RESEARCH</span></td>
<td>Items 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).</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/java-parity.md"><code>java-parity.md</code></a> <span class="pill new">full scan</span></td>
<td>Reverse 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 <i>do-not-port</i> list — Colt, PETSc, jReality wrappers).</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/roadmap/porting-status.md"><code>porting-status.md</code></a></td>
<td>Operational snapshot: 25 kLoC Java breakdown, 5-DCE-model status matrix, things Java doesn't have.</td></tr>
</table>
</details>
<details>
<summary>📚 Mathematics &amp; literature — <code>doc/math/</code></summary>
<table>
<tr><th>Document</th><th>What it covers</th></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/math/references.md"><code>references.md</code></a> <span class="pill new">+13 refs</span></td>
<td>Per-phase literature index. 13 new citations added: decorated DCE in non-Euclidean geometries (BobenkoLutz 2025); canonical tessellations (Lutz 2023 / 2024); hyperideal polyhedra rigidity (BowersBowersLutz 2026); polygon Laplacians (AlexaWardetzky 2011 / Alexa 2020); optimal cone placement (Crane et al. 2018); Schläfli identity (RivinSpringborn 1999); hyperbolic polyhedra (Springborn 2019); polyhedral period matrices (BobenkoBücking 2009); integrable cluster dynamics (SpringbornVeselov 2015); BFF (Crane et al. 2017); stripe patterns (Bonneel et al. 2015).</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/math/hyperideal-hessian-derivation.md"><code>hyperideal-hessian-derivation.md</code></a></td>
<td>Full 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, ChoKim 1999, Glickenstein 2011, RivinSpringborn 1999, Springborn 2020.</td></tr>
</table>
</details>
<details>
<summary>🏗️ Architecture, dependencies &amp; auto-generated reference</summary>
<table>
<tr><th>Document</th><th>What it covers</th></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/architecture/locked-vs-flexible.md"><code>locked-vs-flexible.md</code></a></td>
<td>12 architecture decisions classified 🔴 load-bearing / 🟡 semi-fixed / 🟢 opportunistic + a "Known limitations" table. Q7 of the reviewer questions points here to push back on anything.</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/architecture/dependencies.md"><code>dependencies.md</code></a></td>
<td>What's required (Eigen + CGAL + Boost headers) vs optional; per-tool install hints; standalone-verification recipe.</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/code/deps/THIRD-PARTY-LICENSES.md"><code>code/deps/THIRD-PARTY-LICENSES.md</code></a></td>
<td>Per-vendored-dep SPDX with MIT-compatibility analysis (LGPL §3 vs §4 distinction for header-only consumption of CGAL).</td></tr>
<tr><td><a href="doxygen.html">Doxygen HTML</a></td>
<td>259 pages, 0 warnings, 100&nbsp;% public-API coverage (396 / 396 symbols). MathJax enabled for inline formulas.</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/api/headers.md"><code>api/headers.md</code></a></td>
<td>Auto-generated table of every public header with brief + symbols; regenerated on every push to main.</td></tr>
<tr><td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/doc/api/tests.md"><code>api/tests.md</code></a></td>
<td>Per-suite test breakdown (single source of truth). 259 tests, 0 skipped.</td></tr>
</table>
</details>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="proof">6. Quality &amp; tests — proof points <a class="anchor" href="#proof">#</a></h2>
<table>
<thead><tr><th>Suite</th><th>Tests</th><th>Status</th></tr></thead>
<tbody>
<tr><td>Non-CGAL (pure-math)</td><td>23</td><td><span class="pill green">PASS</span> 0 skipped</td></tr>
<tr><td>CGAL (Surface_mesh + Phase 8b-Lite)</td><td>236</td><td><span class="pill green">PASS</span> 0 skipped</td></tr>
<tr><th>Total</th><th>259</th><th>0 failures</th></tr>
</tbody>
</table>
<details>
<summary>Quality gates — 14 of 15 PASS, 1 SKIP (full breakdown)</summary>
<p class="small">Run with <code>bash scripts/quality/run-all.sh</code>. Four ★ gates are
required in CI on every PR; the rest are local-only and skip gracefully
on a partial dev environment.</p>
<table>
<thead><tr><th>Gate</th><th>Where</th><th>Result</th><th>Detail</th></tr></thead>
<tbody>
<tr><td>License headers ★</td><td>CI</td><td><span class="pill green">PASS</span></td><td>66/66 files carry MIT SPDX</td></tr>
<tr><td>CGAL conventions (6 rules) ★</td><td>CI</td><td><span class="pill green">PASS</span></td><td>0/6 violations across 6 CGAL public headers</td></tr>
<tr><td>codespell ★</td><td>CI</td><td><span class="pill green">PASS</span></td><td>0 typos</td></tr>
<tr><td>shellcheck ★ (strict)</td><td>CI</td><td><span class="pill green">PASS</span></td><td>0 findings across 16 shell scripts</td></tr>
<tr><td>clang-format drift</td><td>local</td><td><span class="pill green">PASS</span></td><td>0 drift against <code>.clang-format</code></td></tr>
<tr><td>cmake-format / cmake-lint</td><td>local</td><td><span class="pill green">PASS</span></td><td>0 drift, 0 lint findings</td></tr>
<tr><td>cppcheck</td><td>local</td><td><span class="pill green">PASS</span></td><td>warning+ severity clean</td></tr>
<tr><td>Markdown links</td><td>CI</td><td><span class="pill green">PASS</span></td><td>internal links resolve</td></tr>
<tr><td>Sanitizers (ASan + UBSan)</td><td>local</td><td><span class="pill green">PASS</span></td><td>23/23 tests pass under instrumentation</td></tr>
<tr><td>clang-tidy</td><td>local</td><td><span class="pill green">PASS</span></td><td>35 headers, 0 findings</td></tr>
<tr><td>Coverage (gcov + lcov)</td><td>local</td><td><span class="pill yellow">DEGRADED</span></td><td>23/23 tests run instrumented; lcov-on-macOS toolchain mismatch (works on Linux CI)</td></tr>
<tr><td>Multi-compiler</td><td>local</td><td><span class="pill green">PASS</span></td><td>AppleClang 17 + brew LLVM 22</td></tr>
<tr><td>Reproducible build</td><td>local</td><td><span class="pill green">PASS</span></td><td>byte-identical test binaries between 2 builds</td></tr>
<tr><td>Doxygen coverage</td><td>CI</td><td><span class="pill green">PASS</span></td><td>396 / 396 public symbols (100&nbsp;%)</td></tr>
<tr><td>CGAL version matrix</td><td>local</td><td><span class="pill skip">SKIP</span></td><td>no CGAL tarballs under <code>~/cgal/</code> (graceful)</td></tr>
<tr><td>test-count consistency ★</td><td>CI</td><td><span class="pill green">PASS</span></td><td><code>tests.md</code> totals match ctest reality</td></tr>
<tr><td>End-to-end smoke (try_it.sh) ★</td><td>CI</td><td><span class="pill green">PASS</span></td><td>full configure + build + ctest + Euclidean example on a bundled mesh</td></tr>
</tbody>
</table>
</details>
<!-- ════════════════════════════════════════════════════════════════ -->
<h2 id="source">7. Source &amp; navigation <a class="anchor" href="#source">#</a></h2>
<table>
<tr><td>Repo (this snapshot)</td>
<td><a href="https://codeberg.org/TMoussa/ConformalLabpp/src/branch/main/">codeberg.org/TMoussa/ConformalLabpp/branch/main</a></td></tr>
<tr><td>Default branch</td>
<td><a href="https://codeberg.org/TMoussa/ConformalLabpp">codeberg.org/TMoussa/ConformalLabpp (main)</a></td></tr>
<tr><td>Doxygen HTML</td>
<td><a href="doxygen.html">259 pages, 0 warnings, 100 % coverage</a></td></tr>
<tr><td>Origin (private)</td>
<td><code>git.eulernest.eu/conformallab/ConformalLabpp</code></td></tr>
</table>
<footer>
Reviewer-hub layout v6 — restructured for time-budget navigation, with
TL;DR + skim path up front and a sticky TOC. Built from
<code>branch/main</code> after merging PR #17 + PR #19
onto <code>main</code>. Status badges are static (snapshotted at publish
time, not live); the underlying CI workflow lives at
<code>.gitea/workflows/cpp-tests.yml</code> and re-runs on every push.
&nbsp;<a href="#top">↑ back to top</a>
</footer>
</main>
</body>
</html>