You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ce...@apache.org on 2012/03/23 08:50:51 UTC
svn commit: r1304216 - in /commons/proper/math/trunk/src:
main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java
test/java/org/apache/commons/math3/linear/SymmLQTest.java
Author: celestin
Date: Fri Mar 23 07:50:51 2012
New Revision: 1304216
URL: http://svn.apache.org/viewvc?rev=1304216&view=rev
Log:
In SymmLQTest, testPreconditionedNormOfResidual() now passes.
Previous failure was due to the test itself, not to the implementation of SymmLQ.
See MATH-770.
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SymmLQTest.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java?rev=1304216&r1=1304215&r2=1304216&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/JacobiPreconditioner.java Fri Mar 23 07:50:51 2012
@@ -16,6 +16,8 @@
*/
package org.apache.commons.math3.linear;
+import org.apache.commons.math3.analysis.function.Sqrt;
+
/**
* This class implements the standard Jacobi (diagonal) preconditioner. For a
* matrix A<sub>ij</sub>, this preconditioner is
@@ -98,4 +100,34 @@ public class JacobiPreconditioner extend
// Dimension check is carried out by ebeMultiply
return x.ebeDivide(diag);
}
+
+ /**
+ * Returns the square root of {@code this} diagonal operator. More
+ * precisely, this method returns
+ * P = diag(1 / √A<sub>11</sub>, 1 / √A<sub>22</sub>, …).
+ *
+ * @return the square root of {@code this} operator
+ */
+ public RealLinearOperator sqrt(){
+ final RealVector sqrtDiag = diag.map(new Sqrt());
+ return new RealLinearOperator() {
+ /** {@inheritDoc} */
+ @Override
+ public RealVector operate(final RealVector x) {
+ return x.ebeDivide(sqrtDiag);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int getRowDimension() {
+ return sqrtDiag.getDimension();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int getColumnDimension() {
+ return sqrtDiag.getDimension();
+ }
+ };
+ }
}
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SymmLQTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SymmLQTest.java?rev=1304216&r1=1304215&r2=1304216&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SymmLQTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/SymmLQTest.java Fri Mar 23 07:50:51 2012
@@ -19,7 +19,6 @@ package org.apache.commons.math3.linear;
import java.util.Arrays;
import org.apache.commons.math3.exception.DimensionMismatchException;
-import org.apache.commons.math3.exception.MathUnsupportedOperationException;
import org.apache.commons.math3.util.FastMath;
import org.apache.commons.math3.util.IterationEvent;
import org.apache.commons.math3.util.IterationListener;
@@ -643,7 +642,8 @@ public class SymmLQTest {
final int n = 5;
final int maxIterations = 100;
final RealLinearOperator a = new HilbertMatrix(n);
- final RealLinearOperator m = JacobiPreconditioner.create(a);
+ final JacobiPreconditioner m = JacobiPreconditioner.create(a);
+ final RealLinearOperator p = m.sqrt();
final PreconditionedIterativeLinearSolver solver;
final IterationListener listener = new IterationListener() {
@@ -653,7 +653,7 @@ public class SymmLQTest {
final RealVector x = evt.getSolution();
final RealVector b = evt.getRightHandSideVector();
final RealVector r = b.subtract(a.operate(x));
- final double rnorm = r.getNorm();
+ final double rnorm = p.operate(r).getNorm();
Assert.assertEquals("iteration performed (residual)",
rnorm, evt.getNormOfResidual(),
FastMath.max(1E-5 * rnorm, 1E-10));