/// <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()); }
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()); }
/// <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 }
/// <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 }