/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fudgemsg;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilderFor;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.model.interestrate.curve.ForwardCurve;
import com.opengamma.analytics.financial.model.volatility.local.LocalVolatilitySurfaceMoneyness;
import com.opengamma.analytics.financial.model.volatility.smile.fitting.sabr.SmileSurfaceDataBundle;
import com.opengamma.analytics.financial.model.volatility.surface.BlackVolatilitySurfaceMoneyness;
import com.opengamma.analytics.financial.model.volatility.surface.BlackVolatilitySurfaceMoneynessFcnBackedByGrid;
import com.opengamma.analytics.financial.model.volatility.surface.PureImpliedVolatilitySurface;
import com.opengamma.analytics.financial.model.volatility.surface.VolatilitySurface;
import com.opengamma.analytics.financial.model.volatility.surface.VolatilitySurfaceInterpolator;
import com.opengamma.analytics.math.surface.Surface;
/**
* Holds Fudge builders for the volatility surface model.
*/
/* package */final class ModelVolatilitySurface {
/**
* Restricted constructor.
*/
private ModelVolatilitySurface() {
}
//-------------------------------------------------------------------------
/**
* Fudge builder for {@code VolatilitySurface}.
*/
@FudgeBuilderFor(VolatilitySurface.class)
public static final class VolatilitySurfaceBuilder extends AbstractFudgeBuilder<VolatilitySurface> {
private static final String SURFACE_FIELD_NAME = "sigma";
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final VolatilitySurface object) {
serializer.addToMessageWithClassHeaders(message, SURFACE_FIELD_NAME, null, substituteObject(object.getSurface()));
}
@SuppressWarnings("unchecked")
@Override
public VolatilitySurface buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Object surface = deserializer.fieldValueToObject(message.getByName(SURFACE_FIELD_NAME));
return new VolatilitySurface((Surface<Double, Double, Double>) surface);
}
}
@FudgeBuilderFor(BlackVolatilitySurfaceMoneyness.class)
public static final class BlackVolatilitySurfaceMoneynessBuilder extends AbstractFudgeBuilder<BlackVolatilitySurfaceMoneyness> {
private static final String SURFACE_FIELD_NAME = "volatility";
private static final String FORWARD_CURVE_FIELD_NAME = "forwardCurve";
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final BlackVolatilitySurfaceMoneyness object) {
serializer.addToMessageWithClassHeaders(message, SURFACE_FIELD_NAME, null, substituteObject(object.getSurface()));
serializer.addToMessageWithClassHeaders(message, FORWARD_CURVE_FIELD_NAME, null, substituteObject(object.getForwardCurve()));
}
@SuppressWarnings("unchecked")
@Override
public BlackVolatilitySurfaceMoneyness buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Object surface = deserializer.fieldValueToObject(message.getByName(SURFACE_FIELD_NAME));
final Object forwardCurve = deserializer.fieldValueToObject(message.getByName(FORWARD_CURVE_FIELD_NAME));
if (surface instanceof Surface) {
return new BlackVolatilitySurfaceMoneyness((Surface<Double, Double, Double>) surface, (ForwardCurve) forwardCurve);
}
throw new OpenGammaRuntimeException("Expected Surface, got " + surface);
}
}
@FudgeBuilderFor(BlackVolatilitySurfaceMoneynessFcnBackedByGrid.class)
public static final class BlackVolatilitySurfaceMoneynessWithGridBuilder extends AbstractFudgeBuilder<BlackVolatilitySurfaceMoneynessFcnBackedByGrid> {
private static final String SURFACE_FIELD_NAME = "volatility";
private static final String FORWARD_CURVE_FIELD_NAME = "forwardCurve";
private static final String GRID_FIELD_NAME = "gridData";
private static final String INTERPOLATOR_FIELD_NAME = "interpolator";
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final BlackVolatilitySurfaceMoneynessFcnBackedByGrid object) {
serializer.addToMessageWithClassHeaders(message, SURFACE_FIELD_NAME, null, substituteObject(object.getSurface()));
serializer.addToMessageWithClassHeaders(message, FORWARD_CURVE_FIELD_NAME, null, substituteObject(object.getForwardCurve()));
serializer.addToMessageWithClassHeaders(message, GRID_FIELD_NAME, null, object.getGridData(), SmileSurfaceDataBundle.class);
serializer.addToMessageWithClassHeaders(message, INTERPOLATOR_FIELD_NAME, null, object.getInterpolator(), VolatilitySurfaceInterpolator.class);
}
@SuppressWarnings("unchecked")
@Override
public BlackVolatilitySurfaceMoneynessFcnBackedByGrid buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Object surface = deserializer.fieldValueToObject(message.getByName(SURFACE_FIELD_NAME));
final Object forwardCurve = deserializer.fieldValueToObject(message.getByName(FORWARD_CURVE_FIELD_NAME));
final SmileSurfaceDataBundle grid = deserializer.fieldValueToObject(SmileSurfaceDataBundle.class, message.getByName(GRID_FIELD_NAME));
final VolatilitySurfaceInterpolator interpolator = deserializer.fieldValueToObject(VolatilitySurfaceInterpolator.class, message.getByName(INTERPOLATOR_FIELD_NAME));
if (surface instanceof Surface) {
return new BlackVolatilitySurfaceMoneynessFcnBackedByGrid((Surface<Double, Double, Double>) surface, (ForwardCurve) forwardCurve, grid, interpolator);
}
throw new OpenGammaRuntimeException("Expected Surface, got " + surface);
}
}
@FudgeBuilderFor(LocalVolatilitySurfaceMoneyness.class)
public static final class LocalVolatilitySurfaceMoneynessBuilder extends AbstractFudgeBuilder<LocalVolatilitySurfaceMoneyness> {
private static final String SURFACE_FIELD_NAME = "volatility";
private static final String FORWARD_CURVE_FIELD_NAME = "forwardCurve";
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final LocalVolatilitySurfaceMoneyness object) {
serializer.addToMessageWithClassHeaders(message, SURFACE_FIELD_NAME, null, substituteObject(object.getSurface()));
serializer.addToMessageWithClassHeaders(message, FORWARD_CURVE_FIELD_NAME, null, object.getForwardCurve(), ForwardCurve.class);
}
@SuppressWarnings("unchecked")
@Override
public LocalVolatilitySurfaceMoneyness buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Object surface = deserializer.fieldValueToObject(message.getByName(SURFACE_FIELD_NAME));
final ForwardCurve forwardCurve = deserializer.fieldValueToObject(ForwardCurve.class, message.getByName(FORWARD_CURVE_FIELD_NAME));
if (surface instanceof Surface) {
return new LocalVolatilitySurfaceMoneyness((Surface<Double, Double, Double>) surface, forwardCurve);
}
throw new OpenGammaRuntimeException("Expected Surface, got " + surface);
}
}
/**
* Fudge builder for {@code PureImpliedVolatilitySurface}
*/
@FudgeBuilderFor(PureImpliedVolatilitySurface.class)
public static final class PureImpliedVolatilitySurfaceBuilder extends AbstractFudgeBuilder<PureImpliedVolatilitySurface> {
private static final String SURFACE_FIELD_NAME = "surface";
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final PureImpliedVolatilitySurface object) {
serializer.addToMessageWithClassHeaders(message, SURFACE_FIELD_NAME, null, substituteObject(object.getSurface()));
}
@SuppressWarnings("unchecked")
@Override
public PureImpliedVolatilitySurface buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Object surface = deserializer.fieldValueToObject(message.getByName(SURFACE_FIELD_NAME));
return new PureImpliedVolatilitySurface((Surface<Double, Double, Double>) surface);
}
}
}