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/21 06:26:46 UTC
svn commit: r1303290 -
/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
Author: celestin
Date: Wed Mar 21 05:26:45 2012
New Revision: 1303290
URL: http://svn.apache.org/viewvc?rev=1303290&view=rev
Log:
In org.apache.commons.math3.linear.SymmLQ.State, created
- boolean bEqualsNullVector()
- boolean betaIsZero()
to improve data encapsulation (see MATH-761).
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java?rev=1303290&r1=1303289&r2=1303290&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java Wed Mar 21 05:26:45 2012
@@ -226,6 +226,11 @@ public class SymmLQ
* </p>
*/
private static class State {
+ /** The cubic root of {@link #MACH_PREC}. */
+ static final double CBRT_MACH_PREC;
+
+ /** The machine precision. */
+ static final double MACH_PREC;
/** Reference to the linear operator. */
private final RealLinearOperator a;
@@ -334,6 +339,14 @@ public class SymmLQ
/** The value of zeta[1]^2 + ... + zeta[k-1]^2. */
private double ynorm2;
+ /** The value of {@code b == 0} (exact floating-point equality). */
+ private boolean bIsNull;
+
+ static {
+ MACH_PREC = Math.ulp(1.);
+ CBRT_MACH_PREC = Math.cbrt(MACH_PREC);
+ }
+
/**
* Creates and inits to k = 1 a new instance of this class.
*
@@ -390,7 +403,7 @@ public class SymmLQ
throws NonSelfAdjointOperatorException {
final double s = y.dotProduct(y);
final double t = x.dotProduct(z);
- final double epsa = (s + SymmLQ.MACH_PREC) * SymmLQ.CBRT_MACH_PREC;
+ final double epsa = (s + MACH_PREC) * CBRT_MACH_PREC;
if (FastMath.abs(s - t) > epsa) {
final NonSelfAdjointOperatorException e;
e = new NonSelfAdjointOperatorException();
@@ -525,8 +538,10 @@ public class SymmLQ
}
if (this.beta1 == 0.) {
/* If b = 0 exactly, stop with x = 0. */
+ this.bIsNull = true;
return;
}
+ this.bIsNull = false;
this.beta1 = FastMath.sqrt(this.beta1);
/* At this point
* r1 = b,
@@ -766,6 +781,25 @@ public class SymmLQ
public boolean hasConverged() {
return hasConverged;
}
+
+ /**
+ * Returns {@code true} if the right-hand side vector is zero exactly.
+ *
+ * @return the boolean value of {@code b == 0}
+ */
+ public boolean bEqualsNullVector() {
+ return bIsNull;
+ }
+
+ /**
+ * Returns {@code true} if {@code beta} is essentially zero. This method
+ * is used to check for early stop of the iterations.
+ *
+ * @return {@code true} if {@code beta < }{@link #MACH_PREC}
+ */
+ public boolean betaEqualsZero() {
+ return beta < MACH_PREC;
+ }
}
/**
@@ -820,12 +854,6 @@ public class SymmLQ
}
}
- /** The cubic root of {@link #MACH_PREC}. */
- static final double CBRT_MACH_PREC;
-
- /** The machine precision. */
- static final double MACH_PREC;
-
/** Key for the exception context. */
private static final String OPERATOR = "operator";
@@ -885,11 +913,6 @@ public class SymmLQ
this.check = check;
}
- static {
- MACH_PREC = Math.ulp(1.);
- CBRT_MACH_PREC = Math.cbrt(MACH_PREC);
- }
-
/**
* Returns {@code true} if symmetry of the matrix, and symmetry as well as
* positive definiteness of the preconditioner should be checked.
@@ -1159,14 +1182,14 @@ public class SymmLQ
final State state = new State(a, minv, b, x, goodb, shift, delta, check);
final IterativeLinearSolverEvent event = new SymmLQEvent(this, state);
- if (state.beta1 == 0.) {
+ if (state.bEqualsNullVector()) {
/* If b = 0 exactly, stop with x = 0. */
manager.fireTerminationEvent(event);
return x;
}
/* Cause termination if beta is essentially zero. */
final boolean earlyStop;
- earlyStop = (state.beta < MACH_PREC) || (state.hasConverged());
+ earlyStop = state.betaEqualsZero() || state.hasConverged();
manager.fireInitializationEvent(event);
if (!earlyStop) {
do {
Re: svn commit: r1303290 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
Posted by Sébastien Brisard <se...@m4x.org>.
Hi Luc,
>>
>> + /** The value of {@code b == 0} (exact floating-point equality). */
>> + private boolean bIsNull;
>> +
>> + static {
>> + MACH_PREC = Math.ulp(1.);
>> + CBRT_MACH_PREC = Math.cbrt(MACH_PREC);
>
> Why not using FastMath ?
>
> Luc
>
Because I'm silly ;-)
Thanks for pointing that out, will correct that. Meanwhile, should you
find some time to review the refactoring itself (still ongoing), any
comment would be most welcome.
Sébastien
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org
Re: svn commit: r1303290 - /commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
Posted by Luc Maisonobe <Lu...@free.fr>.
Le 21/03/2012 06:26, celestin@apache.org a écrit :
> Author: celestin
> Date: Wed Mar 21 05:26:45 2012
> New Revision: 1303290
>
> URL: http://svn.apache.org/viewvc?rev=1303290&view=rev
> Log:
> In org.apache.commons.math3.linear.SymmLQ.State, created
> - boolean bEqualsNullVector()
> - boolean betaIsZero()
> to improve data encapsulation (see MATH-761).
>
> Modified:
> commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
>
> Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java
> URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java?rev=1303290&r1=1303289&r2=1303290&view=diff
> ==============================================================================
> --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java (original)
> +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/SymmLQ.java Wed Mar 21 05:26:45 2012
> @@ -226,6 +226,11 @@ public class SymmLQ
> * </p>
> */
> private static class State {
> + /** The cubic root of {@link #MACH_PREC}. */
> + static final double CBRT_MACH_PREC;
> +
> + /** The machine precision. */
> + static final double MACH_PREC;
>
> /** Reference to the linear operator. */
> private final RealLinearOperator a;
> @@ -334,6 +339,14 @@ public class SymmLQ
> /** The value of zeta[1]^2 + ... + zeta[k-1]^2. */
> private double ynorm2;
>
> + /** The value of {@code b == 0} (exact floating-point equality). */
> + private boolean bIsNull;
> +
> + static {
> + MACH_PREC = Math.ulp(1.);
> + CBRT_MACH_PREC = Math.cbrt(MACH_PREC);
Why not using FastMath ?
Luc
> + }
> +
> /**
> * Creates and inits to k = 1 a new instance of this class.
> *
> @@ -390,7 +403,7 @@ public class SymmLQ
> throws NonSelfAdjointOperatorException {
> final double s = y.dotProduct(y);
> final double t = x.dotProduct(z);
> - final double epsa = (s + SymmLQ.MACH_PREC) * SymmLQ.CBRT_MACH_PREC;
> + final double epsa = (s + MACH_PREC) * CBRT_MACH_PREC;
> if (FastMath.abs(s - t) > epsa) {
> final NonSelfAdjointOperatorException e;
> e = new NonSelfAdjointOperatorException();
> @@ -525,8 +538,10 @@ public class SymmLQ
> }
> if (this.beta1 == 0.) {
> /* If b = 0 exactly, stop with x = 0. */
> + this.bIsNull = true;
> return;
> }
> + this.bIsNull = false;
> this.beta1 = FastMath.sqrt(this.beta1);
> /* At this point
> * r1 = b,
> @@ -766,6 +781,25 @@ public class SymmLQ
> public boolean hasConverged() {
> return hasConverged;
> }
> +
> + /**
> + * Returns {@code true} if the right-hand side vector is zero exactly.
> + *
> + * @return the boolean value of {@code b == 0}
> + */
> + public boolean bEqualsNullVector() {
> + return bIsNull;
> + }
> +
> + /**
> + * Returns {@code true} if {@code beta} is essentially zero. This method
> + * is used to check for early stop of the iterations.
> + *
> + * @return {@code true} if {@code beta < }{@link #MACH_PREC}
> + */
> + public boolean betaEqualsZero() {
> + return beta < MACH_PREC;
> + }
> }
>
> /**
> @@ -820,12 +854,6 @@ public class SymmLQ
> }
> }
>
> - /** The cubic root of {@link #MACH_PREC}. */
> - static final double CBRT_MACH_PREC;
> -
> - /** The machine precision. */
> - static final double MACH_PREC;
> -
> /** Key for the exception context. */
> private static final String OPERATOR = "operator";
>
> @@ -885,11 +913,6 @@ public class SymmLQ
> this.check = check;
> }
>
> - static {
> - MACH_PREC = Math.ulp(1.);
> - CBRT_MACH_PREC = Math.cbrt(MACH_PREC);
> - }
> -
> /**
> * Returns {@code true} if symmetry of the matrix, and symmetry as well as
> * positive definiteness of the preconditioner should be checked.
> @@ -1159,14 +1182,14 @@ public class SymmLQ
>
> final State state = new State(a, minv, b, x, goodb, shift, delta, check);
> final IterativeLinearSolverEvent event = new SymmLQEvent(this, state);
> - if (state.beta1 == 0.) {
> + if (state.bEqualsNullVector()) {
> /* If b = 0 exactly, stop with x = 0. */
> manager.fireTerminationEvent(event);
> return x;
> }
> /* Cause termination if beta is essentially zero. */
> final boolean earlyStop;
> - earlyStop = (state.beta < MACH_PREC) || (state.hasConverged());
> + earlyStop = state.betaEqualsZero() || state.hasConverged();
> manager.fireInitializationEvent(event);
> if (!earlyStop) {
> do {
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org