/// <summary>Update the buffer <c>Buffer</c>.</summary> /// <param name="Buffer">Buffer <c>Buffer</c>.</param> /// <param name="list">Incoming message from <c>list</c>.</param> /// <param name="IndexOfMaximumDouble">Constant value for <c>indexOfMaximumDouble</c>.</param> /// <returns>New value of buffer <c>Buffer</c>.</returns> /// <remarks> /// <para /> /// </remarks> /// <typeparam name="GaussianList">The type of an incoming message from <c>list</c>.</typeparam> public static IndexOfMaximumBuffer Buffer <GaussianList>( IndexOfMaximumBuffer Buffer, GaussianList list, int IndexOfMaximumDouble) // redundant parameters required for correct dependency graph where GaussianList : IList <Gaussian> { var max_marginal = Buffer.to_list[IndexOfMaximumDouble] * list[IndexOfMaximumDouble]; Gaussian product = Gaussian.Uniform(); //var order = Rand.Perm(list.Count); for (int i = 0; i < list.Count; i++) { //int c = order[i]; int c = i; if (c != IndexOfMaximumDouble) { var msg_to_sum = max_marginal / Buffer.MessagesToMax[c]; var msg_to_positiveop = DoublePlusOp.AAverageConditional(Sum: msg_to_sum, b: list[c]); var msgFromPositiveOp = IsPositiveOp.XAverageConditional(true, msg_to_positiveop); Buffer.MessagesToMax[c] = DoublePlusOp.SumAverageConditional(list[c], msgFromPositiveOp); Buffer.to_list[c] = DoublePlusOp.AAverageConditional(Sum: msg_to_sum, b: msgFromPositiveOp); max_marginal = msg_to_sum * Buffer.MessagesToMax[c]; product.SetToProduct(product, Buffer.MessagesToMax[c]); } } //Buffer.to_list[IndexOfMaximumDouble] = max_marginal / list[IndexOfMaximumDouble]; Buffer.to_list[IndexOfMaximumDouble] = product; return(Buffer); }
/// <summary>Evidence message for EP.</summary> /// <param name="Buffer">Buffer <c>Buffer</c>.</param> /// <param name="list">Incoming message from <c>list</c>.</param> /// <param name="IndexOfMaximumDouble">Constant value for <c>indexOfMaximumDouble</c>.</param> /// <returns>Logarithm of the factor's average value across the given argument distributions.</returns> /// <remarks> /// <para>The formula for the result is <c>log(sum_(list) p(list) factor(indexOfMaximumDouble,list))</c>.</para> /// </remarks> /// <typeparam name="GaussianList">The type of an incoming message from <c>list</c>.</typeparam> public static double LogAverageFactor <GaussianList>(IndexOfMaximumBuffer Buffer, GaussianList list, int IndexOfMaximumDouble) where GaussianList : IList <Gaussian> { double evidence = 0; var max_marginal = list[IndexOfMaximumDouble] * Buffer.to_list[IndexOfMaximumDouble]; for (int c = 0; c < list.Count; c++) { if (c != IndexOfMaximumDouble) { var msg_to_sum = max_marginal / Buffer.MessagesToMax[c]; var msg_to_positiveop = DoublePlusOp.AAverageConditional(Sum: msg_to_sum, b: list[c]); evidence += IsPositiveOp.LogEvidenceRatio(true, msg_to_positiveop); // sum operator does not contribute because no projection is involved // the x[index]-x[c] variable does not contribute because it only connects to two factors evidence -= msg_to_sum.GetLogAverageOf(Buffer.MessagesToMax[c]); if (max_marginal.IsPointMass) { evidence += Buffer.MessagesToMax[c].GetLogAverageOf(max_marginal); } else { evidence -= Buffer.MessagesToMax[c].GetLogNormalizer(); } } } //evidence += ReplicateOp.LogEvidenceRatio<Gaussian>(MessagesToMax, list[IndexOfMaximumDouble], MessagesToMax.Select(o => max_marginal / o).ToArray()); if (!max_marginal.IsPointMass) { evidence += max_marginal.GetLogNormalizer() - list[IndexOfMaximumDouble].GetLogNormalizer(); } //evidence -= Buffer.MessagesToMax.Sum(o => o.GetLogNormalizer()); //evidence -= Buffer.MessagesToMax.Sum(o => (max_marginal / o).GetLogAverageOf(o)); return(evidence); }
/// <summary> /// Computes the average parameter of an array of user/item parameters /// excluding the feature contribution for the users or items. /// </summary> /// <param name="entityParameters">The array of user/item parameters to get the average of.</param> /// <param name="weights">The feature weights of each user/item.</param> /// <param name="features">The feature values of each user/item.</param> /// <returns>The average parameter distribution excluding feature contributions.</returns> private static Gaussian GetAverageParameterExcludingFeatureContribution( IEnumerable <Gaussian> entityParameters, IList <Gaussian> weights, SparseFeatureMatrix features) { var adjustedEntityParameters = entityParameters.Select((gaussian, i) => DoublePlusOp.AAverageConditional(gaussian, ComputeFeatureContribution(weights, features.NonZeroFeatureValues[i], features.NonZeroFeatureIndices[i]))); return(GetAverageParameter(adjustedEntityParameters)); }
/// <summary>Computations that depend on the observed value of x1</summary> private void Changed_x1() { if (this.Changed_x1_isDone) { return; } Gaussian x2_F = default(Gaussian); this.x2_marginal_F = Gaussian.Uniform(); Gaussian x2_use_B = Gaussian.Uniform(); // Message to 'x2' from GaussianFromMeanAndVariance factor x2_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(0.0, 100.0); // Message to 'x2_marginal' from Variable factor this.x2_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(x2_use_B, x2_F, this.x2_marginal_F); Gaussian vdouble26_F = default(Gaussian); this.vdouble26_marginal_F = Gaussian.Uniform(); Gaussian vdouble26_use_B = Gaussian.Uniform(); Gaussian[] vdouble26_uses_F; Gaussian[] vdouble26_uses_B; // Create array for 'vdouble26_uses' Forwards messages. vdouble26_uses_F = new Gaussian[2]; // Create array for 'vdouble26_uses' Backwards messages. vdouble26_uses_B = new Gaussian[2]; vdouble26_uses_B[1] = Gaussian.Uniform(); vdouble26_uses_B[0] = Gaussian.Uniform(); vdouble26_uses_F[1] = Gaussian.Uniform(); vdouble26_uses_F[0] = Gaussian.Uniform(); // Message to 'vdouble26' from Difference factor vdouble26_F = DoublePlusOp.AAverageConditional(x2_F, this.X1); // Message to 'vdouble26' from Copy factor vdouble26_F = Distribution.SetPoint <Gaussian, double>(vdouble26_F, Factor.Copy <double>(0.0)); // FactorManager.Any(vdouble26_F, vdouble26_F) is now updated in all contexts // Message to 'vdouble26_uses' from Replicate factor vdouble26_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(vdouble26_uses_B, vdouble26_F, 0, vdouble26_uses_F[0]); // Message to 'vdouble26_uses' from Replicate factor vdouble26_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(vdouble26_uses_B, vdouble26_F, 1, vdouble26_uses_F[1]); // Message to 'vdouble26_uses' from Replicate factor vdouble26_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(vdouble26_uses_B, vdouble26_F, 0, vdouble26_uses_F[0]); // FactorManager.Any(vdouble26_uses_F[0], vdouble26_uses_F[0]) is now updated in all contexts // Message to 'vdouble26_marginal' from DerivedVariable factor this.vdouble26_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble26_use_B, vdouble26_uses_F[0], this.vdouble26_marginal_F); // Message to 'vdouble26_uses' from Replicate factor vdouble26_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(vdouble26_uses_B, vdouble26_F, 1, vdouble26_uses_F[1]); // FactorManager.Any(vdouble26_uses_F[1], vdouble26_uses_F[1]) is now updated in all contexts // Message to 'vdouble26_marginal' from DerivedVariable factor this.vdouble26_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble26_use_B, vdouble26_uses_F[1], this.vdouble26_marginal_F); this.x1_marginal_F = Gaussian.Uniform(); // Message to 'x1_marginal' from DerivedVariable factor this.x1_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian, double>(this.X1, this.x1_marginal_F); // FactorManager.Any(vdouble26_marginal_F, vdouble26_marginal_F) is now updated in all contexts this.Changed_x1_isDone = true; }
/// <summary>Computations that depend on the observed value of biasPrior and xValueCount and xValues and wPrior and xIndices</summary> public void Changed_biasPrior_xValueCount_xValues_wPrior_xIndices() { if (this.Changed_biasPrior_xValueCount_xValues_wPrior_xIndices_iterationsDone == 1) { return; } this.vdouble11_F = DoublePlusOp.SumAverageConditional(this.score_F, this.BiasPrior); this.vdouble13_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(this.vdouble11_F, 1); this.Changed_biasPrior_xValueCount_xValues_wPrior_xIndices_iterationsDone = 1; this.Changed_y_biasPrior_xValueCount_xValues_wPrior_xIndices_iterationsDone = 0; }
/// <summary> /// Adds the feature contribution for a given user/item to its traits and bias. /// </summary> /// <param name="parameters">The user/item parameters.</param> /// <param name="featureWeights">The feature weights.</param> /// <param name="featureValues">The feature values.</param> /// <param name="adjustedTraits">The resulting traits.</param> /// <param name="adjustedBias">The resulting bias.</param> public static void AddFeatureContribution( EntityParameterDistribution parameters, FeatureParameterDistribution featureWeights, SparseFeatureVector featureValues, out GaussianArray adjustedTraits, out Gaussian adjustedBias) { adjustedTraits = new GaussianArray( parameters.Traits.Count, i => DoublePlusOp.SumAverageConditional( parameters.Traits[i], ComputeFeatureContribution(featureWeights.TraitWeights[i], featureValues.NonZeroFeatureValues, featureValues.NonZeroFeatureIndices))); adjustedBias = DoublePlusOp.SumAverageConditional( parameters.Bias, ComputeFeatureContribution(featureWeights.BiasWeights, featureValues.NonZeroFeatureValues, featureValues.NonZeroFeatureIndices)); }
/// <summary>Computations that depend on the observed value of y and biasPrior and xValueCount and xValues and wPrior and xIndices</summary> public void Changed_y_biasPrior_xValueCount_xValues_wPrior_xIndices() { if (this.Changed_y_biasPrior_xValueCount_xValues_wPrior_xIndices_iterationsDone == 1) { return; } this.vdouble13_use_B = IsPositiveOp.XAverageConditional(this.Y, this.vdouble13_F); this.vdouble11_B = GaussianFromMeanAndVarianceOp.MeanAverageConditional(this.vdouble13_use_B, 1); this.bias_use_B = DoublePlusOp.BAverageConditional(this.vdouble11_B, this.score_F); this.bias_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(this.bias_use_B, this.BiasPrior, this.bias_marginal_F); this.score_B = DoublePlusOp.AAverageConditional(this.vdouble11_B, this.BiasPrior); this.product_B = FastSumOp.ArrayAverageConditional <DistributionStructArray <Gaussian, double> >(this.score_B, this.score_F, this.product_F, this.product_B); for (int userFeature = 0; userFeature < this.XValueCount; userFeature++) { this.wSparse_use_B[userFeature] = GaussianProductOp.BAverageConditional(this.product_B[userFeature], this.XValues[userFeature]); } this.wSparse_marginal_F = DerivedVariableOp.MarginalAverageConditional <DistributionStructArray <Gaussian, double> >(this.wSparse_use_B, this.wSparse_F, this.wSparse_marginal_F); this.Changed_y_biasPrior_xValueCount_xValues_wPrior_xIndices_iterationsDone = 1; }
// redundant parameters required for correct dependency graph public static IndexOfMaximumBuffer Buffer <GaussianList>(IndexOfMaximumBuffer Buffer, GaussianList list, int IndexOfMaximumDouble) where GaussianList : IList <Gaussian> { var max_marginal = Buffer.to_list[IndexOfMaximumDouble] * list[IndexOfMaximumDouble]; //var order = Rand.Perm(list.Count); for (int i = 0; i < list.Count; i++) { //int c = order[i]; int c = i; if (c != IndexOfMaximumDouble) { var msg_to_sum = max_marginal / Buffer.MessagesToMax[c]; var msg_to_positiveop = DoublePlusOp.AAverageConditional(Sum: msg_to_sum, b: list[c]); var msgFromPositiveOp = IsPositiveOp.XAverageConditional(true, msg_to_positiveop); Buffer.MessagesToMax[c] = DoublePlusOp.SumAverageConditional(list[c], msgFromPositiveOp); Buffer.to_list[c] = DoublePlusOp.AAverageConditional(Sum: msg_to_sum, b: msgFromPositiveOp); max_marginal = msg_to_sum * Buffer.MessagesToMax[c]; } } Buffer.to_list[IndexOfMaximumDouble] = max_marginal / list[IndexOfMaximumDouble]; return(Buffer); }
/// <summary>Computations that depend on the observed value of numberOfIterations and vint__0 and vint__1</summary> /// <param name="numberOfIterations">The number of times to iterate each loop</param> private void Changed_numberOfIterations_vint__0_vint__1(int numberOfIterations) { if (this.Changed_numberOfIterations_vint__0_vint__1_isDone) { return; } DistributionStructArray <Gaussian, double> vdouble__0_F; Gaussian vdouble__0_F_reduced; // Create array for 'vdouble__0' Forwards messages. vdouble__0_F = new DistributionStructArray <Gaussian, double>(5); // Message to 'vdouble__0' from GaussianFromMeanAndVariance factor vdouble__0_F_reduced = GaussianFromMeanAndVarianceOp.SampleAverageConditional(6.0, 9.0); for (int index1 = 0; index1 < 5; index1++) { vdouble__0_F[index1] = vdouble__0_F_reduced; vdouble__0_F[index1] = vdouble__0_F_reduced; } // Create array for 'vdouble__0_marginal' Forwards messages. this.vdouble__0_marginal_F = new DistributionStructArray <Gaussian, double>(5); DistributionStructArray <Gaussian, double> vdouble__0_use_B; // Create array for 'vdouble__0_use' Backwards messages. vdouble__0_use_B = new DistributionStructArray <Gaussian, double>(5); for (int index1 = 0; index1 < 5; index1++) { vdouble__0_use_B[index1] = Gaussian.Uniform(); } DistributionStructArray <Gaussian, double>[] vdouble__0_uses_F; // Create array for 'vdouble__0_uses' Forwards messages. vdouble__0_uses_F = new DistributionStructArray <Gaussian, double> [2]; // Create array for 'vdouble__0_uses' Forwards messages. vdouble__0_uses_F[1] = new DistributionStructArray <Gaussian, double>(5); for (int index1 = 0; index1 < 5; index1++) { vdouble__0_uses_F[1][index1] = Gaussian.Uniform(); } DistributionStructArray <Gaussian, double> vdouble__0_uses_F_1__marginal; // Message to 'vdouble__0_itemvint__1_index0_' from GetItems factor vdouble__0_uses_F_1__marginal = GetItemsOp <double> .MarginalInit <DistributionStructArray <Gaussian, double> >(vdouble__0_uses_F[1]); DistributionStructArray <Gaussian, double> vdouble__0_itemvint__1_index0__F; // Create array for 'vdouble__0_itemvint__1_index0_' Forwards messages. vdouble__0_itemvint__1_index0__F = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble__0_itemvint__1_index0__F[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble11_F' DistributionStructArray <Gaussian, double> vdouble11_F = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble11_F[index0] = Gaussian.Uniform(); } // Create array for 'vdouble__0_uses' Forwards messages. vdouble__0_uses_F[0] = new DistributionStructArray <Gaussian, double>(5); for (int index1 = 0; index1 < 5; index1++) { vdouble__0_uses_F[0][index1] = Gaussian.Uniform(); } DistributionStructArray <Gaussian, double> vdouble__0_uses_F_0__marginal; // Message to 'vdouble__0_itemvint__0_index0_' from GetItems factor vdouble__0_uses_F_0__marginal = GetItemsOp <double> .MarginalInit <DistributionStructArray <Gaussian, double> >(vdouble__0_uses_F[0]); DistributionStructArray <Gaussian, double> vdouble__0_itemvint__0_index0__F; // Create array for 'vdouble__0_itemvint__0_index0_' Forwards messages. vdouble__0_itemvint__0_index0__F = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble__0_itemvint__0_index0__F[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble8_F' DistributionStructArray <Gaussian, double> vdouble8_F = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble8_F[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble12_F' DistributionStructArray <Gaussian, double> vdouble12_F = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble12_F[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble12_B' DistributionStructArray <Gaussian, double> vdouble12_B = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble12_B[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble8_use_B' DistributionStructArray <Gaussian, double> vdouble8_use_B = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble8_use_B[index0] = Gaussian.Uniform(); } // Create array for replicates of 'vdouble11_use_B' DistributionStructArray <Gaussian, double> vdouble11_use_B = new DistributionStructArray <Gaussian, double>(6); for (int index0 = 0; index0 < 6; index0++) { vdouble11_use_B[index0] = Gaussian.Uniform(); } for (int iteration = this.numberOfIterationsDone; iteration < numberOfIterations; iteration++) { // Message to 'vdouble__0_uses' from Replicate factor vdouble__0_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <DistributionStructArray <Gaussian, double> >(this.vdouble__0_uses_B, vdouble__0_F, 1, vdouble__0_uses_F[1]); // Message to 'vdouble__0_itemvint__1_index0_' from GetItems factor vdouble__0_uses_F_1__marginal = GetItemsOp <double> .Marginal <DistributionStructArray <Gaussian, double>, Gaussian>(vdouble__0_uses_F[1], this.vdouble__0_uses_B[1], vdouble__0_uses_F_1__marginal); // Message to 'vdouble__0_uses' from Replicate factor vdouble__0_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <DistributionStructArray <Gaussian, double> >(this.vdouble__0_uses_B, vdouble__0_F, 0, vdouble__0_uses_F[0]); // Message to 'vdouble__0_itemvint__0_index0_' from GetItems factor vdouble__0_uses_F_0__marginal = GetItemsOp <double> .Marginal <DistributionStructArray <Gaussian, double>, Gaussian>(vdouble__0_uses_F[0], this.vdouble__0_uses_B[0], vdouble__0_uses_F_0__marginal); for (int index0 = 0; index0 < 6; index0++) { // Message to 'vdouble__0_itemvint__1_index0_' from GetItems factor vdouble__0_itemvint__1_index0__F[index0] = GetItemsOp <double> .ItemsAverageConditional <DistributionStructArray <Gaussian, double>, Gaussian>(this.vdouble__0_itemvint__1_index0__B[index0], vdouble__0_uses_F[1], vdouble__0_uses_F_1__marginal, this.Vint__1, index0, vdouble__0_itemvint__1_index0__F[index0]); // Message to 'vdouble11' from GaussianFromMeanAndVariance factor vdouble11_F[index0] = GaussianFromMeanAndVarianceOp.SampleAverageConditional(vdouble__0_itemvint__1_index0__F[index0], 1.0); // Message to 'vdouble__0_itemvint__0_index0_' from GetItems factor vdouble__0_itemvint__0_index0__F[index0] = GetItemsOp <double> .ItemsAverageConditional <DistributionStructArray <Gaussian, double>, Gaussian>(this.vdouble__0_itemvint__0_index0__B[index0], vdouble__0_uses_F[0], vdouble__0_uses_F_0__marginal, this.Vint__0, index0, vdouble__0_itemvint__0_index0__F[index0]); // Message to 'vdouble8' from GaussianFromMeanAndVariance factor vdouble8_F[index0] = GaussianFromMeanAndVarianceOp.SampleAverageConditional(vdouble__0_itemvint__0_index0__F[index0], 1.0); // Message to 'vdouble12' from Difference factor vdouble12_F[index0] = DoublePlusOp.AAverageConditional(vdouble8_F[index0], vdouble11_F[index0]); // Message to 'vdouble12' from IsPositive factor vdouble12_B[index0] = IsPositiveOp_Proper.XAverageConditional(Bernoulli.PointMass(true), vdouble12_F[index0]); // Message to 'vdouble8_use' from Difference factor vdouble8_use_B[index0] = DoublePlusOp.SumAverageConditional(vdouble12_B[index0], vdouble11_F[index0]); // Message to 'vdouble__0_itemvint__0_index0_' from GaussianFromMeanAndVariance factor this.vdouble__0_itemvint__0_index0__B[index0] = GaussianFromMeanAndVarianceOp.MeanAverageConditional(vdouble8_use_B[index0], 1.0); // Message to 'vdouble11_use' from Difference factor vdouble11_use_B[index0] = DoublePlusOp.BAverageConditional(vdouble8_F[index0], vdouble12_B[index0]); // Message to 'vdouble__0_itemvint__1_index0_' from GaussianFromMeanAndVariance factor this.vdouble__0_itemvint__1_index0__B[index0] = GaussianFromMeanAndVarianceOp.MeanAverageConditional(vdouble11_use_B[index0], 1.0); } // Message to 'vdouble__0_uses' from GetItems factor this.vdouble__0_uses_B[0] = GetItemsOp <double> .ArrayAverageConditional <Gaussian, DistributionStructArray <Gaussian, double> >(this.vdouble__0_itemvint__0_index0__B, this.Vint__0, this.vdouble__0_uses_B[0]); // Message to 'vdouble__0_uses' from GetItems factor this.vdouble__0_uses_B[1] = GetItemsOp <double> .ArrayAverageConditional <Gaussian, DistributionStructArray <Gaussian, double> >(this.vdouble__0_itemvint__1_index0__B, this.Vint__1, this.vdouble__0_uses_B[1]); this.OnProgressChanged(new ProgressChangedEventArgs(iteration)); } // Message to 'vdouble__0_use' from Replicate factor vdouble__0_use_B = ReplicateOp_NoDivide.DefAverageConditional <DistributionStructArray <Gaussian, double> >(this.vdouble__0_uses_B, vdouble__0_use_B); for (int index1 = 0; index1 < 5; index1++) { this.vdouble__0_marginal_F[index1] = Gaussian.Uniform(); // Message to 'vdouble__0_marginal' from Variable factor this.vdouble__0_marginal_F[index1] = VariableOp.MarginalAverageConditional <Gaussian>(vdouble__0_use_B[index1], vdouble__0_F_reduced, this.vdouble__0_marginal_F[index1]); } this.Changed_numberOfIterations_vint__0_vint__1_isDone = true; }
/// <summary> /// Returns the probability that A>B /// </summary> /// <param name="A"></param> /// <param name="B"></param> /// <returns></returns> private static Bernoulli ProbGreater(Gaussian A, Gaussian B) { Gaussian diff = DoublePlusOp.AAverageConditional(Sum: A, b: B); return(IsPositiveOp.IsPositiveAverageConditional(diff)); }
/// <summary>Computations that do not depend on observed values</summary> private void Constant() { if (this.Constant_isDone) { return; } Gaussian t1_F = default(Gaussian); this.t1_marginal_F = Gaussian.Uniform(); Gaussian t1_use_B = Gaussian.Uniform(); // Message to 't1' from GaussianFromMeanAndVariance factor t1_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(1.0, 1.0); Gaussian[] t1_uses_F; Gaussian[] t1_uses_B; // Create array for 't1_uses' Forwards messages. t1_uses_F = new Gaussian[2]; // Create array for 't1_uses' Backwards messages. t1_uses_B = new Gaussian[2]; t1_uses_B[1] = Gaussian.Uniform(); t1_uses_B[0] = Gaussian.Uniform(); t1_uses_F[1] = Gaussian.Uniform(); t1_uses_F[0] = Gaussian.Uniform(); // Message to 't1_marginal' from Variable factor this.t1_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t1_use_B, t1_F, this.t1_marginal_F); // Message to 't1_uses' from Replicate factor t1_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t1_uses_B, t1_F, 0, t1_uses_F[0]); // Message to 't1_uses' from Replicate factor t1_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t1_uses_B, t1_F, 1, t1_uses_F[1]); Gaussian t2_F = default(Gaussian); this.t2_marginal_F = Gaussian.Uniform(); Gaussian t2_use_B = Gaussian.Uniform(); // Message to 't2' from GaussianFromMeanAndVariance factor t2_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(10.0, 1.0); Gaussian[] t2_uses_F; Gaussian[] t2_uses_B; // Create array for 't2_uses' Forwards messages. t2_uses_F = new Gaussian[2]; // Create array for 't2_uses' Backwards messages. t2_uses_B = new Gaussian[2]; t2_uses_B[1] = Gaussian.Uniform(); t2_uses_B[0] = Gaussian.Uniform(); t2_uses_F[1] = Gaussian.Uniform(); t2_uses_F[0] = Gaussian.Uniform(); // Message to 't2_marginal' from Variable factor this.t2_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t2_use_B, t2_F, this.t2_marginal_F); // Message to 't2_uses' from Replicate factor t2_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t2_uses_B, t2_F, 0, t2_uses_F[0]); // Message to 't2_uses' from Replicate factor t2_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t2_uses_B, t2_F, 1, t2_uses_F[1]); Gaussian vdouble6_F = default(Gaussian); this.vdouble6_marginal_F = Gaussian.Uniform(); Gaussian vdouble6_use_B = Gaussian.Uniform(); // Message to 'vdouble6' from Plus factor vdouble6_F = DoublePlusOp.SumAverageConditional(t1_uses_F[0], t2_uses_F[0]); // Message to 'vdouble6_marginal' from DerivedVariable factor this.vdouble6_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble6_use_B, vdouble6_F, this.vdouble6_marginal_F); Gaussian t4_F = default(Gaussian); this.t4_marginal_F = Gaussian.Uniform(); Gaussian t4_use_B = Gaussian.Uniform(); // Message to 't4' from GaussianFromMeanAndVariance factor t4_F = GaussianFromMeanAndVarianceOp.SampleAverageConditional(2.0, 1.0); Gaussian[] t4_uses_F; Gaussian[] t4_uses_B; // Create array for 't4_uses' Forwards messages. t4_uses_F = new Gaussian[2]; // Create array for 't4_uses' Backwards messages. t4_uses_B = new Gaussian[2]; t4_uses_B[1] = Gaussian.Uniform(); t4_uses_B[0] = Gaussian.Uniform(); t4_uses_F[1] = Gaussian.Uniform(); t4_uses_F[0] = Gaussian.Uniform(); // Message to 't4_marginal' from Variable factor this.t4_marginal_F = VariableOp.MarginalAverageConditional <Gaussian>(t4_use_B, t4_F, this.t4_marginal_F); // Message to 't4_uses' from Replicate factor t4_uses_F[0] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t4_uses_B, t4_F, 0, t4_uses_F[0]); // Message to 't4_uses' from Replicate factor t4_uses_F[1] = ReplicateOp_NoDivide.UsesAverageConditional <Gaussian>(t4_uses_B, t4_F, 1, t4_uses_F[1]); Gaussian vdouble10_F = default(Gaussian); this.vdouble10_marginal_F = Gaussian.Uniform(); Gaussian vdouble10_use_B = Gaussian.Uniform(); // Message to 'vdouble10' from Plus factor vdouble10_F = DoublePlusOp.SumAverageConditional(t1_uses_F[1], t2_uses_F[1]); // Message to 'vdouble10_marginal' from DerivedVariable factor this.vdouble10_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(vdouble10_use_B, vdouble10_F, this.vdouble10_marginal_F); Gaussian t5_F = default(Gaussian); this.t5_marginal_F = Gaussian.Uniform(); Gaussian t5_use_B = Gaussian.Uniform(); // Message to 't5' from Product factor t5_F = GaussianProductOp.ProductAverageConditional(t5_use_B, vdouble10_F, t4_uses_F[0]); // Message to 't5_marginal' from DerivedVariable factor this.t5_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(t5_use_B, t5_F, this.t5_marginal_F); Gaussian t7_F = default(Gaussian); this.t7_marginal_F = Gaussian.Uniform(); Gaussian t7_use_B = Gaussian.Uniform(); // Message to 't7' from Product factor t7_F = GaussianProductOp.ProductAverageConditional(t7_use_B, vdouble6_F, t4_uses_F[1]); // Message to 't7_marginal' from DerivedVariable factor this.t7_marginal_F = DerivedVariableOp.MarginalAverageConditional <Gaussian>(t7_use_B, t7_F, this.t7_marginal_F); this.Constant_isDone = true; }