# a variable<vector> sum factor • ### Question

• Hello,

I am new to Infer.NET. This is a factor I created as according to add new factor . But it does not work .

```using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MicrosoftResearch.Infer.Models;
using MicrosoftResearch.Infer.Maths;
using MicrosoftResearch.Infer;
using MicrosoftResearch.Infer.Distributions;
using MicrosoftResearch.Infer.Factors;
[assembly: MicrosoftResearch.Infer.Factors.HasMessageFunctions]
public static class MyFactor
{

public static Vector SumTwoVector(Vector a, Vector b)
{
return a+b;
}
[FactorMethod(typeof(MyFactor), "SumTwoVector",typeof(Variable<Vector>),typeof(Variable<Vector>))]
public static class SumTwoVectorOp
{

public static VectorGaussian SumAverageLogarithm(VectorGaussian vector1,VectorGaussian vector2)
{
Vector v=null;
PositiveDefiniteMatrix m=null;
vector1.GetMeanAndVariance(v,m);
Vector v2=null;
PositiveDefiniteMatrix m2=null;
vector2.GetMeanAndVariance(v2,m2);
return VectorGaussian.FromMeanAndVariance(v+v2,m+m2);

}
public static VectorGaussian TwoP1AverageLogarithm(VectorGaussian sum, VectorGaussian vector1)
{
Vector v=null;
PositiveDefiniteMatrix m=null;
sum.GetMeanAndVariance(v,m);

Vector v2=null;
PositiveDefiniteMatrix m2=null;
vector1.GetMeanAndVariance(v2,m2);
return VectorGaussian.FromMeanAndVariance(v-v2,m);
}
public static VectorGaussian TwoP2AverageLogarithm(VectorGaussian sum, VectorGaussian vector2)
{

Vector v=null;
PositiveDefiniteMatrix m=null;
sum.GetMeanAndVariance(v,m);

Vector v2=null;
PositiveDefiniteMatrix m2=null;
vector2.GetMeanAndVariance(v2,m2);
return VectorGaussian.FromMeanAndVariance(v-v2,m);
}
}
}

```

Is there any special notations should be added to factor method declaration?

I did not see which connects the method and the operator....

In the method declaration, it only accepts ordinary types, right?

Friday, July 13, 2012 2:30 PM

• ```[ParameterNames("Sum", "A", "B")]
public static Vector SumTwoVector(Vector a, Vector b)
{
return a + b;
}```

(b) Your operator class should have the following attribute (i.e. Vector, not Variable<Vector>)

``` [FactorMethod(typeof(MyFactor), "SumTwoVector",typeof(Vector),typeof(Vector))]
```

(c) The operator method names have to reflect the names of the variables ("Sum" "A", "B" given the ParameterNames attribute above. So:

SumAverageLogarithm, AAverageLogarithm, and BAverageLogarithm.

John

Tuesday, July 17, 2012 1:44 PM

### All replies

• ```[ParameterNames("Sum", "A", "B")]
public static Vector SumTwoVector(Vector a, Vector b)
{
return a + b;
}```

(b) Your operator class should have the following attribute (i.e. Vector, not Variable<Vector>)

``` [FactorMethod(typeof(MyFactor), "SumTwoVector",typeof(Vector),typeof(Vector))]
```

(c) The operator method names have to reflect the names of the variables ("Sum" "A", "B" given the ParameterNames attribute above. So:

SumAverageLogarithm, AAverageLogarithm, and BAverageLogarithm.

John

Tuesday, July 17, 2012 1:44 PM
• John,

Thanks for your reply. I modified the codes as you suggested. But when I try to call this method, It alert a compiler error. As the method requires a Vector not a Variable<Vector> .

```using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MicrosoftResearch.Infer.Models;
using MicrosoftResearch.Infer.Factors;
using MicrosoftResearch.Infer;
using MicrosoftResearch.Infer.Distributions;
using MicrosoftResearch.Infer.Maths;

public class Class1
{
class program
{
static void Main()
{

Vector[] pros = new Vector[] { Vector.FromArray(0.3, 0.3,0.4 ) /* */, Vector.FromArray(0.3,0.3,0.4 ) /* */,
Vector.FromArray(0.1, 0.4,0.5 ),Vector.FromArray(0.1,0.5,0.4 )};
var Pros = pros.Select(v => VectorGaussian.PointMass(v)).ToArray();

VariableArray<Vector> contributionMatrix;
Range K = new Range(4);
Range D = new Range(3);
Variable<PositiveDefiniteMatrix> MatrixC;
MatrixC = PositiveDefiniteMatrix.Identity(3);
VariableArray<VectorGaussian> contributionPrior;
contributionPrior = Variable.Array<VectorGaussian>(K).Named("contributionprior");

contributionMatrix = Variable.Array<Vector>(K).Named("Emission");
contributionMatrix[K] = Variable<Vector>.Random<VectorGaussian>(contributionPrior[K]);
contributionMatrix.SetValueRange(D);

contributionPrior.ObservedValue = Pros;

InferenceEngine ei = new InferenceEngine(new VariationalMessagePassing());
ei.ShowFactorGraph = true;

Variable<Vector> r1 = Variable.VectorGaussianFromMeanAndPrecision(contributionMatrix, MatrixC);
Variable<Vector> r2 = Variable.VectorGaussianFromMeanAndPrecision(contributionMatrix, MatrixC);

Variable<Vector> r = MyFactor.SumTwoVector(r1,r2);

Console.WriteLine(ei.Infer(r1));

}
}

}```

Thursday, July 19, 2012 9:12 PM
• You need to use the Factor method on Variable<Vector> to incorporate your factor into your model as described in the first paragraph of http://research.microsoft.com/infernet/docs/How%20to%20add%20a%20new%20factor%20and%20message%20operators.aspx - see link to http://research.microsoft.com/infernet/docs/applying%20functions%20and%20operators%20to%20variables.aspx

`Variable<Vector>.Factor<Vector, Vector>(MyFactor.SumTwoVector, r1, r2)`

Friday, July 20, 2012 7:52 AM