# Reviewer briefing — conformallab++

> **Audience.** Active researcher in discrete differential geometry —
> specifically the research line around **decorated discrete conformal
> equivalence**, **Penner coordinates on hyperbolic surfaces**,
> **canonical Delaunay tessellations of decorated surfaces**, and
> **hyperideal polyhedra**.  Treats the reader as a peer who is more
> likely to *use* conformallab++ as numerical infrastructure for their
> own future experiments than to merely evaluate it as a software
> artefact.
>
> **Purpose.** One page to read before the meeting: what is shipping,
> which of the reader's research questions it could already support,
> and where the gaps are that we would close together.

## In one paragraph

`conformallab++` is a C++17 header-only re-implementation of the Java
library [`ConformalLab`](https://github.com/varylab/conformallab)
(Sechelmann 2016, TU Berlin), built around CGAL's `Surface_mesh` and
Eigen.  v0.9.0 ships five Discrete Conformal Equivalence (DCE) solvers
— Euclidean, Spherical, HyperIdeal, Circle-Packing Euclidean
(BPS 2010, face-based), Inversive-Distance (Luo 2004, vertex-based) —
plus the Newton infrastructure, layout (priority-BFS trilateration in
ℝ², S², Poincaré disk), Möbius holonomy, period matrix, cut graph, and
JSON/XML serialisation.  Long-term goal: a CGAL package.

## Where to start (one URL, 5 minutes)

**👉 https://tmoussa.codeberg.page/ConformalLabpp/**

The landing page is a hand-curated reviewer hub, not an auto-generated
index. It links to the Doxygen API, the key markdown documents, and
shows static quality-gate status.

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

The current snapshot already contains, or has roadmap entries for,
the following.  Most rows match an active publication line in
discrete differential geometry; a few (marked *no Java parent*) are
research-only phases the reader can shape at design stage.

| Your research thread | What this snapshot has | Phase |
|---|---|---|
| **Decorated DCE in non-Euclidean geometries** (Bobenko–Lutz 2025, *DCG*) | five DCE solvers + traits scaffolding; non-Euclidean cone extension scoped in research-track with acceptance criteria | **9d.2** RESEARCH (planned) |
| **Canonical Delaunay tessellations of decorated hyperbolic surfaces** (Lutz 2023, *Geom. Dedicata*; Lutz 2024 PhD thesis) | cut-graph + period matrix + hyperbolic-disk layout as scaffolding; canonical-tessellation algorithm itself outlined | **10c** planned |
| **Hyperideal polyhedra rigidity** (Bowers–Bowers–Lutz 2026) | HyperIdeal functional + analytic Hessian derivation (805-line LaTeX note) | **9b-analytic** derived; **10c′** KAT planned |
| **Optimal cone placement / non-Euclidean cone metrics** (Crane et al. 2018) | Cone-singularity port via `ConesUtility` scoped; the *non-Euclidean* extension is the research delta | **9d.1** port + **9d.2** RESEARCH |
| **Polygon Laplacian on general meshes** (Alexa–Wardetzky 2011; Bunge et al. 2020) | *no Java parent* — first phase a reviewer can shape at design stage | **9f** RESEARCH (planned) |
| **Quasi-isothermic maps** (generalising conformality where exact conformality is impossible — Lawson-correspondence parameterisation) | scoped as a 6-class port (~800 lines) from the Java original: `QuasiisothermicLayout`, `DBFSolution` (discrete Beltrami field), `SinConditionApplication`, `QuasiisothermicDelaunay`, `QuasiisothermicUtility`, `ConformalStructureUtility` | **10e** planned |
| **Higher-genus + hyperelliptic surfaces** (Bobenko–Mercat–Schmies 2011 / Bobenko–Bücking 2021 on polyhedral period matrices; block-diagonal Z₂ structure) | port of `HyperellipticUtility` + `HyperIdealHyperellipticUtility` scoped; existing period-matrix code as scaffolding | **10b** planned |
| **Möbius centring for Poincaré-disk layouts** as a variational problem (Lorentz geometry: `E = Σ log(−⟨x,p⟩/√(−⟨x,x⟩))`) | currently we use iterative Fréchet mean in `normalise_hyperbolic()`; the principled variational alternative is scoped via the Java `MobiusCenteringFunctional` port (full gradient + Hessian) | **9d.4** planned |
| **Boundary-First / interactive flattening** (Sawhney–Crane 2017 BFF; Knöppel–Crane–Pinkall–Schröder 2015 *Stripe Patterns on Surfaces*) | not on the roadmap as ports; documented in [`references.md`](../math/references.md) as comparison points / inspiration for future API design | — |
| **Schläfli-based variational machinery** (Rivin–Schlenker 1999) | derivation done, implementation gated on your view of whether the ~6× speedup over our block-FD path matters at your mesh sizes | **9b-analytic** ready to implement |

See [`doc/roadmap/phases.md`](../roadmap/phases.md) for the per-phase
porting plan, [`doc/roadmap/research-track.md`](../roadmap/research-track.md)
for the items beyond Java parity with explicit acceptance criteria,
and [`doc/roadmap/java-parity.md`](../roadmap/java-parity.md) for the
reverse table (every Java class → C++ destination or *do-not-port*
rationale).

## What's new on this snapshot (since the previous publish)

- **+6 new porting-roadmap phases** (9d cones + 9d.4 Möbius centring /
  9e circle-pattern layout / 10d Koebe circle-domain / 10e
  quasi-isothermic / 10f Koebe polyhedra / 10g cyclic-symmetry
  quotients) derived from a full Java-library scan.  See `phases.md`
  for the per-phase plan and `java-parity.md` for the reverse table.
- **+13 literature citations** integrated into the roadmap, all
  Tier-1/2.  Decorated-DCE / canonical-tessellation / hyperideal line:
  Bobenko–Lutz 2024 IMRN; Bobenko–Lutz 2025 *DCG*; Lutz 2023
  *Geom. Dedicata*; Lutz 2024 PhD; Bowers–Bowers–Lutz 2026.  Cones,
  polyhedra, period matrices: 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 +
  practical-flattening context: Born–Bücking–Springborn 2015 (quasiconformal
  distortion); Sawhney–Crane 2017 (BFF); Knöppel et al. 2015 (Stripe
  Patterns).
- **Phase 9f** (polygon Laplacian on non-triangular meshes) added as
  RESEARCH-only — no Java parent — so you can influence its design
  before it exists.
- **Phase 10e** (quasi-isothermic maps) and **Phase 9d.4** (variational
  Möbius centring) newly scoped from the Java scan; both touch
  research lines adjacent to decorated DCE.
- **`output_uv_map`** now covers 4 of 5 DCE solvers (Inversive-Distance
  added; CP-Euclidean deferred to Phase 9c with a clear runtime error
  rather than silent failure).

## What's true about this snapshot

| Claim | Concrete evidence |
|---|---|
| **Library is header-only and standalone** | Verification recipe in `doc/architecture/dependencies.md`: `env -i PATH=…  cmake … && ctest` passes with zero quality tools installed. |
| **Tests: 259 pass, 0 skipped** | `bash scripts/check-test-counts.sh` enforces this against `doc/api/tests.md`; CI fails on drift. |
| **Doxygen: 100 % public-API coverage, 0 warnings** | `bash scripts/doxygen-coverage.sh --threshold 100` is in CI. |
| **License hygiene: 66/66 files carry MIT SPDX** | `bash scripts/quality/license-headers.sh` is in CI (strict). |
| **Build reproducibility: byte-identical between runs** | `bash scripts/quality/reproducible-build.sh` (local, ~6 min). |
| **Sanitizers (ASan + UBSan) clean on fast suite** | `bash scripts/quality/sanitizers.sh` (local, ~3 min). |
| **CGAL conventions: 6 rules, 0 violations** | `python3 scripts/quality/cgal-conventions.py` (CI required). |

## What we want from you

Seven concrete questions are in
[`doc/reviewer/questions.md`](questions.md) — please skim them
beforehand. They are deliberately scoped: each can be answered with
"go this way" / "no, go that way" / "either is fine".

Ordered by reviewer-value (the first two are the ones your research
profile makes you best-positioned to answer):

1. **Q1 — Research-track alignment** — of the three RESEARCH-track
   phases (9d.2 non-Euclidean cones, 9f polygon Laplacian, 10c
   canonical tessellations + 10c′ Koebe polyhedra), which would
   unblock concrete experiments you have wanted to run?
2. **Q2 — Decorated-DCE API surface** — what's the minimum public
   API for Penner-coordinate / decorated-DCE work?  Named parameter
   on the existing Euclidean entry, separate `decorated_*` solvers,
   or per-edge decoration weights via property maps?
3. **Q3 — Phase 9b-analytic** — is the ~6× speedup over the current
   block-FD Hessian worth ~2 weeks of implementation, at the mesh
   sizes you typically work with?
4. **Q4 — Phase 9c (4g-polygon)** — port the Java implementation
   literally, or re-derive from Springborn 2020 §5?
5. **Q5 — geometry-central cross-validation (GC-1)** — would you
   be interested in co-authoring a Newton-vs-Ptolemy-flips comparison?
6. **Q6 — CGAL submission strategy** — one package or several?
7. **Q7 — The "no" question** — looking at our 12 architecture
   decisions, is there one you would push back on?

## What's deliberately deferred (so we can discuss with you first)

| Item | Why deferred |
|---|---|
| Phase 9b-analytic (Schläfli-based HyperIdeal Hessian) | derivation done (805-line LaTeX doc), implementation depends on your opinion of payoff |
| Phase 9c (fundamental-polygon utility, 4g-polygon canonical form) | algorithm choice up to you |
| Cross-validation against geometry-central (GC-1) | potential paper, scope depends on your interest |
| CP-Euclidean `output_uv_map` (per-face circle packing) | needs the BPS-2010 §6 layout algorithm, ~3 days |
| `.a().b().c()` member-style named-parameter chaining | requires patching CGAL upstream; pipe-operator (`a | b | c`) shipped instead |

These are all flagged in
[`doc/architecture/locked-vs-flexible.md`](../architecture/locked-vs-flexible.md)
§"Known limitations".

## Architectural decisions you might want to challenge

12 decisions classified 🔴 load-bearing / 🟡 semi-fixed / 🟢 opportunistic
in [`doc/architecture/locked-vs-flexible.md`](../architecture/locked-vs-flexible.md).
The ones most worth your time:

- **#1 Surface_mesh as default** — 🔴 ~3 weeks to change. Are you OK
  with this default, or should we wire Polyhedron_3 / OpenMesh now?
- **#6 Eigen as linear-algebra back-end** — 🔴 ~2 weeks to change. Are
  the Eigen sparse solvers (SparseCholesky + SparseQR fallback)
  sufficient for the mesh sizes you've seen, or should we look at
  CHOLMOD / PETSc?
- **#7 Strategy C** (one Default trait per functional, not a unified
  trait) — 🟡 ~1 week to refactor. CGAL convention agrees; do you?

## How to actually run something

```bash
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 tests (adds Boost as a 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
```

A more end-to-end recipe lives in `scripts/try_it.sh` (also run in CI).

## Meeting logistics

- **Format**: video call (you suggested), ~60 min
- **Materials needed on your side**: just a browser to follow the
  reviewer-hub URL.
- **Materials I'll have ready**: a screen-share-able terminal with
  the repo open, my own agenda in `doc/reviewer/agenda.md`, and the
  questions doc above.

Looking forward.
