UNPKG

@webwriter/automaton

Version:

Build, visualize, and interact with different kinds of automata (DFA, NFA, PDA).

38 lines (31 loc) 1.23 kB
import { Graph } from '../../graph'; import { DFA } from '../../automata/dfa'; import { Logger } from '@u/logger'; export function AddSinkstateToDFA(dfa: DFA): void { const meanX = dfa.nodes.get().reduce((acc, node) => acc + node.x!, 0) / dfa.nodes.get().length; const meanY = dfa.nodes.get().reduce((acc, node) => acc + node.y!, 0) / dfa.nodes.get().length; const sinkstateId = dfa.getNewNodeId(); dfa.addNode({ id: sinkstateId, label: 'sink', final: false, initial: false, x: meanX, y: meanY + 100, }); const alphabet = dfa.getFormalDefinition().alphabet.split(', '); Logger.log(alphabet); for (const node of dfa.nodes.get()) { if (node.id === Graph.initialGhostNode.id) continue; const transitions = dfa.getTransitionsFromNode(node); const missingSymbols = alphabet.filter((symbol) => !transitions.some((t) => t.symbols.includes(symbol))); if (missingSymbols.length === 0) continue; dfa.addTransition({ id: dfa.getNewTransitionId(), label: missingSymbols.join(','), from: node.id, to: sinkstateId, symbols: missingSymbols, }); } }