/// <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); }
/// <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); }