public class ExpCommStrength implements ICommStrengthFunc { double m_lfCutoff; double m_lfDecay; public ExpCommStrength() { m_lfCutoff = 1.0; m_lfDecay = 1.0; } public ExpCommStrength(double lfCutoff, double lfDecay) { m_lfCutoff = lfCutoff; m_lfDecay = lfDecay; } public ExpCommStrength(ExpCommStrength src) { m_lfCutoff = src.m_lfCutoff; m_lfDecay = src.m_lfDecay; } public void setVars(double lfCutoff, double lfDecay) { m_lfCutoff = lfCutoff; m_lfDecay = lfDecay; } public double getStrength(double lfDist) { if(lfDist < m_lfCutoff) { return 1.0; } return Math.exp(m_lfDecay*(m_lfCutoff - lfDist)); } public double getGrad(double lfDist) { if(lfDist < m_lfCutoff) { return 0.0; } return -m_lfDecay*Math.exp(m_lfDecay*(m_lfCutoff - lfDist)); } public double maxStrengthRange(double lfMinD, double lfMaxD) { if(lfMinD < m_lfCutoff) { return 1.0; } return Math.exp(m_lfDecay*(m_lfCutoff - lfMinD)); } public double minStrengthRange(double lfMinD, double lfMaxD) { if(lfMaxD < m_lfCutoff) { return 1.0; } return Math.exp(m_lfDecay*(m_lfCutoff - lfMaxD)); } public boolean isMonotonic() { return true; } public double minDerivRange(double lfMin, double lfMax) { if(lfMin < m_lfCutoff) { if(lfMax < m_lfCutoff) { return 0.0; } lfMin = m_lfCutoff; } return getGrad(lfMin); } public double maxDerivRange(double lfMin, double lfMax) { if(lfMin < m_lfCutoff) { return 0.0; } return getGrad(lfMax); } public ICommStrengthFunc makeCopy() { return new ExpCommStrength(this); } }