docs: refine Phase 8 strategy to Hybrid MVP — MVP first, port second
Some checks failed
C++ Tests / test-fast (push) Successful in 1m59s
C++ Tests / test-fast (pull_request) Successful in 2m17s
C++ Tests / test-cgal (push) Has been skipped
C++ Tests / test-cgal (pull_request) Failing after 2m27s

Re-evaluated cost/benefit of Phase 8 vs Phase 9 after distinguishing three
concurrent goals:
  • Goal A (Port):    ~90% done, ~3 weeks remaining
  • Goal B (CGAL):    speculative, 12+ months, uncertain submission
  • Goal C (Tool):    research utility with novel features

Phase 8 full (3–4 weeks) would mostly serve Goal C plus optional Goal B.
Phase 9 (3 weeks) finishes Goal A unconditionally. Building Phase 8 in
full before Phase 9 risks 3-4 weeks of speculative architecture for a
hypothetical CGAL submission.

New strategy: Hybrid MVP.

  Phase 8 MVP (3–5 days):
    Conformal_map_traits.h    concept + Default<Surface_mesh,K>
    Discrete_conformal_map.h  ONE entry: _euclidean()
    4 named parameters        Theta-map, max_iter, tol, pin
    Concept-check header + Doxygen

  Phase 9a (3–5 days): Inversive-Distance vs MVP API = acceptance test
  Phase 9b + 9c (~2 weeks): Port truly complete

  Phase 8 extensions: Only on concrete trigger
    8a.2 generic FaceGraph        trigger: Polyhedron_3 user
    8c full doc                   trigger: submission planned
    8d CGAL-format tests          trigger: submission planned
    8e YAML pipeline              orthogonal, any time

Net committed budget: ~4 weeks for "port complete + CGAL MVP",
not 6–8 weeks for full Phase 8 + Phase 9.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tarik Moussa
2026-05-19 20:04:38 +02:00
parent 02fb80ee3e
commit 4971f0254d
2 changed files with 122 additions and 29 deletions

View File

@@ -253,19 +253,34 @@ Phase 7 is complete. Phase 7.5 (Doxygen) and Phase 8 (CGAL package) are next.
## Phase 8 strategic decisions (2026-05-19) ## Phase 8 strategic decisions (2026-05-19)
The CGAL-package architecture was frozen on 2026-05-19 after the end-of-Phase-7 The CGAL-package architecture was frozen on 2026-05-19. Full design:
docstring audit. Full design: [`doc/api/cgal-package.md`](doc/api/cgal-package.md). [`doc/api/cgal-package.md`](doc/api/cgal-package.md). Key decisions:
Key decisions:
| Decision | Choice | | Decision | Choice |
|---|---| |---|---|
| Submission to upstream CGAL | **Pre-submission-ready, not bound.** 12+ months horizon. | | Submission to upstream CGAL | **Pre-submission-ready, not bound.** 12+ months horizon. |
| License | **MIT preserved** (no LGPL switch). | | License | **MIT preserved** (no LGPL switch). |
| Mesh-type flexibility | **Generic `FaceGraph + HalfedgeGraph`** — Surface_mesh, Polyhedron_3, OpenMesh-adapter, pmp. | | Mesh-type flexibility | **Generic `FaceGraph + HalfedgeGraph`** in target design; MVP starts Surface_mesh-only. |
| Parameter style | **Named Parameters** (`CGAL::parameters::...`). | | Parameter style | **Named Parameters** (`CGAL::parameters::...`). |
| Default kernel | **`Simple_cartesian<double>`** (status quo). | | Default kernel | **`Simple_cartesian<double>`** (status quo). |
| Backward compatibility | **Dual-layer wrapper**`code/include/*.hpp` stays as implementation, `include/CGAL/*.h` is thin wrapper. No algorithm duplication. | | Backward compatibility | **Dual-layer wrapper**`code/include/*.hpp` stays as implementation, `include/CGAL/*.h` is thin wrapper. No algorithm duplication. |
| Phase-8a acceptance test | **Phase 9a (Inversive-Distance)** as the first new client of the new traits API. | | Implementation strategy | **Hybrid MVP** — minimum Phase 8 (traits + one wrapper) first, then Phase 9 in full, then Phase 8 extensions only on concrete demand. |
| Phase-8 MVP acceptance test | **Phase 9a (Inversive-Distance)** as the first new client of the new traits API. |
### Implementation sequence (committed)
```
1. Phase 7.5 Doxygen + cleanup done ✅
2. Phase 8 MVP — traits + one euclidean wrapper 35 days
3. Phase 9a — Inversive-Distance against new traits 35 days
4. Phase 9b — analytic HyperIdeal Hessian 1 week
5. Phase 9c — 4g-polygon for genus g > 1 1 week
→ port really complete, v0.9.0 release
```
Phase 8 extensions (8a.2 generic FaceGraph, 8c full Doxygen manuals, 8d
CGAL-format tests, 8e YAML pipeline) are deferred to on-demand status —
no speculative architecture for an uncertain submission.
Root-level files added at v0.7.0: Root-level files added at v0.7.0:
- `CITATION.cff` — machine-readable citation (Sechelmann 2016, Springborn 2020, BobenkoSpringborn 2004) - `CITATION.cff` — machine-readable citation (Sechelmann 2016, Springborn 2020, BobenkoSpringborn 2004)

View File

@@ -290,36 +290,114 @@ If any of these fail, the design is iterated before continuing.
--- ---
## Implementation order ## Implementation strategy — "Hybrid MVP" (decided 2026-05-19)
After cost/benefit re-evaluation, the plan is **not** to build Phase 8 in full
before resuming the port. Instead:
``` ```
1. Phase 7.5 Doxygen infrastructure + duplicate cleanup (½1 day) ┌────────────────────────────────────────────────────────────────────┐
2. Phase 8a.1 ConformalMapTraits concept + Default_traits (23 days) PHASE 8 MVP (35 days) │
3. Phase 8a.2 Generic FaceGraph specialisation (2 days) │ ───────────────────── │
4. Phase 8b.1 Discrete_conformal_map.h entry point (2 days) │ Just enough CGAL-style architecture for Phase 9a to validate it. │
5. Phase 8b.2 Layout + cut graph wrappers (2 days) │ │
6. Phase 9a Inversive-Distance against new traits = API test (35 days) │ • Conformal_map_traits.h concept + Default<Surface_mesh,K> │
7. Phase 8c PackageDescription.txt + User_manual.md (2 days) │ • Discrete_conformal_map.h ONE entry: _euclidean()
8. Phase 8d CGAL-format test directory (12 days) │ • 4 named parameters Θ-map, max_iter, tol, pin │
9. Phase 8e YAML pipeline + CLI flag (3 days) │ • Concept-check header
│ • Doxygen on these 3 headers │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ PHASE 9a — Inversive-Distance (35 days) │
│ ────────────────────────────────── │
│ Built directly against the new traits API. This is the │
│ acceptance test for the MVP. │
│ │
│ If painless → MVP design is sound, continue with Phase 9b/9c │
│ If painful → iterate the traits design before going further │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ PHASE 9b — Analytic HyperIdeal Hessian (1 week) │
│ PHASE 9c — 4g-polygon fundamental domain (1 week) │
│ ──────────────────────────────────────── │
│ Port really finished. v0.9.0 release possible. │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ PHASE 8 EXTENSIONS — only on demand │
│ ───────────────────────────────── │
│ • 8a.2 generic FaceGraph specialisation when Polyhedron_3 user │
│ • 8b extend to spherical + hyperbolic when 9a pattern proven │
│ • 8c full User_manual + Reference_manual when submission planned│
│ • 8d CGAL-format test directory when submission planned│
│ • 8e YAML pipeline + CLI flag orthogonal, any time │
│ │
│ Each extension only when there is a concrete trigger. No │
│ speculative architecture for a hypothetical CGAL submission. │
└────────────────────────────────────────────────────────────────────┘
``` ```
**Total budget: 34 weeks net work, 68 weeks calendar.** **Why this order?**
- Port-completion (Phase 9) is the higher-confidence value: well-defined,
~3 weeks of work, finishes Goal A.
- Full Phase 8 (34 weeks) speculative — only pays off if CGAL submission
actually happens, which is uncertain.
- Phase 8 MVP captures the architectural insight (traits + named params)
without the long tail. If the rest of Phase 8 is ever wanted, it's
additive — nothing built in the MVP needs to be thrown away.
**Total committed budget: 2 weeks (MVP + 9a) + 2 weeks (9b + 9c) = ~4 weeks
net work, 68 weeks calendar.** After that, the port is finished.
## Phase 8 MVP scope — what is and isn't in the first cut
| Item | MVP | Later | Reason |
|---|:---:|:---:|---|
| `Conformal_map_traits.h` concept | ✅ | — | Core abstraction |
| `Default_conformal_map_traits<Surface_mesh, K>` | ✅ | — | Status-quo wrapper |
| Generic `FaceGraph` specialisation | — | ✅ 8a.2 | Speculative until asked |
| `Discrete_conformal_map.h``_euclidean()` | ✅ | — | First entry function |
| `Discrete_conformal_map.h``_spherical()`, `_hyperbolic()` | — | ✅ 8b.2 | Pattern-replicates once 9a works |
| Named parameters: `vertex_curvature_map`, `max_iterations`, `gradient_tolerance`, `fixed_vertex_pmap` | ✅ | — | Essential 4 |
| Named parameters: rest (`output_uv_map`, `cut_graph`, …) | — | ✅ 8b.2 | Additive |
| Doxygen on MVP headers | ✅ | — | Same time anyway |
| Doxygen on legacy `code/include/*` | partial | ✅ 8c | Bulk later |
| `PackageDescription.txt` | — | ✅ 8c | Only if submitting |
| User_manual.md | — | ✅ 8c | Only if submitting |
| `test/Conformal_map/` CGAL-style | — | ✅ 8d | Only if submitting |
| YAML pipeline + CLI flag | — | ✅ 8e | Orthogonal, any time |
--- ---
## TODO checklist ## TODO checklist
- [ ] Phase 7.5: Doxyfile + CMake doc target + duplicate cleanup ### MVP track (committed work, ~4 weeks)
- [ ] 8a.1: `ConformalMapTraits` concept header - [x] Phase 7.5: Doxyfile + CMake doc target + duplicate cleanup
- [ ] 8a.1: `Default_conformal_map_traits<Surface_mesh, K>` - [ ] **Phase 8 MVP — Traits + one wrapper**
- [ ] 8a.2: Generic `FaceGraph` specialisation - [ ] `Conformal_map_traits.h` — concept documentation
- [ ] 8a.2: `Conformal_map_concept_checks.h` - [ ] `Default_conformal_map_traits<Surface_mesh, K>`
- [ ] 8b.1: `Discrete_conformal_map.h` (3 entry functions) - [ ] `Conformal_map_concept_checks.h`
- [ ] 8b.1: Named-parameter vocabulary header - [ ] `Discrete_conformal_map.h` with `_euclidean()` only
- [ ] 4 named parameters: Θ-map, max_iter, tol, pin
- [ ] Test: `cgal.ConformalTraits.Surface_mesh_default_works`
- [ ] **Phase 9a — Inversive-Distance (acceptance test for MVP)**
- [ ] `inversive_distance_functional.hpp` against new traits
- [ ] Gradient check + Newton convergence tests
- [ ] Doxygen on new headers
- [ ] **Phase 9b — Analytic HyperIdeal Hessian**
- [ ] Replace FD in `hyper_ideal_hessian.hpp`
- [ ] Symmetry + PSD checks unchanged
- [ ] **Phase 9c — 4g-polygon for genus g > 1**
- [ ] Extend `compute_fundamental_domain()` beyond genus 1
### On-demand track (only with concrete trigger)
- [ ] 8a.2: Generic `FaceGraph` specialisation (trigger: Polyhedron_3 user)
- [ ] 8b.2: `_spherical()` + `_hyperbolic()` entry functions (trigger: pattern proven)
- [ ] 8b.2: `Conformal_layout.h`, `Conformal_cut_graph.h` wrappers - [ ] 8b.2: `Conformal_layout.h`, `Conformal_cut_graph.h` wrappers
- [ ] 9a: `inversive_distance_functional.hpp` written against new traits - [ ] 8c: `doc/Conformal_map/PackageDescription.txt` (trigger: submission planned)
- [ ] 8c: `doc/Conformal_map/PackageDescription.txt` - [ ] 8c: User_manual + Reference_manual (trigger: submission planned)
- [ ] 8c: User_manual + Reference_manual - [ ] 8d: `test/Conformal_map/` CGAL-style tests (trigger: submission planned)
- [ ] 8d: `test/Conformal_map/` CGAL-style tests - [ ] 8e: YAML validator + CLI `--pipeline` flag (orthogonal, any time)
- [ ] 8e: YAML validator + CLI `--pipeline` flag