/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.finitedifference.applications;
import org.apache.commons.lang.Validate;
/**
*
*/
public class TwoStateMarkovChainDataBundle {
private final double _vol1;
private final double _vol2;
private final double _beta1;
private final double _beta2;
private final double _lambda12;
private final double _lambda21;
private final double _pi1;
private final double _p0;
/**
*
* @param vol1 Volatility of state 1
* @param vol2 Volatility of state 1
* @param lambda12 Transition rate from state 1 to 2
* @param lambda21 Transition rate from state 2 to 1
* @param probS1 Probability of starting in state 1
*/
public TwoStateMarkovChainDataBundle(final double vol1, final double vol2,
final double lambda12, final double lambda21, final double probS1) {
this(vol1, vol2, lambda12, lambda21, probS1, 1.0, 1.0);
}
/**
*
* @param vol1 Volatility of state 1
* @param vol2 Volatility of state 1
* @param lambda12 Transition rate from state 1 to 2
* @param lambda21 Transition rate from state 2 to 1
* @param probS1 Probability of starting in state 1
* @param beta1 CEV parameter in state 1
* @param beta2 CEV parameter in state 2
*/
public TwoStateMarkovChainDataBundle(final double vol1, final double vol2,
final double lambda12, final double lambda21, final double probS1, final double beta1, final double beta2) {
Validate.isTrue(vol1 >= 0.0, "vol1 < 0");
Validate.isTrue(vol2 >= vol1, "vol2 < vol1");
Validate.isTrue(lambda12 >= 0.0, "lambda12 < 0");
Validate.isTrue(lambda21 >= 0.0, "lambda21 < 0");
Validate.isTrue(probS1 >= 0.0 && probS1 <= 1.0, "Need 0 <= probS1 <= 1.0");
Validate.isTrue(beta1 >= 0.0 && beta1 <= 2.0, "Need 0 <= beta1 <= 2.0");
Validate.isTrue(beta2 >= 0.0 && beta2 <= 2.0, "Need 0 <= beta2 <= 2.0");
_vol1 = vol1;
_vol2 = vol2;
_beta1 = beta1;
_beta2 = beta2;
_lambda12 = lambda12;
_lambda21 = lambda21;
_p0 = probS1;
double sum = lambda12 + lambda21;
if (sum == 0) {
_pi1 = probS1;
} else {
_pi1 = lambda21 / sum;
}
}
/**
* Gets the vol1.
* @return the vol1
*/
public double getVol1() {
return _vol1;
}
/**
* Gets the vol2.
* @return the vol2
*/
public double getVol2() {
return _vol2;
}
/**
* Gets the beta1.
* @return the beta1
*/
public double getBeta1() {
return _beta1;
}
/**
* Gets the beta2.
* @return the beta2
*/
public double getBeta2() {
return _beta2;
}
/**
* Gets the lambda12.
* @return the lambda12
*/
public double getLambda12() {
return _lambda12;
}
/**
* Gets the lambda21.
* @return the lambda21
*/
public double getLambda21() {
return _lambda21;
}
/**
* Gets the p0.
* @return the p0
*/
public double getP0() {
return _p0;
}
public double getSteadyStateProb() {
return _pi1;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(_beta1);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_beta2);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_lambda12);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_lambda21);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_p0);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_vol1);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(_vol2);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
TwoStateMarkovChainDataBundle other = (TwoStateMarkovChainDataBundle) obj;
if (Double.doubleToLongBits(_beta1) != Double.doubleToLongBits(other._beta1)) {
return false;
}
if (Double.doubleToLongBits(_beta2) != Double.doubleToLongBits(other._beta2)) {
return false;
}
if (Double.doubleToLongBits(_lambda12) != Double.doubleToLongBits(other._lambda12)) {
return false;
}
if (Double.doubleToLongBits(_lambda21) != Double.doubleToLongBits(other._lambda21)) {
return false;
}
if (Double.doubleToLongBits(_p0) != Double.doubleToLongBits(other._p0)) {
return false;
}
if (Double.doubleToLongBits(_vol1) != Double.doubleToLongBits(other._vol1)) {
return false;
}
if (Double.doubleToLongBits(_vol2) != Double.doubleToLongBits(other._vol2)) {
return false;
}
return true;
}
}