示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }