package org.openlca.core.math;
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.ArrayRealVector;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.RealVector;
public class JavaSolver implements IMatrixSolver {
@Override
public double[] solve(IMatrix a, int idx, double d) {
RealMatrix A = unwrap(a);
RealVector b = new ArrayRealVector(a.rows());
b.setEntry(idx, d);
RealVector x = new LUDecomposition(A).getSolver().solve(b);
return x.toArray();
}
@Override
public double[] multiply(IMatrix m, double[] v) {
RealMatrix A = unwrap(m);
RealMatrix b = new Array2DRowRealMatrix(v.length, 1);
b.setColumn(0, v);
return A.multiply(b).getColumn(0);
}
@Override
public IMatrix invert(IMatrix a) {
RealMatrix _a = unwrap(a);
RealMatrix inverse = new LUDecomposition(_a).getSolver().getInverse();
return new JavaMatrix(inverse);
}
@Override
public IMatrix multiply(IMatrix a, IMatrix b) {
RealMatrix _a = unwrap(a);
RealMatrix _b = unwrap(b);
RealMatrix c = _a.multiply(_b);
return new JavaMatrix(c);
}
private RealMatrix unwrap(IMatrix matrix) {
if (!(matrix instanceof JavaMatrix))
throw new IllegalArgumentException("unsupported matrix type: "
+ matrix);
JavaMatrix javaMatrix = (JavaMatrix) matrix;
return javaMatrix.getRealMatrix();
}
@Override
public IMatrixFactory<?> getMatrixFactory() {
return new JavaMatrixFactory();
}
}