package org.freehep.math.minuit;
/**
*
* @version $Id: MnCovarianceSqueeze.java 8584 2006-08-10 23:06:37Z duns $
*/
abstract class MnCovarianceSqueeze
{
static MnUserCovariance squeeze(MnUserCovariance cov, int n)
{
assert(cov.nrow() > 0);
assert(n < cov.nrow());
MnAlgebraicSymMatrix hess = new MnAlgebraicSymMatrix(cov.nrow());
for(int i = 0; i < cov.nrow(); i++)
{
for(int j = i; j < cov.nrow(); j++)
{
hess.set(i,j,cov.get(i,j));
}
}
try
{
hess.invert();
}
catch (MatrixInversionException x)
{
System.err.println("MnUserCovariance inversion failed; return diagonal matrix;");
MnUserCovariance result = new MnUserCovariance(cov.nrow() - 1);
for(int i = 0, j =0; i < cov.nrow(); i++)
{
if(i == n) continue;
result.set(j,j,cov.get(i,i));
j++;
}
return result;
}
MnAlgebraicSymMatrix squeezed = squeeze(hess, n);
try
{
squeezed.invert();
}
catch (MatrixInversionException x)
{
System.err.println("MnUserCovariance back-inversion failed; return diagonal matrix;");
MnUserCovariance result = new MnUserCovariance(squeezed.nrow());
for(int i = 0; i < squeezed.nrow(); i++)
{
result.set(i,i,1./squeezed.get(i,i));
}
return result;
}
return new MnUserCovariance(squeezed.data(), squeezed.nrow());
}
static MinimumError squeeze(MinimumError err, int n)
{
MnAlgebraicSymMatrix hess = err.hessian();
MnAlgebraicSymMatrix squeezed = squeeze(hess, n);
try
{
squeezed.invert();
}
catch (MatrixInversionException x)
{
System.err.println("MnCovarianceSqueeze: MinimumError inversion fails; return diagonal matrix.");
MnAlgebraicSymMatrix tmp = new MnAlgebraicSymMatrix(squeezed.nrow());
for(int i = 0; i < squeezed.nrow(); i++)
{
tmp.set(i,i, 1./squeezed.get(i,i));
}
return new MinimumError(tmp, new MinimumError.MnInvertFailed());
}
return new MinimumError(squeezed, err.dcovar());
}
static MnAlgebraicSymMatrix squeeze(MnAlgebraicSymMatrix hess, int n)
{
assert(hess.nrow() > 0);
assert(n < hess.nrow());
MnAlgebraicSymMatrix hs = new MnAlgebraicSymMatrix(hess.nrow() - 1);
for(int i = 0, j = 0; i < hess.nrow(); i++)
{
if(i == n) continue;
for(int k = i, l = j; k < hess.nrow(); k++)
{
if(k == n) continue;
hs.set(j,l,hess.get(i,k));
l++;
}
j++;
}
return hs;
}
}