private ClassType classify(NodeReference node, KnowledgeRule rule) { if (rule.Path == null) { //there is no constraint return(getKnownClassifications(_knownClassifications.Keys.First())); } var layer = Knowledge.GetForwardTargets(new[] { node }, rule.Path); var isSatisfied = layer.Contains(rule.EndNode); if (isSatisfied && rule.YesRule != null) { return(classify(node, rule.YesRule)); } if (!isSatisfied && rule.NoRule != null) { return(classify(node, rule.NoRule)); } var classExamples = isSatisfied ? rule.InitialYesNodes : rule.InitialNoNodes; var opositeExamples = isSatisfied ? rule.InitialNoNodes : rule.InitialYesNodes; if (!classExamples.Any()) { classExamples = opositeExamples; } //TODO examples could be missing return(getKnownClassifications(classExamples.First())); }
internal void AddYesBranch(KnowledgeRule knowledgeRule) { if (YesRule != null) { throw new NotSupportedException("Cannot set rule branch twice"); } YesRule = knowledgeRule; }
internal void Retrain() { var log = new MultiTraceLog(_knownClassifications.Keys, Knowledge); Root = createRuleTree(new HashSet <NodeReference>(_knownClassifications.Keys), log); }