package edu.berkeley.nlp.math; import java.util.Arrays; import edu.berkeley.nlp.util.Pair; public abstract class CachingDifferentiableFunction implements DifferentiableFunction { double[] lastX ; double[] lastGradient ; double lastValue; protected abstract Pair<Double, double[]> calculate(double[] x) ; private void ensureCache(double[] x) { if (!isCached(x)) { Pair<Double, double[]> result = calculate(x); lastValue = result.getFirst(); lastX = DoubleArrays.clone(x); lastGradient = DoubleArrays.clone(result.getSecond()); } } private boolean isCached(double[] x) { if (lastX == null) { return false; } return Arrays.equals(x, lastX); } public void clearCache() { lastX = null; lastGradient = null; } public double[] derivativeAt(double[] x) { ensureCache(x); return lastGradient; } public double valueAt(double[] x) { ensureCache(x); return lastValue; } public abstract int dimension() ; }