/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.description.inflation;
import java.util.List;
import java.util.Set;
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.legalentity.LegalEntity;
import com.opengamma.analytics.financial.legalentity.LegalEntityFilter;
import com.opengamma.analytics.financial.provider.description.interestrate.IssuerProviderInterface;
import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderInterface;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.DoublesPair;
import com.opengamma.util.tuple.Pair;
/**
* Class describing a issuer provider created from a issuer provider where the discounting curve for one issuer is
* shifted (decorated) by a a parallel spread (in the zero-coupon continuously compounded rate).
*/
public class InflationIssuerProviderIssuerDecoratedSpread implements InflationIssuerProviderInterface {
/**
* The underlying issuer provider on which the multi-curves provider is based.
*/
private final InflationIssuerProviderInterface _inflationIssuerProvider;
/**
* The issuer/currency pair to be shifted.
*/
private final LegalEntity _issuer;
/**
* The spread (shift).
*/
private final double _spread;
/**
* Constructor.
* @param inflationIssuerProvider The underlying inflation issuer provider on which the multi-curves provider is based, not null
* @param issuer The issuer, not null
* @param spread The spread
*/
public InflationIssuerProviderIssuerDecoratedSpread(final InflationIssuerProviderInterface inflationIssuerProvider, final LegalEntity issuer, final double spread) {
ArgumentChecker.notNull(inflationIssuerProvider, "inflationIssuerProvider");
ArgumentChecker.notNull(issuer, "issuer");
_inflationIssuerProvider = inflationIssuerProvider;
_issuer = issuer;
_spread = spread;
}
@Override
public MulticurveProviderInterface getMulticurveProvider() {
return _inflationIssuerProvider.getMulticurveProvider();
}
@Override
public IssuerProviderInterface getIssuerProvider() {
return this.getIssuerProvider();
}
@Override
public InflationIssuerProviderInterface copy() {
throw new UnsupportedOperationException("Copy not supported for decorated providers");
}
@Override
public double getDiscountFactor(final LegalEntity issuer, final Double time) {
final double df = _inflationIssuerProvider.getDiscountFactor(issuer, time);
if (issuer.equals(_issuer)) {
return df * Math.exp(-time * _spread);
}
return df;
}
@Override
public Set<String> getAllNames() {
return _inflationIssuerProvider.getAllNames();
}
@Override
public double[] parameterSensitivity(final String name, final List<DoublesPair> pointSensitivity) {
throw new UnsupportedOperationException("parameterSensitivity not supported for decorated providers");
}
@Override
public double[] parameterForwardSensitivity(final String name, final List<ForwardSensitivity> pointSensitivity) {
return _inflationIssuerProvider.parameterForwardSensitivity(name, pointSensitivity);
}
@Override
public Integer getNumberOfParameters(final String name) {
return _inflationIssuerProvider.getNumberOfParameters(name);
}
@Override
public List<String> getUnderlyingCurvesNames(final String name) {
return _inflationIssuerProvider.getUnderlyingCurvesNames(name);
}
@Override
public Set<Pair<Object, LegalEntityFilter<LegalEntity>>> getIssuers() {
return _inflationIssuerProvider.getIssuers();
}
@Override
public Set<String> getAllCurveNames() {
return _inflationIssuerProvider.getAllCurveNames();
}
@Override
public double[] parameterInflationSensitivity(final String name, final List<DoublesPair> pointSensitivity) {
return _inflationIssuerProvider.parameterInflationSensitivity(name, pointSensitivity);
}
@Override
public double getPriceIndex(final IndexPrice index, final Double time) {
return _inflationIssuerProvider.getPriceIndex(index, time);
}
@Override
public String getName(final IndexPrice index) {
return _inflationIssuerProvider.getName(index);
}
@Override
public Set<IndexPrice> getPriceIndexes() {
return _inflationIssuerProvider.getPriceIndexes();
}
@Override
public double getDiscountFactor(final Pair<Object, LegalEntityFilter<LegalEntity>> issuerCcy, final Double time) {
return _inflationIssuerProvider.getDiscountFactor(issuerCcy, time);
}
@Override
public InflationProviderInterface getInflationProvider() {
return _inflationIssuerProvider.getInflationProvider();
}
@Override
public double getDiscountFactor(final Currency ccy, final Double time) {
return _inflationIssuerProvider.getDiscountFactor(ccy, time);
}
@Override
public double getForwardRate(final IborIndex index, final double startTime, final double endTime, final double accrualFactor) {
return _inflationIssuerProvider.getForwardRate(index, startTime, endTime, accrualFactor);
}
@Override
public double getForwardRate(final IndexON index, final double startTime, final double endTime, final double accrualFactor) {
return _inflationIssuerProvider.getForwardRate(index, startTime, endTime, accrualFactor);
}
@Override
public double getFxRate(final Currency ccy1, final Currency ccy2) {
return _inflationIssuerProvider.getFxRate(ccy1, ccy2);
}
@Override
public String getName(final Currency ccy) {
return _inflationIssuerProvider.getName(ccy);
}
@Override
public Set<Currency> getCurrencies() {
return _inflationIssuerProvider.getCurrencies();
}
@Override
public String getName(final IborIndex index) {
return _inflationIssuerProvider.getName(index);
}
@Override
public Set<IborIndex> getIndexesIbor() {
return _inflationIssuerProvider.getIndexesIbor();
}
@Override
public String getName(final IndexON index) {
return _inflationIssuerProvider.getName(index);
}
@Override
public Set<IndexON> getIndexesON() {
return _inflationIssuerProvider.getIndexesON();
}
@Override
public FXMatrix getFxRates() {
return _inflationIssuerProvider.getFxRates();
}
@Override
public InflationProviderInterface withDiscountFactor(final Currency ccy, final Pair<Object, LegalEntityFilter<LegalEntity>> replacement) {
return _inflationIssuerProvider.withDiscountFactor(ccy, replacement);
}
@Override
public InflationProviderInterface withDiscountFactor(final Currency ccy, final LegalEntity replacement) {
return _inflationIssuerProvider.withDiscountFactor(ccy, replacement);
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((_inflationIssuerProvider == null) ? 0 : _inflationIssuerProvider.hashCode());
result = prime * result + ((_issuer == null) ? 0 : _issuer.hashCode());
long temp;
temp = Double.doubleToLongBits(_spread);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final InflationIssuerProviderIssuerDecoratedSpread other = (InflationIssuerProviderIssuerDecoratedSpread) obj;
if (_inflationIssuerProvider == null) {
if (other._inflationIssuerProvider != null) {
return false;
}
} else if (!_inflationIssuerProvider.equals(other._inflationIssuerProvider)) {
return false;
}
if (_issuer == null) {
if (other._issuer != null) {
return false;
}
} else if (!_issuer.equals(other._issuer)) {
return false;
}
if (Double.doubleToLongBits(_spread) != Double.doubleToLongBits(other._spread)) {
return false;
}
return true;
}
}