UNPKG

fauton

Version:

A library to test any finite automaton with arbitrary alphabets

55 lines (54 loc) 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.minimize = void 0; const checkEquivalenceBetweenStatesGroups_1 = require("./checkEquivalenceBetweenStatesGroups"); const generateEquivalenceStates_1 = require("./generateEquivalenceStates"); const generateStateGroupsRecord_1 = require("./generateStateGroupsRecord"); function minimize(automaton, minimizedDfaOptions) { const finalStatesSet = new Set(automaton.final_states); const nonFinalStates = []; automaton.states.forEach((state) => { if (!finalStatesSet.has(state)) { nonFinalStates.push(state); } }); let currentEquivalentStatesGroups = [nonFinalStates, automaton.final_states]; let previousEquivalentStatesGroups = []; let shouldStop = false; while (!shouldStop) { previousEquivalentStatesGroups = currentEquivalentStatesGroups; currentEquivalentStatesGroups = (0, generateEquivalenceStates_1.generateEquivalenceStates)(automaton, currentEquivalentStatesGroups); shouldStop = (0, checkEquivalenceBetweenStatesGroups_1.checkEquivalenceBetweenStatesGroups)([ currentEquivalentStatesGroups, previousEquivalentStatesGroups, ]); } const stateGroupsRecord = (0, generateStateGroupsRecord_1.generateStateGroupsRecord)(automaton.states, currentEquivalentStatesGroups); const newStartState = currentEquivalentStatesGroups.find((stateGroup) => stateGroup.includes(automaton.start_state)); const newTransitions = {}; currentEquivalentStatesGroups.forEach((currentEquivalentStatesGroup) => { const [firstState] = currentEquivalentStatesGroup; const newState = currentEquivalentStatesGroup.join(''); newTransitions[newState] = {}; automaton.alphabets.forEach((symbol) => { newTransitions[newState][symbol] = [ currentEquivalentStatesGroups[stateGroupsRecord[automaton.transitions[firstState][symbol][0]]].join(''), ]; }); }); const newStates = currentEquivalentStatesGroups.map((currentEquivalentStatesGroup) => currentEquivalentStatesGroup.join('')); return { label: minimizedDfaOptions?.label ?? automaton.label, alphabets: automaton.alphabets, description: minimizedDfaOptions?.description ?? automaton.description, final_states: newStates.filter((newState) => { const newStateStrings = new Set(newState); return automaton.final_states.find((finalState) => newStateStrings.has(finalState)); }), start_state: newStartState.join(''), states: newStates, transitions: newTransitions, epsilon_transitions: null, }; } exports.minimize = minimize;