fauton
Version:
A library to test any finite automaton with arbitrary alphabets
55 lines (54 loc) • 2.81 kB
JavaScript
;
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;