Package com.opengamma.financial.analytics.fudgemsg

Source Code of com.opengamma.financial.analytics.fudgemsg.AnalyticsParameterProviderBuilders$HullWhiteOneFactorPiecewiseConstantParametersBuilder

/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fudgemsg;

import it.unimi.dsi.fastutil.doubles.DoubleArrayList;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilderFor;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import org.threeten.bp.Period;

import com.opengamma.analytics.financial.forex.method.FXMatrix;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.index.IndexON;
import com.opengamma.analytics.financial.instrument.index.IndexPrice;
import com.opengamma.analytics.financial.model.interestrate.curve.PriceIndexCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.definition.G2ppPiecewiseConstantParameters;
import com.opengamma.analytics.financial.model.interestrate.definition.HullWhiteOneFactorPiecewiseConstantParameters;
import com.opengamma.analytics.financial.provider.description.inflation.InflationProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.HullWhiteOneFactorProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.IssuerProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderForward;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.businessday.BusinessDayConventionFactory;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.daycount.DayCountFactory;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.Pair;

/**
* Contains builders for the objects that analytics needs to perform pricing.
*/
public final class AnalyticsParameterProviderBuilders {

  private AnalyticsParameterProviderBuilders() {
  }

  /**
   * Fudge builder for {@link IborIndex}
   */
  @FudgeBuilderFor(IborIndex.class)
  public static class IborIndexBuilder extends AbstractFudgeBuilder<IborIndex> {
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";
    /** Spot lag field */
    private static final String SPOT_LAG_FIELD = "spotLag";
    /** Daycount field */
    private static final String DAY_COUNT_FIELD = "dayCount";
    /** Business day convention field */
    private static final String BUSINESS_DAY_CONVENTION_FIELD = "businessDayConvention";
    /** EOM convention field */
    private static final String EOM_FIELD = "isEOM";
    /** The tenor field */
    private static final String TENOR_FIELD = "tenor";
    /** The name field */
    private static final String NAME_FIELD = "name";

    @Override
    public IborIndex buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final Currency currency = Currency.of(message.getString(CURRENCY_FIELD));
      final int spotLag = message.getInt(SPOT_LAG_FIELD);
      final DayCount dayCount = DayCountFactory.INSTANCE.getDayCount(message.getString(DAY_COUNT_FIELD));
      final BusinessDayConvention businessDayConvention = BusinessDayConventionFactory.INSTANCE.getBusinessDayConvention(message.getString(BUSINESS_DAY_CONVENTION_FIELD));
      final boolean isEOM = message.getBoolean(EOM_FIELD);
      final Period tenor = Period.parse(message.getString(TENOR_FIELD));
      final String name = message.getString(NAME_FIELD);
      return new IborIndex(currency, tenor, spotLag, dayCount, businessDayConvention, isEOM, name);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final IborIndex object) {
      message.add(SPOT_LAG_FIELD, object.getSpotLag());
      message.add(DAY_COUNT_FIELD, object.getDayCount().getConventionName());
      message.add(BUSINESS_DAY_CONVENTION_FIELD, object.getBusinessDayConvention().getConventionName());
      message.add(EOM_FIELD, object.isEndOfMonth());
      message.add(TENOR_FIELD, object.getTenor().toString());
      message.add(NAME_FIELD, object.getName());
      message.add(CURRENCY_FIELD, object.getCurrency().getCode());
    }
  }

  /**
   * Fudge builder for {@link IndexON}
   */
  @FudgeBuilderFor(IndexON.class)
  public static class IndexONBuilder extends AbstractFudgeBuilder<IndexON> {
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";
    /** Index name field */
    private static final String NAME_FIELD = "name";
    /** Daycount field */
    private static final String DAY_COUNT_FIELD = "dayCount";
    /** Publication lag field */
    private static final String PUBLICATION_LAG_FIELD = "publicationLag";

    @Override
    public IndexON buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final String name = message.getString(NAME_FIELD);
      final Currency currency = Currency.of(message.getString(CURRENCY_FIELD));
      final DayCount dayCount = DayCountFactory.INSTANCE.getDayCount(message.getString(DAY_COUNT_FIELD));
      final int publicationLag = message.getInt(PUBLICATION_LAG_FIELD);
      return new IndexON(name, currency, dayCount, publicationLag);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final IndexON object) {
      message.add(CURRENCY_FIELD, object.getCurrency().getCode());
      message.add(NAME_FIELD, object.getName());
      message.add(DAY_COUNT_FIELD, object.getDayCount().getConventionName());
      message.add(PUBLICATION_LAG_FIELD, object.getPublicationLag());
    }

  }

  /**
   * Fudge builder for {@link IndexPrice}
   */
  @FudgeBuilderFor(IndexPrice.class)
  public static class IndexPriceBuilder extends AbstractFudgeBuilder<IndexPrice> {
    /** Name field */
    private static final String NAME_FIELD = "name";
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";

    @Override
    public IndexPrice buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final String name = message.getString(NAME_FIELD);
      final Currency currency = Currency.of(message.getString(CURRENCY_FIELD));
      return new IndexPrice(name, currency);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final IndexPrice object) {
      message.add(NAME_FIELD, object.getName());
      message.add(CURRENCY_FIELD, object.getCurrency().getCode());
    }

  }

  /**
   * Fudge builder for {@link FXMatrix}
   */
  @FudgeBuilderFor(FXMatrix.class)
  public static class FXMatrixBuilder extends AbstractFudgeBuilder<FXMatrix> {
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";
    /** Order (of the entries) field */
    private static final String ORDER_FIELD = "order";
    /** Entries field */
    private static final String ENTRIES_FIELD = "entries";
    /** FX rates field */
    private static final String FX_RATES_FIELD = "fxRates";
    /** Row field */
    private static final String ROW_FIELD = "row";

    @Override
    public FXMatrix buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final List<FudgeField> currencies = message.getAllByName(CURRENCY_FIELD);
      final List<FudgeField> orders = message.getAllByName(ORDER_FIELD);
      final Map<Currency, Integer> map = new HashMap<>();
      for (int i = 0; i < currencies.size(); i++) {
        final Currency currency = Currency.of((String) currencies.get(i).getValue());
        final Integer order = ((Number) orders.get(i).getValue()).intValue();
        map.put(currency, order);
      }
      final List<FudgeField> entries = message.getAllByName(ENTRIES_FIELD);
      final List<FudgeField> arrays = message.getAllByName(FX_RATES_FIELD);
      final double[][] fxRates = new double[entries.size()][];
      for (int i = 0; i < entries.size(); i++) {
        final FudgeMsg msg = (FudgeMsg) arrays.get(i).getValue();
        final double[] row = deserializer.fieldValueToObject(double[].class, msg.getByName(ROW_FIELD));
        fxRates[i] = row;
      }
      return new FXMatrix(map, fxRates);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final FXMatrix object) {
      final Map<Currency, Integer> currencies = object.getCurrencies();
      for (final Map.Entry<Currency, Integer> entry : currencies.entrySet()) {
        message.add(CURRENCY_FIELD, entry.getKey().getCode());
        message.add(ORDER_FIELD, entry.getValue());
      }
      final double[][] rates = object.getRates();
      for (final double[] array : rates) {
        message.add(ENTRIES_FIELD, array.length);
        final MutableFudgeMsg msg = serializer.newMessage();
        serializer.addToMessageWithClassHeaders(msg, ROW_FIELD, null, array);
        message.add(FX_RATES_FIELD, msg);
      }
    }

  }

  /**
   * Fudge builder for {@link MulticurveProviderDiscount}
   */
  @FudgeBuilderFor(MulticurveProviderDiscount.class)
  public static class MulticurveProviderDiscountBuilder extends AbstractFudgeBuilder<MulticurveProviderDiscount> {
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";
    /** Discounting curves field */
    private static final String DISCOUNTING_CURVE_FIELD = "discountingCurve";
    /** Overnight indices field */
    private static final String INDEX_ON_FIELD = "indexON";
    /** Overnight curves field */
    private static final String OVERNIGHT_CURVE_FIELD = "overnightCurve";
    /** Index indices field */
    private static final String INDEX_IBOR_FIELD = "iborIndex";
    /** Ibor curves field */
    private static final String INDEX_IBOR_CURVE = "iborCurve";
    /** FX matrix field */
    private static final String FX_MATRIX_FIELD = "fxMatrix";

    @Override
    public MulticurveProviderDiscount buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final Map<Currency, YieldAndDiscountCurve> discountingCurves = new LinkedHashMap<>();
      final List<FudgeField> currencyFields = message.getAllByName(CURRENCY_FIELD);
      final List<FudgeField> discountingCurveFields = message.getAllByName(DISCOUNTING_CURVE_FIELD);
      for (int i = 0; i < currencyFields.size(); i++) {
        final Currency currency = Currency.of((String) currencyFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fudgeMsgToObject(YieldAndDiscountCurve.class, (FudgeMsg) discountingCurveFields.get(i).getValue());
        discountingCurves.put(currency, curve);
      }
      final Map<IborIndex, YieldAndDiscountCurve> forwardIborCurves = new LinkedHashMap<>();
      final List<FudgeField> indexIborFields = message.getAllByName(INDEX_IBOR_FIELD);
      final List<FudgeField> forwardIborCurveFields = message.getAllByName(INDEX_IBOR_CURVE);
      for (int i = 0; i < currencyFields.size(); i++) {
        final IborIndex index = deserializer.fudgeMsgToObject(IborIndex.class, (FudgeMsg) indexIborFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fudgeMsgToObject(YieldAndDiscountCurve.class, (FudgeMsg) forwardIborCurveFields.get(i).getValue());
        forwardIborCurves.put(index, curve);
      }
      final Map<IndexON, YieldAndDiscountCurve> forwardONCurves = new LinkedHashMap<>();
      final List<FudgeField> indexONFields = message.getAllByName(INDEX_ON_FIELD);
      final List<FudgeField> forwardONCurveFields = message.getAllByName(OVERNIGHT_CURVE_FIELD);
      for (int i = 0; i < currencyFields.size(); i++) {
        final IndexON index = deserializer.fudgeMsgToObject(IndexON.class, (FudgeMsg) indexONFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fudgeMsgToObject(YieldAndDiscountCurve.class, (FudgeMsg) forwardONCurveFields.get(i).getValue());
        forwardONCurves.put(index, curve);
      }
      final FXMatrix fxMatrix = deserializer.fieldValueToObject(FXMatrix.class, message.getByName(FX_MATRIX_FIELD));
      return new MulticurveProviderDiscount(discountingCurves, forwardIborCurves, forwardONCurves, fxMatrix);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MulticurveProviderDiscount object) {
      final Map<Currency, YieldAndDiscountCurve> discountingCurves = object.getDiscountingCurves();
      for (final Map.Entry<Currency, YieldAndDiscountCurve> entry : discountingCurves.entrySet()) {
        message.add(CURRENCY_FIELD, entry.getKey().getCode());
        serializer.addToMessageWithClassHeaders(message, DISCOUNTING_CURVE_FIELD, null, entry.getValue());
      }
      final Map<IborIndex, YieldAndDiscountCurve> forwardIborCurves = object.getForwardIborCurves();
      for (final Map.Entry<IborIndex, YieldAndDiscountCurve> entry : forwardIborCurves.entrySet()) {
        serializer.addToMessageWithClassHeaders(message, INDEX_IBOR_FIELD, null, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, INDEX_IBOR_CURVE, null, entry.getValue());
      }
      final Map<IndexON, YieldAndDiscountCurve> forwardONCurves = object.getForwardONCurves();
      for (final Map.Entry<IndexON, YieldAndDiscountCurve> entry : forwardONCurves.entrySet()) {
        serializer.addToMessageWithClassHeaders(message, INDEX_ON_FIELD, null, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, OVERNIGHT_CURVE_FIELD, null, entry.getValue());
      }
      serializer.addToMessageWithClassHeaders(message, FX_MATRIX_FIELD, null, object.getFxRates());
    }

  }

  /**
   * Fudge builder for {@link MulticurveProviderForward}
   */
  @FudgeBuilderFor(MulticurveProviderForward.class)
  public static class MulticurveProviderForwardBuilder extends AbstractFudgeBuilder<MulticurveProviderForward> {
    /** Currencies field */
    private static final String CURRENCY_FIELD = "currency";
    /** Discounting curves field */
    private static final String DISCOUNTING_CURVE_FIELD = "discountingCurve";
    /** Overnight indices field */
    private static final String INDEX_ON_FIELD = "indexON";
    /** Overnight curves field */
    private static final String FORWARD_OVERNIGHT_CURVE_FIELD = "forwardOvernightCurve";
    /** Index indices field */
    private static final String INDEX_IBOR_FIELD = "iborIndex";
    /** Ibor curves field */
    private static final String FORWARD_IBOR_CURVE_FIELD = "forwardIborCurve";
    /** FX matrix field */
    private static final String FX_MATRIX_FIELD = "fxMatrix";

    @Override
    public MulticurveProviderForward buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final Map<Currency, YieldAndDiscountCurve> discountingCurves = new LinkedHashMap<>();
      final List<FudgeField> currencyFields = message.getAllByName(CURRENCY_FIELD);
      final List<FudgeField> discountingCurveFields = message.getAllByName(DISCOUNTING_CURVE_FIELD);
      for (int i = 0; i < currencyFields.size(); i++) {
        final Currency currency = Currency.of((String) currencyFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fudgeMsgToObject(YieldAndDiscountCurve.class, (FudgeMsg) discountingCurveFields.get(i).getValue());
        discountingCurves.put(currency, curve);
      }
      final Map<IborIndex, DoublesCurve> forwardIborCurves = new LinkedHashMap<>();
      final List<FudgeField> indexIborFields = message.getAllByName(INDEX_IBOR_FIELD);
      final List<FudgeField> forwardIborCurveFields = message.getAllByName(FORWARD_IBOR_CURVE_FIELD);
      for (int i = 0; i < currencyFields.size(); i++) {
        final IborIndex index = deserializer.fudgeMsgToObject(IborIndex.class, (FudgeMsg) indexIborFields.get(i).getValue());
        final DoublesCurve curve = deserializer.fudgeMsgToObject(DoublesCurve.class, (FudgeMsg) forwardIborCurveFields.get(i).getValue());
        forwardIborCurves.put(index, curve);
      }
      final Map<IndexON, YieldAndDiscountCurve> forwardONCurves = new LinkedHashMap<>();
      final List<FudgeField> indexONFields = message.getAllByName(INDEX_ON_FIELD);
      final List<FudgeField> forwardONCurveFields = message.getAllByName(FORWARD_OVERNIGHT_CURVE_FIELD);
      for (int i = 0; i < currencyFields.size(); i++) {
        final IndexON index = deserializer.fudgeMsgToObject(IndexON.class, (FudgeMsg) indexONFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fudgeMsgToObject(YieldAndDiscountCurve.class, (FudgeMsg) forwardONCurveFields.get(i).getValue());
        forwardONCurves.put(index, curve);
      }
      final FXMatrix fxMatrix = deserializer.fieldValueToObject(FXMatrix.class, message.getByName(FX_MATRIX_FIELD));
      return new MulticurveProviderForward(discountingCurves, forwardIborCurves, forwardONCurves, fxMatrix);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MulticurveProviderForward object) {
      final Map<Currency, YieldAndDiscountCurve> discountingCurves = object.getDiscountingCurves();
      for (final Map.Entry<Currency, YieldAndDiscountCurve> entry : discountingCurves.entrySet()) {
        message.add(CURRENCY_FIELD, entry.getKey().getCode());
        serializer.addToMessageWithClassHeaders(message, DISCOUNTING_CURVE_FIELD, null, entry.getValue());
      }
      final Map<IborIndex, DoublesCurve> forwardIborCurves = object.getForwardIborCurves();
      for (final Map.Entry<IborIndex, DoublesCurve> entry : forwardIborCurves.entrySet()) {
        serializer.addToMessageWithClassHeaders(message, INDEX_IBOR_FIELD, null, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, FORWARD_IBOR_CURVE_FIELD, null, entry.getValue());
      }
      final Map<IndexON, YieldAndDiscountCurve> forwardONCurves = object.getForwardONCurves();
      for (final Map.Entry<IndexON, YieldAndDiscountCurve> entry : forwardONCurves.entrySet()) {
        serializer.addToMessageWithClassHeaders(message, INDEX_ON_FIELD, null, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, FORWARD_OVERNIGHT_CURVE_FIELD, null, entry.getValue());
      }
      serializer.addToMessageWithClassHeaders(message, FX_MATRIX_FIELD, null, object.getFxRates());
    }

  }

  /**
   * Fudge builder for {@link InflationProviderDiscount}
   */
  @FudgeBuilderFor(InflationProviderDiscount.class)
  public static class InflationProviderDiscountBuilder extends AbstractFudgeBuilder<InflationProviderDiscount> {
    /** The multi-curve provider */
    private static final String YIELD_CURVES_FIELD = "yieldCurves";
    /** Price index field */
    private static final String PRICE_INDEX_FIELD = "priceIndex";
    /** Price index curve field */
    private static final String PRICE_INDEX_CURVE_FIELD = "priceIndexCurve";

    @Override
    public InflationProviderDiscount buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final MulticurveProviderDiscount yieldCurves = deserializer.fieldValueToObject(MulticurveProviderDiscount.class, message.getByName(YIELD_CURVES_FIELD));
      final List<FudgeField> indexFields = message.getAllByName(PRICE_INDEX_FIELD);
      final List<FudgeField> indexCurveFields = message.getAllByName(PRICE_INDEX_CURVE_FIELD);
      final Map<IndexPrice, PriceIndexCurve> priceIndexCurves = new LinkedHashMap<>();
      final int n = indexFields.size();
      for (int i = 0; i < n; i++) {
        final IndexPrice index = deserializer.fudgeMsgToObject(IndexPrice.class, (FudgeMsg) indexFields.get(i).getValue());
        final PriceIndexCurve curve = deserializer.fudgeMsgToObject(PriceIndexCurve.class, (FudgeMsg) indexCurveFields.get(i).getValue());
        priceIndexCurves.put(index, curve);
      }
      return new InflationProviderDiscount(yieldCurves, priceIndexCurves);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final InflationProviderDiscount object) {
      serializer.addToMessageWithClassHeaders(message, YIELD_CURVES_FIELD, null, object.getMulticurveProvider());
      final Map<IndexPrice, PriceIndexCurve> priceIndexCurves = object.getPriceIndexCurves();
      for (final Map.Entry<IndexPrice, PriceIndexCurve> entry : priceIndexCurves.entrySet()) {
        serializer.addToMessageWithClassHeaders(message, PRICE_INDEX_FIELD, null, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, PRICE_INDEX_CURVE_FIELD, null, entry.getValue());
      }
    }

  }

  /**
   * Fudge builder for {@link IssuerProviderDiscount}
   */
  @FudgeBuilderFor(IssuerProviderDiscount.class)
  public static class IssuerProviderDiscountBuilder extends AbstractFudgeBuilder<IssuerProviderDiscount> {
    /** The curve provider field */
    private static final String CURVE_PROVIDER_FIELD = "curveProvider";
    /** The issuer curve names field */
    private static final String ISSUER_CURVE_NAMES_FIELD = "issuerName";
    /** The issuer currencies field */
    private static final String ISSUER_CURRENCIES_FIELD = "issuerCurrency";
    /** The issuer yield curves field */
    private static final String ISSUER_CURVES_FIELD = "issuerCurve";

    @Override
    public IssuerProviderDiscount buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final MulticurveProviderDiscount multicurves = deserializer.fieldValueToObject(MulticurveProviderDiscount.class, message.getByName(CURVE_PROVIDER_FIELD));
      final List<FudgeField> issuerNameFields = message.getAllByName(ISSUER_CURVE_NAMES_FIELD);
      final List<FudgeField> issuerCurrencyFields = message.getAllByName(ISSUER_CURRENCIES_FIELD);
      final List<FudgeField> issuerCurveFields = message.getAllByName(ISSUER_CURVES_FIELD);
      final Map<Pair<String, Currency>, YieldAndDiscountCurve> issuerCurves = new HashMap<>();
      for (int i = 0; i < issuerNameFields.size(); i++) {
        final String issuerName = (String) issuerNameFields.get(i).getValue();
        final Currency issuerCurrency = Currency.of((String) issuerCurrencyFields.get(i).getValue());
        final YieldAndDiscountCurve curve = deserializer.fieldValueToObject(YieldAndDiscountCurve.class, issuerCurveFields.get(i));
        issuerCurves.put(Pair.of(issuerName, issuerCurrency), curve);
      }
      return new IssuerProviderDiscount(multicurves, issuerCurves);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final IssuerProviderDiscount object) {
      serializer.addToMessageWithClassHeaders(message, CURVE_PROVIDER_FIELD, null, object.getMulticurveProvider());
      for (final Map.Entry<Pair<String, Currency>, YieldAndDiscountCurve> entry : object.getIssuerCurves().entrySet()) {
        message.add(ISSUER_CURVE_NAMES_FIELD, entry.getKey().getFirst());
        message.add(ISSUER_CURRENCIES_FIELD, entry.getKey().getSecond().getCode());
        serializer.addToMessageWithClassHeaders(message, ISSUER_CURVES_FIELD, null, entry.getValue());
      }
    }

  }

  /**
   * Fudge builder for {@link HullWhiteOneFactorProviderDiscount}
   */
  @FudgeBuilderFor(HullWhiteOneFactorProviderDiscount.class)
  public static class HullWhiteOneFactorProviderDiscountBuilder extends AbstractFudgeBuilder<HullWhiteOneFactorProviderDiscount> {
    /** The curve provider field */
    private static final String CURVE_PROVIDER_FIELD = "curveProvider";
    /** The Hull-White parameters field */
    private static final String HULL_WHITE_PARAMETERS_FIELD = "hullWhiteParameters";
    /** The currency field */
    private static final String CURRENCY_FIELD = "currency";

    @Override
    public HullWhiteOneFactorProviderDiscount buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final MulticurveProviderDiscount multicurves = deserializer.fieldValueToObject(MulticurveProviderDiscount.class, message.getByName(CURVE_PROVIDER_FIELD));
      final HullWhiteOneFactorPiecewiseConstantParameters parameters = deserializer.fieldValueToObject(HullWhiteOneFactorPiecewiseConstantParameters.class,
          message.getByName(HULL_WHITE_PARAMETERS_FIELD));
      final Currency currency = Currency.of(message.getString(CURRENCY_FIELD));
      return new HullWhiteOneFactorProviderDiscount(multicurves, parameters, currency);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final HullWhiteOneFactorProviderDiscount object) {
      serializer.addToMessageWithClassHeaders(message, CURVE_PROVIDER_FIELD, null, object.getMulticurveProvider());
      serializer.addToMessageWithClassHeaders(message, HULL_WHITE_PARAMETERS_FIELD, null, object.getHullWhiteParameters());
      message.add(CURRENCY_FIELD, object.getHullWhiteCurrency().getCode());
    }

  }

  /**
   * Fudge builder for {@link HullWhiteOneFactorPiecewiseConstantParameters}
   */
  @FudgeBuilderFor(HullWhiteOneFactorPiecewiseConstantParameters.class)
  public static class HullWhiteOneFactorPiecewiseConstantParametersBuilder extends AbstractFudgeBuilder<HullWhiteOneFactorPiecewiseConstantParameters> {
    /** The mean reversion field */
    private static final String MEAN_REVERSION_FIELD = "meanReversion";
    /** The volatility field */
    private static final String VOLATILITY_FIELD = "volatility";
    /** The time field */
    private static final String TIME_FIELD = "time";

    @Override
    public HullWhiteOneFactorPiecewiseConstantParameters buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final double meanReversion = message.getDouble(MEAN_REVERSION_FIELD);
      final List<FudgeField> volatilityFields = message.getAllByName(VOLATILITY_FIELD);
      int n = volatilityFields.size();
      final double[] volatilities = new double[n];
      for (int i = 0; i < n; i++) {
        volatilities[i] = (Double) volatilityFields.get(i).getValue();
      }
      final List<FudgeField> timeFields = message.getAllByName(TIME_FIELD);
      n = timeFields.size();
      final double[] times = new double[n];
      for (int i = 0; i < n; i++) {
        times[i] = (Double) timeFields.get(i).getValue();
      }
      return new HullWhiteOneFactorPiecewiseConstantParameters(meanReversion, volatilities, times);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final HullWhiteOneFactorPiecewiseConstantParameters object) {
      message.add(MEAN_REVERSION_FIELD, object.getMeanReversion());
      final double[] volatility = object.getVolatility();
      final double[] volatilityTime = object.getVolatilityTime();
      for (int i = 0; i < volatility.length; i++) {
        message.add(VOLATILITY_FIELD, volatility[i]);
        message.add(TIME_FIELD, volatilityTime[i + 1]); //values are added to the time array in the constructor
      }
    }

  }

  /**
   * Fudge builder for {@link G2ppPiecewiseConstantParameters}
   */
  @FudgeBuilderFor(G2ppPiecewiseConstantParameters.class)
  public static class G2ppPiecewiseConstantParametersBuilder extends AbstractFudgeBuilder<G2ppPiecewiseConstantParameters> {
    /** The mean reversion fields */
    private static final String MEAN_REVERSION_FIELD = "meanReversion";
    /** The volatility fields */
    private static final String VOLATILITIES_FIELD = "volatilities";
    /** The time fields */
    private static final String TIME_FIELD = "times";
    /** The correlation field */
    private static final String CORRELATION_FIELD = "correlation";

    @Override
    public G2ppPiecewiseConstantParameters buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final List<FudgeField> meanReversionFields = message.getAllByName(MEAN_REVERSION_FIELD);
      int n = meanReversionFields.size();
      final double[] meanReversion = new double[n];
      for (int i = 0; i < n; i++) {
        meanReversion[i] = (Double) meanReversionFields.get(i).getValue();
      }
      final List<FudgeField> volatilityFields = message.getAllByName(VOLATILITIES_FIELD);
      n = volatilityFields.size();
      final double[][] volatilities = new double[n][];
      for (int i = 0; i < n; i++) {
        volatilities[i] = deserializer.fieldValueToObject(double[].class, volatilityFields.get(i));
      }
      final List<FudgeField> timeFields = message.getAllByName(TIME_FIELD);
      n = timeFields.size();
      final double[] times = new double[n];
      for (int i = 0; i < n; i++) {
        times[i] = (Double) timeFields.get(i).getValue();
      }
      final double correlation = message.getDouble(CORRELATION_FIELD);
      return new G2ppPiecewiseConstantParameters(meanReversion, volatilities, times, correlation);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final G2ppPiecewiseConstantParameters object) {
      final double[] meanReversion = object.getMeanReversion();
      for (final double element : meanReversion) {
        message.add(MEAN_REVERSION_FIELD, element);
      }
      final DoubleArrayList[] volatility = object.getVolatility();
      for (final DoubleArrayList element : volatility) {
        serializer.addToMessage(message, VOLATILITIES_FIELD, null, element.toDoubleArray());
      }
      final double[] volatilityTime = object.getVolatilityTime();
      for (int i = 0; i < volatilityTime.length - 2; i++) {
        message.add(TIME_FIELD, volatilityTime[i + 1]); //values added to front and back of times array on construction
      }
      message.add(CORRELATION_FIELD, object.getCorrelation());
    }

  }
}
TOP

Related Classes of com.opengamma.financial.analytics.fudgemsg.AnalyticsParameterProviderBuilders$HullWhiteOneFactorPiecewiseConstantParametersBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.