/*
* Copyright (C) 2014 - Martin Berger
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.data.generic;
import edu.stanford.rsl.conrad.data.generic.datatypes.Gridable;
import edu.stanford.rsl.conrad.data.generic.iterators.GenericPointwiseIteratorND;
public abstract class GenericGridOperator<T extends Gridable<T>> implements GenericGridOperatorInterface<T>{
/** Fill a GenericGrid<T> with the given value */
public void fill(final GenericGrid<T> grid, T val) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
while (it.hasNext())
it.setNext(val);
}
/** Get sum of all grid elements */
public T sum(final GenericGrid<T> grid) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
T sum = (it.hasNext()) ? it.next() : null;
while (it.hasNext())
sum = it.next().add(sum);
return sum;
}
/** Get min of a GenericGrid<T> */
public T min(final GenericGrid<T> grid) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
T min = (it.hasNext()) ? it.next() : null;
while (it.hasNext()) {
min = ((it.get().compareTo(min)) < 0) ? it.get() : min;
it.iterate();
}
return min;
}
/** Get max of a GenericGrid<T> */
public T max(final GenericGrid<T> grid) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
T max = (it.hasNext()) ? it.next() : null;
while (it.hasNext()) {
max = ((it.get().compareTo(max)) > 0) ? it.get() : max;
it.iterate();
}
return max;
}
/** Copy data of a GenericGrid<T> to another, not including boundaries */
public void copy(GenericGrid<T> grid1, GenericGrid<T> grid2) {
GenericPointwiseIteratorND<T> it1 = new GenericPointwiseIteratorND<T>(grid1);
GenericPointwiseIteratorND<T> it2 = new GenericPointwiseIteratorND<T>(grid2);
while (it1.hasNext() && it2.hasNext())
it1.setNext(it2.next());
}
/** Compute dot product between grid1 and grid2 */
public T dotProduct(GenericGrid<T> grid1, GenericGrid<T> grid2) {
GenericPointwiseIteratorND<T> it1 = new GenericPointwiseIteratorND<T>(grid1);
GenericPointwiseIteratorND<T> it2 = new GenericPointwiseIteratorND<T>(grid2);
T value = (it1.hasNext() && it2.hasNext()) ? it1.next().mul(it2.next()) : null;
while (it1.hasNext())
value = value.add(it1.next().mul(it2.next()));
return value;
}
/** Compute grid1 = grid1 - grid2 */
public void addBy(GenericGrid<T> input, GenericGrid<T> add) {
GenericPointwiseIteratorND<T> it_inout = new GenericPointwiseIteratorND<T>(input);
GenericPointwiseIteratorND<T> it_add = new GenericPointwiseIteratorND<T>(add);
while (it_inout.hasNext())
it_inout.setNext(it_inout.get().add(it_add.next()));
}
/** Compute grid = grid + a */
public void addBy(GenericGrid<T> grid, T a) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
while (it.hasNext())
it.setNext(it.get().add(a));
}
/** Compute grid1 = grid1 - grid2 */
public void subtractBy(GenericGrid<T> input, GenericGrid<T> sub) {
GenericPointwiseIteratorND<T> it_inout = new GenericPointwiseIteratorND<T>(input);
GenericPointwiseIteratorND<T> it_sub = new GenericPointwiseIteratorND<T>(sub);
while (it_inout.hasNext())
it_inout.setNext(it_inout.get().sub(it_sub.next()));
}
/** Compute grid = grid - a */
public void subtractBy(GenericGrid<T> grid, T a) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
while (it.hasNext())
it.setNext(it.get().sub(a));
}
public void divideBy(GenericGrid<T> input, GenericGrid<T> divisor) {
GenericPointwiseIteratorND<T> it_inout = new GenericPointwiseIteratorND<T>(input);
GenericPointwiseIteratorND<T> it_div = new GenericPointwiseIteratorND<T>(divisor);
while (it_inout.hasNext())
it_inout.setNext(it_inout.get().div(it_div.next()));
}
/** Compute grid = grid / a */
public void divideBy(GenericGrid<T> grid, T a) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
while (it.hasNext())
it.setNext(it.get().div(a));
}
public void multiplyBy(GenericGrid<T> input, GenericGrid<T> multiplicator) {
GenericPointwiseIteratorND<T> it_inout = new GenericPointwiseIteratorND<T>(input);
GenericPointwiseIteratorND<T> it_mult = new GenericPointwiseIteratorND<T>(multiplicator);
while (it_inout.hasNext() && it_mult.hasNext())
it_inout.setNext(it_inout.get().mul(it_mult.next()));
}
/** Compute grid = grid * a */
public void multiplyBy(GenericGrid<T> grid, T a) {
GenericPointwiseIteratorND<T> it = new GenericPointwiseIteratorND<T>(grid);
while (it.hasNext())
it.setNext(it.get().mul(a));
}
}