summaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java')
-rw-r--r--src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java b/src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java
new file mode 100644
index 0000000..ad98ca3
--- /dev/null
+++ b/src/main/java/org/apache/commons/math3/linear/IterativeLinearSolverEvent.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.math3.linear;
+
+import org.apache.commons.math3.exception.MathUnsupportedOperationException;
+import org.apache.commons.math3.util.IterationEvent;
+
+/**
+ * This is the base class for all events occurring during the iterations of a {@link
+ * IterativeLinearSolver}.
+ *
+ * @since 3.0
+ */
+public abstract class IterativeLinearSolverEvent extends IterationEvent {
+ /** Serialization identifier. */
+ private static final long serialVersionUID = 20120129L;
+
+ /**
+ * Creates a new instance of this class.
+ *
+ * @param source the iterative algorithm on which the event initially occurred
+ * @param iterations the number of iterations performed at the time {@code this} event is
+ * created
+ */
+ public IterativeLinearSolverEvent(final Object source, final int iterations) {
+ super(source, iterations);
+ }
+
+ /**
+ * Returns the current right-hand side of the linear system to be solved. This method should
+ * return an unmodifiable view, or a deep copy of the actual right-hand side vector, in order
+ * not to compromise subsequent iterations of the source {@link IterativeLinearSolver}.
+ *
+ * @return the right-hand side vector, b
+ */
+ public abstract RealVector getRightHandSideVector();
+
+ /**
+ * Returns the norm of the residual. The returned value is not required to be <em>exact</em>.
+ * Instead, the norm of the so-called <em>updated</em> residual (if available) should be
+ * returned. For example, the {@link ConjugateGradient conjugate gradient} method computes a
+ * sequence of residuals, the norm of which is cheap to compute. However, due to accumulation of
+ * round-off errors, this residual might differ from the true residual after some iterations.
+ * See e.g. A. Greenbaum and Z. Strakos, <em>Predicting the Behavior of Finite Precision Lanzos
+ * and Conjugate Gradient Computations</em>, Technical Report 538, Department of Computer
+ * Science, New York University, 1991 (available <a
+ * href="http://www.archive.org/details/predictingbehavi00gree">here</a>).
+ *
+ * @return the norm of the residual, ||r||
+ */
+ public abstract double getNormOfResidual();
+
+ /**
+ * Returns the residual. This is an optional operation, as all iterative linear solvers do not
+ * provide cheap estimate of the updated residual vector, in which case
+ *
+ * <ul>
+ * <li>this method should throw a {@link MathUnsupportedOperationException},
+ * <li>{@link #providesResidual()} returns {@code false}.
+ * </ul>
+ *
+ * <p>The default implementation throws a {@link MathUnsupportedOperationException}. If this
+ * method is overriden, then {@link #providesResidual()} should be overriden as well.
+ *
+ * @return the updated residual, r
+ */
+ public RealVector getResidual() {
+ throw new MathUnsupportedOperationException();
+ }
+
+ /**
+ * Returns the current estimate of the solution to the linear system to be solved. This method
+ * should return an unmodifiable view, or a deep copy of the actual current solution, in order
+ * not to compromise subsequent iterations of the source {@link IterativeLinearSolver}.
+ *
+ * @return the solution, x
+ */
+ public abstract RealVector getSolution();
+
+ /**
+ * Returns {@code true} if {@link #getResidual()} is supported. The default implementation
+ * returns {@code false}.
+ *
+ * @return {@code false} if {@link #getResidual()} throws a {@link
+ * MathUnsupportedOperationException}
+ */
+ public boolean providesResidual() {
+ return false;
+ }
+}