@thi.ng/fuzzy
Version:
Fuzzy logic operators & configurable rule inferencing engine
41 lines (40 loc) • 1.11 kB
JavaScript
import { constant, intersect, union, weighted } from "./shapes.js";
import { centroidStrategy } from "./strategies/centroid.js";
import { snormMax, tnormMin } from "./tnorms.js";
const defuzz = (ins, outs, rules, vals, strategy = centroidStrategy(), imply = tnormMin, combine = snormMax) => {
const ruleTerms = rules.map((r) => {
let alpha = null;
for (let id in vals) {
if (r.if[id]) {
const v = ins[id].terms[r.if[id]](vals[id]);
alpha = alpha !== null ? r.op(alpha, v) : v;
}
}
const terms = {};
if (alpha) {
const aterm = constant(alpha);
for (let id in r.then) {
if (outs[id]) {
const oterm = outs[id].terms[r.then[id]];
terms[id] = intersect(
imply,
r.weight == 1 ? oterm : weighted(oterm, r.weight),
aterm
);
}
}
}
return terms;
});
const res = {};
for (let id in outs) {
res[id] = strategy(
union(combine, ...ruleTerms.map((r) => r[id]).filter((f) => !!f)),
outs[id].domain
);
}
return res;
};
export {
defuzz
};