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

Java tutorial

Introduction

Here is the source code for br.unicamp.cst.behavior.glas.ActionSelectionCodelet.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 java.util.ArrayList;
import java.util.Random;

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

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;

/**
 * 
 * Selects action based on solution tree retrieved from working storage.
 * @author klaus
 *
 */
public class ActionSelectionCodelet extends Codelet {

    MemoryObject SOLUTION_TREE_MO; //input (should be found in working storage)
    MemoryObject ACTION_MO; //output
    MemoryObject STIMULUS_MO; //input
    int[] empty_solution_tree = { 0, 1, 0, 1, 0, 1 };
    private GlasActionSelection sm;
    private Timestamp last_stimulus_time_stamp;
    private boolean first_run = true;
    private JSONArray current_solution_tree_jsonarray = new JSONArray();
    private MemoryObject NEW_STIM_MO;
    //   private MemoryObject NEW_EVENT_DETECTED_MO;
    private MemoryObject NEW_ACTION_MO;
    private MemoryObject NEW_REWARD_MO;
    private boolean enabled = true;
    private double exp_factor = 0; //Exploratory factor
    private double solution_tree_fitness = Double.NEGATIVE_INFINITY;
    private boolean dynamicExplorationOn = false;

    private RawMemory rawMemory;

    private WorkingStorage ws;

    public ActionSelectionCodelet(RawMemory rawMemory, WorkingStorage ws) {
        this.rawMemory = rawMemory;
        this.ws = ws;
        if (ws != null) {
            ws.registerCodelet(this, "SOLUTION_TREE", 0);
            ws.registerCodelet(this, "STIMULUS", 0);
            ws.putMemoryObject(ACTION_MO);
            ws.registerCodelet(this, "NEW_STIM", 0);
            ws.registerCodelet(this, "NEW_ACTION", 0);
            ws.registerCodelet(this, "NEW_REWARD", 0);
            //         ws.registerCodelet(this,MemoryObjectTypesGlas.ACTION, 1);
            //         ws.registerCodelet(this,MemoryObjectTypesGlas.NEW_EVENT_DETECTED, 0);
        }

        if (rawMemory != null)
            ACTION_MO = rawMemory.createMemoryObject("ACTION", "");

        for (int i = 0; i < empty_solution_tree.length; i++) {
            current_solution_tree_jsonarray.put(empty_solution_tree[i]);
        }

        sm = new GlasActionSelection(empty_solution_tree);
        sm.reset();
    }

    @Override
    public void accessMemoryObjects() {
        SOLUTION_TREE_MO = this.getInput("SOLUTION_TREE", 0);
        ArrayList<MemoryObject> teste = ws != null ? ws.getAllOfType("SOLUTION_TREE") : null;
        STIMULUS_MO = this.getInput("STIMULUS", 0);
        //      System.out.println("(STIMULUS_MO.getInfo() (antes): "+STIMULUS_MO.getInfo());
        //      ACTION_MO=this.getOutput(MemoryObjectTypesGlas.ACTION, 0);

        //      NEW_EVENT_DETECTED_MO = this.getInput(MemoryObjectTypesGlas.NEW_EVENT_DETECTED,0);

        int index = 0;
        NEW_STIM_MO = this.getInput("NEW_STIM", index);
        NEW_ACTION_MO = this.getInput("NEW_ACTION", index);
        NEW_REWARD_MO = this.getInput("NEW_REWARD", index);
    }

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

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

            //Update Solution Tree if needed
            Object new_solution_tree_string = SOLUTION_TREE_MO.getI();
            if (!new_solution_tree_string.equals(this.current_solution_tree_jsonarray.toString())) {
                //         System.out.println("Action Selection Found a new Solution Tree: "+new_solution_tree_string);
                JSONArray new_solution_tree_jsonarray;
                try {
                    new_solution_tree_jsonarray = new JSONArray(new_solution_tree_string);
                    int[] new_solution_tree_phenotype = new int[new_solution_tree_jsonarray.length()];

                    for (int i = 0; i < new_solution_tree_phenotype.length; i++) {
                        new_solution_tree_phenotype[i] = new_solution_tree_jsonarray.getInt(i);
                    }
                    current_solution_tree_jsonarray = new_solution_tree_jsonarray;

                    sm = new GlasActionSelection(new_solution_tree_phenotype);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                solution_tree_fitness = SOLUTION_TREE_MO.getEvaluation();
                //            exp_factor=1-(1/(1+Math.exp(-solution_tree_fitness)));
                //1/(1+EXP(AB3*10))
                if (dynamicExplorationOn) {
                    exp_factor = (1 / (1 + Math.exp(10 * solution_tree_fitness)));
                }

            }

            //Selects action based on stimulus

            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 (!STIMULUS_MO.getI().equals("") && new_stim && !new_action && !new_reward) {

                int[] stimulus = { Integer.valueOf((String) STIMULUS_MO.getI()) };
                int[] selected_action = sm.runStimuli(stimulus); //TODO Ugly solution

                //TODO Add an exploratory element here?

                Random rnd_exp = new Random();

                if (rnd_exp.nextFloat() <= exp_factor) {
                    int[] actions = sm.getActions();
                    selected_action[0] = actions[rnd_exp.nextInt(actions.length)];

                }

                ACTION_MO.updateI(Integer.toString(selected_action[0])); //TODO is [0] correct?
                //         System.out.println("ACTION_MO.updateInfo("+selected_action[0]+")");

                new_action = true;
                //         System.out.println("new_action=true;");
            }

            NEW_ACTION_MO.updateI(String.valueOf(new_action));

        } //end if(enabled)
    }// end proc()

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

    /**
     * @param enabled the enabled to set
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
    //   public int[] getGenotypeFromPhenotype(int[] phenotype) {
    //
    //
    //      int nN=Math.round(phenotype.length/3)+1;
    //      int[] genotype = new int[nN*3];
    //
    //      genotype[0]=0;//First nodes always zero
    //      genotype[nN]=0;//First nodes always zero
    //      genotype[2*nN]=0;//First nodes always zero 
    //
    //      int index = 0;
    //      for(int i=1;i<nN;i++){   
    //         genotype[i] = phenotype[index];
    //         index++;
    //      }
    //      index = nN-1;
    //      for(int i=nN+1;i<2*nN;i++){      
    //         genotype[i] = phenotype[index];
    //         index++;
    //      }
    //      index = 2*nN-2;
    //      for(int i=2*nN+1;i<3*nN;i++){      
    //         genotype[i] = phenotype[index];
    //         index++;
    //      }
    //
    //      return genotype;
    //   }

    /**
     * @return the exp_factor
     */
    public double getExp_factor() {
        return exp_factor;
    }

    /**
     * Probability (0-1) of getting a random action
     * @param ef the exp_factor to set
     */
    public void setExp_factor(double ef) {
        if (ef < 0.0) {
            this.exp_factor = 0.0;
        } else if (ef > 1) {
            this.exp_factor = 1.0;
        } else {
            this.exp_factor = ef;
        }

    }

    /**
     * @return the dynamicExplorationOn
     */
    public boolean isDynamicExplorationOn() {
        return dynamicExplorationOn;
    }

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

}