コード例 #1
0
        public string SayHello()
        {
            PureFact numberOfStarts    = (PureFact)factsManager.GetByName("SystemStartsCount");
            int      numberOfStartsInt = Convert.ToInt32(numberOfStarts.Value);

            string text = "";

            if (!string.IsNullOrEmpty(factsManager.GetValueByName("UserName"))) //we know how the user's name
            {
                text = KorraModelHelper.GetChance(new string[] { "Hi", "Hello", "Hey", });

                if (KorraModelHelper.GetChance(3) && numberOfStartsInt > 1 && (text == "Hi" || text == "Hello")) //again version
                {
                    text += " again";
                }

                text += " " + factsManager.GetValueByName("UserName");
            }
            else //we do NOT know how the user's name
            {
                if (KorraModelHelper.GetChance(3) && numberOfStartsInt > 1)
                {
                    text = KorraModelHelper.GetChance(new string[] { "Hi again", "Hello again", }); //again version
                }
                else
                {
                    text = KorraModelHelper.GetChance(new string[] { "Hi", "Hello", "Hey", "Hello there", "Hey buddy" });
                }
            }
            return(text);
        }
コード例 #2
0
        public string GoOutAnnoucement()
        {
            PureFact factJob = (PureFact)factsManager.GetByName("UserHasJob");

            bool userWorks = factJob.IsAnswered && this.IsYes(factJob.Value);

            var options = (new string[]
                           { "You should go out this evening with your friends.",
                             "Call somebody and go for a drink this evening.",
                             "Today is " + KorraModelHelper.DayOfWeek() + ". It is pizza day. You better have something to eat outside." //TODO: check if it evening, or lunch time
                           }).ToList();

            if (userWorks)
            {
                options.Add("Call some friends and go for a drink after work.");
                options.Add("Going to a bar after work sounds like a great idea");
                options.Add("Do you have plans for this evening after work? You better go out and have a drink at the local pub.");
            }
            else
            {
                options.Add("Call some friends and go for a drink.");
                options.Add("Going to a bar this evening sounds like a great idea.");
                options.Add("Do you have plans for this evening? You better go out and have a drink at the local pub.");
            }

            //choose a statement randomly
            string text = KorraModelHelper.GetChance(options.ToArray(), lastGoOutAnnouncementUsed);

            lastGoOutAnnouncementUsed = text;

            return(text);
        }
コード例 #3
0
        private PureFact GetPureFactAbouBot()
        {
            PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts);

            if (pfManager == null)
            {
                SharedHelper.LogError("No manager in GetPureFactAbouBot.");
                return(null);
            }

            var q = (from item in pfManager.GetAll()
                     let pf = item as PureFact
                              where pf.Type == PureFactType.AboutBot && pf.IsPlanned == false && pf.IsUsed == false
                              select pf).ToArray();

            if (q.Length > 0)
            {
                string[] group1 = { "BotName" };          //conversation should start with these
                string[] group2 = { "BotAge", "BotSex" }; //conversation should continue with these

                List <ItemProb <string> > itemProbs = new List <ItemProb <string> >();

                //assign probabilities
                foreach (PureFact fact in q)
                {
                    if (group1.Contains(fact.Name)) //add only 1 item
                    {
                        itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.99)));
                        break;
                    }
                    else
                    if (group2.Contains(fact.Name))
                    {
                        itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.25)));
                    }
                    else
                    {
                        itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.8)));
                    }
                }

                var pureFactDistF = CategoricalF(itemProbs.ToArray()).Normalize();

                var pureFactDist = pureFactDistF.ToSampleDist();

                var selectionName = pureFactDist.Sample();

                PureFact selectedPureFact = (PureFact)pfManager.GetByName(selectionName);

                //SharedHelper.Log("GetPureFactAbouUser: selectionName " + selectionName);

                return(selectedPureFact);
            }
            else
            {
                SharedHelper.LogError("GetPureFactAbouBot could not supply a pure fact about the bot.");
                return(null);
            }
        }
コード例 #4
0
        public bool IsAnsweredAndUserIsWoman()
        {
            PureFact fact = (PureFact)factsManager.GetByName("UserSex");

            if (fact.IsAnswered && fact.Value.ToLower() == Female().ToLower()) //should be changed for other languages
            {
                return(true);
            }

            return(false);
        }
コード例 #5
0
ファイル: JoiModel.cs プロジェクト: toncho11/KorraAI
        public void BeforeAnalyseUserResponse(PureFact pfact)
        {
            //Here you change the responses that were encoded when creating this PureFact, even replace the function responsible for the answers.
            //This can be useful if you have new information about the user and its environment and this could not be encoded in advance.

            bool   isAnswerd     = pfact.IsAnswered;
            string responseValue = pfact.Value;

            //if (context.Phrases.IsYes(responseValue))
            //{
            //    fact.StatementOnPositiveResponse = "";
            //}
            SharedHelper.Log("Pure fact updated: " + pfact.Name);
        }
コード例 #6
0
        public CommItem?Process(IKorraAIModel model)
        {
            #region Get Fact Manager
            PureFacts pfManager = (PureFacts)model.ItemProviders.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No manager in Facts Manager in MoviesModelUpdateTrigger.");
                return(null);
            }
            #endregion

            var    context = model.GetContext();
            string text    = "";

            PureFact factLikesVideoGames = (PureFact)pfManager.GetByName("UserLikesVideoGames");
            PureFact factThinksVideoGameIsGoodPresent = (PureFact)pfManager.GetByName("UserThinksVideoGameIsGoodPresent");
            PureFact userAge = (PureFact)pfManager.GetByName("UserAge");
            PureFact userSex = (PureFact)pfManager.GetByName("UserSex");

            if (factLikesVideoGames == null || factThinksVideoGameIsGoodPresent == null || userAge == null || userSex == null)
            {
                SharedHelper.LogError("factJob or factWatchedMovieYesterday is NULL in MoviesModelUpdateTrigger.");
            }

            bool UserLikesVideoGamesAnswered = factLikesVideoGames.IsAnswered;
            bool UserThinksVideoGameIsGoodPresentAnswered = factThinksVideoGameIsGoodPresent.IsAnswered;

            bool userAgeAnswered = userAge.IsAnswered;
            bool userSexAnswered = userSex.IsAnswered;

            if (!UserLikesVideoGamesAnswered)
            {
                return(null);
            }

            bool UserLikesVideoGamesAnsweredYES = context.BasePhrases.IsYes(factLikesVideoGames.Value); //only if answered

            //Calcualte 3 differerent surprises:

            //1. surprise because statistically people from this sex and age like computer games
            //Should like Video Games, but user answered No
            if (userAgeAnswered && userSexAnswered &&
                factLikesVideoGames.IsAnswered &&
                !UserLikesVideoGamesAnsweredYES //DOES NOT LIKE VIDEO GAMES
                )
            {
                int  Age    = Convert.ToInt32(userAge.Value);
                bool IsMale = userSex.Value.ToLower() == phrases.Male().ToLower();

                var likesVideoGamesInferred = BernoulliF(ProbVariables.User.playsGames(Age, IsMale)); //our estimation based on Age and Sex

                //Threshold check
                if (likesVideoGamesInferred.ProbOf(e => e == true).Value > 0.8)
                {
                    SharedHelper.LogWarning("VG S1 surprise inferred.");
                    text          = phrases.SurpriseVideoGames(1, false); //second parameter is not used
                    executedCount = executedCount + 1;

                    return(new CommItem
                    {
                        Category = ActionsEnum.MakeGeneralStatement,
                        Name = "ExpressVideoGamesSurprise",

                        TextToSay = text,
                        FacialExpression = FaceExp.SurpriseOnStartTalking,
                    });
                }
                else
                {
                    SharedHelper.LogWarning("No VG S1 surprise, because it is below threshold.");
                }
            }

            if (!UserThinksVideoGameIsGoodPresentAnswered)
            {
                return(null);
            }
            bool UserThinksVideoGameIsGoodPresentYES = context.BasePhrases.IsYes(factThinksVideoGameIsGoodPresent.Value); //only if answered

            //2. Surprise
            //Thinks games are good present - YES
            //Likes games in general - NO
            //surprise: LikesGames rendered more than 70% positive, but still answered NO by user
            //backward inference
            if (UserLikesVideoGamesAnswered &&
                !UserLikesVideoGamesAnsweredYES &&  //DOES NOT LIKE VIDEO GAMES
                UserThinksVideoGameIsGoodPresentAnswered &&
                UserThinksVideoGameIsGoodPresentYES //LIKES VG AS PRESENT
                )
            {
                var conditionThinksVideogameIsGoodPresent = ProbVariables.User.VideoGameModel.ConditionHard(e => e.ThinksVideogameIsGoodPresent);

                //for this query we are not using Age and Sex, because we already know that the user LikesVideoGames (answered by the user)
                double probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred = conditionThinksVideogameIsGoodPresent.ProbOf(e => e.LikesVideoGames).Value;

                SharedHelper.LogWarning("S2 probLikesGamesConditionedOnThinksGamesAreGoodPresent: " + probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred);

                //Threshold check
                if (probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred > 0.6)
                {
                    SharedHelper.LogWarning("VG S2 surprise inferred.");
                    bool IsLikesGamesFirstAnswered = factLikesVideoGames.LastUpdated < factThinksVideoGameIsGoodPresent.LastUpdated;
                    text          = phrases.SurpriseVideoGames(2, IsLikesGamesFirstAnswered);
                    executedCount = executedCount + 1;

                    return(new CommItem
                    {
                        Category = ActionsEnum.MakeGeneralStatement,
                        Name = "ExpressVideoGamesSurprise",

                        TextToSay = text,
                        IsReactionToUser = true,
                        FacialExpression = FaceExp.SurpriseOnStartTalking,
                    });
                }
                else
                {
                    SharedHelper.LogWarning("No VG S2 surprise, because it is below threshold.");
                }
            }

            // 3. Surprise
            //Thinks games are a good present - NO
            //Likes games in general - YES
            //surprise: ThinkGamesGoodPresent rendered more than 70% positive, but still answered NO by user
            if (UserLikesVideoGamesAnswered &&
                UserThinksVideoGameIsGoodPresentAnswered &&
                UserLikesVideoGamesAnsweredYES &&     //LIKES VIDEO GAMES
                !UserThinksVideoGameIsGoodPresentYES) //DOES NOT LIKE VG AS PRESENT
            {
                //TODO: it should not be here, but attached to the item
                //THIS IS NEEDED FOR THE INFERRENCE BELOW ON: probThinksVideoGameIsGoodPresentInferred
                if (UserLikesVideoGamesAnsweredYES)
                {
                    ProbVariables.User.LikesVideoGames = BernoulliF(Prob(0.98));
                }

                var probThinksVideoGameIsGoodPresentInferred = ProbVariables.User.VideoGameModel.ProbOf(e => e.ThinksVideogameIsGoodPresent).Value;

                SharedHelper.LogWarning("S3 probThinksVideoGameIsGoodPresent: " + probThinksVideoGameIsGoodPresentInferred);

                //Threshold check
                if (probThinksVideoGameIsGoodPresentInferred >= 0.7)
                {
                    SharedHelper.LogWarning("VG S3 surprise inferred.");
                    bool IsLikesGamesFirstAnswered = factLikesVideoGames.LastUpdated < factThinksVideoGameIsGoodPresent.LastUpdated;
                    text          = phrases.SurpriseVideoGames(3, IsLikesGamesFirstAnswered);
                    executedCount = executedCount + 1;

                    return(new CommItem
                    {
                        Category = ActionsEnum.MakeGeneralStatement,
                        Name = "ExpressVideoGamesSurprise",

                        TextToSay = text,
                        FacialExpression = FaceExp.SurpriseOnStartTalking,
                    });
                }
                else
                {
                    SharedHelper.LogWarning("No VG S3 surprise, because it is below threshold.");
                }
            }

            return(null);
        }
コード例 #7
0
        public bool Process(bool isPureFactUpdated, TimeSpan timeSinceStart, IKorraAIModel model)
        {
            //SharedHelper.LogWarning("Inside movies trigger");
            #region Get Fact Manager
            PureFacts pfManager = (PureFacts)model.ItemProviders.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No manager in Process in MoviesModelUpdateTrigger.");
                return(false);
            }
            #endregion

            var context = model.GetContext();

            PureFact factJob = (PureFact)pfManager.GetByName("UserHasJob");
            PureFact factWatchedMovieYesterday = (PureFact)pfManager.GetByName("UserMovieYesterday");

            if (factJob == null || factWatchedMovieYesterday == null)
            {
                SharedHelper.LogError("factJob or factWatchedMovieYesterday is NULL in MoviesModelUpdateTrigger.");
            }

            if (!IsTimeOfDayUpdated && !isPureFactUpdated)
            {
                return(false);
            }

            SharedHelper.Log("Inside MoviesModelUpdateTrigger");

            var oldSuggestToWatchMovie = SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie).Value;

            //TODO: this model can be replaced by a Bayesian network, because of the too many IFs

            //if no job or weekend
            if ((factJob.IsAnswered && context.BasePhrases.IsNo(factJob.Value)) || StatesShared.IsWeekend)
            {
                ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.18));
                //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.18, no job or weekend");
            }
            else if (factJob.IsAnswered && context.BasePhrases.IsYes(factJob.Value)) //if has job
            {
                #region working and evening
                if (StatesShared.IsEvening /*TODO: or after work hours*/)
                {
                    //has NOT watched movie yesterday (is working and evening)
                    if (factWatchedMovieYesterday.IsAnswered && context.BasePhrases.IsNo(factJob.Value))
                    {
                        ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.18));
                        //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.18, evening");
                    }
                    //has watched movie yesterday (is working and evening)
                    else if (factWatchedMovieYesterday.IsAnswered && context.BasePhrases.IsYes(factJob.Value))
                    {
                        ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.12));
                        // KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.12. Watched movie yesterday.");
                    }
                }
                #endregion
                else //is working and not evening, no time because working and not evening
                {
                    ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.05));
                    //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.05");
                }
            }
            else //has job is unknown
            {
                ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.10));
            }

            double newSuggestToWatchMovie = SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie).Value;

            if (Math.Abs(oldSuggestToWatchMovie - newSuggestToWatchMovie) > (1 / 1000))
            {
                executedCount = executedCount + 1;

                SharedHelper.Log("Prob SuggestToWatchMovie changed from " + oldSuggestToWatchMovie + " to: " + SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie));
                //return new ModelUpdateTriggerReturn { IsTriggered = true, IsResamplingRequired = true, Value = "" };
                return(true); //re-sampling requested
            }
            else
            {
                return(false); //no re-sampling
            }
        }
コード例 #8
0
        public void ReGenerateMainSequence(ref Queue <CommItem> Interactions, ItemManager[] p_providers)
        {
            this.providers = p_providers;

            #region debug planned
            string availableItems = "Available items before sampling:\n";
            foreach (var manager in providers)
            {
                availableItems += "Available items for : " + manager.ToString() + " (" + manager.AvailableItems() + ")\n";
                if (!manager.AreAllUnPlanned())
                {
                    SharedHelper.LogError("Flag planned not removed for: " + manager.ToString());
                }
            }

            if ((JokesProvider.GetAll().Where(x => x.IsPlanned == false)).Count() != JokesProvider.GetAll().Count())
            {
                SharedHelper.LogError("Flag planned not removed for: JokeProvider ");
            }
            int availableJokes = JokesProvider.GetAll().Where(x => x.IsPlanned == false && x.IsUsed == false).Count();
            availableItems += "Available items for : " + "JokeProvider" + " (" + availableJokes + ")\n";
            SharedHelper.LogWarning(availableItems);
            #endregion

            PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No PureFact manager in ReGenerateMainSequence.");
            }

            //Creates a distribution over "EasilyOffended", IsRomanticJoke
            dists.InitJokesDistribution((PureFact)pfManager.GetByName("EasilyOffended"), false, true);

            //Interactions are built newely generated suggestions and actions
            allSuggestions = GenerateSuggestions();
            allActions     = GenerateActions();

            while (allActions.Count > 0 && allSuggestions.Count > 0)
            {
                if (this.AdjFunc(Interactions.Count))
                {
                    allActions = GenerateActions();
                }

                //==================================================================================================

                CommItem citem = new CommItem();
                citem.Category = allActions.Dequeue();

                //SharedHelper.Log("action: " + action);

                string suggestion = "";
                if (citem.Category == ActionsEnum.MakeSuggestion)
                {
                    suggestion = allSuggestions.Dequeue();
                }
                citem.SubCategory = suggestion;

                //Correction
                if (citem.Category == ActionsEnum.AskPureFactQuestionAboutUser)
                {
                    citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.AskPureFactQuestionAboutUser;
                }
                if (citem.Category == ActionsEnum.SharePureFactInfoAboutBot)
                {
                    citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.SharePureFactInfoAboutBot;
                }

                #region Process All
                ItemManager manager = providers.SingleOrDefault(x => x.Is(citem));

                if (manager != null && !(manager is PureFacts))  //TODO: to be improved
                {
                    Item item = manager.GetItem();
                    if (item != null)
                    {
                        manager.SetAsPlanned(item.Name);
                        citem = new CommItem(item);

                        if (manager is SongsProvider)
                        {
                            citem.TextToSay = ((Song)item).Name;
                        }

                        if (manager is MoviesProvider)
                        {
                            citem.TextToSay = phrases.MovieAnnouncement((Movie)item);
                        }

                        //if (manager is SportsProvider)
                        //    SharedHelper.Log("Sport item added in Joi sampler: " + citem.TextToSay);

                        InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        //SharedHelper.LogWarning("Added " + citem.Category + citem.SubCategory + " with text: " + citem.TextToSay);
                    }
                    else
                    {
                        InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        SharedHelper.LogWarning("Not enough " + citem.Category + citem.SubCategory + " during planning.");
                    }
                }
                #endregion
                else
                {
                    #region Set Suggestion
                    if (citem.Category == ActionsEnum.MakeSuggestion)
                    {
                        //string suggestion = allSuggestions.Dequeue();

                        //SharedHelper.Log("suggestion: " + suggestion);

                        #region set joke
                        if (suggestion == SuggestionsEnum.TellJoke)
                        {
                            //the fact that joke has bee planned, does not mean it has been executed

                            Joke joke = dists.NextJoke();

                            if (joke != null)
                            {
                                citem = new CommItem(joke);

                                //Planned is handled by "dists"
                                //It gives a distribution from all unplanned and unused

                                JokesProvider.SetJokeAsPlanned(joke.Name);

                                //joke.IsPlanned = true;
                                //citem.Name = joke.Name;
                                //citem.TextToSay = joke.Text;
                                //citem.SubCategory = suggestion;
                                citem.IsJokePureFact   = joke.IsPureFact; //these jokes come from the PureFacts collection
                                citem.UIAnswer         = joke.PureFactUI;
                                citem.FacialExpression = joke.FaceExpression;

                                InteractionsStat.AddScheduledInteraction(SuggestionsEnum.TellJoke);
                            }
                            else
                            {
                                citem.TextToSay = "__nointeraction__";
                                //UnityEngine.Debug.LogWarning("Not enough jokes during planning.");
                                InteractionsStat.AddMissingInteraction(SuggestionsEnum.TellJoke);
                            }
                        }
                        #endregion

                        #region set Go Out
                        if (suggestion == SuggestionsEnum.GoOut)
                        {
                            citem.TextToSay = phrases.GoOutAnnoucement();
                            InteractionsStat.AddScheduledInteraction(SuggestionsEnum.GoOut);
                        }
                        #endregion

                        //#region set Watch movie
                        //if (suggestion == SuggestionsEnum.WatchMovie)
                        //{
                        //    Movie movie = MoviesProvider.Get();
                        //    if (movie != null)
                        //    {
                        //        movie.IsPlanned = true;
                        //        //citem.Name = movie.Name;
                        //        //citem.TextToSay = phrases.MovieAnnouncement(movie);
                        //        citem = new CommItem(movie);

                        //        //UnityEngine.Debug.LogWarning("Movie scheduled: " + citem.TextToSay);
                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.WatchMovie);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough movies during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.WatchMovie);
                        //    }
                        //}
                        //#endregion

                        #region set Weather forecast
                        if (suggestion == SuggestionsEnum.TellWeatherForecast)
                        {
                            citem.TextToSay = "The weather forecast should be good."; //TODO not translated
                        }
                        #endregion

                        //#region set Song
                        //if (suggestion == SuggestionsEnum.ListenToSong)
                        //{
                        //    //the fact that song has bee planned, does not mean it has been executed
                        //    Song song = SongsProvider.GetSong();
                        //    if (song != null)
                        //    {
                        //        song.IsPlanned = true;
                        //        citem.Name = song.Name;
                        //        citem.TextToSay = song.Name;

                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.ListenToSong);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough songs during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.ListenToSong);
                        //    }
                        //}
                        //#endregion
                        //else
                        //#region set Go to gym
                        //if (suggestion == SuggestionsEnum.DoSport)
                        //{
                        //    ItemManager manager = providers.Single(x => x.Is(citem));

                        //    if (manager == null) SharedHelper.LogWarning("Manager is null");

                        //    Sport sport = (Sport)manager.GetItem();
                        //    if (sport != null)
                        //    {
                        //        manager.SetAsPlanned(sport.Name);
                        //        citem = new CommItem(sport);

                        //        InteractionsStat.AddScheduledInteraction(SuggestionsEnum.DoSport);
                        //    }
                        //    else
                        //    {
                        //        citem.TextToSay = "__nointeraction__";
                        //        SharedHelper.LogWarning("Not enough sports during planning.");
                        //        InteractionsStat.AddMissingInteraction(SuggestionsEnum.DoSport);
                        //    }
                        //}
                        //#endregion
                    } //end action suggestions
                    #endregion
                    else if (citem.Category == ActionsEnum.AskUncertanFactQuestion)
                    {
                        //the actual question is selected at run time
                        citem.TextToSay  = "###place holder for UncertanFactQuestion";
                        citem.IsPureFact = false;

                        InteractionsStat.AddScheduledInteraction(ActionsEnum.AskUncertanFactQuestion);
                    }
                    else if (citem.SubCategory == ActionsEnum.AskPureFactQuestionAboutUser) //ABOUT USER
                    {
                        int pfabul = PureFactsAboutUserLeftCount();

                        if (pfabul > 0)
                        {
                            PureFact sf = pfManager.GetPureFactAbouUser();

                            if (sf == null)
                            {
                                SharedHelper.LogError("There are pure facts about the user left, but no pure fact has been selected.");
                            }
                            else
                            {
                                citem.TextToSay = sf.Question;
                                //SharedHelper.Log("q name: " + q [0].Name);
                                citem.Name       = sf.Name;
                                citem.IsPureFact = true;

                                pfManager.SetAsPlanned(sf.Name);

                                citem.UIAnswer = sf.UI;
                            }
                            InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        }
                        else
                        {
                            InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        }
                    }
                    else if (citem.SubCategory == ActionsEnum.SharePureFactInfoAboutBot) //ABOUT BOT
                    {
                        int pfabbl = PureFactsAboutBotLeftCount();

                        if (pfabbl > 0)
                        {
                            PureFact sf = GetPureFactAbouBot();
                            if (sf == null)
                            {
                                SharedHelper.LogError("There are pure facts about the bot left, but no pure fact has been selected.");
                            }
                            else
                            {
                                //SharedHelper.Log("Found " + Actions.SharePureFactInfoAboutBot + ": " + q.Length.ToString());
                                citem.TextToSay  = sf.Acknowledgement;
                                citem.IsPureFact = true;
                                citem.Name       = sf.Name;

                                pfManager.SetAsPlanned(sf.Name);
                            }
                            InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory);
                        }
                        else
                        {
                            InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory);
                        }
                    }
                    else if (citem.Category == ActionsEnum.ChangeVisualAppearance)
                    {
                        citem.TextToSay = context.BasePhrases.ChangeClothesAnnouncement();
                        InteractionsStat.AddScheduledInteraction(ActionsEnum.ChangeVisualAppearance);
                    }
                    else if (citem.Category == ActionsEnum.ExpressMentalState)
                    {
                        //choose mental state to share using a distribution (uniform?)
                        //currently only one state is processed
                        string selectedMentalState = "InAGoodMood";

                        if (selectedMentalState == "InAGoodMood")
                        {
                            //Take into account the: ProbVariables.Bot.InAGoodMood;
                            //class Statement where the constructor takes prob variable as or UncertainFact
                            //or just phrase that internally takes into account current values of the prob variable and other normal variables
                            citem.TextToSay = "###place holder for InAGoodMood";
                        }

                        InteractionsStat.AddScheduledInteraction(ActionsEnum.ExpressMentalState);
                    }
                    else
                    {
                        SharedHelper.LogError("Unknown action: " + citem.Category);
                    }
                }

                #region Add interaction item to queue

                if (string.IsNullOrEmpty(citem.TextToSay))
                {
                    SharedHelper.LogError("Text is empty! Action was: " + citem.Category + "|" + citem.SubCategory);
                }
                else
                {
                    Interactions.Enqueue(citem);
                }

                #endregion

                #region debug
                PureFact[] LeftPureFacts = (from item in pfManager.GetAll()
                                            let pf = (PureFact)item
                                                     where (pf.Type == PureFactType.AboutBot || pf.Type != PureFactType.AboutUser) &&
                                                     pf.IsPlanned == false && pf.IsUsed == false
                                                     select pf).ToArray();

                //if (!Flags.DecreaseDistributionOfAskPureFactQuestionAboutUserDone && Interactions.Count > 45 && (LeftPureFacts.Length - PersistentData.PureFactsLoadedOnStartup()) > 0)
                //    KorraBaseHelper.LogError("All pure facts should have been already planned. Left not used pure facts: " + LeftPureFacts.Length);

                #endregion
            }
        }
コード例 #9
0
 public void InitJokesDistribution(PureFact p_factEasilyOffended, bool p_romanticJokesFirst, bool p_romanticJokesLast)
 {
     factEasilyOffended = p_factEasilyOffended;
     romanticJokesFirst = p_romanticJokesFirst;
     romanticJokesLast  = p_romanticJokesLast;
 }
コード例 #10
0
ファイル: JoiModel.cs プロジェクト: toncho11/KorraAI
        /// <summary>
        /// Configures when facial expressions are used
        /// </summary>
        /// <param name="item"></param>
        public void SetFacialExpression(CommItem item)
        {
            #region Get Fact Manager
            PureFacts pfManager = (PureFacts)ItemProviders.SingleOrDefault(x => x is PureFacts);
            if (pfManager == null)
            {
                SharedHelper.LogError("No manager in Facts Manager in SetFacialExpression for model " + this.Name);
                return;
            }
            #endregion

            //PureFacts and Jokes will facial expression set at this stage or by Dynamic Function
            //it updates the facial expression, if it is empty

            if (!string.IsNullOrEmpty(item.FacialExpression))
            {
                KorraModelHelper.SetFacialExpressionFlag(item.FacialExpression);
            }
            else //here in most cases we default to smile
            {
                if (item.IsReactionToUser) //default to smile on reaction
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                //Handle PureFacts AboutBot
                if (item.IsPureFact && !item.IsJokePureFact)
                {
                    PureFact fact = (PureFact)pfManager.GetByName(item.Name);

                    if (fact != null && fact.Type == PureFactType.AboutBot)
                    {
                        KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                    }
                }
                else
                if (item.Category == ActionsEnum.ChangeVisualAppearance)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                if (item.Category == ActionsEnum.ConvinceBuyStatement)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                if (item.Category == ActionsEnum.ExpressMentalState)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
                else
                //Hnadle Jokes (Normal or PureFacts)
                if (item.SubCategory == SuggestionsEnum.TellJoke && !item.IsJokePureFact)
                {
                    if (!item.IsJokePureFact) //Normal joke
                    {
                        Joke joke = JokesProvider.GetJokeByName(item.Name);

                        if (joke != null && !string.IsNullOrEmpty(joke.FaceExpression)) //check for custom facial expression
                        {
                            KorraModelHelper.SetFacialExpressionFlag(joke.FaceExpression);
                        }
                        else
                        {
                            KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile
                        }
                    }
                    else //PureFact joke that had no facial expression set
                    {
                        KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile
                    }
                }
                else
                if (item.SubCategory == SuggestionsEnum.ListenToSong ||
                    item.SubCategory == SuggestionsEnum.DoSport ||
                    item.SubCategory == SuggestionsEnum.WatchMovie ||
                    item.SubCategory == SuggestionsEnum.GoOut)
                {
                    KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking);
                }
            }
        }