package org.singinst.uf.model; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.singinst.uf.math.MathUtil; import org.singinst.uf.math.SimplePoint; import org.singinst.uf.presenter.ScalarValuePointList; import org.singinst.uf.presenter.LineBounds; public class HazardRateNodeMetadataContentsFactory { private final List scalarSchemata = new ArrayList(); private final ScalarRelation relation; private final Map extremeByYear = new HashMap(); private final List pointLists = new ArrayList(); private final List conjectureList = new ArrayList(); private static final double MID_YEAR = MathUtil.average(ModelUtil.EARLIEST_YEAR, ModelUtil.LATEST_YEAR); public HazardRateNodeMetadataContentsFactory(Node node) { IncidentBounds incidentBounds = new IncidentBounds(); LineBounds yearBounds = new LineBounds(ModelUtil.EARLIEST_YEAR, ModelUtil.LATEST_YEAR); final List extremes = IncidentExtremeNodeMetadataContentsFactory.createList(node, incidentBounds, yearBounds); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { extremeByYear.put(extreme.getYear(), extreme); scalarSchemata.addAll(extreme.getScalars()); } for (ScalarSchema scalarSchema : scalarSchemata) { conjectureList.add(scalarSchema.getScalarValueHolder()); } for (NotablePercentile percentile : NotablePercentile.values()) { PercentileDraggableLine pointList = new IncidentLine(this, percentile); pointLists.add(pointList); } relation = new ScalarRelation(new Axis(yearBounds), new Axis(incidentBounds)) { @Override public List getPointLists() { for (PercentileDraggableLine incidentLine : pointLists) { List points = new ArrayList(); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { points.add(new SimplePoint(extreme.getYear(), extreme.getScalarSchema(incidentLine.getPercentile()).getScalarValueHolder().getValue())); } incidentLine.setHypothesisPoints(points); } return pointLists; } public List getConclusionGenerators() { List retVal = new ArrayList(); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { retVal.add(extreme.getConclusionGenerator()); } return retVal; } public List getScalarValues() { return conjectureList ; } }; } public Collection getScalars() { return scalarSchemata; } public ScalarRelation getRelation() { return relation; } public void dragTo(NotablePercentile percentile, SimplePoint point) { boolean selectLeft = point.x < MID_YEAR; double year = selectLeft ? ModelUtil.EARLIEST_YEAR : ModelUtil.LATEST_YEAR; double anchorYear = selectLeft ? ModelUtil.LATEST_YEAR : ModelUtil.EARLIEST_YEAR; YearExtremeNodeMetadataContentsFactory extreme = extremeByYear.get(year); if (extreme == null) { throw new NullPointerException("" + year); } YearExtremeNodeMetadataContentsFactory anchorExtreme = extremeByYear.get(anchorYear); if (anchorExtreme == null) { throw new NullPointerException("" + year); } SimplePoint anchorPoint = new SimplePoint( anchorYear, anchorExtreme.getScalarSchema(percentile).getScalarValueHolder().getValue()); double newExtremeY = MathUtil.interpolate( anchorPoint, point, year); extreme.getScalarSchema(percentile).getScalarValueHolder().setValue(newExtremeY); } }