예제 #1
0
        private void HandleServerReceived(object sender, DataPacketEventArgs e)
        {
            // Add the input to working memory
            string           senderName = e.DataPacket.SenderName;
            StringMemoryItem inputItem  = null;

            if (senderName == AgentConstants.LISTENER_PROCESS_NAME)
            {
                inputItem = new StringMemoryItem();
                inputItem.TagList.Add(listenerInputTag);
                inputItem.SetContent(e.DataPacket.Message);
                workingMemory.AddItem(inputItem);
                timeOfLastListenerInput = inputItem.InsertionTime;
                if (!busy)
                {
                    HandleUserInput(inputItem);
                }
            }
            else if (senderName == AgentConstants.VISION_PROCESS_NAME)
            {
                inputItem = new StringMemoryItem();
                inputItem.TagList.Add(visionInputTag);
                inputItem.SetContent(e.DataPacket.Message);
                workingMemory.AddItem(inputItem);
                timeOfLastVisionInput = inputItem.InsertionTime;
                if (!busy)
                {
                    HandleUserInput(inputItem);
                }
            }
            else if (senderName == AgentConstants.INTERNET_PROCESS_NAME)
            {
                ProcessInternetInput(e.DataPacket.Message);
            }
        }
예제 #2
0
        private void AddQueryTermsToWorkingMemory(List <string> queryTerms)
        {
            List <MemoryItem> queryMemoryItemList = new List <MemoryItem>();

            for (int ii = 0; ii < queryTerms.Count; ii++)
            {
                string           queryTerm       = queryTerms[ii];
                string           queryTag        = queryTagList[ii];
                StringMemoryItem queryMemoryItem = new StringMemoryItem();
                queryMemoryItem.TagList.Add(queryTag);
                queryMemoryItem.SetContent(queryTerm);
                queryMemoryItemList.Add(queryMemoryItem);
            }
            ownerAgent.WorkingMemory.AddItems(queryMemoryItemList);


            /*   StringMemoryItem queryMemoryItem = new StringMemoryItem();
             * foreach (string queryTag in queryTagList)
             * {
             *     queryMemoryItem.TagList.Add(queryTag);
             * }
             * string queryTermsString = "";
             * foreach (string queryTerm in queryTerms)
             * {
             *     queryTermsString += queryTerm + ownerAgent.MemoryItemSeparationCharacter;
             * }
             * queryTermsString = queryTermsString.TrimEnd(new char[] { ownerAgent.MemoryItemSeparationCharacter });
             * queryMemoryItem.SetContent(queryTermsString);
             * ownerAgent.WorkingMemory.AddItem(queryMemoryItem);   */
        }
예제 #3
0
        public void SendInternetRequest(string request)
        {
            StringMemoryItem requestItem = new StringMemoryItem();

            requestItem.TagList.Add(internetOutputTag);
            requestItem.SetContent(request);
            workingMemory.AddItem(requestItem);
            timeOfLastInternetRequest = requestItem.InsertionTime;
            string clientID = server.GetFirstClientID(AgentConstants.INTERNET_PROCESS_NAME);

            if (clientID != null)
            {
                server.Send(clientID, request);
            }
        }
예제 #4
0
        public void SendExpression(string expression)
        {
            StringMemoryItem expressionItem = new StringMemoryItem();

            expressionItem.TagList.Add(faceExpressionOutputTag);
            expressionItem.SetContent(expression);
            workingMemory.AddItem(expressionItem);
            timeOfLastFaceExpressionOutput = expressionItem.InsertionTime;
            string clientID = server.GetFirstClientID(AgentConstants.FACE_PROCESS_NAME);

            if (clientID != null)
            {
                server.Send(clientID, expression);
            }
        }
예제 #5
0
        public void SendSpeechOutput(string outputString)
        {
            StringMemoryItem outputItem = new StringMemoryItem();

            outputItem.TagList.Add(speechOutputTag);
            outputItem.SetContent(outputString);
            workingMemory.AddItem(outputItem);
            timeOfLastSpeechOutput = outputItem.InsertionTime;
            string clientID = server.GetFirstClientID(AgentConstants.SPEECH_PROCESS_NAME);

            if (clientID != null)
            {
                server.Send(clientID, outputString);
            }
        }
        private void AddQueryTermsToWorkingMemory(List <string> queryTerms)
        {
            List <MemoryItem> queryMemoryItemList = new List <MemoryItem>();

            for (int ii = 0; ii < queryTerms.Count; ii++)
            {
                string           queryTerm       = queryTerms[ii];
                string           queryTag        = QueryTagList[ii];
                StringMemoryItem queryMemoryItem = new StringMemoryItem();
                queryMemoryItem.TagList.Add(queryTag);
                queryMemoryItem.SetContent(queryTerm);
                queryMemoryItemList.Add(queryMemoryItem);
            }
            ownerAgent.WorkingMemory.AddItems(queryMemoryItemList);
        }
        public override Boolean Run(List <object> parameterList, out string targetContext, out string targetID)
        {
            base.Run(parameterList, out targetContext, out targetID);
            Boolean       labelFound           = false;
            List <string> itemSoughtStringList = new List <string>();

            foreach (string inputQueryTag in inputQueryTagList)
            {
                MemoryItem itemSought = ownerAgent.WorkingMemory.GetLastItemByTag(inputQueryTag);
                if (itemSought != null)  // 20171201
                {
                    string itemSoughtString = (string)itemSought.GetContent();
                    itemSoughtStringList.Add(itemSoughtString);
                }
            }
            List <MemoryItem> tagMatchingItemList = null;

            if (memoryIdentifier == AgentConstants.LONG_TERM_MEMORY_NAME)
            {
                tagMatchingItemList = ownerAgent.LongTermMemory.GetAllItemsByTagList(searchTagList, tagSearchMode);
            }
            else
            {
                tagMatchingItemList = ownerAgent.WorkingMemory.GetAllItemsByTagList(searchTagList, tagSearchMode);
            }
            if (tagMatchingItemList != null)
            {
                foreach (MemoryItem memoryItem in tagMatchingItemList)
                {
                    if (memoryItem is StringMemoryItem)  // The only case covered, so far.
                    {
                        StringMemoryItem stringMemoryItem = (StringMemoryItem)memoryItem;
                        stringMemoryItem.GenerateLabelContentPairs();
                        LabelContentPair labelContentPair = null;

                        labelContentPair = stringMemoryItem.LabelContentPairList.Find(lcp => (lcp.Label == identificationLabel)); // && (lcp.Content.ToLower() == itemSoughtString));
                        if (labelContentPair != null)                                                                             // 20171201
                        {
                            foreach (string itemSoughtString in itemSoughtStringList)
                            {
                                if (!labelContentPair.Content.ToLower().Contains(itemSoughtString))
                                {
                                    labelContentPair = null;
                                    break;
                                }
                            }
                        }


                        if (labelContentPair != null)
                        {
                            // A match was found. Now check if the searchLabel can be found as well:
                            LabelContentPair searchLabelContentPair = stringMemoryItem.LabelContentPairList.Find(lcp => lcp.Label == searchLabel);
                            if (searchLabelContentPair != null)
                            {
                                labelFound = true;
                                StringMemoryItem matchMemoryItem = new StringMemoryItem();
                                matchMemoryItem.TagList = new List <string>()
                                {
                                    outputQueryTag
                                };
                                matchMemoryItem.SetContent(searchLabelContentPair.Content);
                                ownerAgent.WorkingMemory.AddItem(matchMemoryItem);
                                break;
                            }
                        }
                    }
                }
            }
            if (labelFound)
            {
                targetContext = successTargetContext; // ToDo - uncomment and use!
                targetID      = successTargetID;      // ToDo - uncomment and use!
            }
            else
            {
                targetContext = failureTargetContext;
                targetID      = failureTargetID;
            }
            return(labelFound);
        }
예제 #8
0
        /* public override void Initialize(Agent ownerAgent) // TODO use pattern list
         * {
         *   base.Initialize(ownerAgent);
         *   //foreach (Pattern pattern in outputAction.PatternList)
         *   //{
         *   //    pattern.ProcessDefinition();
         *   //    //     pattern.ProcessDefinitionList();
         *   //}
         * }*/

        public override Boolean Run(List <object> parameterList, out string targetContext, out string targetID)
        {
            base.Run(parameterList, out targetContext, out targetID);


            string     currentUser = "";
            MemoryItem itemSought  = ownerAgent.WorkingMemory.GetLastItemByTag(inputQueryTagList[0]);

            if (itemSought != null)  // 20171201
            {
                currentUser = (string)itemSought.GetContent();
            }

            List <string> openRatings = new List <string> {
            };

            foreach (var movie in _ultraManager.MovieList)
            {
                Boolean addItem = true;
                //movie.Title ==
                foreach (var rating in _ultraManager.RatingList)
                {
                    if (rating.UserName == currentUser && rating.MovieTitle == movie.Title)
                    {
                        addItem = false;
                    }
                }
                if (addItem)
                {
                    openRatings.Add(movie.Title);
                }
            }

            // return random unseen movie to rate as outputQueryTag
            Boolean noMoreRatngs = false;

            if (openRatings.Count > 0)
            {
                // Random random = new Random();
                // int randomIndex = random.Next(0, openRatings.Count);
                int              randomIndex    = ownerAgent.RandomNumberGenerator.Next(0, openRatings.Count);
                string           openRating     = openRatings[randomIndex];
                StringMemoryItem rateMemoryItem = new StringMemoryItem();
                rateMemoryItem.TagList = new List <string>()
                {
                    outputQueryTag
                };
                rateMemoryItem.SetContent(openRating);
                ownerAgent.WorkingMemory.AddItem(rateMemoryItem);
            }
            else
            {
                noMoreRatngs = true;
            }


            if (repetitionCount < maximumRepetitionCount && noMoreRatngs == false)
            {
                targetContext = successTargetContext;
                targetID      = successTargetID;
            }
            else
            {
                targetContext = failureTargetContext;
                targetID      = failureTargetID;
            }
            return(true);
        }
예제 #9
0
        protected override void RunLoop(List <object> parameterList)
        {
            string     originalContext = ownerAgent.WorkingMemory.CurrentContext;
            string     currentUser     = "";
            MemoryItem itemSought      = ownerAgent.WorkingMemory.GetLastItemByTag(inputQueryTagList[0]);

            if (itemSought != null)  // 20171201
            {
                currentUser = (string)itemSought.GetContent();
            }

            // Recommend!

            // Get similarity of currentUser to all other users-------------------------------------------------

            // create ratingTable
            List <string> userList  = new List <string> {
            };
            List <string> movieList = new List <string> {
            };

            userList.Add(currentUser);
            foreach (var rating in _ultraManager.RatingList)
            {
                if (!userList.Exists(x => string.Equals(x, rating.UserName, StringComparison.OrdinalIgnoreCase)))
                {
                    userList.Add(rating.UserName);
                }
            }
            foreach (var rating in _ultraManager.RatingList)
            {
                if (!movieList.Exists(x => string.Equals(x, rating.MovieTitle, StringComparison.OrdinalIgnoreCase)))
                {
                    movieList.Add(rating.MovieTitle);
                }
            }

            int nbrOfUsers          = userList.Count;
            int userInsertionIndex  = 0;
            int nbrOfMovies         = movieList.Count;
            int movieInsertionIndex = 0;

            double[,] ratingTable = new double[nbrOfUsers, nbrOfMovies];

            foreach (var rating in _ultraManager.RatingList)
            {
                userInsertionIndex  = userList.FindIndex(x => x.StartsWith(rating.UserName));
                movieInsertionIndex = movieList.FindIndex(x => x.StartsWith(rating.MovieTitle));
                ratingTable[userInsertionIndex, movieInsertionIndex] = rating.RatingValue;
            }

            // calculate mean rating for each user
            double[] meanRatings = new double[nbrOfUsers];
            for (int i = 0; i < nbrOfUsers; ++i)
            {
                double ratingSum  = 0;
                int    nbrOfRated = 0;
                for (int j = 0; j < nbrOfMovies; ++j)
                {
                    if (ratingTable[i, j] > 0)
                    {
                        ratingSum = ratingSum + ratingTable[i, j];
                        ++nbrOfRated;
                    }
                }
                if (ratingSum > 0 && nbrOfRated > 0)
                {
                    meanRatings[i] = ratingSum / nbrOfRated;
                }
            }

            // calculate Pearson correlation
            List <double> simToUser = new List <double> {
                0
            };                                               // TODO: use dictionary

            for (int i = 1; i < nbrOfUsers; ++i)
            {
                List <int> setRatedBoth = new List <int> {
                };
                for (int j = 0; j < nbrOfMovies; ++j)
                {
                    if (ratingTable[0, j] > 0 && ratingTable[i, j] > 0)
                    {
                        setRatedBoth.Add(j);
                    }
                }

                double sum1 = 0;
                double sum2 = 0;
                double sum3 = 0;
                for (int k = 0; k < setRatedBoth.Count; ++k)
                {
                    sum1 = sum1 + (ratingTable[0, setRatedBoth[k]] - meanRatings[0]) * (ratingTable[i, setRatedBoth[k]] - meanRatings[i]);
                    sum2 = sum2 + Math.Pow(ratingTable[0, setRatedBoth[k]] - meanRatings[0], 2);
                    sum3 = sum3 + Math.Pow(ratingTable[i, setRatedBoth[k]] - meanRatings[i], 2);
                }
                simToUser.Add(sum1 / (Math.Sqrt(sum2 * sum3)));
            }

            // Get most similar user
            int mostSimilarUser = simToUser.IndexOf(simToUser.Max());

            Debug.WriteLine(userList[mostSimilarUser]);

            // Return random unseen movie
            List <string> unseenMovies = new List <string> {
            };

            for (int j = 0; j < nbrOfMovies; ++j)
            {
                if (ratingTable[0, j] == 0 && ratingTable[mostSimilarUser, j] > 5)
                {
                    unseenMovies.Add(movieList[j]);
                }
            }
            Boolean noMoreRecommendations = false;

            if (unseenMovies.Count > 0)
            {
                int              randomIndex    = ownerAgent.RandomNumberGenerator.Next(0, unseenMovies.Count);
                string           recommendation = unseenMovies[randomIndex];
                StringMemoryItem rateMemoryItem = new StringMemoryItem();
                rateMemoryItem.TagList = new List <string>()
                {
                    outputQueryTag
                };
                rateMemoryItem.SetContent(recommendation);
                ownerAgent.WorkingMemory.AddItem(rateMemoryItem);
            }
            else
            {
                noMoreRecommendations = true;
            }


            AsynchronousDialogueItemEventArgs e = new AsynchronousDialogueItemEventArgs(originalContext, outputAction.TargetContext, outputAction.TargetID);

            OnRunCompleted(e);
        }
예제 #10
0
        public override Boolean Run(List <object> parameterList, out string targetContext, out string targetID)
        {
            base.Run(parameterList, out targetContext, out targetID);
            List <double> operandList = new List <double>();

            foreach (string inputQueryTag in inputQueryTagList)
            {
                MemoryItem itemSought       = ownerAgent.WorkingMemory.GetLastItemByTag(inputQueryTag);
                string     itemSoughtString = (string)itemSought.GetContent();
                double     operand;
                Boolean    inputOK = double.TryParse(itemSoughtString, out operand);
                if (inputOK)
                {
                    operandList.Add(operand);
                }
                else
                {
                    return(false);
                }
            }
            double output = 0;

            if (operation.ToLower() == "addition")
            {
                output = 0;
                foreach (double operand in operandList)
                {
                    output += operand;
                }
            }
            else if (operation.ToLower() == "subtraction")
            {
                if (operandList.Count == 2)
                {
                    output = operandList[0] - operandList[1];
                }
                else
                {
                    return(false);
                }
            }
            else if (operation.ToLower() == "multiplication")
            {
                output = 1;
                foreach (double operand in operandList)
                {
                    output *= operand;
                }
            }
            else
            {
                return(false);
            }
            StringMemoryItem matchMemoryItem = new StringMemoryItem();

            matchMemoryItem.TagList = new List <string>()
            {
                outputQueryTag
            };
            matchMemoryItem.SetContent(output.ToString());
            ownerAgent.WorkingMemory.AddItem(matchMemoryItem);
            targetContext = outputTargetContext;
            targetID      = outputTargetID;
            return(true);
        }
예제 #11
0
        // The message should be formatted as [<dest>][{tag1, ..., tagN}][<content>]
        // where <dest> is either "WorkingMemory" or "LongTermMemory". The tag list is optional for items
        // inserted into working memory, but must be present for long-term memory items. If tags are included,
        // they are added to the tag list of the memory item. Then the content (specified in <content>, without
        // the < >) is added as well.
        // Note that the message must have PRECISELY the shape defined above!
        private void ProcessInternetInput(string message)
        {
            StringMemoryItem internetInputItem        = new StringMemoryItem();
            char             leftSeparationCharacter  = AgentConstants.INTERNET_INPUT_LEFT_SEPARATION_CHARACTER;
            char             rightSeparationCharacter = AgentConstants.INTERNET_INPUT_RIGHT_SEPARATION_CHARACTER;
            List <string>    messageSplit             = message.Split(new char[] { leftSeparationCharacter, rightSeparationCharacter }, StringSplitOptions.RemoveEmptyEntries).ToList();

            if (messageSplit.Count == 2)  // No tags
            {
                if (messageSplit[0] == AgentConstants.WORKING_MEMORY_NAME)
                {
                    string content = messageSplit[1];
                    if (content != null)
                    {
                        if (content.Length > 0)
                        {
                            internetInputItem.SetContent(content);
                            internetInputItem.TagList.Add(internetInputTag);
                            workingMemory.AddItem(internetInputItem);
                            timeOfLastInternetInput = internetInputItem.InsertionTime;
                            //         if (!busy) { HandleInput(internetInputItem); }
                        }
                    }
                }
            }
            else if (messageSplit.Count == 3)
            {
                if (messageSplit[0] == AgentConstants.WORKING_MEMORY_NAME)
                {
                    string content = messageSplit[2];
                    if (content != null)
                    {
                        if (content.Length > 0)
                        {
                            internetInputItem.SetContent(content);
                            internetInputItem.TagList.Add(internetInputTag);
                            char          leftListCharacter  = AgentConstants.INTERNET_INPUT_TAG_LIST_LEFT_CHARACTER;
                            char          rightListCharacter = AgentConstants.INTERNET_INPUT_TAG_LIST_RIGHT_CHARACTER;
                            char          separator          = AgentConstants.INTERNET_INPUT_TAG_LIST_SEPARATOR_CHARACTER;
                            List <string> tagListSplit       = messageSplit[1].Split(new char[] { leftListCharacter, rightListCharacter, separator },
                                                                                     StringSplitOptions.RemoveEmptyEntries).ToList();
                            if (tagListSplit != null)
                            {
                                if (tagListSplit.Count > 0)
                                {
                                    foreach (string tag in tagListSplit)
                                    {
                                        internetInputItem.TagList.Add(tag);
                                    }
                                }
                            }
                            workingMemory.AddItem(internetInputItem);
                            timeOfLastInternetInput = internetInputItem.InsertionTime;
                            //      if (!busy) { HandleInput(internetInputItem); }
                        }
                    }
                }
                else if (messageSplit[0] == AgentConstants.LONG_TERM_MEMORY_NAME)
                {
                    // Insertions on long-term memory do not trigger actions by the agent, but the contents
                    // will of course be available for later use.
                    // Also, for long-term memory items, tags are _required_. If no tags are present, the
                    // input is simply ignored.
                    char          leftListCharacter  = AgentConstants.INTERNET_INPUT_TAG_LIST_LEFT_CHARACTER;
                    char          rightListCharacter = AgentConstants.INTERNET_INPUT_TAG_LIST_RIGHT_CHARACTER;
                    char          separator          = AgentConstants.INTERNET_INPUT_TAG_LIST_SEPARATOR_CHARACTER;
                    List <string> tagListSplit       = messageSplit[1].Split(new char[] { leftListCharacter, rightListCharacter, separator },
                                                                             StringSplitOptions.RemoveEmptyEntries).ToList();
                    if (tagListSplit != null)
                    {
                        if (tagListSplit.Count > 0)
                        {
                            foreach (string tag in tagListSplit)
                            {
                                internetInputItem.TagList.Add(tag);
                            }
                            string content = messageSplit[2];
                            if (content != null)
                            {
                                if (content.Length > 0)
                                {
                                    internetInputItem.SetContent(content);
                                    longtermMemory.AddItem(internetInputItem);
                                    timeOfLastInternetInput = internetInputItem.InsertionTime;
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #12
0
 private void importMemoryItemsButton_Click(object sender, EventArgs e)
 {
     using (OpenFileDialog openFileDialog = new OpenFileDialog())
     {
         string longTermMemoryDirectoryPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\" + agent.LongTermMemoryRelativePath;
         openFileDialog.InitialDirectory = longTermMemoryDirectoryPath;
         openFileDialog.Filter           = "text files (*.txt)|*.txt";
         if (openFileDialog.ShowDialog() == DialogResult.OK)
         {
             List <MemoryItem> addedItemsList   = new List <MemoryItem>();
             StreamReader      memoryItemReader = new StreamReader(openFileDialog.FileName);
             string            errorString      = "Errors on lines: ";
             Boolean           errorsFound      = false;
             int lineNumber = 0;
             while (!memoryItemReader.EndOfStream)
             {
                 string information = memoryItemReader.ReadLine();
                 if (information != null)
                 {
                     Boolean       itemOK          = false;
                     List <string> tagsContentList = information.Split(new string[] { "[Tags]", "[Content]" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                     if (tagsContentList.Count == 2)
                     {
                         if (information.IndexOf("Tags") < information.IndexOf("Content"))
                         {
                             string tagInformation = tagsContentList[0];
                             if ((!tagInformation.Contains("=")) && (!tagInformation.Contains(":")))  // Make sure that the user does not accidentally add a "=" or ":"
                             {
                                 List <string> tagList = tagInformation.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                                 if (tagList.Count > 0)
                                 {
                                     string content = tagsContentList[1];
                                     if (content != null)
                                     {
                                         if (content != "")
                                         {
                                             itemOK = true;
                                             StringMemoryItem item = new StringMemoryItem();
                                             item.TagList = tagList;
                                             item.SetContent(content);
                                             item.InsertionTime = DateTime.Now;
                                             addedItemsList.Add(item);
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     if (!itemOK)
                     {
                         errorsFound  = true;
                         errorString += lineNumber.ToString() + ",";
                     }
                 }
             }
             if (addedItemsList.Count > 0)
             {
                 agent.LongTermMemory.AddItems(addedItemsList);
             }
             if (errorsFound)
             {
                 MessageBox.Show("Import errors", errorString);
             }
         }
     }
 }