Some checks failed
C++ Tests / test-fast (pull_request) Successful in 1m55s
API Docs / doc-build (pull_request) Successful in 53s
Markdown link check / check (pull_request) Successful in 50s
C++ Tests / test-cgal (pull_request) Has been skipped
C++ Tests / quality-gates (pull_request) Failing after 1m56s
External reviewer pass over the literature references. Verified entries against arXiv/DOI/publisher and corrected misattributions that had propagated across the docs. Corrected citations (consistent across all docs): - Bowers-Bowers-Lutz 2026: title was the 2017 paper's -> "Rigidity of Koebe Polyhedra and Inversive Distance Circle Packings" - Liouville theorem: "Springborn 2019" -> Pinkall & Springborn, Geom. Dedicata 214 (2021) - Bobenko-Pinkall-Springborn: "G&T 14 (2010)" -> G&T 19(4) (2015), 2155-2215 - Optimal Cone Singularities: "Crane, Soliman, Ben-Chen, Schroeder" -> Soliman, Slepcev, Crane, ACM TOG 37(4) - Schlaefli formula: "Rivin, Springborn 1999" -> Rivin, Schlenker - Quasiconformal distortion: "Springborn, Veselov" -> Born, Buecking, Springborn (arXiv:1505.01341) - Period matrices: "Bobenko, Buecking 2009" (was Bobenko-Mercat-Schmies' title) -> Bobenko-Mercat-Schmies 2011 + genuine Bobenko-Buecking 2021 - Fabricated entry: "Alexa 2020, DOI 10.1145/3414685.3417840" pointed to an unrelated paper (Pixelor) -> Bunge, Herholz, Kazhdan, Botsch 2020 - Stripe Patterns: "Bonneel et al. 2015" -> Knoeppel, Crane, Pinkall, Schroeder 2015 Equation-number corrections (verified against the PDFs): - Glickenstein 2011 "eq. 4.6" -> "§5.2" (no such equation label exists) - Springborn 2020 "eq. 4.6" -> "§4 variational gradient" - inversive-distance attribution softened to classical inversive distance Other: - DBFEnergy bibliography (separate repo) and convergence half-sentence in novelty-statement.md §3.3 (Bobenko-Buecking 2021) - Status legend (implemented vs planned) at top of references.md - New Phase 12 (decorated DCE & geometric transition, Chain A, near-term) and Phase 13 (canonical tessellations & polyhedral realisation, Chain B capstone) in phases.md + research-track.md; 10c scope-boundary note clarifying infrastructure vs Lutz-specific algorithms Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
531 lines
32 KiB
HTML
531 lines
32 KiB
HTML
<!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 % 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 Q1–Q7)</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 (Bobenko–Mercat–Schmies 2011 / Bobenko–Bücking 2021 period matrices; block-diagonal 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 (Sawhney–Crane 2017 BFF; Knöppel–Crane–Pinkall–Schröder 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 (Rivin–Schlenker 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 "A / B / either" 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 "no" 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:
|
||
Bobenko–Lutz 2024 IMRN; Bobenko–Lutz 2025 <i>DCG</i>; Lutz 2023
|
||
<i>Geom. Dedicata</i>; Lutz 2024 PhD; Bowers–Bowers–Lutz 2026.
|
||
Cones, polyhedra, period matrices: Soliman–Slepčev–Crane 2018;
|
||
Pinkall–Springborn 2021 (discrete Liouville); Bobenko–Mercat–Schmies
|
||
2011 / Bobenko–Bücking 2021; Rivin–Schlenker 1999.
|
||
Polygon Laplacians: Alexa–Wardetzky 2011; Bunge et al. 2020. Integrable
|
||
and practical-flattening context: Born–Bücking–Springborn 2015;
|
||
Sawhney–Crane 2017 (BFF); Knöppel 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 / Bunge et al. 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 <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.</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 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.</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 & 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 (Bobenko–Lutz 2025); canonical tessellations (Lutz 2023 / 2024); hyperideal polyhedra rigidity (Bowers–Bowers–Lutz 2026); polygon Laplacians (Alexa–Wardetzky 2011 / Bunge et al. 2020); optimal cone placement (Soliman–Slepčev–Crane 2018); Schläfli identity (Rivin–Schlenker 1999); discrete Liouville theorem (Pinkall–Springborn 2021); polyhedral period matrices (Bobenko–Mercat–Schmies 2011 / Bobenko–Bücking 2021); quasiconformal distortion (Born–Bücking–Springborn 2015); BFF (Sawhney–Crane 2017); stripe patterns (Knöppel–Crane–Pinkall–Schröder 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, Cho–Kim 1999, Glickenstein 2011, Rivin–Schlenker 1999, Springborn 2020.</td></tr>
|
||
</table>
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary>🏗️ Architecture, dependencies & 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 % 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 & 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 %)</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 & 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.
|
||
<a href="#top">↑ back to top</a>
|
||
</footer>
|
||
|
||
</main>
|
||
|
||
</body>
|
||
</html>
|