/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.volatility.local.defaultproperties;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.InitializingBean;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.engine.function.config.AbstractFunctionConfigurationBean;
import com.opengamma.engine.function.config.FunctionConfiguration;
import com.opengamma.util.ArgumentChecker;
/**
* Function repository configuration source for the functions contained in this package.
*/
public class DefaultPropertiesFunctions extends AbstractFunctionConfigurationBean {
/**
* Currency specific data.
*/
public static class CurrencyInfo implements InitializingBean {
private String _curveConfiguration;
private String _discountingCurve;
public String getCurveConfiguration() {
return _curveConfiguration;
}
public void setCurveConfiguration(final String curveConfiguration) {
_curveConfiguration = curveConfiguration;
}
public String getDiscountingCurve() {
return _discountingCurve;
}
public void setDiscountingCurve(final String discountingCurve) {
_discountingCurve = discountingCurve;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getCurveConfiguration(), "curveConfiguration");
ArgumentChecker.notNullInjected(getDiscountingCurve(), "discountingCurve");
}
}
private final Map<String, CurrencyInfo> _perCurrencyInfo = new HashMap<String, CurrencyInfo>();
private double _theta = 0.5;
private int _nTimeSteps = 100;
private int _nSpaceSteps = 100;
private double _timeStepBunching = 5.0;
private double _spaceStepBunching = 0.05;
private double _maxProxyDelta = 1.5;
private double _centreMoneyness = 1.0;
private double _maxMoneynessScale = 3.5;
private String _spaceDirectionInterpolator = Interpolator1DFactory.DOUBLE_QUADRATIC;
public void setPerCurrencyInfo(final Map<String, CurrencyInfo> perCurrencyInfo) {
_perCurrencyInfo.clear();
_perCurrencyInfo.putAll(perCurrencyInfo);
}
public Map<String, CurrencyInfo> getPerCurrencyInfo() {
return _perCurrencyInfo;
}
public void setCurrencyInfo(final String currency, final CurrencyInfo info) {
_perCurrencyInfo.put(currency, info);
}
public CurrencyInfo getCurrencyInfo(final String currency) {
return _perCurrencyInfo.get(currency);
}
public void setTheta(final double theta) {
_theta = theta;
}
public double getTheta() {
return _theta;
}
public void setNTimeSteps(final int nTimeSteps) {
_nTimeSteps = nTimeSteps;
}
public int getNTimeSteps() {
return _nTimeSteps;
}
public void setNSpaceSteps(final int nSpaceSteps) {
_nSpaceSteps = nSpaceSteps;
}
public int getNSpaceSteps() {
return _nSpaceSteps;
}
public void setTimeStepBunching(final double timeStepBunching) {
_timeStepBunching = timeStepBunching;
}
public double getTimeStepBunching() {
return _timeStepBunching;
}
public void setSpaceStepBunching(final double spaceStepBunching) {
_spaceStepBunching = spaceStepBunching;
}
public double getSpaceStepBunching() {
return _spaceStepBunching;
}
public void setMaxProxyDelta(final double maxProxyDelta) {
_maxProxyDelta = maxProxyDelta;
}
public double getMaxProxyDelta() {
return _maxProxyDelta;
}
public void setCentreMoneyness(final double centreMoneyness) {
_centreMoneyness = centreMoneyness;
}
public double getCentreMoneyness() {
return _centreMoneyness;
}
public void setMaxMoneynessScale(final double maxMoneynessScale) {
_maxMoneynessScale = maxMoneynessScale;
}
public double getMaxMoneynessScale() {
return _maxMoneynessScale;
}
public void setSpaceDirectionInterpolator(final String spaceDirectionInterpolator) {
_spaceDirectionInterpolator = spaceDirectionInterpolator;
}
public String getSpaceDirectionInterpolator() {
return _spaceDirectionInterpolator;
}
@Override
public void afterPropertiesSet() {
ArgumentChecker.notNullInjected(getSpaceDirectionInterpolator(), "spaceDirectionInterpolator");
super.afterPropertiesSet();
}
protected void addPDECurveDefaults(final List<FunctionConfiguration> functions) {
final String[] args = new String[getPerCurrencyInfo().size() * 3];
int i = 0;
for (final Map.Entry<String, CurrencyInfo> e : getPerCurrencyInfo().entrySet()) {
args[i++] = e.getKey();
args[i++] = e.getValue().getDiscountingCurve();
args[i++] = e.getValue().getCurveConfiguration();
}
functions.add(functionConfiguration(FXPDECurveDefaults.class, args));
}
@Override
protected void addAllConfigurations(final List<FunctionConfiguration> functions) {
functions.add(functionConfiguration(ForwardPDEDefaults.class, Double.toString(getTheta()), Integer.toString(getNTimeSteps()), Integer.toString(getNSpaceSteps()),
Double.toString(getTimeStepBunching()), Double.toString(getSpaceStepBunching()), Double.toString(getMaxProxyDelta()), Double.toString(getCentreMoneyness()), getSpaceDirectionInterpolator()));
functions.add(functionConfiguration(BackwardPDEDefaults.class, Double.toString(getTheta()), Integer.toString(getNTimeSteps()), Integer.toString(getNSpaceSteps()),
Double.toString(getTimeStepBunching()), Double.toString(getSpaceStepBunching()), Double.toString(getMaxMoneynessScale()), getSpaceDirectionInterpolator()));
if (!getPerCurrencyInfo().isEmpty()) {
addPDECurveDefaults(functions);
}
}
}