49 foreach ($nodes as $node) {
51 $this->_nodes[$node] = $node;
53 foreach ($relations as $pair) {
54 list($fromNode, $toNode) = $pair;
69 if ($fromNode == $toNode) {
70 throw new \InvalidArgumentException(
"Graph node '{$fromNode}' is linked to itself.");
74 $this->_from[$fromNode][$toNode] = $toNode;
75 $this->_to[$toNode][$fromNode] = $fromNode;
95 foreach ($this->_to as $idTo => $relations) {
96 foreach ($relations as $idFrom) {
97 $graph[$idTo][$idFrom] = $idFrom;
102 throw new \InvalidArgumentException(
"Unknown search mode: '{$mode}'");
116 public function findCycle($node =
null, $firstOnly =
true)
118 $nodes =
null === $node ? $this->_nodes : [$node];
120 foreach ($nodes as $node) {
148 $visited = [$rootNode => $rootNode];
149 $paths[$rootNode] = [$rootNode];
151 $node = array_shift(
$queue);
152 if (!empty($graph[$node])) {
153 foreach ($graph[$node] as $child) {
154 if (!isset($visited[$child])) {
156 $paths[$child][] = $child;
157 $visited[$child] = $child;
177 public function dfs($fromNode, $toNode,
$mode = self::DIRECTIONAL)
195 protected function _dfs($fromNode, $toNode, $graph, &$visited = [], $stack = [])
197 $stack[] = $fromNode;
198 $visited[$fromNode] = $fromNode;
199 if (isset($graph[$fromNode][$toNode])) {
203 if (isset($graph[$fromNode])) {
204 foreach ($graph[$fromNode] as $node) {
205 if (!isset($visited[$node])) {
206 $result = $this->
_dfs($node, $toNode, $graph, $visited, $stack);
226 if (isset($this->_nodes[$node])) {
228 throw new \InvalidArgumentException(
"Graph node '{$node}' already exists'.");
232 throw new \InvalidArgumentException(
"Graph node '{$node}' does not exist.");
dfs($fromNode, $toNode, $mode=self::DIRECTIONAL)
findPathsToReachableNodes($rootNode, $mode=self::DIRECTIONAL)
__construct(array $nodes, array $relations)
_dfs($fromNode, $toNode, $graph, &$visited=[], $stack=[])
_assertNode($node, $mustExist)
if($exist=($block->getProductCollection() && $block->getProductCollection() ->getSize())) $mode
findCycle($node=null, $firstOnly=true)
getRelations($mode=self::DIRECTIONAL)
addRelation($fromNode, $toNode)