/* * JABM - Java Agent-Based Modeling Toolkit * Copyright (C) 2013 Steve Phelps * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package net.sourceforge.jabm.report; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sourceforge.jabm.Simulation; import net.sourceforge.jabm.event.AbstractModel; import net.sourceforge.jabm.event.ReportVariablesChangedEvent; import net.sourceforge.jabm.event.SimEvent; import net.sourceforge.jabm.event.SimulationEvent; import net.sourceforge.jabm.event.SimulationStartingEvent; import org.apache.commons.math3.stat.descriptive.SummaryStatistics; public abstract class AbstractReportVariables extends AbstractModel implements XYReportVariables { protected long timeStamp; protected String name; protected String xVariableName; protected List<Object> yVariableNames = new LinkedList<Object>(); protected Simulation simulation; public AbstractReportVariables(String name) { super(); this.name = name; this.xVariableName = name + ".t"; } public Map<Object, Number> getVariableBindings() { LinkedHashMap<Object, Number> result = new LinkedHashMap<Object,Number>(); result.put(this.xVariableName, timeStamp); return result; } public Object createVariable(String variableName) { return this.name + "." + variableName; } public void recordMoments(Object statName, Map<Object, Number> variables, SummaryStatistics stats) { variables.put(createVariable(statName + ".mean"), stats.getMean()); variables.put(createVariable(statName + ".variance"), stats.getVariance()); } public void recordSummaryStatistics(Object statName, Map<Object, Number> variables, SummaryStatistics stats) { variables.put(createVariable(statName + ".mean"), stats.getMean()); variables.put(createVariable(statName + ".min"), stats.getMin()); variables.put(createVariable(statName + ".max"), stats.getMax()); variables.put(createVariable(statName + ".n"), stats.getN()); variables.put(createVariable(statName + ".stdev"), stats .getStandardDeviation()); } public void compute(SimEvent event) { // if (event instanceof SimulationEvent) { // onSimulationEvent((SimulationEvent) event); // } if (simulation != null) { timeStamp = this.simulation.getSimulationTime().getTicks(); } fireEvent(new ReportVariablesChangedEvent(this)); } // // public void onSimulationEvent(SimulationEvent event) { // timeStamp = event.getSimulation().getSimulationTime().getTicks(); // } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getTimeStamp() { return timeStamp; } @Override public void eventOccurred(SimEvent event) { if (event instanceof SimulationStartingEvent) { this.simulation = ((SimulationEvent) event).getSimulation(); } } @Override public void dispose(SimEvent event) { // Default is do nothing } @Override public void initialise(SimEvent event) { // this.yVariableNames = new LinkedList<Object>(); // this.yVariableNames.addAll(getVariableBindings().keySet()); } @Override public Number getX(int seriesIndex) { return getVariableBindings().get(this.xVariableName); } @Override public Number getY(int seriesIndex) { // return getVariableBindings().get( // this.yVariableNames.get(seriesIndex + 1)); return getVariableBindings().get(getyVariableNames().get(seriesIndex)); } @Override public String getxVariableName() { return xVariableName; } @Override public List<Object> getyVariableNames() { return yVariableNames; } @Override public int getNumberOfSeries() { return getVariableBindings().size() - 1; } public String tag(Object strategy) { if (strategy instanceof Taggable) { return ((Taggable) strategy).getTag(); } else { return strategy.getClass().toString(); } } }