UNPKG

fuzzy-rater

Version:

Tooling for fuzzily rating text according to some query

107 lines 9.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NFADFA = void 0; const DFA_1 = require("../DFA"); const convertNFATemplateToDFATemplate_1 = require("./convertNFATemplateToDFATemplate"); /** * A deterministic finite automata that emulates a non-deterministic finite automata. * Note that depending on the input NFA, the setup time and automata size may be exponential. * Execution time is always linear */ class NFADFA { /** * Creates a DFA equivalent to a given NFA template * @param template The NFA template to create an DFA automata from * @param getMeta Functions to add extra meta to the DFA nodes and transitions */ constructor(template, getMeta) { this.initialize(template, getMeta); } /** * Initializes the NFA structure * @param template The NFA template * @param getMeta Functions to add extra meta to the DFA nodes and transitions */ initialize(template, getMeta) { const dfaTemplate = convertNFATemplateToDFATemplate_1.convertNFATemplateToDFATemplate(template, getMeta); this.nodes = Object.fromEntries(template.map(v => [v.ID, v])); this.DFA = new DFA_1.DFA(dfaTemplate); } /** * Executes the NFA on the given input, and returns the metadata of the final node, if any * @param input The input to execute the NFA on * @returns The metadata of the states teh automaton finished in */ execute(input) { const result = this.DFA.execute(input); if (result) return result.sources.map(s => s.metadata); return []; } /** * Executes the NFA on the given input, and returns the metadata of the DFA trace. * @param input The input to execute the NFA on * @returns The metadata of the states teh automaton finished in */ executeDFATraced(input) { return this.DFA.executeTraced(input); } /** * Executes the NFA on the given input, and returns the metadata of the trace. * If multiple paths to the same final state exist, only a single path is returned * @param input The input to execute the NFA on * @returns The metadata of the states teh automaton finished in */ executeTraced(input) { const result = this.DFA.executeTraced(input); return result.final.sources.map(s => ({ final: s.metadata, getPath: (getTransitionChooser = () => (to, transitions) => transitions.find(transition => transition.to == to.ID)) => { var _a; const chooseTransition = getTransitionChooser(result); // If a best match was found const trace = (_a = result.path.reduceRight(({ last, trace }, item, i) => { if (!last) return {}; // Get all transitions that lead to the correct next node const sourceTransition = chooseTransition(last, item.transition.sources, i, this.nodes); // Follow any empty transitions until a character transition was used const transitionData = []; let initTransition = sourceTransition; while ((initTransition === null || initTransition === void 0 ? void 0 : initTransition.type) == "empty") { transitionData.unshift({ fromNode: this.nodes[initTransition.from].metadata, transition: initTransition.metadata, }); initTransition = item.transition.sources.find(transition => transition.to == (initTransition === null || initTransition === void 0 ? void 0 : initTransition.from)); } // Obtain a combination of previous node and transition leading to the next node const source = item.fromNode.sources.find(s => s.ID == (initTransition === null || initTransition === void 0 ? void 0 : initTransition.from), null); if (source && initTransition) transitionData.unshift({ fromNode: source.metadata, transition: initTransition.metadata, }); // Store the proper data of the transition, and store the previous node if (!source) return {}; return { trace: [...transitionData, ...trace], last: source, }; }, { trace: [], last: s })) === null || _a === void 0 ? void 0 : _a.trace; if (trace) { // Map the transition metadata to the correct format return trace; } else { // I don't think this can occur, but I'm not positive, so this is a safe-ish failure case console.error("Didn't manage to find a path", input, s); return []; } }, })); } } exports.NFADFA = NFADFA; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkZBREZBLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL0RGQS9ORkFERkEvTkZBREZBLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLGdDQUEyQjtBQUUzQix1RkFBa0Y7QUFLbEY7Ozs7R0FJRztBQUNILE1BQWEsTUFBTTtJQUlmOzs7O09BSUc7SUFDSCxZQUNJLFFBQXNDLEVBQ3RDLE9BQTBDO1FBRTFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sVUFBVSxDQUNoQixRQUFzQyxFQUN0QyxPQUEwQztRQUUxQyxNQUFNLFdBQVcsR0FBRyxpRUFBK0IsQ0FDL0MsUUFBUSxFQUNSLE9BQTJDLENBQzlDLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUNuQixLQUFhO1FBU2IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxL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