/** * Merge singleton nodes * * All equivalency classes which consist of just one nodes are considered * singleton nodes. This method merges all maximum sets of singleton nodes, * which share the same successors and precedessors. * * @param slAutomaton $automaton * @return void */ protected function mergeSingletonNodes(slAutomaton $automaton) { $classes = array_keys($this->equivalenceClasses); $classCount = count($classes); for ($i = 0; $i < $classCount; ++$i) { if (!isset($this->equivalenceClasses[$classes[$i]]) || count($this->equivalenceClasses[$classes[$i]]) > 1) { // We only care for singletons continue; } for ($j = $i + 1; $j < $classCount; ++$j) { if (!isset($this->equivalenceClasses[$classes[$j]]) || count($this->equivalenceClasses[$classes[$j]]) > 1) { // We only care for singletons continue; } if ($automaton->getOutgoing($classes[$i]) === $automaton->getOutgoing($classes[$j]) && $automaton->getIncoming($classes[$i]) === $automaton->getIncoming($classes[$j])) { $this->equivalenceClasses[$classes[$i]][] = $classes[$j]; unset($this->equivalenceClasses[$classes[$j]]); $automaton->removeNode($classes[$j]); } } } }