protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var criterion = generator.GetValue(instance, _parameter); var criterionValues = generator.GetPropertyValues(criterion); criterionValues.Remove(Concept2.OnSetListener); // TODO internal property removal should be done in more systematic way criterionValues.Remove(Concept2.HasProperty); criterionValues.Remove(Concept2.HasPropertyValue); var requiredProperties = new HashSet <Concept2>(criterionValues.Values.Select(i => i.Concept)); requiredProperties.Add(criterion.Concept); var result = FindRelevantConcepts(generator, requiredProperties); var isSubjectClass = generator.GetInverseConceptValues(Concept2.InstanceOf, criterion).Any(); if (result.Count == 0) { if (isSubjectClass) { generator.Push(new StaticScoreEvent(0.1)); } else { generator.Push(new StaticScoreEvent(-0.1)); } generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.NotFound))); } else if (result.Count == 1) { generator.Push(new StaticScoreEvent(0.5)); generator.Push(new InstanceOutputEvent(result.First())); } else { if (generator.IsProperty(criterion.Concept)) { generator.Push(new StaticScoreEvent(-0.15)); } var needRefinementInstance = new ConceptInstance(Concept2.NeedsRefinement); generator.SetValue(needRefinementInstance, Concept2.Subject, criterion); generator.SetValue(criterion, Concept2.OnSetListener, instance); generator.Push(new InstanceOutputEvent(needRefinementInstance)); } }
protected override IEnumerable <string> execute(BeamGenerator generator) { var fullRelation = Get <PropertySetEvent>(p => IsDefined(p.SubstitutedValue.Concept) && IsDefined(p.Target.Instance?.Concept)); if (fullRelation == null) { yield break; } var targetInstance = fullRelation.Target.Instance; if (targetInstance == null) { yield break; } var children = generator.GetInverseConceptValues(Concept2.InstanceOf, targetInstance); if (children.Any()) { //TODO add learning for classes yield break; } var parameters = generator.GetParameterDefinitions(targetInstance); if (parameters.Any(p => p.Property == fullRelation.Target.Property)) { //don't learn argument values yield break; } generator.Push(new StaticScoreEvent(0.1)); var remember = RememberPropertyValue.Create(generator, fullRelation.Target, fullRelation.SubstitutedValue); YesNoPrompt.Generate(generator, remember, new ConceptInstance(Concept2.Nothing)); yield return($"So you think, {singularWithProperty(fullRelation.Target.Instance)} ?"); }