Files
ConformalLabpp/doc/roadmap/java-parity.md
Tarik Moussa 4f0a3035e4
Some checks failed
C++ Tests / test-fast (push) Successful in 2m50s
C++ Tests / test-fast (pull_request) Successful in 2m36s
API Docs / doc-build (pull_request) Successful in 1m10s
C++ Tests / test-cgal (push) Has been skipped
C++ Tests / test-cgal (pull_request) Failing after 10m25s
docs: full audit — fix 4 wrong port/research labels + consolidated research-track
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>
2026-05-21 20:48:16 +02:00

6.7 KiB
Raw Blame History

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 PinkallPolthier (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)
GaussBonnet consistency check
Tree-cotree cut graph (2g edges) EricksonWhittlesey (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 10bc
QuasiisothermicUtility + SinConditionApplication (~1200 lines) Lawson-correspondence parametrisation, sin-condition functional 10b
KoebePolyhedron (321 lines) KoebeAndreevThurston 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.java line 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.