com.opengamma.analytics.financial.model.interestrate.definition.HullWhiteTwoFactorDataBundle.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.analytics.financial.model.interestrate.definition.HullWhiteTwoFactorDataBundle.java

Source

/**
 * 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);
    }
}