/*- * Copyright (c) 2012 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.fitting.functions; import org.eclipse.dawnsci.analysis.api.fitting.functions.IParameter; import org.eclipse.january.dataset.DoubleDataset; /** * This class implements the function y(x) = m*x + c */ public class StraightLine extends AFunction { private static final String NAME = "Linear"; private static final String DESC = "A linear function or straight line." + "\n y(x) = m*x + c"; private static final String[] PARAM_NAMES = new String[]{"m", "c"}; /** * Basic constructor, not advisable to use. */ public StraightLine() { super(2); } public StraightLine(double[] params) { super(params); } public StraightLine(IParameter... params) { super(params); } /** * Constructor allowing for careful construction of bounds * * @param minM * Minimum value allowed for m * @param maxM * Maximum value allowed for m * @param minC * Minimum value allowed for c * @param maxC * Maximum value allowed for c */ public StraightLine(double minM, double maxM, double minC, double maxC) { super(2); IParameter p; p = getParameter(0); p.setLowerLimit(minM); p.setUpperLimit(maxM); p.setValue((minM + maxM) / 2.0); p = getParameter(1); p.setLowerLimit(minC); p.setUpperLimit(maxC); p.setValue((minC + maxC) / 2.0); } @Override protected void setNames() { setNames(NAME, DESC, PARAM_NAMES); } private transient double a, b; private void calcCachedParameters() { a = getParameterValue(0); b = getParameterValue(1); setDirty(false); } @Override public double val(double... values) { if (isDirty()) calcCachedParameters(); double position = values[0]; return a * position + b; } @Override public void fillWithValues(DoubleDataset data, CoordinatesIterator it) { if (isDirty()) calcCachedParameters(); it.reset(); double[] coords = it.getCoordinates(); int i = 0; double[] buffer = data.getData(); while (it.hasNext()) { buffer[i++] = a * coords[0] + b; } } @Override public double partialDeriv(IParameter parameter, double... position) { if (isDuplicated(parameter)) return super.partialDeriv(parameter, position); int i = indexOfParameter(parameter); switch (i) { case 0: return position[0]; case 1: return 1.0; default: return 0; } } @Override public void fillWithPartialDerivativeValues(IParameter parameter, DoubleDataset data, CoordinatesIterator it) { int i = indexOfParameter(parameter); switch (i) { case 0: data.setSlice(it.getValues()[0]); break; case 1: data.fill(1); break; default: break; } } }