Files
ConformalLabpp/doc/roadmap/phases.md
Tarik Moussa 48e6d2131e docs: split Phase 9a into 9a.1 (CPEuclidean) + 9a.2 (InversiveDistance)
Audit during Phase 9a preparation revealed:

* The Java repo `varylab/conformallab` does NOT contain
  `InversiveDistanceFunctional.java`.  The original roadmap mention
  was based on a misreading.
* The closest existing Java class is `CPEuclideanFunctional.java`
  (260 lines, with FunctionalTest), implementing the Bobenko-Pinkall-
  Springborn 2010 face-based circle-packing functional.

These two functionals are mathematically distinct (face-dual vs vertex-
based) but related: BPS-CP generalises inversive-distance via the
intersection angle parameter θ_e (I_ij = cos θ_e for orthogonal
limit, I_ij = 1 for tangential).

The roadmap is now split into:
- 9a.1  CPEuclideanFunctional  (Java port + test, BPS 2010 reference)
- 9a.2  InversiveDistanceFunctional  (from-literature, Luo 2004
        + Glickenstein 2011)

Both belong in Phase 9a; cross-validation between them in the
tangential limit (θ=0 ⇔ I=1) becomes a Phase 9a acceptance test.

The tutorial `doc/tutorials/add-inversive-distance.md` is corrected:
it no longer claims `InversiveDistanceFunctional.java` exists upstream,
and cites Luo 2004 + Glickenstein 2011 + Bowers-Stephenson 2004 instead.
Updated edge-length formula from incorrect hyperbolic cosh form to
the correct Luo §3 Euclidean form:
  ℓ_ij² = exp(2u_i) + exp(2u_j) + 2 I_ij exp(u_i + u_j)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 23:18:57 +02:00

243 lines
11 KiB
Markdown
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.

# Development Roadmap
> **Legend:** ✅ complete · 🔲 planned
>
> **Porting / research boundary:**
> Phases 17 are direct ports of the Java original and its dissertation.
> From Phase 8 onwards the work goes beyond the scope of the Java library.
> Phase 8 (CGAL package) is infrastructure. Phase 9 is porting of remaining Java features.
> Phase 10+ is independent research with no direct Java reference implementation.
---
## ◼ Porting complete — Phases 17
```
Phase 1 Clausen / Lobachevsky / ImLi₂ special functions ✅
Phase 2 Hyper-ideal geometry (ζ, lᵢⱼ, αᵢⱼ, σᵢ, σᵢⱼ) ✅
Phase 3 CGAL Surface_mesh infrastructure + all three functionals
(Euclidean, Spherical, HyperIdeal)
+ analytical Hessians for Euclidean + Spherical
(HyperIdeal Hessian: symmetric FD — analytic deferred to 9b) ✅
Phase 4 Newton solver (SimplicialLDLT + SparseQR fallback)
+ Mesh I/O (OFF/OBJ/PLY) + example programs ✅ 68 tests
Phase 5 Priority-BFS layout + CLI app + JSON/XML serialisation ✅ 95 tests
Phase 6 GaussBonnet check/enforce, tree-cotree cut graph (2g),
exact hyperbolic trilateration, layout normalisation ✅ 121 tests
Phase 7 MobiusMap, halfedge_uv, Möbius holonomy (SU(1,1)),
period matrix τ∈ℍ + SL(2,) reduction,
fundamental domain parallelogram + tiling ✅ 176 tests
```
---
## ◼ Infrastructure — Phase 8: CGAL Package
Goal: conformallab++ as a standalone CGAL package, submission-ready, fulfilling all
CGAL package conventions with a traits-class design compatible with any CGAL-conforming
mesh type.
```
8a Traits class & concepts
→ include/CGAL/Conformal_map_traits.h
Separates MeshType, KernelType, ScalarType from the algorithm.
Enables use with any CGAL-compatible mesh, not just Surface_mesh.
→ Concept checks via static_assert / CGAL_concept_check
8b Public CGAL header hierarchy
→ include/CGAL/Discrete_conformal_map.h (user-facing entry header)
→ include/CGAL/Conformal_newton_solver.h
→ include/CGAL/Conformal_layout.h
→ include/CGAL/Conformal_cut_graph.h
All existing include/conformallab/*.hpp remain as implementation details.
8c CGAL-style documentation
→ doc/Conformal_map/PackageDescription.txt
→ doc/Conformal_map/fig/ (pipeline diagrams)
→ Doxygen comments on all public concepts and functions
→ User_manual.md + Reference_manual.md
8d CGAL test format
→ test/Conformal_map/CMakeLists.txt (CGAL-style CMake)
Existing GTest tests remain; CGAL-format tests are added alongside.
8e Declarative YAML pipeline
→ Lightweight YAML format for reproducible experiments
(specification in doc/api/cgal-package.md)
→ Validator: checks require/provide tokens before execution
→ CLI integration: conformallab_core --pipeline experiment.yml
```
---
## ◼ Remaining porting — Phase 9
Java features from `de.varylab.discreteconformal` not yet in C++:
```
9a Circle-packing / inversive-distance functionals
───────────────────────────────────────────────
Status: discovered during 9a-prep audit (2026-05-19) that the
original roadmap mention "inversive_distance_functional.hpp" was
based on a misreading — the Java repo at de.varylab.discreteconformal
does NOT contain InversiveDistanceFunctional.java. It contains the
related CPEuclideanFunctional.java which is the face-dual variant
(Bobenko-Pinkall-Springborn 2010). These are two mathematically
distinct models that both belong in this phase. Plan split:
9a.1 CPEuclideanFunctional (FACE-based circle packing)
→ cp_euclidean_functional.hpp
Java reference: CPEuclideanFunctional.java (260 lines) + test
Mathematical reference:
Bobenko, Pinkall, Springborn (2010) — "Discrete conformal maps
and ideal hyperbolic polyhedra", Geom. Topol. 14, 379-426.
DOFs: ρ_f per FACE (log-radius of the face-circle)
Constants: θ_e per edge (intersection angle, π/2 = orthogonal)
φ_f per face (target face-angle sum, default 2π)
Energy: E(ρ) = -Σ_f φ_f·ρ_f
+ Σ_e [½·p(θ*_e, Δρ_e)·Δρ_e + Λ(θ*_e + p)]
where p = 2·atan(tan(θ*/2)·tanh(Δρ/2)),
Λ = Clausen function, θ* = π θ.
Hessian: analytic, 2×2 per interior edge:
h_jk = sin(θ) / (cosh(Δρ) cos(θ))
Gauge: first face is pinned (ρ_0 = 0)
New CGAL entry: CGAL::discrete_circle_packing_euclidean(mesh, np)
Test suite: test_cp_euclidean_functional.cpp
(Dodecahedron-with-removed-face, θ=π/2,
FD gradient check, FD-vs-analytic Hessian check)
9a.2 Inversive-distance functional (VERTEX-based)
→ inversive_distance_functional.hpp
Java reference: NONE (does not exist upstream)
Mathematical reference:
Luo, F. (2004) "Combinatorial Yamabe Flow on Surfaces",
Commun. Contemp. Math. 6(5), 765-780.
Bowers, P. & Stephenson, K. (2004) "Uniformizing dessins
and Belyĭ maps via circle packing", Mem. AMS 170(805).
Glickenstein, D. (2011) "Discrete conformal variations and
scalar curvature on piecewise flat manifolds",
J. Diff. Geom. 87(2), 201-238 (analytic Hessian).
DOFs: u_i per VERTEX (u_i = log r_i)
Constants: I_ij per edge (inversive distance, computed
once from initial geometry:
I_ij = (_ij² r_i² r_j²)
/ (2 r_i r_j))
Θ_v per vertex (target cone angle, default 2π)
Edge length: _ij(u)² = e^{2u_i} + e^{2u_j} + 2 I_ij e^{u_i+u_j}
Angles: identical half-tangent atan2 form to Euclidean
Gradient: ∂E/∂u_v = Θ_v Σ_{T∋v} α_v(T)
(Luo 2004 Lemma 3.1)
Energy: path integral E(u) = ∫₀¹⟨G(tu),u⟩dt
(Luo's 1-form is closed; no general closed form,
use 10-point Gauss-Legendre as in Euclidean)
Hessian: FD for MVP; analytic (Glickenstein 2011 eq. 4.6)
as future optimisation
Gauge: first vertex pinned (u_0 = 0)
New CGAL entry: CGAL::discrete_inversive_distance_map(mesh, np)
Test suite: test_inversive_distance_functional.cpp
(small triangle + quad + tetra, FD gradient
check, convergence test, special case I=1
coincides with tangential circle packing)
Cross-validation between 9a.1 and 9a.2 (Glickenstein 2011 §5):
In the tangential limit (θ_e = 0 in 9a.1 ⇔ I_ij = 1 in 9a.2),
both functionals describe the same circle packing. Their
converged radii must satisfy
ρ_f(9a.1) vs ½·log(r_i·r_j) (9a.2)
under the appropriate vertex↔face dual correspondence. This
cross-check is part of the Phase 9a acceptance tests.
9b Analytic HyperIdeal Hessian
→ Replace FD Hessian in hyper_ideal_hessian.hpp
Direct differentiation through the chain:
(bᵢ, aₑ) → lᵢⱼ → ζ₁₃/ζ₁₄/ζ₁₅ → αᵢⱼ / βᵢ
Relevant for meshes > 500 DOFs (current FD Hessian is slow there).
9c 4g-polygon boundary walk (genus g > 1)
→ Extend compute_fundamental_domain() beyond genus 1
Algorithm outline already in fundamental_domain.hpp as TODO(Phase 9).
Java reference: FundamentalDomainUtility.java
```
---
## ◼ Optional / Hypothetical — geometry-central Cross-Comparison
> **Status: no planned phase — purely exploratory.**
> These items are not prerequisites for Phase 810. They are
> of interest because geometry-central (Keenan Crane, CMU) is built on the same
> mathematical foundations as conformallab++ — in particular
> **Springborn 2020** and its direct extension by
> **Gillespie, Springborn & Crane (SIGGRAPH 2021)**.
> The key difference: geometry-central solves the same problem
> (discrete conformal equivalence) using **intrinsic triangulations +
> Ptolemaic flips**, while conformallab++ applies **Newton on the
> original triangulation**.
```
GC-1 [optional, possible now]
Mathematical output comparison
→ load the same test meshes (cathead.obj, brezel.obj, torus_4x4.off) into
both libraries
→ compare UV coordinates, u-vector, residual norm
→ align normalisation conventions (u mean, scaling)
Goal: independent cross-validation of convergence points.
Effort: small Python/C++ comparison script, no library restructuring.
GC-2 [optional, useful after Phase 8]
Intrinsic Delaunay pre-conditioning
→ before the Newton solver: apply geometry-central SignpostIntrinsicTriangulation
to the input
→ Ptolemaic flips pre-condition the Hessian matrix
→ hypothesis: fewer Newton iterations on non-Delaunay inputs
→ implementable as an optional cmake flag: -DWITH_GC_PRECOND=ON
Dependency: geometry-central as an optional external dependency
(header-only parts suffice for the flip algorithm).
GC-3 [hypothetical, Phase 10+ research]
Ptolemaic flip-based solver as an alternative backend
→ instead of Newton: Ptolemaic flips + penultimate-step normalisation
(GillespieSpringbornCrane 2021 algorithm)
→ comparison: convergence radius, robustness on pathological meshes,
numerical stability on high-genus surfaces
→ relevant for conformallab++ because the Newton approach can become
unstable on strongly non-Delaunay meshes (e.g. after remeshing).
No implementation planned — conceptual note for Phase 10 research.
```
**Connection to the literature:**
The Springborn 2020 paper ("Ideal Hyperbolic Polyhedra and Discrete
Uniformization") is already implemented in conformallab++ as the HyperIdeal
geometry mode (Phase 2/3). The GillespieSpringbornCrane
2021 extension — implemented in geometry-central — augments this with
intrinsic triangulations and makes the algorithm robust against
poor input triangulations. Both share the same
mathematical core (discrete conformal equivalence, GaussBonnet,
variational principle of BobenkoSpringborn 2004).
---
## ◼ New research — Phase 10+
No direct Java reference implementation exists for these items.
```
Phase 10 Global uniformization for genus g ≥ 2
10a Discrete holomorphic differentials
Integrate basis 1-forms ωᵢ along b-cycles of the cut graph.
Mathematical basis: BobenkoSpringborn (2004), §6.
Java partial reference: DiscreteHolomorphicFormUtility.java
10b Siegel period matrix Ω ∈ H_g (g×g complex symmetric, Im(Ω) > 0)
Ωᵢⱼ = ∫_{bⱼ} ωᵢ
Reduction to Siegel fundamental domain via Sp(2g,).
Requires: 10a
10c Full uniformization for genus g ≥ 2
Embedding as H²/Γ with Γ ⊂ PSL(2,) a Fuchsian group.
Requires: 10a + 10b + stable cut graph for g ≥ 2 (Phase 9c)
```