/* * Copyright (C) 2010-2014 - Andreas Maier, Magdalena Herbst, Michael Dorner, Salah Saleh, Anja Pohan, Stefan Nottrott, Frank Schebesch * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */ package edu.stanford.rsl.conrad.data.numeric; import edu.stanford.rsl.conrad.data.numeric.opencl.OpenCLGridInterface; import edu.stanford.rsl.conrad.data.numeric.opencl.OpenCLGridOperators; /** The collection of all operators working point-wise on NumericGrid data. */ public abstract class NumericPointwiseOperators { /* * Auxiliary method to select a combined grid operator */ public static NumericGridOperator selectGridOperator(NumericGrid ... grids) { boolean nonCLFound = false; for (NumericGrid grid : grids){ if (!(grid instanceof OpenCLGridInterface)){ nonCLFound = true; } } return (nonCLFound ? NumericGridOperator.getInstance() : OpenCLGridOperators.getInstance()); } /** Fill a NumericGrid with the given value */ public static void fill(final NumericGrid grid, float val) { grid.getGridOperator().fill(grid, val); } /** Get sum of all grid elements */ public static float sum(final NumericGrid grid) { return grid.getGridOperator().sum(grid); } /** Get min of a NumericGrid */ public static float min(final NumericGrid grid) { return grid.getGridOperator().min(grid); } /** Get max of a NumericGrid */ public static float max(final NumericGrid grid) { return grid.getGridOperator().max(grid); } /** Copy data of a NumericGrid to another, not including boundaries */ public static void copy(NumericGrid grid1, NumericGrid grid2) { NumericGridOperator op = selectGridOperator(grid1, grid2); op.copy(grid1, grid2); } /** Compute dot product between grid1 and grid2 */ public static float dotProduct(NumericGrid grid1, NumericGrid grid2) { NumericGridOperator op = selectGridOperator(grid1, grid2); return op.dotProduct(grid1, grid2); } /** Compute dot product between grid1 and grid2 */ public static float weightedSSD(NumericGrid grid1, NumericGrid grid2, double weightGrid2, double addGrid2) { NumericGridOperator op = selectGridOperator(grid1, grid2); return op.weightedSSD(grid1, grid2, weightGrid2, addGrid2); } /** Compute dot product between grid1 and grid2 */ public static float weightedDotProduct(NumericGrid grid1, NumericGrid grid2, double weightGrid2, double subGrid2) { NumericGridOperator op = selectGridOperator(grid1, grid2); return op.weightedSSD(grid1, grid2, weightGrid2, subGrid2); } /** Compute dot product between grid and itself. Same as square of l2 norm */ public static float dotProduct(NumericGrid grid) { return dotProduct(grid, grid); } /** Compute grid3 = grid1 + grid2 */ public static NumericGrid addedBy(NumericGrid input, NumericGrid sub) { NumericGridOperator op = selectGridOperator(input, sub); NumericGrid output=input.clone(); op.addBy(output, sub); return output; } /** Compute grid1 = grid1 + grid2 */ public static void addBy(NumericGrid input, NumericGrid sub) { NumericGridOperator op = selectGridOperator(input, sub); op.addBy(input, sub); } /** Compute grid = grid + a */ public static void addBy(NumericGrid grid, float a) { grid.getGridOperator().addBy(grid, a); } /** Compute grid3 = grid1 - grid2 */ public static NumericGrid subtractedBy(NumericGrid input, NumericGrid sub) { NumericGridOperator op = selectGridOperator(input, sub); NumericGrid output = input.clone(); op.subtractBy(output, sub); return output; } /** Compute grid1 = grid1 - grid2 */ public static void subtractBy(NumericGrid input, NumericGrid sub) { NumericGridOperator op = selectGridOperator(input, sub); op.subtractBy(input, sub); } /** Compute grid = grid - a */ public static void subtractBy(NumericGrid grid, float a) { grid.getGridOperator().subtractBy(grid, a); } public static NumericGrid dividedBy(NumericGrid input, NumericGrid divisor) { NumericGridOperator op = selectGridOperator(input, divisor); NumericGrid output = input.clone(); op.divideBy(output, divisor); return output; } public static void divideBy(NumericGrid input, NumericGrid divisor) { NumericGridOperator op = selectGridOperator(input, divisor); op.divideBy(input, divisor); } /** Compute grid = grid / a */ public static void divideBy(NumericGrid grid, float a) { grid.getGridOperator().divideBy(grid, a); } public static NumericGrid multipliedBy(NumericGrid input, NumericGrid multiplier) { NumericGridOperator op = selectGridOperator(input, multiplier); NumericGrid output = input.clone(); op.multiplyBy(output, multiplier); return output; } public static void multiplyBy(NumericGrid input, NumericGrid multiplier) { NumericGridOperator op = selectGridOperator(input, multiplier); op.multiplyBy(input, multiplier); } /** Compute grid = grid * a */ public static void multiplyBy(NumericGrid grid, float a) { grid.getGridOperator().multiplyBy(grid, a); } /** Set all negative values in grid as zero. */ public static void removeNegative(NumericGrid grid ) { grid.getGridOperator().removeNegative(grid); } public static float mean(NumericGrid data) { return sum(data)/data.getNumberOfElements(); } public static float stddev(NumericGrid data, double mean) { return data.getGridOperator().stddev(data, mean); } public static void abs(NumericGrid data) { data.getGridOperator().abs(data); } public static void sqr(NumericGrid grid) { grid.getGridOperator().pow(grid,2); } public static void pow(NumericGrid grid, double exponent) { grid.getGridOperator().pow(grid, exponent); } public static void sqrt(NumericGrid grid) { grid.getGridOperator().sqrt(grid); } public static NumericGrid sqrcopy(NumericGrid grid) { NumericGrid out = grid.clone(); sqr(out); return out; } public static NumericGrid sqrtcopy(NumericGrid grid) { NumericGrid out = grid.clone(); sqrt(out); return out; } public static void log(NumericGrid data) { data.getGridOperator().log(data); } public static void exp(NumericGrid data) { data.getGridOperator().exp(data); } /** set maximum value, all values > max are set to max */ public static void setMax(NumericGrid data, float max) { data.getGridOperator().setMax(data, max); } /** set minimum value, all values < min are set to min */ public static void setMin(NumericGrid data, float min) { data.getGridOperator().setMin(data, min); } }