/// <summary> /// Quadrature nodes for Gamma expectations /// </summary> /// <param name="precision">'precision' message</param> /// <param name="nodes">Place to put the nodes</param> /// <param name="weights">Place to put the weights</param> public static void QuadratureNodesAndWeights(Gamma precision, double[] nodes, double[] weights) { #if KeepLastMessage if (LastPrecisionMessage != null) { Gamma PrecisionPosterior = precision * LastPrecisionMessage; Quadrature.GammaNodesAndWeights(PrecisionPosterior.Precision, PrecisionPosterior.PrecisionOverMean, nodes, weights); // modify the weights to include q(prec)/Ga(prec;a,b) for (int i = 0; i < weights.Length; i++) { weights[i] *= Math.Exp(precision.EvaluateLn(nodes[i]) - Gamma.EvaluateLn(nodes[i], PrecisionPosterior.Precision, PrecisionPosterior.PrecisionOverMean)); } return; } #endif Quadrature.GammaNodesAndWeights(precision.Shape - 1, precision.Rate, nodes, weights); }