@@ -0,0 +1,529 @@
<!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 : 1100 px ; margin : 0 auto ; padding : 0 ;
color : var ( - - c - text ) ; line-height : 1.55 ;
background : var ( - - c - bg - soft ) ; }
main { padding : 2 em 1.5 em 5 em 1.5 em ; background : #fff ; }
/* ── Sticky TOC nav ───────────────────────────────────────────────── */
nav . toc {
position : sticky ; top : 0 ; z-index : 10 ;
background : var ( - - c - primary ) ; color : #fff ;
padding : 0.7 em 1.5 em ; font-size : 0.92 em ;
border-bottom : 3 px solid var ( - - c - primary - dark ) ;
display : flex ; flex-wrap : wrap ; gap : 0.4 em 1.2 em ;
box-shadow : 0 2 px 6 px rgba ( 0 , 0 , 0 , 0.08 ) ;
}
nav . toc a { color : #fff ; text-decoration : none ; font-weight : 500 ; padding : 2 px 6 px ;
border-radius : 3 px ; transition : background 0.15 s ; }
nav . toc a : hover { background : rgba ( 255 , 255 , 255 , 0.2 ) ; }
nav . toc strong { color : #fce4a6 ; font-weight : 700 ; margin-right : 0.6 em ; }
nav . toc . skim a { background : rgba ( 255 , 255 , 255 , 0.15 ) ; }
/* ── Headings ────────────────────────────────────────────────────── */
h1 { color : var ( - - c - primary - dark ) ; border-bottom : 3 px solid var ( - - c - primary ) ;
padding-bottom : 0.3 em ; margin : 0.2 em 0 0.5 em 0 ; font-size : 1.8 em ; }
h2 { color : var ( - - c - primary - dark ) ; margin-top : 2.5 em ;
padding : 0.5 em 0.8 em ; background : var ( - - c - border ) ;
border-left : 5 px solid var ( - - c - primary ) ; border-radius : 3 px ;
font-size : 1.25 em ; scroll-margin-top : 4 em ; }
h2 . anchor { color : var ( - - c - primary ) ; opacity : 0.4 ; font-size : 0.7 em ;
margin-left : 0.4 em ; text-decoration : none ; }
h2 : hover . anchor { opacity : 1 ; }
h3 { color : var ( - - c - primary - dark ) ; margin-top : 1.5 em ; font-size : 1.05 em ; }
/* ── Badges + status pills ───────────────────────────────────────── */
. badges { margin : 1 em 0 1.5 em 0 ; }
. badges img { margin : 2 px 6 px 2 px 0 ; vertical-align : middle ; }
. pill { display : inline-block ; padding : 2 px 8 px ; border-radius : 4 px ;
font-size : 0.85 em ; margin-right : 4 px ; 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 : 1 em 0 ;
font-size : 0.95 em ; }
th , td { text-align : left ; padding : 8 px 12 px ; border-bottom : 1 px solid #e8e8e8 ;
vertical-align : top ; }
th { background : #ecf0f1 ; font-weight : 600 ; color : var ( - - c - primary - dark ) ; }
tr : hover { background : #fafcfe ; }
/* ── Boxes ───────────────────────────────────────────────────────── */
. box { padding : 0.8 em 1.1 em ; margin : 1.2 em 0 ; border-radius : 4 px ;
border-left-width : 5 px ; border-left-style : solid ; }
. box-tldr { background : #fff ; border : 1 px 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 : 1 px 5 px ; border-radius : 3 px ;
font-size : 0.92 em ; }
pre { background : #f4f4f4 ; padding : 0.8 em 1 em ; border-radius : 4 px ;
overflow-x : auto ; font-size : 0.88 em ; line-height : 1.45 ; }
details { margin : 0.8 em 0 ; }
details summary { cursor : pointer ; padding : 0.4 em 0.6 em ;
background : #ecf0f1 ; border-radius : 3 px ;
font-weight : 600 ; color : var ( - - c - primary - dark ) ; }
details [ open ] summary { border-bottom : 1 px solid var ( - - c - border ) ; margin-bottom : 0.5 em ; }
/* ── Time-budget grid ────────────────────────────────────────────── */
. time-grid { display : grid ; grid-template-columns : repeat ( 3 , 1 fr ) ;
gap : 1 em ; margin : 1.2 em 0 ; }
. time-card { background : #fff ; border : 1 px solid var ( - - c - border ) ;
border-top : 4 px solid var ( - - c - primary ) ; border-radius : 4 px ;
padding : 0.9 em 1 em ; }
. time-card h3 { margin : 0 0 0.4 em 0 ; font-size : 1 em ; color : var ( - - c - primary - dark ) ; }
. time-card ul { margin : 0 ; padding-left : 1.2 em ; font-size : 0.92 em ; }
. time-card li { margin : 0.2 em 0 ; }
@ media ( max-width : 700px ) {
. time-grid { grid-template-columns : 1 fr ; }
}
/* ── Question table compact ──────────────────────────────────────── */
table . qtable td : first-child { width : 50 px ; font-weight : 700 ;
color : var ( - - c - primary - dark ) ; }
table . qtable td : last-child { width : 110 px ; }
/* ── Footer ──────────────────────────────────────────────────────── */
footer { margin-top : 3 em ; padding-top : 1 em ; border-top : 1 px solid #e8e8e8 ;
font-size : 0.88 em ; color : var ( - - c - muted ) ; }
/* ── Small helpers ───────────────────────────────────────────────── */
. small { color : var ( - - c - muted ) ; font-size : 0.9 em ; }
. lead { font-size : 1.05 em ; }
. topshift { scroll-margin-top : 4 em ; }
< / 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.9.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/branch/main/doc/reviewer/briefing.md" > briefing.md< / a > (1 page)< / li >
< li > < a href = "https://codeberg.org/TMoussa/ConformalLabpp/src/branch/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/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/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/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– Bü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 (Rivin– Springborn 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/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/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: 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).
< / 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 < 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/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/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/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/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/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/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/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/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/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/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/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 / 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).< / td > < / tr >
< tr > < td > < a href = "https://codeberg.org/TMoussa/ConformalLabpp/src/branch/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– Springborn 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/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/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/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/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/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/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 >