/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.interestrate.definition; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.Validate; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.model.volatility.curve.VolatilityCurve; import com.opengamma.util.ArgumentChecker; /** * */ public class HullWhiteTwoFactorDataBundle extends StandardDiscountBondModelDataBundle { private final double _reversionSpeed1; private final double _reversionSpeed2; private final double _meanReversionLevel; private final YieldAndDiscountCurve _forwardRateCurve; private final VolatilityCurve _volatilityCurve2; private final double _correlation; public HullWhiteTwoFactorDataBundle(final YieldAndDiscountCurve shortRateCurve, final VolatilityCurve volatilityCurve1, final VolatilityCurve volatilityCurve2, final ZonedDateTime date, final double reversionSpeed1, final double reversionSpeed2, final double meanReversionLevel, final YieldAndDiscountCurve forwardRateCurve, final double correlation) { super(shortRateCurve, volatilityCurve1, date); Validate.notNull(volatilityCurve2, "second volatility curve"); Validate.notNull(forwardRateCurve, "forward rate curve"); if (!ArgumentChecker.isInRangeInclusive(-1, 1, correlation)) { throw new IllegalArgumentException("Correlation must be >= -1 and <= 1"); } _reversionSpeed1 = reversionSpeed1; _reversionSpeed2 = reversionSpeed2; _meanReversionLevel = meanReversionLevel; _forwardRateCurve = forwardRateCurve; _volatilityCurve2 = volatilityCurve2; _correlation = correlation; } public double getFirstSpeed() { return _reversionSpeed1; } public double getSecondSpeed() { return _reversionSpeed2; } public double getMeanReversionLevel() { return _meanReversionLevel; } public double getForwardRate(final double t) { return _forwardRateCurve.getInterestRate(t); } public YieldAndDiscountCurve getForwardRateCurve() { return _forwardRateCurve; } public double getSecondVolatility(final double t) { return _volatilityCurve2.getVolatility(t); } public double getCorrelation() { return _correlation; } public VolatilityCurve getSecondVolatilityCurve() { return _volatilityCurve2; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); long temp; temp = Double.doubleToLongBits(_correlation); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + ((_forwardRateCurve == null) ? 0 : _forwardRateCurve.hashCode()); temp = Double.doubleToLongBits(_meanReversionLevel); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(_reversionSpeed1); result = prime * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(_reversionSpeed2); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + ((_volatilityCurve2 == null) ? 0 : _volatilityCurve2.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } final HullWhiteTwoFactorDataBundle other = (HullWhiteTwoFactorDataBundle) obj; if (Double.doubleToLongBits(_correlation) != Double.doubleToLongBits(other._correlation)) { return false; } if (!ObjectUtils.equals(_forwardRateCurve, other._forwardRateCurve)) { return false; } if (Double.doubleToLongBits(_meanReversionLevel) != Double.doubleToLongBits(other._meanReversionLevel)) { return false; } if (Double.doubleToLongBits(_reversionSpeed1) != Double.doubleToLongBits(other._reversionSpeed1)) { return false; } if (Double.doubleToLongBits(_reversionSpeed2) != Double.doubleToLongBits(other._reversionSpeed2)) { return false; } return ObjectUtils.equals(_volatilityCurve2, other._volatilityCurve2); } }