package p3order

Import Path
	github.com/d2lang/elk-go/internal/layered/p3order (on go.dev)

Dependency Relation
	imports 9 packages, and imported by one package


Package-Level Type Names (total 21)
/* sort by: | */
AllCrossingsCounter coordinates the specialized counters and implements ELK's IInitializable traversal callbacks explicitly. (*AllCrossingsCounter) CountAllCrossings(arena *layered.LGraphArena, currentOrder [][]layered.LNodeID) int (*AllCrossingsCounter) InitAfterTraversal() (*AllCrossingsCounter) InitAtEdgeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex, portIndex int, edgeID layered.LEdgeID, nodeOrder [][]layered.LNodeID) (*AllCrossingsCounter) InitAtNodeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex int, nodeOrder [][]layered.LNodeID) (*AllCrossingsCounter) InitAtPortLevel(arena *layered.LGraphArena, layerIndex, nodeIndex, portIndex int, nodeOrder [][]layered.LNodeID) func NewAllCrossingsCounter(numberOfLayers int) *AllCrossingsCounter func InitializeAllCrossingsCounter(counter *AllCrossingsCounter, arena *layered.LGraphArena, nodeOrder [][]layered.LNodeID)
Arena *layered.LGraphArena Distributor *BarycenterPortDistributor ModelOrder *ModelOrderBarycenterHeuristic Random *javacompat.Random Resolver *ForsterConstraintResolver (*BarycenterHeuristic) MinimizeCrossings(order [][]layered.LNodeID, freeLayerIndex int, forwardSweep, firstSweep bool) bool (*BarycenterHeuristic) MinimizeLayer(layer *[]layered.LNodeID, preordered, randomize, forward bool) (*BarycenterHeuristic) SetFirstLayerOrder(order [][]layered.LNodeID, forward bool) bool func NewBarycenterHeuristic(arena *layered.LGraphArena, resolver *ForsterConstraintResolver, random *javacompat.Random, distributor *BarycenterPortDistributor) *BarycenterHeuristic
Kind PortDistributorKind PortRanks []float32 (*BarycenterPortDistributor) CalculatePortRanks(arena *layered.LGraphArena, layer []layered.LNodeID, portType layered.PortType) (*BarycenterPortDistributor) DistributePortsWhileSweeping(arena *layered.LGraphArena, nodeOrder [][]layered.LNodeID, currentIndex int, forward bool) bool (*BarycenterPortDistributor) InitAfterTraversal() (*BarycenterPortDistributor) InitAtLayerLevel(layerIndex int, order [][]layered.LNodeID) (*BarycenterPortDistributor) InitAtNodeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex int, order [][]layered.LNodeID) (*BarycenterPortDistributor) InitAtPortLevel(arena *layered.LGraphArena, layerIndex, nodeIndex, portIndex int, order [][]layered.LNodeID) func NewBarycenterPortDistributor(kind PortDistributorKind, numberOfLayers int) *BarycenterPortDistributor func InitializeBarycenterPortDistributor(distributor *BarycenterPortDistributor, arena *layered.LGraphArena, order [][]layered.LNodeID) func NewBarycenterHeuristic(arena *layered.LGraphArena, resolver *ForsterConstraintResolver, random *javacompat.Random, distributor *BarycenterPortDistributor) *BarycenterHeuristic
func NewCrossingMatrixFiller(arena *layered.LGraphArena, crossMinType CrossMinType, order [][]layered.LNodeID, freeLayerIndex int, side CrossingCountSide) *CrossingMatrixFiller const CrossingsEast const CrossingsWest
CrossingMatrixFiller lazily caches both orders of each node pair. Node.ID is the immutable identity assigned by GraphInfoHolder initialization; it is deliberately not changed when the current order swaps nodes. (*CrossingMatrixFiller) GetCrossingMatrixEntry(arena *layered.LGraphArena, upper, lower layered.LNodeID) int func NewCrossingMatrixFiller(arena *layered.LGraphArena, crossMinType CrossMinType, order [][]layered.LNodeID, freeLayerIndex int, side CrossingCountSide) *CrossingMatrixFiller func NewSwitchDecider(arena *layered.LGraphArena, freeLayerIndex int, order [][]layered.LNodeID, filler *CrossingMatrixFiller, portPositions []int, holder *GraphInfoHolder, oneSided bool) *SwitchDecider
CrossingsCounter is the exact ELK 0.8.1 reduction of between-layer, in-layer, and north/south crossings to inversion counting. Port IDs are scratch indices into PortPositions; AllCrossingsCounter assigns them in Java traversal order. PortPositions []int (*CrossingsCounter) CountCrossingsBetweenLayers(arena *layered.LGraphArena, leftLayerNodes, rightLayerNodes []layered.LNodeID) int (*CrossingsCounter) CountCrossingsBetweenPortsInBothOrders(arena *layered.LGraphArena, upperPort, lowerPort layered.LPortID) (int, int) (*CrossingsCounter) CountInLayerCrossingsBetweenNodesInBothOrders(arena *layered.LGraphArena, upperNode, lowerNode layered.LNodeID, side layered.PortSide) (int, int) (*CrossingsCounter) CountInLayerCrossingsOnSide(arena *layered.LGraphArena, nodes []layered.LNodeID, side layered.PortSide) int (*CrossingsCounter) CountNorthSouthPortCrossingsInLayer(arena *layered.LGraphArena, nodes []layered.LNodeID) int (*CrossingsCounter) InitForCountingBetween(arena *layered.LGraphArena, leftLayerNodes, rightLayerNodes []layered.LNodeID) (*CrossingsCounter) InitPortPositionsForInLayerCrossings(arena *layered.LGraphArena, nodes []layered.LNodeID, side layered.PortSide) []layered.LPortID (*CrossingsCounter) SwitchNodes(arena *layered.LGraphArena, wasUpperNode, wasLowerNode layered.LNodeID, side layered.PortSide) (*CrossingsCounter) SwitchPorts(arena *layered.LGraphArena, topPort, bottomPort layered.LPortID) func NewCrossingsCounter(portPositions []int) *CrossingsCounter
CrossMinType is LayerSweepCrossingMinimizer.CrossMinType. Declaration order follows ELK 0.8.1 and is observable through the zero value used by the phase-three provider. func NewCrossingMatrixFiller(arena *layered.LGraphArena, crossMinType CrossMinType, order [][]layered.LNodeID, freeLayerIndex int, side CrossingCountSide) *CrossingMatrixFiller func NewGraphInfoHolder(arena *layered.LGraphArena, graphID layered.LGraphID, crossMinType CrossMinType, graphs []*GraphInfoHolder, random *javacompat.Random) (*GraphInfoHolder, error) func NewGreedySwitchHeuristic(arena *layered.LGraphArena, crossMinType CrossMinType, holder *GraphInfoHolder) *GreedySwitchHeuristic func NewLayerSweepCrossingMinimizer(crossMinType CrossMinType) *LayerSweepCrossingMinimizer const CrossMinBarycenter const CrossMinOneSidedGreedySwitch const CrossMinTwoSidedGreedySwitch
BarycenterStates [][]BarycenterState (*ForsterConstraintResolver) InitAtLayerLevel(layerIndex int, order [][]layered.LNodeID) (*ForsterConstraintResolver) InitAtNodeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex int, order [][]layered.LNodeID) (*ForsterConstraintResolver) ProcessConstraints(arena *layered.LGraphArena, nodes *[]layered.LNodeID) func NewForsterConstraintResolver(arena *layered.LGraphArena, order [][]layered.LNodeID) *ForsterConstraintResolver func InitializeForsterConstraintResolver(resolver *ForsterConstraintResolver, arena *layered.LGraphArena, order [][]layered.LNodeID) func NewBarycenterHeuristic(arena *layered.LGraphArena, resolver *ForsterConstraintResolver, random *javacompat.Random, distributor *BarycenterPortDistributor) *BarycenterHeuristic
GraphInfoHolder collects all state initialized by a single IInitializable traversal of one graph. BestNodeAndPortOrder *SweepCopy ChildGraphs []layered.LGraphID CrossMinType CrossMinType CrossMinimizer crossingMinimizationHeuristic CrossingsCounter *AllCrossingsCounter CurrentNodeOrder [][]layered.LNodeID CurrentlyBestNodeAndPortOrder *SweepCopy HasExternalPorts bool HasParent bool LGraph layered.LGraphID Parent *layered.LNodeID ParentGraphData *GraphInfoHolder PortDistributor sweepPortDistributor PortPositions []int UseBottomUp bool (*GraphInfoHolder) CrossMinAlwaysImproves() bool (*GraphInfoHolder) CrossMinDeterministic() bool (*GraphInfoHolder) DontSweepInto() bool (*GraphInfoHolder) GetBestSweep() *SweepCopy func NewGraphInfoHolder(arena *layered.LGraphArena, graphID layered.LGraphID, crossMinType CrossMinType, graphs []*GraphInfoHolder, random *javacompat.Random) (*GraphInfoHolder, error) func NewGraphInfoHolder(arena *layered.LGraphArena, graphID layered.LGraphID, crossMinType CrossMinType, graphs []*GraphInfoHolder, random *javacompat.Random) (*GraphInfoHolder, error) func NewGreedySwitchHeuristic(arena *layered.LGraphArena, crossMinType CrossMinType, holder *GraphInfoHolder) *GreedySwitchHeuristic func NewSwitchDecider(arena *layered.LGraphArena, freeLayerIndex int, order [][]layered.LNodeID, filler *CrossingMatrixFiller, portPositions []int, holder *GraphInfoHolder, oneSided bool) *SwitchDecider
GreedyPortDistributor is the distributor used by ELK's two-sided greedy switch. It repeatedly swaps adjacent ports whenever the swap strictly decreases crossings. (*GreedyPortDistributor) DistributePortsWhileSweeping(arena *layered.LGraphArena, order [][]layered.LNodeID, currentIndex int, forward bool) bool (*GreedyPortDistributor) InitAfterTraversal() (*GreedyPortDistributor) InitAtNodeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex int, order [][]layered.LNodeID) func NewGreedyPortDistributor() *GreedyPortDistributor func InitializeGreedyPortDistributor(distributor *GreedyPortDistributor, arena *layered.LGraphArena, order [][]layered.LNodeID)
GreedySwitchHeuristic switches adjacent nodes whenever doing so strictly reduces the selected one- or two-sided crossing count. Arena *layered.LGraphArena GraphData *GraphInfoHolder PortPositions []int Type CrossMinType (*GreedySwitchHeuristic) InitAfterTraversal() (*GreedySwitchHeuristic) InitAtLayerLevel(arena *layered.LGraphArena, layerIndex int, order [][]layered.LNodeID) (*GreedySwitchHeuristic) InitAtPortLevel() (*GreedySwitchHeuristic) MinimizeCrossings(order [][]layered.LNodeID, freeLayerIndex int, forwardSweep, _ bool) bool (*GreedySwitchHeuristic) SetFirstLayerOrder(order [][]layered.LNodeID, forward bool) bool func NewGreedySwitchHeuristic(arena *layered.LGraphArena, crossMinType CrossMinType, holder *GraphInfoHolder) *GreedySwitchHeuristic
InteractiveCrossingMinimizer orders nodes by their previous vertical positions and reconstructs previous long-edge positions at each layer. (*InteractiveCrossingMinimizer) Process(arena *layered.LGraphArena, graphID layered.LGraphID) error (*InteractiveCrossingMinimizer) ProcessorConfiguration(arena *layered.LGraphArena, graphID layered.LGraphID) layered.ProcessorConfiguration *InteractiveCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.ConfiguredProcessor *InteractiveCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.LayoutProcessor
LayerSweepCrossingMinimizer is ELK Layered's phase-three layer sweep. Its zero value is the BARYCENTER phase implementation used by the provider. Type CrossMinType HierarchyAware is a marker used by the layered executor. In an INCLUDE_CHILDREN layout this processor must be paused on child graphs and invoked once on the root after every graph has completed all processors preceding phase three. (*LayerSweepCrossingMinimizer) Process(arena *layered.LGraphArena, graphID layered.LGraphID) error ProcessHierarchy is the source-shaped hierarchy-aware entry point. graphID must be the hierarchy root; initialization then discovers every child graph breadth-first and assigns GraphInfoHolder indices before sweeping bottom-up or through nested graphs as decided by LayerSweepTypeDecider. (*LayerSweepCrossingMinimizer) ProcessorConfiguration(_ *layered.LGraphArena, _ layered.LGraphID) layered.ProcessorConfiguration *LayerSweepCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.ConfiguredProcessor *LayerSweepCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.LayoutProcessor func NewGreedySwitchPostprocessor(strategy layered.IntermediateProcessorStrategy) (*LayerSweepCrossingMinimizer, error) func NewLayerSweepCrossingMinimizer(crossMinType CrossMinType) *LayerSweepCrossingMinimizer
LayerSweepTypeDecider chooses between bottom-up and cross-hierarchical sweeping for one graph. InitAtLayerLevel and InitAtNodeLevel must be called in IInitializable traversal order before UseBottomUp. NodeInfo [][]layerSweepNodeInfo (*LayerSweepTypeDecider) InitAtLayerLevel(arena *layered.LGraphArena, layerIndex int, order [][]layered.LNodeID) (*LayerSweepTypeDecider) InitAtNodeLevel(arena *layered.LGraphArena, layerIndex, nodeIndex int, order [][]layered.LNodeID) (*LayerSweepTypeDecider) UseBottomUp(arena *layered.LGraphArena, graphID layered.LGraphID, parent *layered.LNodeID, crossMinDeterministic bool, order [][]layered.LNodeID) bool func NewLayerSweepTypeDecider(numberOfLayers int) *LayerSweepTypeDecider
ModelOrderBarycenterHeuristic is ELK 0.8.1's partial-order comparator used when model order is considered during crossing minimization. ForceNodeModelOrder bool (*ModelOrderBarycenterHeuristic) ClearTransitiveOrdering() func NewModelOrderBarycenterHeuristic(force bool) *ModelOrderBarycenterHeuristic
NoCrossingMinimizer deliberately preserves the node and port order produced by layering and the required long-edge preprocessing. (*NoCrossingMinimizer) Process(*layered.LGraphArena, layered.LGraphID) error (*NoCrossingMinimizer) ProcessorConfiguration(_ *layered.LGraphArena, _ layered.LGraphID) layered.ProcessorConfiguration *NoCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.ConfiguredProcessor *NoCrossingMinimizer : github.com/d2lang/elk-go/internal/layered.LayoutProcessor
NorthSouthEdgeNeighbouringNodeCrossingsCounter accounts for north/south port dummies and their crossings with long-edge dummies. LowerUpperCrossings int UpperLowerCrossings int (*NorthSouthEdgeNeighbouringNodeCrossingsCounter) CountCrossings(arena *layered.LGraphArena, upper, lower layered.LNodeID) func NewNorthSouthEdgeNeighbouringNodeCrossingsCounter(arena *layered.LGraphArena, layer []layered.LNodeID) *NorthSouthEdgeNeighbouringNodeCrossingsCounter
func NewBarycenterPortDistributor(kind PortDistributorKind, numberOfLayers int) *BarycenterPortDistributor const LayerTotalPortDistributor const NodeRelativePortDistributor
SweepCopy stores the node order and each node's current port order. Port orders are indexed by layer and position, just as in ELK 0.8.1; this means they travel with a candidate sweep order rather than with arena IDs. (*SweepCopy) Clone() *SweepCopy Nodes returns the saved order. Callers must treat it as read-only, matching SweepCopy.nodes()'s contract in Java. (*SweepCopy) TransferNodeAndPortOrdersToGraph(arena *layered.LGraphArena, graphID layered.LGraphID, setPortConstraints bool) func NewSweepCopy(arena *layered.LGraphArena, nodeOrder [][]layered.LNodeID) *SweepCopy func (*GraphInfoHolder).GetBestSweep() *SweepCopy func (*SweepCopy).Clone() *SweepCopy
SwitchDecider compares the crossing count of two adjacent nodes in their current and switched orders. (*SwitchDecider) DoesSwitchReduceCrossings(arena *layered.LGraphArena, upperIndex, lowerIndex int) bool (*SwitchDecider) NotifyOfSwitch(arena *layered.LGraphArena, upper, lower layered.LNodeID) func NewSwitchDecider(arena *layered.LGraphArena, freeLayerIndex int, order [][]layered.LNodeID, filler *CrossingMatrixFiller, portPositions []int, holder *GraphInfoHolder, oneSided bool) *SwitchDecider
Package-Level Functions (total 22)
GreedySwitchIntermediateForGraph implements GraphConfigurator's exact activation decision. It must be called while the graph is still layerless, since the threshold is compared to LGraph.layerlessNodes.size().
InitializeAllCrossingsCounter performs IInitializable.init's exact layer/node/port/edge nesting and connected-edge order.
func NewCrossingsCounter(portPositions []int) *CrossingsCounter
NewGreedySwitchPostprocessor constructs IntermediateProcessorStrategy's exact LayerSweepCrossingMinimizer variant.
func NewSwitchDecider(arena *layered.LGraphArena, freeLayerIndex int, order [][]layered.LNodeID, filler *CrossingMatrixFiller, portPositions []int, holder *GraphInfoHolder, oneSided bool) *SwitchDecider