/// <summary> /// Compute finite difference coefficients according to the method provided here: /// http://en.wikipedia.org/wiki/Finite_difference_coefficients /// </summary> /// <returns>An array of the coefficients for FD.</returns> public double[] CreateCoefficients() { var result = new double[_pointCount]; var delts = new Matrix(_pointCount, _pointCount); double[][] t = delts.Data; for (int j = 0; j < _pointCount; j++) { double delt = (j - _center); double x = 1.0; for (int k = 0; k < _pointCount; k++) { t[j][k] = x / EncogMath.Factorial(k); x *= delt; } } Matrix invMatrix = delts.Inverse(); double f = EncogMath.Factorial(_pointCount); for (int k = 0; k < _pointCount; k++) { result[k] = (Math .Round(invMatrix.Data[1][k] * f)) / f; } return(result); }
/// <summary> /// Calculate G. /// </summary> /// <param name="network">The network to calculate for.</param> /// <param name="e">The event to calculate for.</param> /// <param name="parents">The parents.</param> /// <returns>The value for G.</returns> public double CalculateG(BayesianNetwork network, BayesianEvent e, IList <BayesianEvent> parents) { double result = 1.0; int r = e.Choices.Count; var args = new int[parents.Count]; do { double n = EncogMath.Factorial(r - 1); double d = EncogMath.Factorial(CalculateN(network, e, parents, args) + r - 1); double p1 = n / d; double p2 = 1; for (int k = 0; k < e.Choices.Count; k++) { p2 *= EncogMath.Factorial(CalculateN(network, e, parents, args, k)); } result *= p1 * p2; } while (EnumerationQuery.Roll(parents, args)); return(result); }