001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math3.linear;
018    
019    import org.apache.commons.math3.exception.MathUnsupportedOperationException;
020    
021    /**
022     * A default concrete implementation of the abstract class
023     * {@link IterativeLinearSolverEvent}.
024     *
025     * @version $Id: DefaultIterativeLinearSolverEvent.java 1416643 2012-12-03 19:37:14Z tn $
026     */
027    public class DefaultIterativeLinearSolverEvent extends IterativeLinearSolverEvent {
028    
029        /** */
030        private static final long serialVersionUID = 20120129L;
031    
032        /** The right-hand side vector. */
033        private final RealVector b;
034    
035        /** The current estimate of the residual. */
036        private final RealVector r;
037    
038        /** The current estimate of the norm of the residual. */
039        private final double rnorm;
040    
041        /** The current estimate of the solution. */
042        private final RealVector x;
043    
044        /**
045         * Creates a new instance of this class. This implementation does
046         * <em>not</em> deep copy the specified vectors {@code x}, {@code b},
047         * {@code r}. Therefore the user must make sure that these vectors are
048         * either unmodifiable views or deep copies of the same vectors actually
049         * used by the {@code source}. Failure to do so may compromise subsequent
050         * iterations of the {@code source}. If the residual vector {@code r} is
051         * {@code null}, then {@link #getResidual()} throws a
052         * {@link MathUnsupportedOperationException}, and
053         * {@link #providesResidual()} returns {@code false}.
054         *
055         * @param source the iterative solver which fired this event
056         * @param iterations the number of iterations performed at the time
057         * {@code this} event is created
058         * @param x the current estimate of the solution
059         * @param b the right-hand side vector
060         * @param r the current estimate of the residual (can be {@code null})
061         * @param rnorm the norm of the current estimate of the residual
062         */
063        public DefaultIterativeLinearSolverEvent(final Object source, final int iterations,
064            final RealVector x, final RealVector b, final RealVector r,
065            final double rnorm) {
066            super(source, iterations);
067            this.x = x;
068            this.b = b;
069            this.r = r;
070            this.rnorm = rnorm;
071        }
072    
073        /**
074         * Creates a new instance of this class. This implementation does
075         * <em>not</em> deep copy the specified vectors {@code x}, {@code b}.
076         * Therefore the user must make sure that these vectors are either
077         * unmodifiable views or deep copies of the same vectors actually used by
078         * the {@code source}. Failure to do so may compromise subsequent iterations
079         * of the {@code source}. Callling {@link #getResidual()} on instances
080         * returned by this constructor throws a
081         * {@link MathUnsupportedOperationException}, while
082         * {@link #providesResidual()} returns {@code false}.
083         *
084         * @param source the iterative solver which fired this event
085         * @param iterations the number of iterations performed at the time
086         * {@code this} event is created
087         * @param x the current estimate of the solution
088         * @param b the right-hand side vector
089         * @param rnorm the norm of the current estimate of the residual
090         */
091        public DefaultIterativeLinearSolverEvent(final Object source, final int iterations,
092            final RealVector x, final RealVector b, final double rnorm) {
093            super(source, iterations);
094            this.x = x;
095            this.b = b;
096            this.r = null;
097            this.rnorm = rnorm;
098        }
099    
100        /** {@inheritDoc} */
101        @Override
102        public double getNormOfResidual() {
103            return rnorm;
104        }
105    
106        /**
107         * {@inheritDoc}
108         *
109         * This implementation throws an {@link MathUnsupportedOperationException}
110         * if no residual vector {@code r} was provided at construction time.
111         */
112        @Override
113        public RealVector getResidual() {
114            if (r != null) {
115                return r;
116            }
117            throw new MathUnsupportedOperationException();
118        }
119    
120        /** {@inheritDoc} */
121        @Override
122        public RealVector getRightHandSideVector() {
123            return b;
124        }
125    
126        /** {@inheritDoc} */
127        @Override
128        public RealVector getSolution() {
129            return x;
130        }
131    
132        /**
133         * {@inheritDoc}
134         *
135         * This implementation returns {@code true} if a non-{@code null} value was
136         * specified for the residual vector {@code r} at construction time.
137         *
138         * @return {@code true} if {@code r != null}
139         */
140        @Override
141        public boolean providesResidual() {
142            return r != null;
143        }
144    }