/*- * Copyright (c) 2013 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.IOperator; import org.eclipse.dawnsci.analysis.api.fitting.functions.IParameter; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.DoubleDataset; /** * Subtract two functions (missing functions are treated as zero) */ public class Subtract extends ABinaryOperator implements IOperator { private static final String NAME = "Subtract"; private static final String DESC = "Subtract one function from another"; public Subtract() { super(); } @Override protected void setNames() { setNames(NAME, DESC); } @Override public double val(double... values) { double y = fa == null ? 0 : fa.val(values); if (fb != null) { y -= fb.val(values); } return y; } @Override public void fillWithValues(DoubleDataset data, CoordinatesIterator it) { if (fa != null) { if (fa instanceof AFunction) { ((AFunction) fa).fillWithValues(data, it); } else { data.setSlice(fa.calculateValues(it.getValues())); } } else { data.fill(0); } if (fb != null) { if (fb instanceof AFunction) { DoubleDataset temp = DatasetFactory.zeros(DoubleDataset.class, it.getShape()); ((AFunction) fb).fillWithValues(temp, it); data.isubtract(temp); } else { data.isubtract(fb.calculateValues(it.getValues())); } } } @Override public double partialDeriv(IParameter param, double... values) { double d = fa == null ? 0 : fa.partialDeriv(param, values); if (fb != null) { d -= fb.partialDeriv(param, values); } return d; } @Override public void fillWithPartialDerivativeValues(IParameter param, DoubleDataset data, CoordinatesIterator it) { if (fa != null && indexOfParameter(fa, param) >= 0) { if (fa instanceof AFunction) { ((AFunction) fa).fillWithPartialDerivativeValues(param, data, it); } else { data.setSlice(fa.calculatePartialDerivativeValues(param, it.getValues())); } } else { data.fill(0); } if (fb != null && indexOfParameter(fb, param) >= 0) { if (fb instanceof AFunction) { DoubleDataset temp = DatasetFactory.zeros(DoubleDataset.class, it.getShape()); ((AFunction) fb).fillWithPartialDerivativeValues(param, temp, it); data.isubtract(temp); } else { data.isubtract(fb.calculatePartialDerivativeValues(param, it.getValues())); } } } }