public void AddUnitaryFactor(int factorId, Factorable.UnitaryFactor factorFunction, Layer layer, bool dynamic = true, bool enabled = true)
        {
            switch (layer)
            {
            case Layer.NodeLayer:
                AddUnitaryFactorToLayer(factorId, factorFunction, this.NodeLayer, dynamic, enabled);
                break;

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

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

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

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