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.math;
018
019
020 /**
021 * Interface for algorithms handling convergence settings.
022 * <p>
023 * This interface only deals with convergence parameters setting, not
024 * execution of the algorithms per se.
025 * </p>
026 * @see ConvergenceException
027 * @version $Revision: 1042336 $ $Date: 2010-12-05 13:40:48 +0100 (dim. 05 d??c. 2010) $
028 * @since 2.0
029 * @deprecated in 2.2 (to be removed in 3.0). The concept of "iteration" will
030 * be moved to a new {@code IterativeAlgorithm}. The concept of "accuracy" is
031 * currently is also contained in {@link org.apache.commons.math.optimization.SimpleRealPointChecker}
032 * and similar classes.
033 */
034 @Deprecated
035 public interface ConvergingAlgorithm {
036
037 /**
038 * Set the upper limit for the number of iterations.
039 * <p>
040 * Usually a high iteration count indicates convergence problems. However,
041 * the "reasonable value" varies widely for different algorithms. Users are
042 * advised to use the default value supplied by the algorithm.</p>
043 * <p>
044 * A {@link ConvergenceException} will be thrown if this number
045 * is exceeded.</p>
046 *
047 * @param count maximum number of iterations
048 */
049 void setMaximalIterationCount(int count);
050
051 /**
052 * Get the upper limit for the number of iterations.
053 *
054 * @return the actual upper limit
055 */
056 int getMaximalIterationCount();
057
058 /**
059 * Reset the upper limit for the number of iterations to the default.
060 * <p>
061 * The default value is supplied by the algorithm implementation.</p>
062 *
063 * @see #setMaximalIterationCount(int)
064 */
065 void resetMaximalIterationCount();
066
067 /**
068 * Set the absolute accuracy.
069 * <p>
070 * The default is usually chosen so that results in the interval
071 * -10..-0.1 and +0.1..+10 can be found with a reasonable accuracy. If the
072 * expected absolute value of your results is of much smaller magnitude, set
073 * this to a smaller value.</p>
074 * <p>
075 * Algorithms are advised to do a plausibility check with the relative
076 * accuracy, but clients should not rely on this.</p>
077 *
078 * @param accuracy the accuracy.
079 * @throws IllegalArgumentException if the accuracy can't be achieved by
080 * the solver or is otherwise deemed unreasonable.
081 */
082 void setAbsoluteAccuracy(double accuracy);
083
084 /**
085 * Get the actual absolute accuracy.
086 *
087 * @return the accuracy
088 */
089 double getAbsoluteAccuracy();
090
091 /**
092 * Reset the absolute accuracy to the default.
093 * <p>
094 * The default value is provided by the algorithm implementation.</p>
095 */
096 void resetAbsoluteAccuracy();
097
098 /**
099 * Set the relative accuracy.
100 * <p>
101 * This is used to stop iterations if the absolute accuracy can't be
102 * achieved due to large values or short mantissa length.</p>
103 * <p>
104 * If this should be the primary criterion for convergence rather then a
105 * safety measure, set the absolute accuracy to a ridiculously small value,
106 * like {@link org.apache.commons.math.util.MathUtils#SAFE_MIN MathUtils.SAFE_MIN}.</p>
107 *
108 * @param accuracy the relative accuracy.
109 * @throws IllegalArgumentException if the accuracy can't be achieved by
110 * the algorithm or is otherwise deemed unreasonable.
111 */
112 void setRelativeAccuracy(double accuracy);
113
114 /**
115 * Get the actual relative accuracy.
116 * @return the accuracy
117 */
118 double getRelativeAccuracy();
119
120 /**
121 * Reset the relative accuracy to the default.
122 * The default value is provided by the algorithm implementation.
123 */
124 void resetRelativeAccuracy();
125
126 /**
127 * Get the number of iterations in the last run of the algorithm.
128 * <p>
129 * This is mainly meant for testing purposes. It may occasionally
130 * help track down performance problems: if the iteration count
131 * is notoriously high, check whether the problem is evaluated
132 * properly, and whether another algorithm is more amenable to the
133 * problem.</p>
134 *
135 * @return the last iteration count.
136 * @throws IllegalStateException if there is no result available, either
137 * because no result was yet computed or the last attempt failed.
138 */
139 int getIterationCount();
140
141 }