fuzzy-rater
Version:
Tooling for fuzzily rating text according to some query
107 lines • 9.17 kB
JavaScript
;
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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