@thi.ng/fuzzy
Version: 
Fuzzy logic operators & configurable rule inferencing engine
51 lines (50 loc) • 1.24 kB
JavaScript
import { eqDelta } from "@thi.ng/math/eqdelta";
import { __defaultOpts } from "./opts.js";
const meanOfMaximaStrategy = (opts) => {
  const { samples, eps } = __defaultOpts(opts);
  return (fn, [min, max]) => {
    const delta = (max - min) / samples;
    let peak = -Infinity;
    let peakPos = min;
    let n = 1;
    for (let i = 0; i <= samples; i++) {
      const t = min + i * delta;
      const x = fn(t);
      if (eqDelta(x, peak, eps)) {
        peakPos += t;
        n++;
      } else if (x > peak) {
        peak = x;
        peakPos = t;
        n = 1;
      }
    }
    return peakPos / n;
  };
};
const firstOfMaximaStrategy = (opts) => {
  const { samples } = __defaultOpts(opts);
  return (fn, [min, max]) => {
    const delta = (max - min) / samples;
    let peak = -Infinity;
    let peakPos = min;
    for (let i = 0; i <= samples; i++) {
      const t = min + i * delta;
      const x = fn(t);
      if (x > peak) {
        peak = x;
        peakPos = t;
      }
    }
    return peakPos;
  };
};
const lastOfMaximaStrategy = (opts) => {
  const impl = firstOfMaximaStrategy(opts);
  return (fn, [min, max]) => impl(fn, [max, min]);
};
export {
  firstOfMaximaStrategy,
  lastOfMaximaStrategy,
  meanOfMaximaStrategy
};