public void AddBinaryFactor(int factorId, Factorable.BinaryFactor factorFunction, Layer layer, bool enabled = true)
        {
            switch (layer)
            {
            case Layer.NodeLayer:
                AddBinaryFactorToLayer(factorId, factorFunction, this.NodeLayer, enabled);
                break;

            case Layer.EdgeLayer:
                AddBinaryFactorToLayer(factorId, factorFunction, this.EdgeLayer, enabled);
                break;

            case Layer.GroupLayer:
                AddBinaryFactorToLayer(factorId, factorFunction, this.GroupLayer, enabled);
                break;

            case Layer.AllLayer:
                AddBinaryFactorToLayer(factorId, factorFunction, this.NodeLayer, enabled);
                AddBinaryFactorToLayer(factorId, factorFunction, this.EdgeLayer, enabled);
                AddBinaryFactorToLayer(factorId, factorFunction, this.GroupLayer, enabled);
                break;

            default:
                break;
            }
            if (!Lambda.ContainsKey(factorId))
            {
                Lambda.Add(factorId, new Dictionary <byte, double>());
            }
        }
 void AddBinaryFactorToLayer <T>(int factorId, Factorable.BinaryFactor factorFunction, List <T> layer, bool enabled = true)
     where T : Factorable, ILayerNode
 {
     layer.ForEach(delegate(T f)
     {
         f.AddBinaryFactor(factorId, factorFunction, enabled);
     });
 }