public class SigmoidStrengthFun implements ICommStrengthFunc { double m_lfWeight; double m_lfRad; public SigmoidStrengthFun() { } public SigmoidStrengthFun(double lfRad, double lfWeight) { m_lfWeight = lfWeight; m_lfRad = lfRad; } public SigmoidStrengthFun(SigmoidStrengthFun src) { m_lfWeight = src.m_lfWeight; m_lfRad = src.m_lfRad; } public double getGrad(double lfDist) { double lfExpVal = Math.exp(m_lfWeight*(lfDist-m_lfRad)); double lfTmp = (1.0+lfExpVal); return -m_lfWeight*lfExpVal/(lfTmp*lfTmp); } public double getStrength(double lfDist) { return 1.0/(1.0+Math.exp(m_lfWeight*(lfDist-m_lfRad))); } public boolean isMonotonic() { return true; } public ICommStrengthFunc makeCopy() { return new SigmoidStrengthFun(this); } public double maxDerivRange(double lfMin, double lfMax) { if(lfMin < 0.0) { lfMin = 0.0; } if(lfMax < 0.0) { lfMax = 0.0; } if(lfMin < m_lfRad && lfMax > m_lfRad) { return getGrad(m_lfRad); } if(Math.abs(lfMin-m_lfRad) > Math.abs(lfMax - m_lfRad)) { return getGrad(lfMax); } return getGrad(lfMin); } public double maxStrengthRange(double lfMinD, double lfMaxD) { if(lfMinD > 0.0) { return getStrength(lfMinD); } return getStrength(0.0); } public double minDerivRange(double lfMin, double lfMax) { if(lfMin < 0.0) { lfMin = 0.0; } if(lfMax < 0.0) { lfMax = 0.0; } if(Math.abs(lfMin-m_lfRad) < Math.abs(lfMax - m_lfRad)) { return getGrad(lfMax); } return getGrad(lfMin); } public double minStrengthRange(double lfMinD, double lfMaxD) { if(lfMaxD > 0.0) { return getStrength(lfMaxD); } return getStrength(0.0); } }