Tarik Moussa
3f124eb071
feat(phase4): HyperIdeal Newton solver, SparseQR fallback, examples, docs
...
Phase 4 complete — 87 CGAL tests pass, 2 skipped.
Newton solver (phase4a):
- hyper_ideal_hessian.hpp: symmetric FD Hessian (O(ε²), PSD by convexity)
- newton_hyper_ideal(): Newton + backtracking for the HyperIdeal functional
- detail::solve_with_fallback(): optional bool* fallback_used parameter
- solve_linear_system(): public API exposing LDLT→SparseQR fallback
SparseQR fallback tests (SparseQRFallback.*):
- FullRankSystem_CorrectSolution: LDLT path, fallback_used=false
- SingularMatrix_FallbackActivated: zero-pivot → QR activated, fallback_used=true
- Euclidean_ClosedMeshNoPinConverges: gauge-mode null space handled via QR
HyperIdeal Newton tests (NewtonSolver.HyperIdeal_*):
- ConvergesTriangleAllVariable, ResultFieldsConsistent,
ConvergesTetrahedron, SparseQRFallbackNoCrash
- Natural-target base point (b=1.0, a=0.5) — x=0 is degenerate in log-space
Pipeline tests (test_pipeline.cpp):
- End-to-end: all three geometries, mesh I/O round-trip, solve+export
Example programs (code/examples/):
- example_euclidean.cpp: headless Euclidean pipeline
- example_hyper_ideal.cpp: headless HyperIdeal pipeline
- example_viewer.cpp: interactive libigl viewer with jet colour map
README:
- Mathematical scope table: C++ vs Java original (18 rows)
- "For mathematicians" section: mental model, step-by-step new-functional
guide, half-edge traversal snippets, recommended reading
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-13 00:11:25 +02:00
Tarik Moussa
5841646017
docs: update README — Phase 3 vollständig abgeschlossen (62 Tests)
...
Mark all Phase 3 sub-phases (3a–3g) as done in the roadmap.
Add euclidean_hessian and spherical_hessian to the feature table.
Update status banner: 62 tests, Phase 4 is next.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-05-12 17:25:26 +02:00
Tarik Moussa
8c353bb884
feat(phase3d+3e): port EuclideanCyclicFunctional + add SphericalFunctional gauge-fix
...
Phase 3d — EuclideanCyclicFunctional:
• euclidean_geometry.hpp: t-value / atan2 corner-angle formula with
centering trick (μ = (Λ̃₁₂+Λ̃₂₃+Λ̃₃₁)/6) for numerical stability
• euclidean_functional.hpp: EuclideanMaps bundle, gradient (G_v = Θ_v − Σα_v,
G_e = α_opp⁺ + α_opp⁻ − φ_e), 10-point GL path-integral energy,
gradient_check_euclidean — identical halfedge convention to SphericalFunctional
• test_euclidean_functional.cpp: 11 tests (1 skip) covering angle formula,
right-isosceles triangle, angle sum = π, degenerate detection, gradient
checks on triangle/quad-strip/tetrahedron/fan-5/mixed-pinned, NaN check
Phase 3e — Spherical gauge-fix:
• spherical_gauge_shift(): Newton + backtracking line search to find t*
where ΣG_v(x + t·1) = 0 (maximises E along the global scale direction);
bisection used when sign change is detectable, Newton+backtrack otherwise
• apply_spherical_gauge(): in-place wrapper
• 3 new tests: GaugeFix_SpherTetVertexZerosSumGv, GaugeFix_ApplyInPlace,
GaugeFix_AlreadyAtGaugeReturnsTNearZero
Total: 45 cgal tests pass, 3 skipped (@Ignore Hessian stubs, one per functional)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-12 07:39:14 +02:00
Tarik Moussa
dc0d3ca005
docs: add Phase 3d–4b roadmap to README
...
Six concrete next steps toward Phase 3 completion and Phase 4 (solver):
3d EuclideanCyclicFunctional — most critical missing functional
3e Spherical gauge-fix (1D Brent along additive u constant)
3f Analytic Hessian via CGAL::Weights::cotangent_weight()
3g Consolidate duplicate PI constant
4a Minimal Newton solver with Eigen SimplicialLDLT
4b CGAL::IO read/write OBJ for mesh round-trip testing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-12 00:25:36 +02:00
Tarik Moussa
a4c2a89e7e
feat(phase3c): port SphericalFunctional onto ConformalMesh; update README
...
New headers:
- spherical_geometry.hpp: spherical arc length l(λ) and half-angle formula
for interior angles of a spherical triangle (SphericalFaceAngles struct)
- spherical_functional.hpp: SphericalMaps bundle, setup/assign DOF helpers,
compute_lambda0_from_mesh(), gradient (Θ_v − Σα_v; Schläfli edge formula),
energy via 10-point Gauss-Legendre path integral, gradient_check_spherical()
Updated:
- mesh_builder.hpp: add make_spherical_tetrahedron() (vertices on unit sphere)
and make_octahedron_face() (single right-angled spherical triangle)
- tests/cgal/CMakeLists.txt: enable test_spherical_functional.cpp
- README.md: rewrite for CGAL-package goal, two test targets, all headers,
updated project tree, Phase progress table, key design decisions
Tests (cgal.SphericalFunctional.*): 8 active + 1 skip
- OctaFaceAnglesAreRightAngles, SpherTetAngleSumExceedsPi
- GradientCheck_{OctaFaceVertex, SpherTetVertex, SpherTetAllDofs,
SpherFan4Vertex, MixedPinnedVertices}
- AnglesFiniteAtKnownPoint
All 30 cgal.* tests pass (2 @Ignore skips).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-12 00:01:24 +02:00
Tarik Moussa
e59f79a8e2
docs + ci: update README, add ci-cpp Docker image, use container in workflow
...
README:
- Remove stale Boost mention (unused dep, removed yesterday)
- Document three build modes (tests-only / WITH_VIEWER / WITH_CGAL)
with a comparison table and per-mode cmake commands
- Add project structure overview
- Fix C++20 → C++17 (actual standard used)
- Fix clone URL and getting-started commands
- Add CI section with Dockerfile build instructions
CI:
- Add .gitea/docker/Dockerfile.ci-cpp — ubuntu:22.04 with cmake,
g++, git, and Node.js 20 pre-installed (Node.js needed for
actions/checkout@v4 inside containers)
- Update cpp-tests.yml to use ci-cpp container instead of installing
build tools on every run; add JUnit XML output and summary step
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-09 21:49:44 +02:00
Tarik Moussa
d134add5a6
update readme
2026-03-07 11:25:56 +02:00
Tarik Moussa
14c825dcf0
v0
2026-03-06 21:55:16 +02:00
Tarik Moussa
e1a90dbd85
fix typo
2026-03-06 21:43:54 +02:00
Tarik Moussa
a140f439a6
README.md
2026-02-09 20:05:35 +02:00
user2595
a0dbdb8818
Initial commit
2026-02-09 18:39:03 +01:00