示例#1
0
        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));
            }
        }
示例#2
0
        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));
            }
        }
示例#3
0
        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));
        }
示例#4
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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));
        }
示例#9
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));
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#14
0
        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));
        }
示例#15
0
        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));
        }
示例#16
0
        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));
        }
示例#17
0
        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?");
        }
示例#18
0
        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?");
        }
示例#19
0
        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)}");
            }
        }