Beispiel #1
0
        /// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="IsGreaterThanOp"]/message_doc[@name="AAverageConditional(Bernoulli, Poisson, int)"]/*'/>
        public static Poisson BAverageConditional([SkipIfUniform] Bernoulli isGreaterThan, int a, [Proper] Poisson b)
        {
            if (b.IsPointMass || !b.IsProper())
            {
                return(Poisson.Uniform());
            }
            double bMean = b.GetMean();
            double sum   = 0;
            double bsum  = 0;

            if (b.Precision == 1)
            {
                if (a > 0)
                {
                    sum  = MMath.GammaUpper(a, b.Rate);
                    bsum = (sum - Math.Exp(b.GetLogProb(a - 1))) * b.Rate;
                }
            }
            else
            {
                for (int i = 0; i < a; i++)
                {
                    double p = Math.Exp(b.GetLogProb(i));
                    sum  += p;
                    bsum += i * p;
                }
                if (sum > 1)
                {
                    sum = 1; // this can happen due to round-off errors
                }
                if (bsum > bMean)
                {
                    bsum = bMean;
                }
            }
            double  pT     = isGreaterThan.GetProbTrue();
            double  pF     = 1 - pT;
            double  Z      = pT * sum + pF * (1 - sum);
            double  bZ     = pT * bsum + pF * (bMean - bsum);
            Poisson result = new Poisson(bZ / Z);

            result.SetToRatio(result, b, false);
            return(result);
        }
Beispiel #2
0
        /// <include file='FactorDocs.xml' path='factor_docs/message_op_class[@name="IsGreaterThanOp"]/message_doc[@name="AAverageConditional(Bernoulli, Poisson, int)"]/*'/>
        public static Poisson AAverageConditional([SkipIfUniform] Bernoulli isGreaterThan, [Proper] Poisson a, int b)
        {
            if (a.IsPointMass || !a.IsProper())
            {
                return(Poisson.Uniform());
            }
            double aMean = a.GetMean();
            double sum   = 0;
            double asum  = 0;

            if (a.Precision == 1)
            {
                if (b >= 0)
                {
                    sum  = MMath.GammaUpper(b + 1, a.Rate);
                    asum = (sum - Math.Exp(a.GetLogProb(b))) * a.Rate;
                }
            }
            else
            {
                for (int i = 0; i <= b; i++)
                {
                    double p = Math.Exp(a.GetLogProb(i));
                    sum  += p;
                    asum += i * p;
                }
                if (sum > 1)
                {
                    sum = 1; // this can happen due to round-off errors
                }
                if (asum > aMean)
                {
                    asum = aMean;
                }
            }
            double  pT     = isGreaterThan.GetProbTrue();
            double  pF     = 1 - pT;
            double  Z      = pF * sum + pT * (1 - sum);
            double  aZ     = pF * asum + pT * (aMean - asum);
            Poisson result = new Poisson(aZ / Z);

            result.SetToRatio(result, a, false);
            return(result);
        }