Changeset 1024


Ignore:
Timestamp:
03/17/2011 03:20:37 PM (9 years ago)
Author:
muk7
Message:

Initial version of Activation-Based Selection, direct integration into class structure, no XML import/export functionality

Location:
AgentMind/branches/FAtiMA-Modular/FAtiMA/src/FAtiMA/Core/memory/episodicMemory
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • AgentMind/branches/FAtiMA-Modular/FAtiMA/src/FAtiMA/Core/memory/episodicMemory/ActionDetail.java

    r896 r1024  
    2121 * Project: FAtiMA 
    2222 * Created: 18/07/2006  
    23  * @author: João Dias 
     23 * @author: Joo Dias 
    2424 * Email to: joao.assis@tagus.ist.utl.pt 
    2525 *  
    2626 * History:  
    27  * João Dias: 18/07/2006 - File created 
    28  * João Dias: 06/09/2006 - Changed everything about the evaluation 
     27 * Joo Dias: 18/07/2006 - File created 
     28 * Joo Dias: 06/09/2006 - Changed everything about the evaluation 
    2929 *                                                 used to determine the interpersonal relation between 
    3030 *                                                 characters and objects. Now, the evaluation field is an arraylist 
    3131 *                                                 of objects and characters and corresponding like values. These values 
    3232 *                                                 are changed by emotions such as Pitty, HappyFor, Repproach 
    33  * João Dias: 02/10/2006 - Changes in the way that parameters are compared for MemoryRetrieval 
     33 * Joo Dias: 02/10/2006 - Changes in the way that parameters are compared for MemoryRetrieval 
    3434 * Bruno Azenha: 09/04/2007 - Reimplemented the method UpdateEmotionValues so that it uses the SocialRelation 
    3535 *                                                        package 
    36  * João Dias: 24/03/2008 - Added time to individual actions stored in AM 
     36 * Joo Dias: 24/03/2008 - Added time to individual actions stored in AM 
    3737 * Meiyii Lim: 11/03/2009 - Added location to individual actions  
    3838 * Meiyii Lim: 13/03/2009 - Moved the class from FAtiMA.autobiographicalMemory package 
     39 * Matthias Keysermann: 08/03/2011 - Added (reference to) retrieval queue 
     40 * Matthias Keysermann: 09/03/2011 - Added (reference to) activation value  
     41 * Matthias Keysermann: 15/03/2011 - Added retrieval queue to toXML() 
     42 * Matthias Keysermann: 15/03/2011 - Added activation value to toXML() 
    3943 */ 
    4044package FAtiMA.Core.memory.episodicMemory; 
     
    4246import java.io.Serializable; 
    4347import java.util.ArrayList; 
     48import java.util.LinkedList; 
    4449import java.util.ListIterator; 
    4550 
     
    6166 
    6267/** 
    63  * @author João Dias 
     68 * @author Joo Dias 
    6469 * Window - Preferences - Java - Code Style - Code Templates 
    6570 */ 
     
    7580        private String _subject; 
    7681        private String _action; 
    77         private String _target;  
     82        private String _target; 
    7883        private Time _time; 
    7984        private String _location; 
     
    9398        private Memory _memory; 
    9499         
    95                  
     100        // 08/03/11 - Matthias 
     101        private RetrievalQueue _retrievalQueue;  
     102         
     103        // 09/03/11 - Matthias 
     104        private ActivationValue _activationValue; 
     105         
     106         
     107         
    96108        public ActionDetail(Memory m, int ID, Event e, String location) 
    97109        {   
     
    128140                 
    129141                this._emotion = new NeutralEmotion(e); 
     142                 
     143                // 08/03/11 - Matthias 
     144                this._retrievalQueue = new RetrievalQueue(this._id); 
     145                this._retrievalQueue.addRetrievalTime(new Time()); 
     146                 
     147                // 09/03/11 - Matthias 
     148                this._activationValue = new ActivationValue(this._id); 
    130149        } 
    131150 
     
    152171                this._desirability = desirability; 
    153172                this._praiseworthiness = praiseworthiness; 
     173                 
     174                // 08/03/11 - Matthias 
     175                this._retrievalQueue = new RetrievalQueue(this._id); 
     176                this._retrievalQueue.addRetrievalTime(new Time()); 
     177                 
     178                // 09/03/11 - Matthias 
     179                this._activationValue = new ActivationValue(this._id); 
    154180        } 
    155181         
     
    165191                this._time = time; 
    166192                this._emotion = emotion; 
     193                 
     194                // 08/03/11 - Matthias 
     195                this._retrievalQueue = new RetrievalQueue(this._id); 
     196                this._retrievalQueue.addRetrievalTime(new Time()); 
     197                 
     198                // 09/03/11 - Matthias 
     199                this._activationValue = new ActivationValue(this._id); 
     200 
    167201        } 
    168202         
     
    340374                return this._praiseworthiness; 
    341375        } 
     376         
     377         
     378         
     379        // 08/03/11 - Matthias 
     380        public void setRetrievalQueue(RetrievalQueue retrievalQueue) { 
     381                this._retrievalQueue = retrievalQueue; 
     382        } 
     383 
     384        // 09/03/11 - Matthias 
     385        public void setActivationValue(ActivationValue activationValue) { 
     386                this._activationValue = activationValue; 
     387        } 
     388 
     389        // 08/03/11 - Matthias 
     390        public RetrievalQueue getRetrievalQueue() { 
     391                return _retrievalQueue; 
     392        } 
     393 
     394        // 09/03/11 - Matthias 
     395        public ActivationValue getActivationValue() { 
     396                return _activationValue; 
     397        } 
     398         
     399        // 09/03/11 - Matthias 
     400        public void calculateActivationValue(Time timeCalculated, double decayValue) { 
     401                 
     402                // fetch retrieval times 
     403                LinkedList<Time> retrievalTimes = _retrievalQueue.getRetrievalTimes(); 
     404 
     405                // initialise sum 
     406                double sum = 0; 
     407 
     408                // loop over retrievals 
     409                for (Time timeRetrieval : retrievalTimes) { 
     410 
     411                        // calculate time difference 
     412                        long timeDifference = timeCalculated.getNarrativeTime() - timeRetrieval.getNarrativeTime(); 
     413                         
     414                        // DEBUG 
     415                        //System.out.println("  time difference is " + timeDifference); 
     416 
     417                        // ignore time difference of 0 
     418                        if(timeDifference > 0) { 
     419                                // sum up 
     420                                sum += Math.pow(timeDifference, -decayValue); 
     421                        } 
     422 
     423                } 
     424                 
     425                // DEBUG 
     426                //System.out.println("  sum is " + sum); 
     427 
     428                // calculate activation value 
     429                double value = 0; 
     430                if(sum > 0) { 
     431                        // log not required if we only select by maximum values afterwards 
     432                        value = Math.log(sum); 
     433                } 
     434 
     435                // set values 
     436                _activationValue.setValue(value); 
     437                _activationValue.setNumRetrievals(retrievalTimes.size()); 
     438                 
     439                // DEBUG 
     440                System.out.println("Activation value for detail id " + this._id + " is " + value); 
     441 
     442        } 
     443         
     444         
    342445         
    343446//      TODO em revisao 15.03.2007 
     
    525628                                return false; 
    526629                        } 
    527                 } 
     630                }                
    528631                return true; 
    529632        } 
     
    597700                action += "<Time>" + this.getTime().getRealTime() + "</Time>"; 
    598701                action += "<Location>" + this.getLocation() + "</Location>"; 
     702                action += this.getRetrievalQueue().toXML(); 
     703                action += this.getActivationValue().toXML(); 
    599704                action += "</Event>\n"; 
    600705                 
  • AgentMind/branches/FAtiMA-Modular/FAtiMA/src/FAtiMA/Core/memory/episodicMemory/EpisodicMemory.java

    r952 r1024  
    6868         
    6969        private ArrayList<ActionDetail> _newRecords;     
     70         
     71        // 09/03/11 - Matthias 
     72        private static final double DECAY_VALUE = 0.8; 
    7073         
    7174        public EpisodicMemory() 
     
    361364                _stm = stem; 
    362365        } 
     366         
     367         
     368         
     369        // 09/03/11 - Matthias 
     370        public void calculateActivationValues() { 
     371                calculateActivationValues(new Time(), DECAY_VALUE); 
     372        } 
     373                 
     374        // 09/03/11 - Matthias 
     375        public void calculateActivationValues(Time timeCalculated, double decayValue) { 
     376                 
     377                // calculate values for Autobiographic Memory            
     378                for(MemoryEpisode episode : _am.GetAllEpisodes()) { 
     379                        for(ActionDetail detail : episode.getDetails()) { 
     380                                detail.calculateActivationValue(timeCalculated, decayValue); 
     381                        }                        
     382                } 
     383                 
     384                // calculate values for Short-Term Memory 
     385                for(ActionDetail detail : _stm.getDetails()) { 
     386                        detail.calculateActivationValue(timeCalculated, decayValue); 
     387                } 
     388                 
     389        } 
     390                 
     391        // 09/03/11 - Matthias 
     392        public ArrayList<ActionDetail> activationBasedSelectionByThreshold(double threshold) {   
     393                 
     394                ArrayList<ActionDetail> selected = new ArrayList<ActionDetail>(); 
     395 
     396                // select details from Autobiographic Memory 
     397                for(MemoryEpisode episode : _am.GetAllEpisodes()) { 
     398                        for(ActionDetail detail : episode.getDetails()) { 
     399                                double value = detail.getActivationValue().getValue(); 
     400                                if(value > threshold) { 
     401                                        selected.add(detail); 
     402                                        // DEBUG 
     403                                        System.out.println("selected detail " + detail.getID() + " with value " + value);                                        
     404                                } 
     405                        }                        
     406                } 
     407                 
     408                // select details from Short-Term Memory 
     409                for(ActionDetail detail : _stm.getDetails()) {                                   
     410                        double value = detail.getActivationValue().getValue(); 
     411                        if(value > threshold) { 
     412                                selected.add(detail); 
     413                                // DEBUG 
     414                                System.out.println("selected detail " + detail.getID() + " with value " + value);                                        
     415                        } 
     416                } 
     417                 
     418                return selected;                 
     419        } 
     420         
     421        // 09/03/11 - Matthias 
     422        public ArrayList<ActionDetail> activationBasedSelectionByCount(int countMax) { 
     423                 
     424                // merge details into one list 
     425                ArrayList<ActionDetail> merged = new ArrayList<ActionDetail>(); 
     426                // add details from Autobiographic Memory 
     427                for(MemoryEpisode episode : _am.GetAllEpisodes()) { 
     428                        merged.addAll(episode.getDetails());                     
     429                } 
     430                // add details from Short-Term Memory 
     431                merged.addAll(_stm.getDetails()); 
     432 
     433                // sort by value (descending) 
     434                // bubble sort 
     435                // TODO: faster sort algorithm 
     436                boolean swapped; 
     437                do { 
     438                        swapped = false; 
     439                        for(int i = 0; i < merged.size() - 1; i++) { 
     440                                ActionDetail detailA = merged.get(i); 
     441                                double valueA = detailA.getActivationValue().getValue(); 
     442                                ActionDetail detailB = merged.get(i + 1);                                
     443                                double valueB = detailB.getActivationValue().getValue(); 
     444                                if(valueA < valueB) { 
     445                                        merged.set(i, detailB); 
     446                                        merged.set(i + 1, detailA); 
     447                                        swapped = true; 
     448                                } 
     449                        } 
     450                } while (swapped); 
     451                 
     452                // select head of list (highest values) 
     453                ArrayList<ActionDetail> selected = new ArrayList<ActionDetail>(); 
     454                int iMax = Math.min(countMax, merged.size()); 
     455                for(int i = 0; i < iMax; i++) { 
     456                        selected.add(merged.get(i)); 
     457                        // DEBUG 
     458                        System.out.println("selected detail " + merged.get(i).getID() + " with value " + merged.get(i).getActivationValue().getValue()); 
     459                } 
     460 
     461                return selected; 
     462        } 
     463 
     464        // 09/03/11 - Matthias 
     465        public ArrayList<ActionDetail> activationBasedSelectionByAmount(double amount) { 
     466                 
     467                // validate amount 
     468                if(amount < 0) { 
     469                        amount = 0; 
     470                } 
     471                else if(amount > 1) { 
     472                        amount = 1; 
     473                } 
     474                 
     475                // determine corresponding count 
     476                double countTotal = 0; 
     477                for(MemoryEpisode episode : _am.GetAllEpisodes()) { 
     478                        countTotal += episode.getDetails().size(); 
     479                } 
     480                countTotal += _stm.getDetails().size(); 
     481                int countMax = (int) Math.round(countTotal * amount); 
     482                 
     483                // select details by count 
     484                ArrayList<ActionDetail> selected = activationBasedSelectionByCount(countMax); 
     485                 
     486                return selected; 
     487        } 
     488         
    363489} 
  • AgentMind/branches/FAtiMA-Modular/FAtiMA/src/FAtiMA/Core/memory/episodicMemory/MemoryEpisode.java

    r952 r1024  
    2121 * Project: FAtiMA 
    2222 * Created: 18/Jul/2006  
    23  * @author: João Dias 
     23 * @author: Joo Dias 
    2424 * Email to: joao.assis@tagus.ist.utl.pt 
    2525 *  
    2626 * History:  
    27  * João Dias: 18/Jul/2006 - File created 
    28  * João Dias: 14/01/2007 - Added setLocation method 
    29  * João Dias: 16/01/2007 - Removed the abstract field and corresponding Getter 
     27 * Joo Dias: 18/Jul/2006 - File created 
     28 * Joo Dias: 14/01/2007 - Added setLocation method 
     29 * Joo Dias: 16/01/2007 - Removed the abstract field and corresponding Getter 
    3030 *                                               - Restructured the generation of the summary of an event. Defined new 
    3131 *                                                 methods that construct the summary and return an xml description 
    32  *                                                 ready to be used by the LanguageEngine  
    33  * **/ 
     32 *                                                 ready to be used by the LanguageEngine 
     33 * Matthias Keysermann: 08/03/2011 - added retrieval storage to VerifiesKey/s, GetDetailsByKey/s  
     34 */ 
    3435 
    3536package FAtiMA.Core.memory.episodicMemory; 
     
    622623                        if(action.verifiesKeys(searchKeys)) 
    623624                        { 
     625                                // 08/03/11 - Matthias 
     626                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     627                                 
    624628                                return true; 
    625629                        } 
     
    653657                        { 
    654658                                action = li.next(); 
    655                                 if(action.verifiesKey(k)) return true; 
     659                                if(action.verifiesKey(k)) 
     660                                { 
     661                                        // 08/03/11 - Matthias 
     662                                        action.getRetrievalQueue().addRetrievalTime(new Time()); 
     663                                         
     664                                        return true; 
     665                                } 
    656666                        } 
    657667                        return false; 
     
    667677                        if(action.verifiesKey(key))  
    668678                        { 
     679                                // 08/03/11 - Matthias 
     680                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     681                                 
    669682                                details.add(action); 
    670683                        } 
     
    682695                        if(action.verifiesKeys(keys) && !details.contains(action))  
    683696                        { 
     697                                // 08/03/11 - Matthias 
     698                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     699                                 
    684700                                details.add(action); 
    685701                        } 
     
    706722                return episode; 
    707723        } 
     724         
    708725} 
  • AgentMind/branches/FAtiMA-Modular/FAtiMA/src/FAtiMA/Core/memory/episodicMemory/ShortTermEpisodicMemory.java

    r952 r1024  
    2626 * History:  
    2727 * Meiyii Lim: 11/03/09 - File created 
    28  *  
    29  * **/ 
     28 * Matthias Keysermann: 09/03/2011 - added retrieval storage to VerifiesKey/s, GetDetailsByKey/s  
     29 */ 
    3030 
    3131package FAtiMA.Core.memory.episodicMemory; 
     
    155155                        if(action.verifiesKeys(searchKeys)) 
    156156                        { 
     157                                // 09/03/11 - Matthias 
     158                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     159                                 
    157160                                return true; 
    158161                        } 
     
    171174                { 
    172175                        action = (ActionDetail) li.next(); 
    173                         if(action.verifiesKey(k)) return true; 
     176                        if(action.verifiesKey(k)) 
     177                        { 
     178                                // 09/03/11 - Matthias 
     179                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     180                                 
     181                                return true; 
     182                        } 
    174183                } 
    175184                return false; 
     
    188197                        if(action.verifiesKey(key))  
    189198                        { 
     199                                // 09/03/11 - Matthias 
     200                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     201                                 
    190202                                details.add(action); 
    191203                        } 
     
    207219                        if(action.verifiesKeys(keys) && !details.contains(action))  
    208220                        { 
     221                                // 09/03/11 - Matthias 
     222                                action.getRetrievalQueue().addRetrievalTime(new Time()); 
     223                                 
    209224                                details.add(action); 
    210225                        } 
Note: See TracChangeset for help on using the changeset viewer.