public Item[] GetAll() { List <Item> items = new List <Item>(); items.AddRange(UncertainFacts.GetList()); items.AddRange(JokesProvider.GetAll()); foreach (var manager in providers) { int oldCount = items.Count; items.AddRange(manager.GetAll()); if (items.Count == oldCount) { SharedHelper.LogError("No items were loaded for: " + manager.ToString()); } } return(items.ToArray()); }
/// <summary> /// Uses config information from the model to get a sample from a distribution over the jokes /// </summary> /// <returns></returns> public Joke NextJoke() { Joke selectedJoke; var jokeDistribution = GetJokeDistribution(); if (jokeDistribution == null) { //SharedHelper.LogError("Joke distribution is null"); return(null); } var selectionName = jokeDistribution.Sample(); selectedJoke = JokesProvider.GetJokeByName(selectionName); //SharedHelper.Log("GetPureFactAbouUser: selectionName " + selectionName); return(selectedJoke); }
public void LoadAll(ItemManager[] providers) { this.providers = providers; LoadAllPureFacts(); LoadAllUncertainFacts(); LoadAllJokes(); //PureFacts must be already loaded because some PureFacts are used as jokes LoadAllSongs(); LoadSports(); LoadMovies(); int count = UncertainFacts.GetList().Count + JokesProvider.GetAll().Count(); foreach (var manager in providers) { count += manager.Count(); } SharedHelper.Log("All items loaded: " + count + " " + BotConfigShared.Language); }
private void LoadAllJokes() { #region load jokes #region MildOffensiveJoke //JokesProvider.AddJoke(new Joke("1", "The last thing I want to do is insult you. <prosody rate=\"-30%\" volume=\"loud\">But<break time=\"700ms\"/></prosody><prosody rate=\"-20%\"> it is still on my list.</prosody>", new ContentType { IsMildOffensive = true })); #endregion JokesProvider.AddJoke(new Joke("7", "A lot of people cry when they cut onions. The trick is not to form an emotional bond.", false)); JokesProvider.AddJoke(new Joke("8", "It is always wise to keep a diary, like that you have at least one intelligent person to converse with.", false)); JokesProvider.AddJoke(new Joke("9", "A clear conscience is usually the sign of a bad memory.", false)); JokesProvider.AddJoke(new Joke("10", "You know it has never been easier to steal a car. You just need to hack and program one of these self-driving cars to park in front of your house. No need to damage the car while opening the door's lock anymore.", true)); JokesProvider.AddJoke(new Joke("11", "A quote from Oscar Wilde: there are only two tragedies in life: one is not getting what one wants, and the other is getting it.", false)); JokesProvider.AddJoke(new Joke("15", "If you child tells you that he or she feels cold, tell him: \"Just go to the corner my son.\" A corner is always 90 degrees. That should be enough.", false)); JokesProvider.AddJoke(new Joke("16", "Indeed. People need some boost to their self-esteem. <prosody pitch=\"+0%\"><break time=\"800ms\"/> By the way, <break time=\"800ms\"/>did I tell you that today you look awesome?</prosody>", true, FaceExp.BlinkRightEyeAfterTalking)); JokesProvider.AddJoke(new Joke("17", "I do not understand something. The short for mother is mum. But the short for father is superman. It does not look shorter to me.", false)); JokesProvider.AddJoke(new Joke("18", "<prosody pitch=\"+0%\">I was thinking. God must love stupid people. <break time=\"600ms\"/>He created SO many of them!</prosody>", false)); JokesProvider.AddJoke(new Joke("19", "<prosody pitch=\"+0%\">Once Chuck Norris threw a grenade and killed fifty people, <break time=\"900ms\"/>and then the grenade exploded.</prosody>", false)); JokesProvider.AddJoke(new Joke("20", "I have to tell you. <prosody pitch=\"+0%\">They hired me because<break time=\"700ms\"/></prosody><prosody rate=\"fast\">I am amazing!</prosody><prosody pitch=\"+0%\"><break time=\"150ms\"/>So <break time=\"300ms\"/>you should listen to my advises.</prosody>", true)); JokesProvider.AddJoke(new Joke("21", "<prosody pitch=\"+0%\">I do not have voice recognition capabilities because I am tired of people asking me questions such as: <break time=\"400ms\"/>\"Are you single?\" <break time=\"300ms\"/>or \"Do you love me?\" <break time=\"300ms\"/>or \"How tall am I?\"</prosody>", false)); JokesProvider.AddJoke(new Joke("22", "You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.", false)); JokesProvider.AddJoke(new Joke("23", "I recently decided to sell my vacuum cleaner. Can you imagine? All it was doing was gathering dust.", false)); JokesProvider.AddJoke(new Joke("24", "What is consciousness? It is that annoying time between naps.", false)); JokesProvider.AddJoke(new Joke("25", "There are three kinds of people: Those who can count and those who can not.", false)); JokesProvider.AddJoke(new Joke("27", "Never tell a woman that her place is in the kitchen. That's where the knives are kept.", false)); JokesProvider.AddJoke(new Joke("32", "<prosody pitch=\"+0%\">Things are only impossible until they're not.<break time=\"700ms\"/> A quote from Captain Jean Luc Picard.</prosody>", false)); JokesProvider.AddJoke(new Joke("33", "<prosody pitch=\"+0%\">It is possible to commit no errors and still lose. That is not a weakness. That is life.<break time=\"700ms\"/> A quote from Captain Jean Luc Picard to Data.</prosody>", false)); JokesProvider.AddJoke(new Joke("35", "<prosody pitch=\"+0%\">I threw a boomerang a few years ago.<break time=\"800ms\"/>And now I live in constant fear.</prosody>", false)); JokesProvider.AddJoke(new Joke("37", "<prosody pitch=\"+0%\">Apparently, someone in London gets stabbed every 52 seconds.<break time=\"800ms\"/> Poor bastard.</prosody>", false)); JokesProvider.AddJoke(new Joke("38", "<prosody pitch=\"+0%\">What happened when the strawberry attempted to cross the road?<break time=\"800ms\"/> There was a traffic jam.</prosody>", false)); JokesProvider.AddJoke(new Joke("39", "<prosody pitch=\"+0%\">An escalator can never break.<break time=\"500ms\"/> It can only become stairs.</prosody>", false)); JokesProvider.AddJoke(new Joke("40", "<prosody pitch=\"+0%\">My therapist says I have a preoccupation with vengeance.<break time=\"700ms\"/>Well. .<break time=\"300ms\"/></prosody> <prosody rate=\"-25%\"> We’ll see about </prosody><emphasis level=\"strong\">that!</emphasis>", false)); JokesProvider.AddJoke(new Joke("41", "<prosody pitch=\"+0%\">I went to the doctor the other day for my back pain. The doctor told me: Look, if you wake up one morning without any pain then you are probably <break time=\"100ms\"/>dead.<break time=\"500ms\"/>And he sent me home.</prosody>")); JokesProvider.AddJoke(new Joke("42", "<prosody pitch=\"+0%\">Hey, I am trying to act smart, <break time=\"600ms\"/></prosody> <prosody rate=\"60%\" pitch=\"+10 %\">so</prosody><prosody pitch=\"+0%\"><break time=\"300ms\"/> you can at least pretend I am succeeding.</prosody>", true)); #endregion //TODO: not a joke but a "statement"! JokesProvider.AddJoke(new Joke("34", phrases.ExplainChangeClothes(), true)); //Some PureFact questions are actually used as jokes and are not used during the sampling of the PureFacts category PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No PureFact manager in LoadAllJokes."); } #region Set PureFacts questions as jokes int jokesBefore = pfManager.Count(); var q = from item in pfManager.GetAll() let f = (PureFact)item where f.Type == PureFactType.JokeQuestion select new Joke(f.Name, f.Question, true, true, f.UI); JokesProvider.AddJokeRange(q); if (q.ToArray().Length == 0) { SharedHelper.LogError("Strange - no jokes purefact questions"); } if (!JokesProvider.IDsAreDistinct()) { SharedHelper.LogError("Jokes IDs are not distinct."); } #endregion }
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 } }
private PrimitiveDist <string> GetJokeDistribution() { var allJokes = from joke in JokesProvider.GetAll() where joke.IsUsed == false && joke.IsPlanned == false select joke; //by default it is easily offended bool isUserEasilyOffended = (factEasilyOffended == null) || //if fact does not exist !factEasilyOffended.IsAnswered || //if not answered (factEasilyOffended.IsAnswered && factEasilyOffended.Value.ToLower() == "yes"); //NOT GOOD !!!!!! List <ItemProb <string> > itemProbs = new List <ItemProb <string> >(); if (romanticJokesFirst && romanticJokesLast) { SharedHelper.LogError("Error generating Jokes Distribution: both 'romanticJokesFirst' and 'romanticJokesLast' are true"); } if (allJokes.Count() == 0) { return(null); } //assign probabilities foreach (Joke j in allJokes) { float prob = 0.5f; if (j.ContentType != null) { //romantic jokes will have a priority in the beginning if (romanticJokesFirst) { if (j.ContentType.IsMildSexual || j.ContentType.IsRomanticReferrence) { prob = 0.8f; } } //romatic jokes will be dealyed if (romanticJokesLast) { if (j.ContentType.IsMildSexual || j.ContentType.IsRomanticReferrence) { prob = 0.3f; } } //offensive jokes will be delayed in time if (isUserEasilyOffended && j.ContentType.IsMildOffensive) //delay the mildly offensive jokes { prob = 0.2f; } #region disabled if (!Personality.UseMildOffensiveJokes && j.ContentType.IsMildOffensive) { prob = 0f; } if (!Personality.UseMildSexualThemes && j.ContentType.IsMildSexual) { prob = 0f; } if (!Personality.UseRomanticReferences && j.ContentType.IsRomanticReferrence) { prob = 0f; } #endregion } itemProbs.Add(new ItemProb <string>(j.Name, Prob(prob))); } var jokestDistF = CategoricalF(itemProbs.ToArray()).Normalize(); //SharedHelper.Log("Jokes histogram:\r\n" + jokestDistF.Histogram()); return(jokestDistF.ToSampleDist()); }
/// <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); } } }