/* * Measurement.java * Copyright (C) 2007 University of Waikato, Hamilton, New Zealand * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz) * * 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 2 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package tr.gov.ulakbim.jDenetX.core; import tr.gov.ulakbim.jDenetX.AbstractMOAObject; import java.util.ArrayList; import java.util.List; public class Measurement extends AbstractMOAObject { private static final long serialVersionUID = 1L; protected String name; protected double value; public Measurement(String name, double value) { this.name = name; this.value = value; } public String getName() { return this.name; } public double getValue() { return this.value; } public static Measurement getMeasurementNamed(String name, Measurement[] measurements) { for (Measurement measurement : measurements) { if (name.equals(measurement.getName())) { return measurement; } } return null; } public static void getMeasurementsDescription(Measurement[] measurements, StringBuilder out, int indent) { if (measurements.length > 0) { StringUtils.appendIndented(out, indent, measurements[0].toString()); for (int i = 1; i < measurements.length; i++) { StringUtils.appendNewlineIndented(out, indent, measurements[i] .toString()); } } } public static Measurement[] averageMeasurements(Measurement[][] toAverage) { List<String> measurementNames = new ArrayList<String>(); for (Measurement[] measurements : toAverage) { for (Measurement measurement : measurements) { if (measurementNames.indexOf(measurement.getName()) < 0) { measurementNames.add(measurement.getName()); } } } GaussianEstimator[] estimators = new GaussianEstimator[measurementNames .size()]; for (int i = 0; i < estimators.length; i++) { estimators[i] = new GaussianEstimator(); } for (Measurement[] measurements : toAverage) { for (Measurement measurement : measurements) { estimators[measurementNames.indexOf(measurement.getName())] .addObservation(measurement.getValue(), 1.0); } } List<Measurement> averagedMeasurements = new ArrayList<Measurement>(); for (int i = 0; i < measurementNames.size(); i++) { String mName = measurementNames.get(i); GaussianEstimator mEstimator = estimators[i]; if (mEstimator.getTotalWeightObserved() > 1.0) { averagedMeasurements.add(new Measurement("[avg] " + mName, mEstimator.getMean())); averagedMeasurements.add(new Measurement("[err] " + mName, mEstimator.getStdDev() / Math .sqrt(mEstimator .getTotalWeightObserved()))); } } return averagedMeasurements .toArray(new Measurement[averagedMeasurements.size()]); } public void getDescription(StringBuilder sb, int indent) { sb.append(getName()); sb.append(" = "); sb.append(StringUtils.doubleToString(getValue(), 3)); } }