Пример #1
0
        /// <summary>
        /// 核心计算
        /// </summary>
        public override void Evaluate()
        {
            ExpressionEvaluator e = new ExpressionEvaluator();

            e.GetEvidence += new EvidenceLookupHandler(RaiseEvidenceLookup);
            e.Postfix      = this.postfixExpression;
            ExpressionEvaluator.Symbol o = e.Evaluate(); //PERFORMANCE: this method is slow.

            base.EvidenceValue.Reset();                  //清空之前数据

            //result must be of this type or the expression is invalid, throw exception
            // 结果是IEvidenceValue类型,或者表达式为无效的,则抛出异常
            IEvidenceValue result = o.value as IEvidenceValue;

            //exit if null returned
            if (o.type == ExpressionEvaluator.Type.Invalid)
            {
                return;
            }

            // 值被改变了则调用事件
            if (base.Value.Equals(result.Value))
            {
                return;                //no change in value, dont raise an event
            }
            base.Value = result.Value; // 此方法,引发false时规则条件表达式中的引用为0
            RaiseChanged(this, new ChangedArgs());
        }
Пример #2
0
        public override void Evaluate()
        {
            ExpressionEvaluator e = new ExpressionEvaluator();

            e.GetEvidence += new EvidenceLookupHandler(RaiseEvidenceLookup);
            e.Postfix      = this.postfixExpression;
            ExpressionEvaluator.Symbol o = e.Evaluate(); //PERFORMANCE: this method is slow.

            base.EvidenceValue.Reset();                  //clear previous values

            //result must be of this type or the expression is invalid, throw exception
            IEvidenceValue result = o.value as IEvidenceValue;

            //exit if null returned
            if (o.type == ExpressionEvaluator.Type.Invalid)
            {
                return;
            }

            //see if its value has changed, if so then set the value and call the events
            if (base.Value.Equals(result.Value))
            {
                return; //no change in value, dont raise an event
            }
            base.Value = result.Value;
            RaiseChanged(this, new ChangedArgs());
        }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="evidenceCollection"></param>
        /// <param name="factRelationships"></param>
        public void Evaluate(Dictionary <string, IEvidence> evidenceCollection, Dictionary <string, List <string> > factRelationships)
        {
            #region register all evidences in this rom with this instance of decision
            foreach (IEvidence evidence in evidenceCollection.Values)
            {
                evidence.CallbackLookup += RaiseCallback;
                evidence.EvidenceLookup += RaiseEvidenceLookup;
                evidence.ModelLookup    += RaiseModelLookup;
                evidence.Changed        += delegate(object sender, ChangedArgs args)
                {
                    IEvidence evidence1 = (IEvidence)sender;
                    if (!(evidence1 is IFact))
                    {
                        return; //exit if not IFact
                    }
                    //find out the model of this ifact
                    IFact          fact    = (IFact)evidence1;
                    IEvidenceValue value   = (IEvidenceValue)fact.ValueObject;
                    string         modelId = value.ModelId;

                    //go through all ifacts and add those to of the same model to the execution list
                    foreach (IEvidence evidence2 in evidenceCollection.Values)
                    {
                        //exclude all evidences not of IFact type
                        if (!(evidence2 is IFact))
                        {
                            continue;
                        }
                        //exclude self
                        if (evidence2.ID == evidence1.ID)
                        {
                            continue;
                        }
                        //exclude all ifacts who are of a different model
                        if (evidence2.ValueObject.ModelId != modelId)
                        {
                            continue;
                        }
                        //we have a hit, add them to the list
                        executionList.Add(evidence2);
                    }
                };
            }
            #endregion

            #region load up the execution list with facts
            //load up the execution list with facts
            foreach (IEvidence fact in evidenceCollection.Values)
            {
                if (!(fact is IFact))
                {
                    continue;
                }

                executionList.Add(fact);
                Debug.WriteLine("Added fact to execution list: " + fact.ID);
            }
            #endregion

            #region load up the execution list with chainable rules
            //load up the execution list with chainable rules
            foreach (IEvidence rule in evidenceCollection.Values)
            {
                if (rule is IRule && ((IRule)rule).isChainable)
                {
                    executionList.Add(rule);
                    Debug.WriteLine("Added rule to execution list: " + rule.ID);
                }
            }
            #endregion

            #region execute list
            //execute list
            Debug.WriteLine("Iteration");
            Debug.IndentLevel++;
            while (executionList.HasNext)
            {
                Debug.WriteLine("Execution List: " + executionList.ToString());
                Debug.WriteLine("Processing");
                Debug.IndentLevel++;
                //evaluate first item on list, it will always be the one of the lowest priority
                string    evidenceId = executionList.Read();
                IEvidence evidence   = evidenceCollection[evidenceId];
                Debug.WriteLine("EvidenceId: " + evidence.ID);

                //evaluate evidence
                evidence.Evaluate();

                //add its actions, if any, to executionList, for evidence that has clauses
                if (evidence.ClauseEvidence != null)
                {
                    foreach (string clauseEvidenceId in evidence.ClauseEvidence)
                    {
                        Evidence.IEvidence clauseEvidence = (Evidence.IEvidence)evidenceCollection[clauseEvidenceId];
                        executionList.Add(clauseEvidence);
                        Debug.WriteLine("Added evidence to execution list: " + clauseEvidence.ID);
                    }
                }

                //add chainable dependent facts to executionList
                if (factRelationships.ContainsKey(evidence.ID))
                {
                    List <string> dependentFacts = factRelationships[evidence.ID];
                    foreach (string dependentFact in dependentFacts)
                    {
                        Evidence.IEvidence dependentEvidence = (Evidence.IEvidence)evidenceCollection[dependentFact];
                        executionList.Add(dependentEvidence);
                        Debug.WriteLine("Added dependent evidence to execution list: " + dependentEvidence.ID);
                    }
                }

                Debug.IndentLevel--;
                Debug.WriteLine("End Processing");
                Debug.WriteLine("");
            }
            Debug.IndentLevel--;
            Debug.WriteLine("End Iteration");

            #endregion
            //complete
        }
Пример #4
0
        /// <summary>
        /// 执行计算
        /// </summary>
        /// <param name="evidenceCollection"></param>
        /// <param name="factRelationships"></param>
        public void Evaluate(Dictionary <string, IEvidence> evidenceCollection, Dictionary <string, List <string> > factRelationships)
        {
            #region register all evidences in this rom with this instance of decision
            // 在这个实例中注册所有的evidences与这个实例的决定
            foreach (IEvidence evidence in evidenceCollection.Values)
            {
                evidence.CallbackLookup += RaiseCallback;
                evidence.EvidenceLookup += RaiseEvidenceLookup;
                evidence.ModelLookup    += RaiseModelLookup;

                evidence.Changed += delegate(object sender, ChangedArgs args)
                {
                    IEvidence evidence1 = (IEvidence)sender;
                    if (!(evidence1 is IFact))
                    {
                        return; //exit if not IFact
                    }

                    // 找出这ifact模型
                    IFact          fact    = (IFact)evidence1;
                    IEvidenceValue value   = (IEvidenceValue)fact.ValueObject;
                    string         modelId = value.ModelId;

                    // 遍历所有ifacts并添加这些到相同的模型来执行列表
                    foreach (IEvidence evidence2 in evidenceCollection.Values)
                    {
                        // 排除所有不是IFact证据类型
                        if (!(evidence2 is IFact))
                        {
                            continue;
                        }
                        // 排除自己
                        if (evidence2.ID == evidence1.ID)
                        {
                            continue;
                        }

                        // 排除所有那些不同的ifacts模型
                        if (evidence2.ValueObject.ModelId != modelId)
                        {
                            continue;
                        }

                        executionList.Add(evidence2);
                    }
                };
            }
            #endregion

            #region load up the execution list with facts
            //load up the execution list with facts
            // 加载列表可执行事实
            foreach (IEvidence fact in evidenceCollection.Values)
            {
                if (!(fact is IFact))
                {
                    continue;
                }

                executionList.Add(fact);
                Debug.WriteLine("Added fact to execution list: " + fact.ID);
            }
            #endregion

            #region load up the execution list with chainable rules
            //load up the execution list with chainable rules
            // 加载列表可执行链式规则
            foreach (IEvidence rule in evidenceCollection.Values)
            {
                if (rule is IRule && ((IRule)rule).isChainable)
                {
                    executionList.Add(rule);
                    Debug.WriteLine("Added rule to execution list: " + rule.ID);
                }
            }
            #endregion

            #region execute list
            //execute list
            Debug.WriteLine("Iteration");
            Debug.IndentLevel++;
            while (executionList.HasNext)
            {
                Debug.WriteLine("Execution List: " + executionList.ToString());
                Debug.WriteLine("Processing");
                Debug.IndentLevel++;
                //evaluate first item on list, it will always be the one of the lowest priority
                // 计算list的第一个,它将永远是最低优先级的一个
                string    evidenceId = executionList.Read();
                IEvidence evidence   = evidenceCollection[evidenceId];
                Debug.WriteLine("EvidenceId: " + evidence.ID);

                //evaluate evidence计算证明
                evidence.Evaluate();

                //add its actions, if any, to executionList, for evidence that has clauses
                // /如果证明有子句的,增加它的行为
                if (evidence.ClauseEvidence != null)
                {
                    foreach (string clauseEvidenceId in evidence.ClauseEvidence)
                    {
                        Evidence.IEvidence clauseEvidence = (Evidence.IEvidence)evidenceCollection[clauseEvidenceId];
                        executionList.Add(clauseEvidence);
                        Debug.WriteLine("Added evidence to execution list: " + clauseEvidence.ID);
                    }
                }

                //add chainable dependent facts to executionList
                // /执行列表的链式的相关的事实
                if (factRelationships.ContainsKey(evidence.ID))
                {
                    List <string> dependentFacts = factRelationships[evidence.ID];
                    foreach (string dependentFact in dependentFacts)
                    {
                        Evidence.IEvidence dependentEvidence = (Evidence.IEvidence)evidenceCollection[dependentFact];
                        executionList.Add(dependentEvidence);
                        Debug.WriteLine("Added dependent evidence to execution list: " + dependentEvidence.ID);
                    }
                }

                Debug.IndentLevel--;
                Debug.WriteLine("End Processing");
                Debug.WriteLine("");
            }
            Debug.IndentLevel--;
            Debug.WriteLine("End Iteration");

            #endregion
            //complete
        }