fcose 0.1.0
fcose: ^0.1.0 copied to clipboard
A pure Dart port of the fCoSE compound graph layout algorithm.
0.1.0-dev.1 #
- Start an experimental pure Dart port of cytoscape-fcose.
- Add deterministic spectral initialization and CoSE-style force refinement.
- Add compound nodes, disconnected component packing, and placement constraints.
- Add CoSE leaf reduction, staged tree regrowth, sparse-side placement, and post-growth cooling.
- Connect disconnected root and nested compound child components through upstream-compatible spectral dummy nodes.
- Add CoSE-style randomized zero-degree grouping and bottom-up clearing and repopulation of fully tiled compound subtrees.
- Add layout-utilities-compatible randomized polyomino component packing, original-center relocation, and explicit typed packing controls.
- Add layout-utilities-compatible incremental POSE component packing for
randomize: false. - Add
uniformNodeDimensionsforce semantics and customtilingCompareByordering with upstream-compatible ideal-row-width tiling. - Add typed constraint-pipeline debug stages and make draft quality bypass CoSE constraint preprocessing and zero-degree tiling.
- Recenter non-fixed transformed-stage results to their original graph bounds without perturbing full-layout coordinates.
- Add typed per-node and per-edge force resolvers, evaluated once per layout run with explicit element values taking precedence.
- Match upstream first-edge filtering before callback evaluation and use the average resolved ideal edge length for implicit relative-placement gaps.
- Match cose-base's cross-axis alignment dummy collision during constrained displacement relaxation and add a deeply nested compound differential case.
- Match cose-base's dimension-aware defaults for omitted relative-placement gaps and cover mixed-size flat and nested compound differentials.
- Add typed zero-argument tiling-padding resolvers with run-scoped upstream semantics across flat and nested tiling.
- Add per-node compound padding across bounds, nested tiling, force geometry, and component packing while retaining the layout-wide fallback.
- Match CoSE's ten-pixel internal ideal-length floor when calculating sparse repulsion-grid neighborhoods without changing configured spring lengths.
- Measure draft-quality recentering on leaf bounds, as upstream does when it never builds the cose-base graph.
- Draw spectral samples and eigenvector guesses from the layout's own random
stream, matching upstream's single sequence of
Math.randomcalls. - Replace the spectral pseudo-inverse with a transcription of the JAMA singular value decomposition that layout-base uses, so compound spectral layouts now match upstream to about 1e-13.
- Untile before relocating and packing, so a tiled layout now returns each component to its original center and takes part in component packing instead of keeping the coordinates the spring embedder left it with.
- Treat the components without an edge as the single tiled pseudo-component upstream packs, appended after the components that kept their edges.
- Run one spectral pass and one spring embedder per connected component when packing is enabled, in upstream's order, so a component is no longer embedded alongside the components it is only packed beside.
- Keep each leaf's top-left corner authoritative through the spring embedder,
as
LNodedoes, and derive its center from that corner. Accumulating displacements on a center instead lost the low bits of every tick, whichcalcRepulsionForce's minimum-distance sign snap turned into whole pixels on symmetric graphs; every oracle fixture now matches upstream to about 1e-13. - Skip the spectral embedding for a debug
stepof a randomized run. Upstream calls its spectral routine wheneverrandomizeis on, but the routine only embeds anything for a draft run or the whole pipeline, and otherwise reads back the positions it was given. - Measure the bounding box that the closing relocation aims at the way the
host reports it, adding
FcoseOptions.compoundBorderWidth. A compound's box stands half a border and an antialiasing pixel outside its children's, so a graph mixing compounds with plain nodes settled three quarters of a pixel away from upstream. - Guard both packers at eight hundred components: the polyomino packer against overlap and a moved center, the POSE packer against non-finite or irreproducible shifts, and both against a change of complexity class.
- Document the polyomino packing grid's sizing on
FcoseOptions.polyominoGridSizeFactor: it follows layout-utilities, so many small components spread far apart can ask for a grid too large to allocate, which the packer refuses with anArgumentError.