protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var subject = generator.GetValue(instance, Concept2.Subject); var property = generator.GetValue(instance, Concept2.Property); var inheritedProperties = generator.GetPropertyValues(subject, includeInstanceProps: false); var value = generator.GetValue(subject, property.Concept); if (value == null) { var refutation = new ConceptInstance(Concept2.KnowledgeRefutation); var refutedInfo = new ConceptInstance(subject.Concept); generator.SetValue(refutedInfo, property.Concept, new ConceptInstance(Concept2.Something)); generator.SetValue(refutation, Concept2.Subject, refutedInfo); generator.SetValue(refutation, Concept2.Property, property); generator.Push(new InstanceOutputEvent(refutation)); } else { var confirmation = new ConceptInstance(Concept2.KnowledgeConfirmed); var confirmedInfo = new ConceptInstance(subject.Concept); generator.SetValue(confirmedInfo, property.Concept, value); generator.SetValue(confirmation, Concept2.Subject, confirmedInfo); generator.Push(new InstanceOutputEvent(confirmation)); } }
protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var property = generator.GetValue(instance, _propertyParameter); var subject = generator.GetValue(instance, _subjectParameter); var answer = getAnswer(subject, property.Concept, generator); if (answer.Count == 0) { //generator.Push(new StaticScoreEvent(-0.20)); generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.NotFound))); } else if (answer.Count == 1) { generator.Push(new StaticScoreEvent(0.20)); generator.Push(new InstanceOutputEvent(answer.First())); } else { var needRefinementInstance = new ConceptInstance(Concept2.NeedsRefinement); generator.SetValue(needRefinementInstance, Concept2.Subject, subject); generator.SetValue(subject, Concept2.OnSetListener, instance); generator.Push(new InstanceOutputEvent(needRefinementInstance)); } }
protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var subject = generator.GetValue(instance, Concept2.Subject); var target = generator.GetValue(instance, Concept2.Target); var relevantProperties = getRelevantProperties(target, generator); if (!relevantProperties.Any()) { generator.Push(new StaticScoreEvent(-0.5)); return; } var disambiguation = new ConceptInstance(Concept2.PropertyValueDisambiguation); generator.SetValue(disambiguation, Concept2.Unknown, subject); generator.SetValue(disambiguation, Concept2.Target, target); foreach (var pair in relevantProperties) { var propertyInstance = new ConceptInstance(pair.Key); foreach (var value in pair.Value) { var valueInstance = new ConceptInstance(value); generator.SetValue(valueInstance, Concept2.Property, propertyInstance); generator.SetValue(disambiguation, Concept2.Subject, valueInstance); } } generator.Push(new InstanceActivationRequestEvent(disambiguation)); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var unknownPhrases = GetUnknownPhrases(generator); var isInLearnPhraseMode = PreviousPolicy <LearnNewPhrase>(out var learnPolicy) || PreviousPolicy <UnknownAnsweredToLearnNewPhrase>(out learnPolicy); if (!isInLearnPhraseMode || unknownPhrases.Count() != 1) { yield break; } var unknown = generator.GetValue(learnPolicy.Tag, Concept2.Unknown); var prompt = generator.GetValue(learnPolicy.Tag, Concept2.Prompt); //remember runtime info so others can use it generator.SetValue(TagInstance, Concept2.Unknown, unknown); generator.SetValue(TagInstance, Concept2.Prompt, prompt); generator.Push(new InstanceActivationRequestEvent(prompt)); yield return($"Still, I'm not getting it. What does {singular(unknown)} mean?"); yield return($"That is complicated. What does {singular(unknown)} mean?"); yield return($"I don't know those words. Could you put {singular(unknown)} differently?"); }
internal static ConceptInstance Create(BeamGenerator generator, Concept2 subject, string description) { var instance = new ConceptInstance(Concept2.RememberConceptDescription); generator.SetValue(instance, Concept2.Subject, new ConceptInstance(subject)); generator.SetValue(instance, Concept2.Description, new ConceptInstance(Concept2.From(description))); return(instance); }
internal static ConceptInstance Create(BeamGenerator generator, ConceptInstance yesInstance, ConceptInstance noInstance) { var prompt = new ConceptInstance(Concept2.Prompt); generator.SetValue(prompt, Concept2.Yes, yesInstance); generator.SetValue(prompt, Concept2.No, noInstance); return(prompt); }
internal static ConceptInstance Create(ConceptInstance instanceToRefine, string unknown, BeamGenerator generator) { var assignUnknownProperty = new ConceptInstance(Concept2.AssignUnknownProperty); var unknownPropertyCandidate = new ConceptInstance(Concept2.From(unknown)); generator.SetValue(assignUnknownProperty, Concept2.Subject, unknownPropertyCandidate); generator.SetValue(assignUnknownProperty, Concept2.Target, instanceToRefine); return(assignUnknownProperty); }
protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var subjects = generator.GetValues(instance, Concept2.Subject).ToArray(); var answer = generator.GetValue(instance, Concept2.Answer); var unknown = generator.GetValue(instance, Concept2.Unknown); var target = generator.GetValue(instance, Concept2.Target); var directSubjects = filterDirectSubjects(subjects, answer); var indirectSubjects = filterIndirectSubjects(subjects, answer, generator); if (answer.Concept == Concept2.Nothing) { // user does not like any option return; } if (directSubjects.Count() == 1) { pushSetSubject(target, directSubjects.First(), generator, unknown); return; } if (indirectSubjects.Count() == 1) { pushSetSubject(target, indirectSubjects.First(), generator, unknown); return; } if (indirectSubjects.Count() == 0) { generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.DisambiguationFailed))); return; } if (indirectSubjects.Count() < subjects.Count()) { //create new disambiguation generator.Push(new StaticScoreEvent(0.1)); pushNewDisambiguation(indirectSubjects, unknown, target, generator); return; } if (indirectSubjects.Count() == subjects.Count()) { var knowledgeConfirmation = new ConceptInstance(Concept2.DisambiguatedKnowledgeConfirmed); generator.SetValue(knowledgeConfirmation, Concept2.Subject, answer); generator.SetValue(knowledgeConfirmation, Concept2.Target, instance); generator.Push(new StaticScoreEvent(0.05)); generator.Push(new InstanceOutputEvent(knowledgeConfirmation)); return; } //disambiguation was not helpful generator.Push(new StaticScoreEvent(-1.0)); }
internal static ConceptInstance Create(BeamGenerator generator, PropertySetTarget target, ConceptInstance value) { var rememberValue = new ConceptInstance(Concept2.RememberPropertyValue); generator.SetValue(rememberValue, Concept2.Target, target.Instance); generator.SetValue(rememberValue, Concept2.TargetProperty, new ConceptInstance(target.Property)); generator.SetValue(rememberValue, Concept2.Subject, value); return(rememberValue); }
private void pushNewDisambiguation(IEnumerable <ConceptInstance> indirectSubjects, ConceptInstance unknown, ConceptInstance target, BeamGenerator generator) { var disambiguation = new ConceptInstance(Concept2.PropertyValueDisambiguation); generator.SetValue(disambiguation, Concept2.Unknown, unknown); generator.SetValue(disambiguation, Concept2.Target, target); foreach (var subject in indirectSubjects) { generator.SetValue(disambiguation, Concept2.Subject, subject); } generator.Push(new InstanceActivationRequestEvent(disambiguation)); }
internal static ConceptInstance CreatePrompt(Dictionary <Concept2, ConceptInstance> optionEffect, BeamGenerator generator) { var prompt = new ConceptInstance(Concept2.OptionPrompt); foreach (var pair in optionEffect) { var optionInstance = new ConceptInstance(pair.Key); var effect = pair.Value; generator.SetValue(optionInstance, Concept2.Invocation, effect); generator.SetValue(prompt, Concept2.Option, optionInstance); } return(prompt); }
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)); } }
private void pushSetSubject(ConceptInstance target, ConceptInstance resolvedSubject, BeamGenerator generator, ConceptInstance unknown) { RememberConceptDescription.Activate(resolvedSubject.Concept, unknown.Concept.Name, generator); var relevantProperty = generator.GetValue(resolvedSubject, Concept2.Property); generator.Push(new StaticScoreEvent(0.1)); generator.SetValue(target, relevantProperty.Concept, resolvedSubject); }
protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var subject = generator.GetValue(instance, Concept2.Subject); var inheritedProperties = generator.GetPropertyValues(subject, includeInstanceProps: false); var pureInstanceProperties = generator.GetPropertyValues(subject, includeInheritedProps: false); if (!pureInstanceProperties.Any()) { var confirmation = new ConceptInstance(Concept2.KnowledgeConfirmed); generator.SetValue(confirmation, Concept2.Subject, subject); generator.Push(new InstanceOutputEvent(confirmation)); return; } var unknown = new List <KeyValuePair <Concept2, ConceptInstance> >(); foreach (var propertyValue in pureInstanceProperties) { if (!inheritedProperties.TryGetValue(propertyValue.Key, out var knownValue) || knownValue.Concept != propertyValue.Value.Concept) { unknown.Add(propertyValue); } } if (unknown.Count == 0) { var confirmation2 = new ConceptInstance(Concept2.KnowledgeConfirmed); generator.SetValue(confirmation2, Concept2.Subject, subject); generator.Push(new InstanceOutputEvent(confirmation2)); return; } var unknownReport = new ConceptInstance(subject.Concept); foreach (var propertyValue in unknown) { generator.SetValue(unknownReport, propertyValue.Key, propertyValue.Value); } var confirmation3 = new ConceptInstance(Concept2.KnowledgeRefutation); generator.SetValue(confirmation3, Concept2.Subject, subject); generator.Push(new InstanceOutputEvent(unknownReport)); }
internal static void GenerateActivationRequest(string unknown, BeamGenerator generator) { var newConcept = Concept2.From(unknown); var newConceptInstance = new ConceptInstance(newConcept); var learnInstance = new ConceptInstance(Concept2.LearnNewConcept); generator.SetValue(learnInstance, Concept2.Unknown, newConceptInstance); generator.Push(new InstanceActivationRequestEvent(learnInstance)); }
private void pushNewOptions(IEnumerable <ConceptInstance> options, BeamGenerator generator) { var optionPrompt = new ConceptInstance(Concept2.OptionPrompt); foreach (var option in options) { generator.SetValue(optionPrompt, Concept2.Option, option); } generator.Push(new InstanceActivationRequestEvent(optionPrompt)); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var unknownPhrases = GetUnknownPhrases(generator).ToArray(); if (unknownPhrases.Length != 1) { yield break; } var phraseToAsk = unknownPhrases.First(); if (phraseToAsk.Split(' ').Length > 2) { yield break; } var newConcept = Concept2.From(phraseToAsk); var newConceptInstance = new ConceptInstance(newConcept); var handlePropertyInstance = new ConceptInstance(Concept2.AcceptNewProperty); generator.SetValue(handlePropertyInstance, Concept2.Property, newConceptInstance); var handleConceptInstance = new ConceptInstance(Concept2.Nothing); var options = new Dictionary <Concept2, ConceptInstance>() { { Concept2.Property, handlePropertyInstance }, { Concept2.ConceptName, handleConceptInstance }, }; var prompt = OptionPrompt.CreatePrompt(options, generator); //remember runtime info so others can use it generator.SetValue(TagInstance, Concept2.Unknown, newConceptInstance); generator.SetValue(TagInstance, Concept2.Prompt, prompt); generator.Push(new InstanceActivationRequestEvent(prompt)); yield return($"What does '{unknownPhrases.First()}' mean?"); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var evt = Get <InstanceOutputEvent>(); var priorityEvt = Get <InstanceOutputEvent>(p => p.Instance.Concept != Concept2.NeedsRefinement && p.Instance.Concept != Concept2.NotFound); if (priorityEvt != null || evt?.Instance.Concept != Concept2.NeedsRefinement) { yield break; } var instanceToRefine = generator.GetValue(evt.Instance, Concept2.Subject); // let following policies know about the refinement target generator.SetValue(TagInstance, Concept2.Target, instanceToRefine); // generate a question generator.Push(new IncompleteRelationEvent(instanceToRefine, Concept2.Something, null)); yield return($"I know many {plural(instanceToRefine)} which one would you like?"); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var suppressedConcepts = new HashSet <Concept2> { Concept2.NotFound, Concept2.DisambiguatedKnowledgeConfirmed, Concept2.NeedsRefinement }; var evt = Get <InstanceOutputEvent>(); var priorityEvt = Get <InstanceOutputEvent>(p => !suppressedConcepts.Contains(p.Instance.Concept)); if (priorityEvt != null) { evt = priorityEvt; } if (evt == null) { yield break; } var concept = evt.Instance.Concept; generator.SetValue(TagInstance, Concept2.Subject, evt.Instance); if (concept == Concept2.DisambiguatedKnowledgeConfirmed) { var disamb = Find <IncompleteRelationEvent>(s => !s.IsFilled && s.Subject?.Concept == Concept2.PropertyValueDisambiguation, precedingTurns: 1); var confirmed = generator.GetValue(evt.Instance, Concept2.Subject); var disambiguator = generator.GetValue(evt.Instance, Concept2.Target); generator.Push(new IncompleteRelationEvent(disambiguator, Concept2.Answer, null)); yield return($"I know it is {singular(confirmed)} already. Could you be more specific?"); } else if (concept == Concept2.NotFound) { yield return($"I don't know anything like that."); } else if (concept == Concept2.DisambiguationFailed) { yield return($"It is too complex for me. Could you use different words?"); } else if (concept == Concept2.RememberPropertyValue) { yield return($"Ok, I'll remember that."); yield return($"Thank you for the information!"); } else if (concept == Concept2.KnowledgeConfirmed) { var information = generator.GetValue(evt.Instance, Concept2.Subject); generator.Push(new InstanceActiveEvent(information, canBeReferenced: true)); yield return($"Yes, I know {singularWithProperty(information)}"); } else if (concept == Concept2.KnowledgeRefutation) { var information = generator.GetValue(evt.Instance, Concept2.Subject); var property = generator.GetValue(evt.Instance, Concept2.Property).Concept; generator.Push(new InstanceActiveEvent(information, canBeReferenced: true)); generator.Push(new IncompleteRelationEvent(information, property, null)); yield return($"No, I don't know {singularWithProperty(information)}"); } else { generator.Push(new InstanceActiveEvent(evt.Instance, canBeReferenced: true)); yield return($"It is {singular(evt.Instance)}"); yield return($"I found {singular(evt.Instance)}"); } }