br.unicamp.cst.behavior.glas.SequenceBuilderCodelet.java Source code

Java tutorial

Introduction

Here is the source code for br.unicamp.cst.behavior.glas.SequenceBuilderCodelet.java

Source

/*******************************************************************************
 * Copyright (c) 2012  DCA-FEEC-UNICAMP
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl.html
 * 
 * Contributors:
 *     K. Raizer, A. L. O. Paraense, R. R. Gudwin - initial API and implementation
 ******************************************************************************/

package br.unicamp.cst.behavior.glas;

import java.sql.Timestamp;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import br.unicamp.cst.core.entities.Codelet;
import br.unicamp.cst.core.entities.MemoryObject;
import br.unicamp.cst.core.entities.RawMemory;
import br.unicamp.cst.memory.WorkingStorage;

/**
 * This class records the sequence of events seen by the agent,
 * @author klaus
 *
 */
public class SequenceBuilderCodelet extends Codelet {
    private boolean enabled = true;
    private MemoryObject STIMULUS_MO;
    private MemoryObject ACTION_MO;
    private MemoryObject PREVIOUS_REWARD_MO; //Reward for i=1 a,s pair
    private boolean first_run = true;
    private Timestamp previous_stimulus_time_stamp;
    private JSONArray sequence = new JSONArray();
    private MemoryObject EVENTS_SEQUENCE_MO;
    private int sensed_stimulus;
    private int expected_action;
    private double reward_received;
    private boolean printEvents = false;
    private MemoryObject NEW_EVENT_DETECTED_MO;

    private MemoryObject NEW_STIM_MO;
    private MemoryObject NEW_ACTION_MO;
    private MemoryObject NEW_REWARD_MO;

    private RawMemory rawMemory;

    public SequenceBuilderCodelet(RawMemory rawMemory, WorkingStorage ws) {
        this.rawMemory = rawMemory;

        if (ws != null) {
            ws.registerCodelet(this, "SOLUTION_TREE", 0);
            ws.registerCodelet(this, "STIMULUS", 0);
            ws.registerCodelet(this, "ACTION", 0);
            ws.registerCodelet(this, "REWARD", 0);
        }

        if (rawMemory != null)
            EVENTS_SEQUENCE_MO = rawMemory.createMemoryObject("EVENTS_SEQUENCE", "");
        this.addOutput(EVENTS_SEQUENCE_MO);
        if (ws != null)
            ws.putMemoryObject(EVENTS_SEQUENCE_MO);

        if (rawMemory != null)
            NEW_EVENT_DETECTED_MO = rawMemory.createMemoryObject("NEW_EVENT_DETECTED", "FALSE");
        this.addOutput(NEW_EVENT_DETECTED_MO);
        if (ws != null)
            ws.putMemoryObject(NEW_EVENT_DETECTED_MO);

        if (rawMemory != null) {
            NEW_STIM_MO = rawMemory.createMemoryObject("NEW_STIM", String.valueOf(false));
            NEW_ACTION_MO = rawMemory.createMemoryObject("NEW_ACTION", String.valueOf(false));
            NEW_REWARD_MO = rawMemory.createMemoryObject("NEW_REWARD", String.valueOf(false));

        }

        this.addOutput(NEW_STIM_MO);
        this.addOutput(NEW_ACTION_MO);
        this.addOutput(NEW_REWARD_MO);

        if (ws != null) {
            ws.putMemoryObject(NEW_STIM_MO);
            ws.putMemoryObject(NEW_ACTION_MO);
            ws.putMemoryObject(NEW_REWARD_MO);
        }

        if (rawMemory != null) {
            STIMULUS_MO = rawMemory.createMemoryObject("STIMULUS", "");
            PREVIOUS_REWARD_MO = rawMemory.createMemoryObject("REWARD", ""); //reward for i-1 s,a pair
        }

        this.addInput(STIMULUS_MO);
        this.addInput(PREVIOUS_REWARD_MO);
        if (ws != null) {
            ws.putMemoryObject(STIMULUS_MO);
            ws.putMemoryObject(PREVIOUS_REWARD_MO);
        }

    }

    @Override
    public void accessMemoryObjects() {
        //      STIMULUS_MO=this.getInput(MemoryObjectTypesGlas.STIMULUS, 0);
        ACTION_MO = this.getInput("ACTION", 0);
        //      PREVIOUS_REWARD_MO=this.getInput(MemoryObjectTypesGlas.REWARD, 0);      

        //      int index=0;
        //      NEW_STIM_MO = this.getOutput(MemoryObjectTypesGlas.NEW_STIM, index);
        //      NEW_ACTION_MO = this.getOutput(MemoryObjectTypesGlas.NEW_ACTION, index);
        //      NEW_REWARD_MO = this.getOutput(MemoryObjectTypesGlas.NEW_REWARD, index);

    }

    @Override
    public void calculateActivation() {
        // TODO Auto-generated method stub

    }

    @Override
    public void proc() {
        if (enabled) {

            boolean new_stim = (NEW_STIM_MO.getI().equals(String.valueOf(true)));
            boolean new_action = (NEW_ACTION_MO.getI().equals(String.valueOf(true)));
            boolean new_reward = (NEW_REWARD_MO.getI().equals(String.valueOf(true)));

            if (new_stim && new_action && new_reward) { //OK to snapshot an event!

                try {
                    sensed_stimulus = Integer.valueOf((String) STIMULUS_MO.getI());
                } catch (NumberFormatException e) {
                    sensed_stimulus = 0;
                }

                try {
                    expected_action = Integer.valueOf((String) ACTION_MO.getI());
                } catch (NumberFormatException e) {
                    expected_action = 0;
                }

                try {
                    reward_received = Double.valueOf((String) PREVIOUS_REWARD_MO.getI());
                } catch (NumberFormatException e) {
                    reward_received = 0.0;
                }
                if (this.printEvents) {
                    System.out
                            .println("Event:" + sensed_stimulus + ", " + expected_action + ", " + reward_received);
                }

                JSONObject event;
                try {
                    event = new JSONObject();//A new event each time
                    event.put(GlasSequenceElements.SENSED_STIMULUS.toString(), sensed_stimulus);
                    event.put(GlasSequenceElements.EXPECTED_ACTION.toString(), expected_action);
                    event.put(GlasSequenceElements.REWARD_RECEIVED.toString(), reward_received);

                    //--------------------
                    //               int s = event.getInt(GlasSequenceElements.SENSED_STIMULUS.toString());
                    //               int a = event.getInt(GlasSequenceElements.EXPECTED_ACTION.toString());
                    //               double r = event.getInt(GlasSequenceElements.REWARD_RECEIVED.toString());
                    //----------------
                    sequence.put(event);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                EVENTS_SEQUENCE_MO.updateI(sequence.toString());

                //----------

                NEW_STIM_MO.updateI(String.valueOf(false));
                NEW_ACTION_MO.updateI(String.valueOf(false));
                NEW_REWARD_MO.updateI(String.valueOf(false));

            } //if enable
        } // proc()

    }

    /**
     * Prints the whole sequence stored in memory
     */
    public void printSequence() {
        System.out.println("------------------------------------");
        try {
            JSONArray es = new JSONArray(EVENTS_SEQUENCE_MO.getI());

            for (int i = 0; i < es.length(); i++) {
                JSONObject ev = es.getJSONObject(i);
                System.out.println(i + "(s,a,r)=(" + ev.getInt(GlasSequenceElements.SENSED_STIMULUS.toString())
                        + "," + ev.getInt(GlasSequenceElements.EXPECTED_ACTION.toString()) + ","
                        + ev.getInt(GlasSequenceElements.REWARD_RECEIVED.toString()) + ")");
            }

        } catch (JSONException e) {
        }
        System.out.println("------------------------------------");

    }

    /**
     * @return the printEvents
     */
    public boolean isPrintEvents() {
        return printEvents;
    }

    /**
     * @param printEvents the printEvents to set
     */
    public void setPrintEvents(boolean printEvents) {
        this.printEvents = printEvents;
    }

    /**
     * @return the enabled
     */
    public boolean isEnabled() {
        return enabled;
    }

    /**
     * @param enabled the enabled to set
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    /**
     * @return the EVENTS_SEQUENCE_MO
     */
    public MemoryObject getEVENTS_SEQUENCE_MO() {
        return EVENTS_SEQUENCE_MO;
    }

    /**
     * @param eVENTS_SEQUENCE_MO the eVENTS_SEQUENCE_MO to set
     */
    public void setEVENTS_SEQUENCE_MO(MemoryObject eVENTS_SEQUENCE_MO) {
        EVENTS_SEQUENCE_MO = eVENTS_SEQUENCE_MO;
    }

}