コード例 #1
0
ファイル: AlphaNode.cs プロジェクト: arastoul/NRules
        public virtual void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            var toAssert = new List <Fact>();

            using (var counter = PerfCounter.Assert(context, this))
            {
                foreach (var fact in facts)
                {
                    if (IsSatisfiedBy(context, fact))
                    {
                        toAssert.Add(fact);
                    }
                }
                counter.AddInputs(facts.Count);
                counter.AddOutputs(toAssert.Count);
            }

            if (toAssert.Count > 0)
            {
                foreach (var childNode in ChildNodes)
                {
                    childNode.PropagateAssert(context, toAssert);
                }
                MemoryNode?.PropagateAssert(context, toAssert);
            }
        }
コード例 #2
0
        public void PropagateAssert(IExecutionContext context, TupleFactList tupleFactList)
        {
            if (tupleFactList.Count == 0)
            {
                return;
            }

            IBetaMemory memory   = context.WorkingMemory.GetNodeMemory(this);
            var         toAssert = new List <Tuple>();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var enumerator = tupleFactList.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    var childTuple = new Tuple(context.IdGenerator.NextTupleId(), enumerator.CurrentTuple,
                                               enumerator.CurrentFact);
                    childTuple.GroupId = enumerator.CurrentTuple.Id;
                    toAssert.Add(childTuple);
                }

                counter.AddItems(tupleFactList.Count);
            }

            PropagateAssertInternal(context, memory, toAssert);
        }
コード例 #3
0
        public override void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var aggregation        = new Aggregation();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, facts);
                foreach (var set in joinedSets)
                {
                    if (set.Facts.Count == 0)
                    {
                        continue;
                    }

                    IFactAggregator aggregator = GetFactAggregator(context, set.Tuple);
                    if (aggregator == null)
                    {
                        aggregator = CreateFactAggregator(context, set.Tuple);

                        var originalSet           = JoinedSet(context, set.Tuple);
                        var matchingOriginalFacts = originalSet.Facts;
                        AddToAggregate(aggregationContext, aggregator, aggregation, originalSet.Tuple, matchingOriginalFacts);
                    }

                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                }

                counter.AddInputs(facts.Count);
                counter.AddOutputs(aggregation.Count);
            }

            PropagateAggregation(context, aggregation);
        }
コード例 #4
0
 public void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
 {
     using var counter = PerfCounter.Assert(context, this);
     foreach (var tuple in tuples)
     {
         var activation = new Activation(CompiledRule, tuple);
         context.WorkingMemory.SetState(this, tuple, activation);
         context.Agenda.Add(activation);
         context.EventAggregator.RaiseActivationCreated(context.Session, activation);
     }
     counter.AddItems(tuples.Count);
 }
コード例 #5
0
ファイル: BindingNode.cs プロジェクト: arastoul/NRules
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var toAssert = new TupleFactList();

            using (var counter = PerfCounter.Assert(context, this))
            {
                foreach (var tuple in tuples)
                {
                    AssertBinding(context, tuple, toAssert);
                }

                counter.AddItems(tuples.Count);
            }
            MemoryNode.PropagateAssert(context, toAssert);
        }
コード例 #6
0
        private void PropagateAssertInternal(IExecutionContext context, IBetaMemory memory, List <Tuple> tuples)
        {
            if (tuples.Count > 0)
            {
                for (int i = 0; i < _sinks.Count; i++)
                {
                    _sinks[i].PropagateAssert(context, tuples);
                }

                using (var counter = PerfCounter.Assert(context, this))
                {
                    memory.Add(tuples);
                    counter.SetCount(memory.TupleCount);
                }
            }
        }
コード例 #7
0
        public void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            IAlphaMemory memory = context.WorkingMemory.GetNodeMemory(this);

            foreach (var sink in _sinks)
            {
                sink.PropagateAssert(context, facts);
            }

            using (var counter = PerfCounter.Assert(context, this))
            {
                memory.Add(facts);

                counter.AddItems(facts.Count);
                counter.SetCount(memory.FactCount);
            }
        }
コード例 #8
0
ファイル: ObjectInputAdapter.cs プロジェクト: arastoul/NRules
        public void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var toAssert = new List <Fact>(tuples.Count);

            using (var counter = PerfCounter.Assert(context, this))
            {
                foreach (var tuple in tuples)
                {
                    var wrapperFact = new WrapperFact(tuple);
                    context.WorkingMemory.SetState(this, tuple, wrapperFact);
                    toAssert.Add(wrapperFact);
                }
                counter.AddItems(tuples.Count);
            }

            foreach (var sink in _sinks)
            {
                sink.PropagateAssert(context, toAssert);
            }
        }
コード例 #9
0
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var aggregationContext = new AggregationContext(context, NodeInfo);
            var aggregation        = new Aggregation();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, tuples);
                foreach (var set in joinedSets)
                {
                    IFactAggregator aggregator = CreateFactAggregator(context, set.Tuple);
                    AddToAggregate(aggregationContext, aggregator, aggregation, set.Tuple, set.Facts);
                }

                counter.AddInputs(tuples.Count);
                counter.AddOutputs(aggregation.Count);
            }

            PropagateAggregation(context, aggregation);
        }
コード例 #10
0
ファイル: ExistsNode.cs プロジェクト: arastoul/NRules
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var toAssert = new TupleFactList();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, tuples);
                foreach (var set in joinedSets)
                {
                    var quantifier = context.CreateQuantifier(this, set.Tuple);
                    quantifier.Value += set.Facts.Count;
                    if (quantifier.Value > 0)
                    {
                        toAssert.Add(set.Tuple, null);
                    }
                }

                counter.AddInputs(tuples.Count);
                counter.AddOutputs(toAssert.Count);
            }

            MemoryNode.PropagateAssert(context, toAssert);
        }
コード例 #11
0
ファイル: JoinNode.cs プロジェクト: arastoul/NRules
        public override void PropagateAssert(IExecutionContext context, List <Tuple> tuples)
        {
            var toAssert = new TupleFactList();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, tuples);
                foreach (var set in joinedSets)
                {
                    foreach (var fact in set.Facts)
                    {
                        if (MatchesConditions(context, set.Tuple, fact))
                        {
                            toAssert.Add(set.Tuple, fact);
                        }
                    }
                }

                counter.AddInputs(tuples.Count);
                counter.AddOutputs(toAssert.Count);
            }

            MemoryNode.PropagateAssert(context, toAssert);
        }
コード例 #12
0
ファイル: NotNode.cs プロジェクト: arastoul/NRules
        public override void PropagateAssert(IExecutionContext context, List <Fact> facts)
        {
            var toRetract = new TupleFactList();

            using (var counter = PerfCounter.Assert(context, this))
            {
                var joinedSets = JoinedSets(context, facts);
                foreach (var set in joinedSets)
                {
                    var quantifier    = context.GetQuantifier(this, set.Tuple);
                    int startingCount = quantifier.Value;
                    quantifier.Value += set.Facts.Count;
                    if (startingCount == 0 && quantifier.Value > 0)
                    {
                        toRetract.Add(set.Tuple, null);
                    }
                }

                counter.AddInputs(facts.Count);
                counter.AddOutputs(toRetract.Count);
            }

            MemoryNode.PropagateRetract(context, toRetract);
        }