UNPKG

pm4js

Version:

Process Mining for Javascript

115 lines (102 loc) 2.56 kB
class GammaRandomVariable { constructor(k, theta) { this.k = k; this.theta = theta; } toString() { return "GammaRandomVariable k="+this.k+" theta="+this.theta; } static gen() { GammaRandomVariable.C = (GammaRandomVariable.C*GammaRandomVariable.G) % GammaRandomVariable.P; return GammaRandomVariable.C / GammaRandomVariable.P; } static estimateParameters(arrayValues) { let n = arrayValues.length; let kn = 0; for (let v of arrayValues) { if (v < 0) { throw "Gamma not defined for x < 0"; } kn += v; } kn = kn * n * (n-1); let kd1 = 0; let kd2 = 0; let kd3 = 0; for (let v of arrayValues) { kd1 += v * Math.log(v); kd2 += Math.log(v); kd3 += v; } kd1 = kd1 * n; let kd = (n+2)*(kd1 - kd2 * kd3); let k = kn / kd; let theta = kd / (n * n * (n-1)); return new GammaRandomVariable(k, theta); } static eulerGamma(x) { x = x - 1; return Math.sqrt(Math.PI) * Math.pow(Math.abs(x) / Math.E, x) * Math.pow(8 * x * x *x + 4 *x *x + x + 1.0 / 3.0, 1.0 / 6.0); } pdf(x) { if (x < 0) { throw "Gamma not defined for x < 0"; } return (Math.pow(x, this.k - 1) * Math.exp(-x / this.theta)) / (Math.pow(this.theta, this.k) * GammaRandomVariable.eulerGamma(this.k)); } logLikelihood(arrayValues) { let ret = 0.0; for (let v of arrayValues) { ret += Math.log(this.pdf(v)); } return ret; } getMean() { return this.k * this.theta; } getVariance() { return this.k * this.theta * this.theta; } getMode() { if (this.k > 1) { return (this.k - 1)*this.theta; } return 0; } getValue() { let k = 0 + this.k; let exp = new ExponentialRandomVariable(1.0 / this.theta); let ret = 0; while (k > 1) { ret += exp.getValue(); k = k - 1; } let umax = Math.pow((k / Math.E), k / 2.0); let vmin = -2 / Math.E; let vmax = 2*k / (Math.E * (Math.E - k)); while (true) { let v1 = GammaRandomVariable.gen(); let v2 = GammaRandomVariable.gen(); let u = umax * v1; let v = (vmax - vmin) * v2 + vmin; let t = v / u; let x = Math.exp(t / k); if (2*Math.log(u) <= t - x) { ret += x * this.theta; break; } } return ret; } } GammaRandomVariable.G = 536870911; GammaRandomVariable.P = 2147483647; GammaRandomVariable.C = 1; try { global.GammaRandomVariable = GammaRandomVariable; module.exports = {GammaRandomVariable: GammaRandomVariable}; } catch (err) { // not in Node //console.log(err); }