gernotbelger@8999: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8999: * Software engineering by gernotbelger@8999: * Björnsen Beratende Ingenieure GmbH gernotbelger@8999: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8999: * gernotbelger@8999: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8999: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8999: * documentation coming with Dive4Elements River for details. gernotbelger@8999: */ gernotbelger@8999: package org.dive4elements.river.artifacts.common; gernotbelger@8999: gernotbelger@8999: import java.io.Serializable; gernotbelger@8999: import java.util.ArrayList; gernotbelger@8999: import java.util.Collection; gernotbelger@8999: import java.util.Collections; gernotbelger@8999: import java.util.List; gernotbelger@8999: gernotbelger@9265: import org.apache.commons.collections.Predicate; gernotbelger@9265: import org.apache.commons.collections.functors.TruePredicate; gernotbelger@9265: gernotbelger@8999: import gnu.trove.TDoubleArrayList; gernotbelger@8999: gernotbelger@8999: /** gernotbelger@8999: * @author Gernot Belger gernotbelger@8999: */ gernotbelger@8999: public abstract class AbstractCalculationResult implements Serializable { gernotbelger@8999: gernotbelger@8999: private static final long serialVersionUID = 1L; gernotbelger@8999: gernotbelger@9265: private final Collection rows; gernotbelger@8999: gernotbelger@8999: private final String label; gernotbelger@8999: gernotbelger@9150: public AbstractCalculationResult(final String label, final Collection rows) { gernotbelger@9150: this.label = label; gernotbelger@8999: this.rows = new ArrayList<>(rows); gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: public final String getLabel() { gernotbelger@8999: return this.label; gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: public boolean isEmpty() { gernotbelger@8999: return this.rows.isEmpty(); gernotbelger@8999: } gernotbelger@8999: mschaefer@9202: public Collection getRows() { gernotbelger@8999: return Collections.unmodifiableCollection(this.rows); gernotbelger@8999: } gernotbelger@8999: gernotbelger@9265: public final double[][] getStationPoints(final IResultType yType) { gernotbelger@9265: return getPoints(GeneralResultType.station, yType, TruePredicate.INSTANCE); gernotbelger@9265: } gernotbelger@9265: gernotbelger@9425: /** gernotbelger@9425: * Return the row with the given station (within the given tolerance) by linear search. gernotbelger@9425: * Returns null, if no such station was found. gernotbelger@9425: */ gernotbelger@9425: protected final ResultRow getRowForStation(final double searchStation, final double stationTolerance) { gernotbelger@9425: gernotbelger@9425: for (final ResultRow row : this.rows) { gernotbelger@9425: final double station = row.getDoubleValue(GeneralResultType.station); gernotbelger@9425: if (Math.abs(station - searchStation) < stationTolerance) gernotbelger@9425: return row; gernotbelger@9425: } gernotbelger@9425: gernotbelger@9425: return null; gernotbelger@9425: } gernotbelger@9425: gernotbelger@9265: public final double[][] getPoints(final IResultType typeX, final IResultType typeY, final Predicate rowFilter) { gernotbelger@8999: gernotbelger@8999: final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size()); gernotbelger@8999: final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size()); gernotbelger@8999: gernotbelger@8999: for (final ResultRow row : this.rows) { gernotbelger@8999: gernotbelger@9265: if (rowFilter.evaluate(row)) { gernotbelger@9265: final double station = row.getDoubleValue(typeX); gernotbelger@9265: final double value = row.getDoubleValue(typeY); gernotbelger@8999: gernotbelger@9265: xPoints.add(station); gernotbelger@9265: yPoints.add(value); gernotbelger@9265: } gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() }; gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: protected final List getValues(final IResultType type) { gernotbelger@8999: gernotbelger@8999: final List values = new ArrayList<>(); gernotbelger@8999: gernotbelger@8999: for (final ResultRow row : this.rows) { gernotbelger@8999: @SuppressWarnings("unchecked") gernotbelger@8999: final TYPE value = (TYPE) row.getValue(type); gernotbelger@8999: values.add(value); gernotbelger@8999: } gernotbelger@8999: gernotbelger@8999: return values; gernotbelger@8999: } gernotbelger@8999: }