Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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));
        }
Пример #4
0
        /// <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;
        }
Пример #5
0
 /// <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;
 }
Пример #6
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));
        }
Пример #7
0
 /// <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);
        }
Пример #9
0
        /// <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;
        }
Пример #10
0
        /// <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));
        }
Пример #11
0
        /// <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;
        }