feat(pineal): cierra stub flow — diagrama Sankey

Fase F: quinto stub de pineal cerrado.

- layout — pipeline Sankey: columnas por longest-path en el DAG
  (back-edges detectadas por DFS y descartadas para romper ciclos),
  valor de nodo = max(entrante, saliente), apilado vertical por columna
  escalado a la altura, una pasada de barycenter para reducir cruces,
  anclas de cada banda en los bordes de sus nodos.
- ribbon — teselado de bandas como triangle-strip con curva S
  (x lineal, y por smoothstep → tangentes horizontales). paint_ribbon
  + paint_sankey (ribbons al fondo, nodos encima).

Painters agnósticos (trait Canvas). 6 tests verdes (columnas, ciclos
sin loop infinito, proporcionalidad, conteo de draw calls).

Pineal: 5/6 stubs cerrados. Resta mesh (viz de grafos: force-directed
+ Sugiyama + tree layout — módulo, no stub).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-20 15:06:58 +00:00
parent 94ea0eaa53
commit 0042fe3f1f
3 changed files with 418 additions and 11 deletions
+13 -11
View File
@@ -1,16 +1,18 @@
//! `pineal-flow` — diagramas Sankey.
//!
//! Pipeline (sección 3.7 del ARCHITECTURE.md):
//! 1. Columnas via longest-path en el DAG (back-edges drop).
//! 2. Flow por nodo = max(in_value, out_value).
//! 3. Barycenter ordering con inversion-count crossings.
//! 4. Stripes por edge dentro de cada lado del nodo.
//! 5. Ribbons como triangle-strip de béziers, un draw call por
//! ribbon, color por vértice.
//! Pipeline:
//! 1. Columnas por longest-path en el DAG (back-edges descartadas).
//! 2. Valor de nodo = max(caudal entrante, caudal saliente).
//! 3. Apilado vertical por columna + una pasada de barycenter.
//! 4. Bandas (ribbons) como triangle-strips con curva S (`smoothstep`).
//!
//! - [`layout`] — cómputo del layout (agnóstico).
//! - [`ribbon`] — teselado + painters contra `Canvas`.
#![forbid(unsafe_code)]
#![allow(dead_code)]
pub mod layout {}
pub mod ribbon {}
pub mod element {}
pub mod layout;
pub mod ribbon;
pub use layout::{compute_layout, LinkBand, NodeBox, SankeyLayout, SankeyLink, SankeyNode};
pub use ribbon::{paint_ribbon, paint_sankey, ribbon_strip};