/// <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) sarvesh //{ // 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 }