A full audit of `doc/` plus root-level markdown files (27 files) against
the actual ground truth in the C++ code and the local Java repository at
`/Users/tarikmoussa/Desktop/conformallab/` revealed four pre-existing
mis-labels and a stale test count. All are corrected here.
Audit findings — corrected
─────────────────────────
1. **`InversiveDistanceFunctional` mis-labelled as Java port** (4 doc sites)
Empirical verification:
find /Users/tarikmoussa/Desktop/conformallab -iname "*nversive*"
(zero matches)
The class does NOT exist in `de.varylab.discreteconformal`. The C++
implementation is built from Luo 2004 + Glickenstein 2011 + Bowers-
Stephenson 2004 — new research, not a port.
Fixed in: java-parity.md, references.md, add-inversive-distance.md.
2. **HyperIdeal Hessian mis-labelled as "Java has analytic Hessian"**
Empirical verification: `HyperIdealFunctional.java:295-298`:
public boolean hasHessian() { return false; }
Java has NO Hessian at all. Both the FD (Phase 4a) and the block-FD
(Phase 9b) Hessians in C++ are research beyond the Java port. The
chain rule (b,a) → ℓ → ζ → α/β is the *mathematical formulation*
from Springborn 2020, not something Java implements.
Fixed in: java-parity.md.
3. **Stale test count** README:87 said "28 suites, 170 tests" — current
actual is 35 suites, 176 CGAL + 36 non-CGAL. Fixed.
4. **Tutorial framing** — `add-inversive-distance.md` was framed as
"porting an InversiveDistanceFunctional.java" that does not exist.
Rewritten as "Implementing the Inversive-Distance functional from
Luo 2004" with prominent verification block at top.
New document: `doc/roadmap/research-track.md`
─────────────────────────────────────────────
Consolidates everything in conformallab++ that goes beyond a Java port:
* Items already on `main`: HyperIdeal FD Hessian, period matrix τ
partial-research components, Möbius holonomy storage.
* Items on open PRs: CP-Euclidean (PR #8, port), Inversive-Distance
(PR #8, research), block-FD Hessian (PR #9, research).
* Planned research with full citations:
- **Phase 9b-analytic** — full analytic HyperIdeal Hessian via
Schläfli identity (Schläfli 1858/60) and chain rule through
ζ₁₃/ζ₁₄/ζ₁₅, citing Springborn 2020 §4, Cho-Kim 1999,
Glickenstein 2011 §4. Includes acceptance-criteria checklist
(per-case derivative cross-checks, gauge null space, PSD,
measured ≥ 3× speed-up, LaTeX correctness note).
- **Phase 9a.2-analytic** — analytic inversive-distance Hessian
via Glickenstein 2011 eq. (4.6).
- **Phase 10c** — full uniformization for genus g ≥ 2 (Fuchsian
group representation) — fully new research, no Java reference.
- **geometry-central** GC-1/2/3 exploratory track.
* Java backlog summary: 11 worth-porting Java classes identified by
the parallel survey (FundamentalPolygonUtility, DiscreteHarmonicForm-
Utility, DiscreteHolomorphicFormUtility, CanonicalBasisUtility,
HyperbolicCyclicFunctional, QuasiisothermicUtility, KoebePolyhedron, …).
~6 500 Java lines, ~5 months of porting work, organised by phase.
Updated documents
─────────────────
* CLAUDE.md
- New "Port-vs-research maintenance rule" with empirical verification
command and the four corrected mis-labels.
- Doc map: 23 → 24 documents (research-track.md added).
* README.md
- Test count corrected (170 → 176+36).
* doc/math/references.md
- Luo 2004 entry corrected ("new research" instead of "not yet ported").
- New entries for Bowers-Stephenson 2004, Glickenstein 2011,
Bobenko-Pinkall-Springborn 2010, Schläfli 1858/60.
* doc/roadmap/phases.md
- Phase 9 reorganised: 9a split into 9a.1 (port) / 9a.2 (research),
9b clarified as research (Java has no Hessian), 9c expanded with
Java line counts and effort estimates.
- Phase 10 reorganised: 10a/10b/10c with their Java prerequisites
explicitly listed; 10c flagged as "fully new research".
- Phase 10b' added: parallel research track (hyperbolic functional,
quasi-isothermic, Möbius centering).
- Phase 10c' added: optional Java-port additions (Koebe, circle
patterns, electrostatic sphere).
* doc/roadmap/java-parity.md
- Inversive-distance row: ❌ Java, ❌ C++ (Phase 9a.2) — new research.
- CP-Euclidean row added: ✅ Java, ❌ C++ (Phase 9a.1) — port.
- HyperIdeal Hessian row: ❌ Java, ⚠️ FD + block-FD in C++.
- Worth-porting table replaced with the survey results (12 classes,
Java line counts, suggested phases).
- "HyperIdeal Hessian: FD vs analytic" section rewritten with the
correction notice.
* doc/tutorials/add-inversive-distance.md
- Rewritten end-to-end with prominent verification block at top.
- Now correctly framed as "Implementing the Inversive-Distance
functional from Luo 2004" — research, not port.
- Includes the four required cross-validations:
limit cases, Bowers-Stephenson round-trip, FD-vs-analytic,
cross-validation against euclidean_functional at u=0.
- New "How to know if it's a port or research" closing section
with the empirical verification command.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.7 KiB
Java ConformalLab vs. conformallab++ — Feature Parity
Reference: github.com/varylab/conformallab
Java package root: de.varylab.discreteconformal
When porting a Java class, locate the original in the Java repository and use it as the reference implementation for expected behaviour, edge cases, and test cases.
Algorithm parity
| Mathematical layer | Java ConformalLab | conformallab++ | Notes |
|---|---|---|---|
| Euclidean functional — energy, gradient | ✅ | ✅ | |
| Spherical functional — energy, gradient, gauge-fix | ✅ | ✅ | |
| HyperIdeal functional — energy, gradient | ✅ | ✅ | |
| Inversive-distance functional (Luo 2004) | ❌ (not in Java) | ❌ Phase 9a.2 | No Java source. Implemented in C++ from Luo 2004 + Glickenstein 2011 + Bowers-Stephenson 2004 — new research, not a port. Verified: find /Users/tarikmoussa/Desktop/conformallab -iname "*nversive*" returns zero. |
| CP-Euclidean functional (BPS 2010) | ✅ | ❌ Phase 9a.1 | CPEuclideanFunctional.java (260 lines) — face-based circle packing |
| Euclidean Hessian — cotangent Laplacian | ✅ analytic | ✅ analytic | Pinkall–Polthier (1993) |
| Spherical Hessian — ∂α/∂u via law of cosines | ✅ analytic | ✅ analytic | |
| HyperIdeal Hessian — analytic via ζ → l → β/α | ❌ (hasHessian()==false) |
⚠️ FD (Phase 4a) → block-FD (Phase 9b) | Java has NO Hessian for HyperIdeal (verified: HyperIdealFunctional.java:295-298 declares hasHessian() { return false; }). Both C++ Hessian variants are new research beyond Java; analytic Schläfli-based variant is Phase 9b-analytic. |
| Newton solver | ✅ | ✅ | |
| SparseQR fallback for gauge modes | unknown | ✅ | New in C++ |
| Cone metrics — prescribed Θᵥ ≠ 2π | ✅ fully | ⚠️ data structure only | |
| Layout / embedding — ℝ² / H² / S² | ✅ | ✅ priority-BFS all three | |
| Exact hyperbolic trilateration | ✅ Möbius | ✅ Möbius + law of cosines | |
| halfedge_uv — seam-aware UV (texture atlas) | ✅ | ✅ | |
| Gauss–Bonnet consistency check | ✅ | ✅ | |
| Tree-cotree cut graph (2g edges) | ✅ | ✅ Erickson–Whittlesey (2005) | |
| Holonomy — Euclidean (translations) | ✅ | ✅ | |
| Holonomy — Hyperbolic (SU(1,1) Möbius maps) | ✅ | ✅ | |
| Period matrix τ — genus 1, SL(2,ℤ)-reduced | ✅ | ✅ | |
| Fundamental domain — genus 1 | ✅ | ✅ CCW parallelogram | |
| 4g-polygon boundary walk — genus g > 1 | ✅ | ❌ Phase 9c | FundamentalDomainUtility.java |
| Siegel period matrix Ω — genus g ≥ 2 | ✅ | ❌ Phase 10b | |
| Global uniformization — genus g ≥ 2 | ✅ | ❌ Phase 10c | |
| Clausen / Lobachevsky / ImLi₂ | ✅ | ✅ | |
| Poincaré disk / Lorentz boost visualisation | ✅ | ✅ | |
| Mesh I/O + serialisation | ✅ XML/CoHDS | ✅ OFF/OBJ/PLY + JSON/XML | |
| Interactive viewer | ✅ jReality | ✅ libigl/GLFW |
Java utility classes not yet ported
These exist in de.varylab.discreteconformal.util in the Java library.
They are candidates for Phase 9 or Phase 10.
| Java class | Description | Phase |
|---|---|---|
CPEuclideanFunctional |
Face-based circle-packing energy (BPS 2010) | 9a.1 |
FundamentalPolygonUtility (698 lines) |
Construction + canonicalisation of 4g-gons for genus-g | 9c |
CanonicalFormUtility (532 lines) |
High-level wrapper for 9c — drives canonicalisation pipeline | 9c |
CuttingUtility + SurgeryUtility (~800 lines) |
Mesh cuts and gluing operations needed for fundamental domains | 9c (foundation) |
DiscreteHarmonicFormUtility (657 lines) |
Discrete harmonic 1-forms via cotangent Laplacian (Hodge theory) | 10a prerequisite |
DiscreteHolomorphicFormUtility (285 lines) |
Holomorphic differentials via Mercat complex structure | 10a (Bobenko-Springborn 2004 §6) |
CanonicalBasisUtility (337 lines) |
Symplectic homology basis with intersection-form normalisation | 10a prerequisite |
DiscreteRiemannUtility (186 lines) |
Period matrix τ, Siegel reduction (genus g) | 10b |
DualityUtility (308 lines), HomologyUtility (122 lines) |
Primal/dual cohomology, cycle generators | 10a support |
HyperbolicCyclicFunctional (530 lines) |
Discrete hyperbolic conformal energy (analogue of Euclidean) — completes the geometry suite | 10b–c |
QuasiisothermicUtility + SinConditionApplication (~1200 lines) |
Lawson-correspondence parametrisation, sin-condition functional | 10b |
KoebePolyhedron (321 lines) |
Koebe–Andreev–Thurston circle-packing construction | 10c |
ElectrostaticSphereFunctional, MobiusCenteringFunctional |
Sphere-domain pre-processing functionals | 10c (optional) |
Note: items marked as new research (e.g. Inversive Distance, HyperIdeal Hessian variants)
are tracked separately in doc/roadmap/research-track.md.
| HomotopyUtility | Homotopy generators | 9c |
| SpanningTreeUtility | Spanning tree algorithms | 8 / infrastructure |
| SurgeryUtility | Mesh surgery (cut/glue) | — |
| StitchingUtility | Seam stitching | — |
| CuttingUtility | Advanced cutting (beyond tree-cotree) | 9c |
| HyperellipticUtility | Hyperelliptic surfaces | 10 |
| LaplaceUtility | Discrete Laplace operators | 9 / infrastructure |
| ConformalStructureUtility | Conformal structure extraction | 10 |
HyperIdeal Hessian — correction of an earlier mis-claim
2026-05-21 audit: A previous version of this document claimed "the Java library computes the HyperIdeal Hessian analytically through the chain (bᵢ, aₑ) → lᵢⱼ → ζ₁₃/ζ₁₄/ζ₁₅ → αᵢⱼ/βᵢ". This is incorrect. The Java source file
HyperIdealFunctional.javaline 295-298 declares@Override public boolean hasHessian() { return false; }i.e. the upstream Java implementation supplies no HyperIdeal Hessian at all — neither analytic nor numerical. The chain rule above is the mathematical formulation (from Springborn 2020 §4 + Schläfli 1858), not something the Java code implements.
Actual state of HyperIdeal Hessian in conformallab++
| Variant | Status | Notes |
|---|---|---|
Phase 4a — full FD H[i,j] = (G(x+εeⱼ)[i] − G(x−εeⱼ)[i]) / (2ε) |
✅ implemented | O(n·F) cost; PSD by Springborn 2020 strict convexity |
| Phase 9b — block-FD (per-face 6×6 local block, scatter to global) | ✅ implemented (PR #9) | O(F·36) cost; ~96× speed-up over Phase 4a measured on V=200 mesh |
| Phase 9b-analytic — Schläfli identity + chain rule through ζ₁₃/ζ₁₄/ζ₁₅ | 🔲 planned (research) | See doc/roadmap/research-track.md for the formal plan and citations |
All three are new research beyond the Java port. Java parity for HyperIdeal stops at the gradient.