/*
* 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.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sourceforge.jabm.event.AbstractModel;
import net.sourceforge.jabm.event.ReportVariablesChangedEvent;
import net.sourceforge.jabm.event.SimEvent;
import net.sourceforge.jabm.view.TimeSeriesChart;
import org.springframework.beans.factory.InitializingBean;
/**
* A report which incrementally records values from an underlying
* {@link ReportVariables} object to an array each time it is computed. This can
* be used as the model for a, e.g. {@link TimeSeriesChart}.
*
* @author Steve Phelps
*
*/
public class SeriesReportVariables extends AbstractModel
implements Serializable, InitializingBean, Timeseries {
protected ArrayList<ArrayList<Number>> xData;
protected ArrayList<ArrayList<Number>> yData;
protected XYReportVariables reportVariables;
protected int n;
@Override
public Map<Object, Number> getVariableBindings() {
return reportVariables.getVariableBindings();
}
@Override
public List<Object> getyVariableNames() {
return reportVariables.getyVariableNames();
}
public String getxVariableName() {
return reportVariables.getxVariableName();
}
@Override
public void eventOccurred(SimEvent event) {
}
@Override
public void compute(SimEvent event) {
// this.reportVariables.compute(event);
this.n = reportVariables.getNumberOfSeries();
for(int i=0; i<n; i++) {
xData.get(i).add(reportVariables.getX(i));
yData.get(i).add(reportVariables.getY(i));
}
fireEvent(new ReportVariablesChangedEvent(this));
}
@Override
public void dispose(SimEvent event) {
// this.reportVariables.dispose(event);
}
@Override
public void initialise(SimEvent event) {
// this.reportVariables.initialise(event);
initialiseSeries();
}
public void initialiseSeries() {
this.n = reportVariables.getNumberOfSeries();
this.xData = new ArrayList<ArrayList<Number>>(n);
this.yData = new ArrayList<ArrayList<Number>>(n);
for(int i=0; i<n; i++) {
xData.add(new ArrayList<Number>());
yData.add(new ArrayList<Number>());
}
fireEvent(new ReportVariablesChangedEvent(this));
}
@Override
public String getName() {
return reportVariables.getName();
}
/* (non-Javadoc)
* @see net.sourceforge.jabm.report.Timeseries#getX(int, int)
*/
@Override
public Number getX(int seriesIndex, int itemIndex) {
return xData.get(seriesIndex).get(itemIndex);
}
/* (non-Javadoc)
* @see net.sourceforge.jabm.report.Timeseries#getY(int, int)
*/
@Override
public Number getY(int seriesIndex, int itemIndex) {
return yData.get(seriesIndex).get(itemIndex);
}
/* (non-Javadoc)
* @see net.sourceforge.jabm.report.Timeseries#size()
*/
@Override
public int size(int seriesIndex) {
if (xData == null) {
return 0;
} else {
return xData.get(seriesIndex).size();
}
}
public XYReportVariables getReportVariables() {
return reportVariables;
}
public void setReportVariables(XYReportVariables reportVariables) {
this.reportVariables = reportVariables;
}
/* (non-Javadoc)
* @see net.sourceforge.jabm.report.Timeseries#getNumberOfSeries()
*/
@Override
public int getNumberOfSeries() {
return n;
}
@Override
public void afterPropertiesSet() throws Exception {
initialiseSeries();
}
}