Tarik Moussa dd87b8007b
Some checks failed
C++ Tests / test-fast (push) Has been cancelled
C++ Tests / test-cgal (push) Has been cancelled
C++ Tests / test-fast (pull_request) Successful in 2m28s
API Docs / doc-build (pull_request) Successful in 52s
C++ Tests / test-cgal (pull_request) Failing after 11m29s
Phase 9a-Newton: newton_cp_euclidean + newton_inversive_distance
Wires the two Phase-9a functionals into the Newton-solver layer so
they are operational end-to-end.  CGAL test count: 212 → 219 (+7).

Solvers
───────
* newton_cp_euclidean(mesh, x0, m, tol, max_iter)
    - Uses cp_euclidean_hessian — analytic 2×2-per-edge BPS-2010
      formula h_jk = sin θ / (cosh Δρ − cos θ).
    - SparseQR fallback handles the gauge-singular case when no face
      is pinned (caller error, but we recover gracefully).
    - Strictly-convex energy ⇒ quadratic convergence near optimum.

* newton_inversive_distance(mesh, x0, m, tol, max_iter, hess_eps)
    - Uses an inline FD Hessian (n × gradient evaluations per step) —
      mirrors the Phase 4a HyperIdeal solver in spirit.
    - Analytic alternative via Glickenstein 2011 eq. (4.6) is tracked
      in doc/roadmap/research-track.md as Phase 9a.2-analytic.
    - Sensitive to initial point; the test suite always starts from
      a natural-theta setup (u = 0 is the equilibrium when
      compute_inversive_distance_init_from_mesh was called).

Tests (test_newton_phase9a.cpp, 7 cases)
────────────────────────────────────────
* CPEuclidean_NaturalPhi_ClosedTetrahedron_ConvergesInZeroIterations
* CPEuclidean_PerturbedStart_ConvergesBackToEquilibrium
* CPEuclidean_OpenTetrahedron_NaturalPhi_Converges
* InversiveDistance_NaturalTheta_Triangle_ConvergesInZero
* InversiveDistance_PerturbedQuadStrip_Converges
* InversiveDistance_PerturbedTetrahedron_Converges
* CPEuclidean_UsesAnalyticHessian
    Regression guard: 3-DOF problem converges in ≤ 10 iterations even
    with strong perturbation, confirming the analytic Hessian path is
    actually used.

All seven tests pass.  Full CGAL suite: 219/219 PASSED, 0 SKIPPED.

Roadmap additions (`doc/roadmap/phases.md`)
───────────────────────────────────────────
New Phase 11+ section flags two Java sub-packages as optional/deferred
ports, recorded for project memory but not roadmap commitments:

* 11a — Schottky uniformisation (Java plugin/schottky/*, ~3000 LoC)
        Hyperbolic loxodromic group acting on S²; complement of the
        Phase 10c Fuchsian-group representation in H².  Requires
        Phase 10b period matrix + Möbius-group machinery from Phase 7.
        Effort: very large (4-6 weeks).

* 11b — Riemann maps (Java plugin/riemannmap/*, ~1500 LoC)
        Discrete Riemann mapping theorem; texture mapping of bounded
        planar regions, classical conformal mapping for engineering.
        Requires Phase 10b' quasi-isothermic or Phase 9a.1 CP-Euclidean.
        Effort: large (3-4 weeks).

Both are explicitly NOT roadmap commitments — they live in the doc so
they aren't re-discovered.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 21:10:00 +02:00

conformallab++

CI License: MIT DOI

C++17 reimplementation of ConformalLab — Stefan Sechelmann's Java research library for discrete conformal geometry (TU Berlin). The long-term goal is a CGAL package for discrete conformal maps.

Algorithmic foundation:

Stefan Sechelmann — Variational Methods for Discrete Surface Parameterization: Applications and Implementation, TU Berlin 2016. DOI: 10.14279/depositonce-5415 · CC BY-SA 4.0 · Java original · sechel.de

Status: Phase 7 complete. Newton solver for all three geometries (Euclidean / Spherical / HyperIdeal), priority-BFS layout in ℝ²/S²/Poincaré disk, GaussBonnet, tree-cotree cut graph, Möbius holonomy, period matrix (genus 1), fundamental domain, halfedge_uv texture atlas, JSON/XML serialisation, CLI app. 176 CGAL tests + 36 non-CGAL tests.


Quick start

git clone https://codeberg.org/TMoussa/ConformalLabpp && cd ConformalLabpp

# Fast tests — no system dependencies
cmake -S code -B build && cmake --build build --target conformallab_tests -j$(nproc)
ctest --test-dir build --output-on-failure

# CGAL tests headless (apt install libboost-dev / brew install boost)
cmake -S code -B build -DWITH_CGAL_TESTS=ON
cmake --build build --target conformallab_cgal_tests -j$(nproc)
ctest --test-dir build -R "^cgal\." --output-on-failure

# Full build with CLI + viewer (requires Wayland/X11 dev headers)
cmake -S code -B build -DWITH_CGAL=ON && cmake --build build -j$(nproc)
./bin/conformallab_core -i input.off -g euclidean -o layout.off -j result.json

# API documentation (requires doxygen: brew/apt install doxygen)
cmake --build build --target doc
open doc/doxygen/html/index.html

Minimal usage

#include "conformal_mesh.hpp"
#include "mesh_io.hpp"
#include "euclidean_functional.hpp"
#include "gauss_bonnet.hpp"
#include "newton_solver.hpp"
#include "layout.hpp"

using namespace conformallab;

ConformalMesh mesh = load_mesh("input.off");
EuclideanMaps maps = setup_euclidean_maps(mesh);
compute_euclidean_lambda0_from_mesh(mesh, maps);

// Assign DOFs — pin first vertex (gauge fix)
auto vit = mesh.vertices().begin();
maps.v_idx[*vit++] = -1;
int idx = 0;
for (; vit != mesh.vertices().end(); ++vit) maps.v_idx[*vit] = idx++;

// Natural equilibrium target: x* = 0 by construction
std::vector<double> x0(idx, 0.0);
auto G0 = euclidean_gradient(mesh, x0, maps);
for (auto v : mesh.vertices())
    if (maps.v_idx[v] >= 0) maps.theta_v[v] -= G0[maps.v_idx[v]];

check_gauss_bonnet(mesh, maps);
NewtonResult res = newton_euclidean(mesh, x0, maps);
Layout2D layout = euclidean_layout(mesh, res.x, maps);

Documentation

Getting started — build modes, single-test invocation, CLI, Docker doc/getting-started.md
Pipeline API — all three geometries, holonomy, serialisation doc/api/pipeline.md
Public headers — all 24 headers with descriptions doc/api/headers.md
Test suites — 35 suites, 176+36 tests, individual counts doc/api/tests.md
Extending — new functionals, geometry modes, porting from Java doc/api/extending.md
Processing unit contracts — preconditions / provides table doc/api/contracts.md
CGAL package design — Phase 8 target, YAML pipeline doc/api/cgal-package.md
Architecture & pipeline diagram doc/architecture/overall_pipeline.md
geometry-central comparison — shared core, demarcation, adoption candidates, scientific added value doc/architecture/geometry-central-comparison.md
Design decisions — key architectural choices + rationale doc/architecture/design-decisions.md
Project structure — directory tree + build targets doc/architecture/project-structure.md
Discrete conformal theory — mathematical background for collaborators doc/math/discrete-conformal-theory.md
Validation — known analytic results + how to verify them doc/math/validation.md
Validation protocol — concrete commands with expected outputs doc/math/validation-protocol.md
Tutorial: add a new functional — step-by-step Inversive-Distance port doc/tutorials/add-inversive-distance.md
Declarative YAML pipeline — concept, token vocabulary, 5 examples doc/concepts/declarative-pipeline.md
Geometry modes — Euclidean / Spherical / HyperIdeal comparison doc/math/geometry-modes.md
References — all papers by module doc/math/references.md
Software landscape — how conformallab++ relates to libigl, CGAL, geometry-central doc/math/software-landscape.md
Novelty statement — unique features, target audience, what this is not doc/math/novelty-statement.md
Complexity & scalability — O() analysis, measured timings on real meshes, HyperIdeal bottleneck doc/math/complexity.md
Roadmap — Phases 110 doc/roadmap/phases.md
Java parity table — what is ported, what is planned doc/roadmap/java-parity.md
Contributing — language policy, test standards, release flow doc/contributing.md
Claude Code context CLAUDE.md

Citing

If you use conformallab++ in your research, please cite it using the metadata in CITATION.cff. GitHub and Codeberg show a "Cite this repository" button that generates BibTeX and APA automatically.

The primary algorithmic source is:

Stefan Sechelmann — Variational Methods for Discrete Surface Parameterization: Applications and Implementation, TU Berlin 2016. DOI: 10.14279/depositonce-5415


Bugs & questions


License

conformallab++ is released under the MIT License (see LICENSE).
Copyright © 20242026 Tarik Moussa.
The dissertation (Sechelmann 2016) is CC BY-SA 4.0.

Description
ConformalLab C++ port
Readme MIT Cite this repository 235 MiB
Languages
C++ 94.8%
Shell 2.7%
CMake 1.4%
Python 0.9%
C 0.2%