/** * Merges a Hull-White curve provider and an FX matrix. * * @param provider The provider, not null * @param matrix The FX matrix, not null * @return The merged provider */ public static HullWhiteOneFactorProviderDiscount mergeHullWhiteProviders( final HullWhiteOneFactorProviderDiscount provider, final FXMatrix matrix) { ArgumentChecker.notNull(provider, "provider"); ArgumentChecker.notNull(matrix, "matrix"); final HullWhiteOneFactorProviderDiscount result = provider.copy(); final Collection<Currency> currencies = matrix.getCurrencies().keySet(); final Iterator<Currency> iterator = currencies.iterator(); if (currencies.size() > 0) { final Currency initialCurrency = iterator.next(); while (iterator.hasNext()) { final Currency otherCurrency = iterator.next(); result .getMulticurveProvider() .getFxRates() .addCurrency( initialCurrency, otherCurrency, matrix.getFxRate(initialCurrency, otherCurrency)); } } return result; }
/** * Merges Hull-White one-factor providers. * * @param providers The providers to merge, not null or empty * @return The merged providers */ public static HullWhiteOneFactorProviderDiscount mergeHullWhiteProviders( final Collection<HullWhiteOneFactorProviderDiscount> providers) { ArgumentChecker.notNull(providers, "providers"); ArgumentChecker.notEmpty(providers, "providers"); final Iterator<HullWhiteOneFactorProviderDiscount> iter = providers.iterator(); final HullWhiteOneFactorProviderDiscount result = iter.next().copy(); while (iter.hasNext()) { final HullWhiteOneFactorProviderDiscount provider = iter.next().copy(); final MulticurveProviderDiscount underlying = provider.getMulticurveProvider().copy(); for (final Map.Entry<Currency, YieldAndDiscountCurve> entry : underlying.getDiscountingCurves().entrySet()) { result.setCurve(entry.getKey(), entry.getValue()); } for (final Map.Entry<IborIndex, YieldAndDiscountCurve> entry : underlying.getForwardIborCurves().entrySet()) { result.setCurve(entry.getKey(), entry.getValue()); } for (final Map.Entry<IndexON, YieldAndDiscountCurve> entry : underlying.getForwardONCurves().entrySet()) { result.setCurve(entry.getKey(), entry.getValue()); } final FXMatrix matrix = underlying.getFxRates(); final Collection<Currency> currencies = matrix.getCurrencies().keySet(); final Iterator<Currency> iterator = currencies.iterator(); if (currencies.size() > 0) { final Currency initialCurrency = iterator.next(); while (iterator.hasNext()) { final Currency otherCurrency = iterator.next(); underlying .getFxRates() .addCurrency( initialCurrency, otherCurrency, matrix.getFxRate(initialCurrency, otherCurrency)); } } // TODO actually merge. } return result; }