/**
*
*/
package turtlekit.pheromone;
/**
* @author Fabien Michel
*
*/
public abstract class AbstractPheromoneGrid<T> extends DataGrid<T> {
private CoefficientBoundedRangeModel diffusionCoefficient, evaporationCoefficient;
private T maximum;
/**
* @param name
* @param width
* @param height
*/
public AbstractPheromoneGrid(String name, int width, int height, final float evaporationCoeff, final float diffusionCoeff) {
super(name, width, height);
diffusionCoefficient = new CoefficientBoundedRangeModel(diffusionCoeff);
evaporationCoefficient = new CoefficientBoundedRangeModel(evaporationCoeff);
}
/**
* @return the maximum
*/
public T getMaximum() {
return maximum;
}
/**
* @param maximum the maximum to set
*/
public void setMaximum(T maximum) {
this.maximum = maximum;
}
/**
* @return the diffusion coefficient as a float between 0 and 1, e.g. 0.33 for 33%
*/
final public float getDiffusionCoefficient(){
return diffusionCoefficient.getCoefficient();
}
/**
* @return the diffusion coefficient as a float between 0 and 1, e.g. 0.33 for 33%
*/
final public CoefficientBoundedRangeModel getDiffusionCoefficientModel(){
return diffusionCoefficient;
}
/**
* @return the evaporation coefficient as a float between 0 and 1, e.g. 0.33 for 33%
*/
final public CoefficientBoundedRangeModel getEvaporationCoefficientModel(){
return evaporationCoefficient;
}
/**
* @return the evaporation coefficient as a float between 0 and 1, e.g. 0.33 for 33%
*/
final public float getEvaporationCoefficient(){
return evaporationCoefficient.getCoefficient();
}
protected abstract void diffuseValuesToTmpGridKernel();
protected abstract void diffusionUpdateKernel();
public void diffusion(){
if (getDiffusionCoefficient() != 0) {
diffuseValuesToTmpGridKernel();
diffusionUpdateKernel();
}
}
/**
* This is faster than calling them sequentially:
* Only one GPU kernel is called.
*
*/
public void diffusionAndEvaporation() {
if(getDiffusionCoefficient() != 0 && getEvaporationCoefficient() != 0){
diffuseValuesToTmpGridKernel();
diffusionAndEvaporationUpdateKernel();
}
else{
diffusion();
evaporation();
}
}
public abstract void diffusionAndEvaporationUpdateKernel();
public void evaporation() {
if (getEvaporationCoefficient() != 0) {
evaporationKernel();
}
}
public abstract void evaporationKernel();
/**
* helper
*
* @param x
* @param width
* @return
*/
public int normeValue(int x, int width) {
if (x < 0) // -1
return width - 1;
if (x == width)
return 0;
return x;
}
public abstract int getMaxDirection(int xcor, int ycor) ;
public abstract int getMinDirection(int i, int j);
}