/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.var.parametric;
import java.util.List;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.analytics.math.matrix.Matrix;
/**
*
*/
public class ParametricVaRDataBundle {
private final List<String> _names;
private final DoubleMatrix1D _expectedReturn;
private final Matrix<?> _sensitivities;
private final DoubleMatrix2D _covarianceMatrix;
private final int _order;
public ParametricVaRDataBundle(final Matrix<?> sensitivities, final DoubleMatrix2D covarianceMatrix, final int order) {
this(null, getEmptyExpectedReturnVector(sensitivities), sensitivities, covarianceMatrix, order);
}
public ParametricVaRDataBundle(final DoubleMatrix1D expectedReturn, final Matrix<?> sensitivities, final DoubleMatrix2D covarianceMatrix, final int order) {
this(null, expectedReturn, sensitivities, covarianceMatrix, order);
}
public ParametricVaRDataBundle(final List<String> names, final Matrix<?> sensitivities, final DoubleMatrix2D covarianceMatrix, final int order) {
this(names, getEmptyExpectedReturnVector(sensitivities), sensitivities, covarianceMatrix, order);
}
public ParametricVaRDataBundle(final List<String> names, final DoubleMatrix1D expectedReturn, final Matrix<?> sensitivities, final DoubleMatrix2D covarianceMatrix, final int order) {
Validate.notNull(sensitivities, "sensitivities");
Validate.notNull(covarianceMatrix, "covariance matrix");
Validate.notNull(expectedReturn, "expected return");
Validate.isTrue(order > 0);
Validate.isTrue(covarianceMatrix.getNumberOfRows() == covarianceMatrix.getNumberOfColumns());
if (sensitivities instanceof DoubleMatrix1D) {
Validate.isTrue(sensitivities.getNumberOfElements() == covarianceMatrix.getNumberOfRows());
Validate.isTrue(sensitivities.getNumberOfElements() == expectedReturn.getNumberOfElements());
if (names != null) {
Validate.isTrue(sensitivities.getNumberOfElements() == names.size());
}
} else if (sensitivities instanceof DoubleMatrix2D) {
Validate.isTrue(((DoubleMatrix2D) sensitivities).getNumberOfRows() == covarianceMatrix.getNumberOfRows());
Validate.isTrue(((DoubleMatrix2D) sensitivities).getNumberOfRows() == expectedReturn.getNumberOfElements());
if (names != null) {
Validate.isTrue(((DoubleMatrix2D) sensitivities).getNumberOfRows() == names.size());
}
} else {
throw new IllegalArgumentException("Can only handle 1- and 2-d sensitivity matrices");
}
_names = names;
_expectedReturn = expectedReturn;
_sensitivities = sensitivities;
_covarianceMatrix = covarianceMatrix;
_order = order;
}
private static DoubleMatrix1D getEmptyExpectedReturnVector(final Matrix<?> sensitivities) {
if (sensitivities instanceof DoubleMatrix1D) {
return new DoubleMatrix1D(new double[((DoubleMatrix1D) sensitivities).getNumberOfElements()]);
} else if (sensitivities instanceof DoubleMatrix2D) {
return new DoubleMatrix1D(new double[((DoubleMatrix2D) sensitivities).getNumberOfRows()]);
}
throw new IllegalArgumentException("Can only handle 1- and 2-d sensitivity matrices");
}
public DoubleMatrix1D getExpectedReturn() {
return _expectedReturn;
}
public Matrix<?> getSensitivities() {
return _sensitivities;
}
public DoubleMatrix2D getCovarianceMatrix() {
return _covarianceMatrix;
}
public List<String> getNames() {
return _names;
}
public int getOrder() {
return _order;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + _covarianceMatrix.hashCode();
result = prime * result + ((_names == null) ? 0 : _names.hashCode());
result = prime * result + _expectedReturn.hashCode();
result = prime * result + _order;
result = prime * result + _sensitivities.hashCode();
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ParametricVaRDataBundle other = (ParametricVaRDataBundle) obj;
if (!ObjectUtils.equals(_covarianceMatrix, other._covarianceMatrix)) {
return false;
}
if (!ObjectUtils.equals(_expectedReturn, other._expectedReturn)) {
return false;
}
if (!ObjectUtils.equals(_names, other._names)) {
return false;
}
if (!ObjectUtils.equals(_sensitivities, other._sensitivities)) {
return false;
}
return _order == other._order;
}
}