blob: 6b90e8a7b23348356eae481a1310f3032e541be5 [file] [log] [blame]
<?xml version="1.0"?>
<!--
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.
-->
<document url="utilities.html">
<properties>
<title>The Commons Math User Guide - Utilites</title>
</properties>
<body>
<section name="6 Utilities">
<subsection name="6.1 Overview" href="overview">
<p>
The <a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/package-summary.html">
org.apache.commons.math4.util</a> package collects a group of array utilities,
value transformers, and numerical routines used by implementation classes in
commons-math.
</p>
</subsection>
<subsection name="6.2 Double array utilities" href="arrays">
<p>
To maintain statistics based on a "rolling" window of values, a resizable
array implementation was developed and is provided for reuse in the
<code>util</code> package. The core functionality provided is described in
the documentation for the interface,
<a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/DoubleArray.html">
DoubleArray</a>. This interface adds one method,
<code>addElementRolling(double)</code> to basic list accessors.
The <code>addElementRolling</code> method adds an element
(the actual parameter) to the end of the list and removes the first element
in the list.
</p>
<p>
The <a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/ResizableDoubleArray.html">
ResizableDoubleArray</a> class provides a configurable, array-backed
implementation of the <code>DoubleArray</code> interface.
When <code>addElementRolling</code> is invoked, the underlying
array is expanded if necessary, the new element is added to the end of the
array and the "usable window" of the array is moved forward, so that
the first element is effectively discarded, what was the second becomes the
first, and so on. To efficiently manage storage, two maintenance
operations need to be periodically performed -- orphaned elements at the
beginning of the array need to be reclaimed and space for new elements at
the end needs to be created. Both of these operations are handled
automatically, with frequency / effect driven by the configuration
properties <code>expansionMode</code>, <code>expansionFactor</code> and
<code>contractionCriteria.</code> See
<a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/ResizableDoubleArray.html">
ResizableDoubleArray</a>
for details.
</p>
</subsection>
<subsection name="6.3 int/double hash map" href="int_double_hash_map">
<p>
The <a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/OpenIntToDoubleHashMap.html">
OpenIntToDoubleHashMap</a> class provides a specialized hash map
implementation for int/double. This implementation has a much smaller memory
overhead than standard <code>java.util.HashMap</code> class. It uses open addressing
and primitive arrays, which greatly reduces the number of intermediate objects and
improve data locality.
</p>
</subsection>
<subsection name="6.4 Continued Fractions" href="continued_fractions">
<p>
The <a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/ContinuedFraction.html">
ContinuedFraction</a> class provides a generic way to create and evaluate
continued fractions. The easiest way to create a continued fraction is
to subclass <code>ContinuedFraction</code> and override the
<code>getA</code> and <code>getB</code> methods which return
the continued fraction terms. The precise definition of these terms is
explained in <a href="http://mathworld.wolfram.com/ContinuedFraction.html">
Continued Fraction, equation (1)</a> from MathWorld.
</p>
<p>
As an example, the constant &pi; can be computed using a <a href="http://functions.wolfram.com/Constants/Pi/10/0002/">continued fraction</a>. The following anonymous class
provides the implementation:
<source>ContinuedFraction c = new ContinuedFraction() {
public double getA(int n, double x) {
switch(n) {
case 0: return 3.0;
default: return 6.0;
}
}
public double getB(int n, double x) {
double y = (2.0 * n) - 1.0;
return y * y;
}
}</source>
</p>
<p>
Then, to evalute &pi;, simply call any of the <code>evalute</code> methods
(Note, the point of evaluation in this example is meaningless since &pi; is a
constant).
</p>
<p>
For a more practical use of continued fractions, consider the <a href="http://functions.wolfram.com/ElementaryFunctions/Exp/10/">exponential function</a>.
The following anonymous class provides its implementation:
<source>ContinuedFraction c = new ContinuedFraction() {
public double getA(int n, double x) {
if (n % 2 == 0) {
switch(n) {
case 0: return 1.0;
default: return 2.0;
}
} else {
return n;
}
}
public double getB(int n, double x) {
if (n % 2 == 0) {
return -x;
} else {
return x;
}
}
}</source>
</p>
<p>
Then, to evalute <i>e</i><sup>x</sup> for any value x, simply call any of the
<code>evalute</code> methods.
</p>
</subsection>
<subsection name="6.5 Binomial coefficients, factorials, Stirling numbers and other common math functions" href="binomial_coefficients_factorials_and_other_common_math_functions">
<p>
A collection of reusable math functions is provided in the
<a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/ArithmeticUtils.html">ArithmeticUtils</a>
utility class. ArithmeticUtils currently includes methods to compute the following: <ul>
<li>
Binomial coefficients -- "n choose k" available as an (exact) long value,
<code>binomialCoefficient(int, int)</code> for small n, k; as a double,
<code>binomialCoefficientDouble(int, int)</code> for larger values; and in
a "super-sized" version, <code>binomialCoefficientLog(int, int)</code>
that returns the natural logarithm of the value.</li>
<li>
Stirling numbers of the second kind -- S(n,k) as an exact long value
<code>stirlingS2(int, int)</code> for small n, k.</li>
<li>
Factorials -- like binomial coefficients, these are available as exact long
values, <code>factorial(int)</code>; doubles,
<code>factorialDouble(int)</code>; or logs, <code>factorialLog(int)</code>. </li>
<li>
Least common multiple and greatest common denominator functions.
</li>
</ul>
</p>
</subsection>
<subsection name="6.6 Fast mathematical functions" href="fast_math">
<p>
Apache Commons Math provides a faster, more accurate, portable alternative
to the regular <code>Math</code> and <code>StrictMath</code>classes for large
scale computation.
</p>
<p>
FastMath is a drop-in replacement for both Math and StrictMath. This
means that for any method in Math (say <code>Math.sin(x)</code> or
<code>Math.cbrt(y)</code>), user can directly change the class and use the
methods as is (using <code>FastMath.sin(x)</code> or <code>FastMath.cbrt(y)</code>
in the previous example).
</p>
<p>
FastMath speed is achieved by relying heavily on optimizing compilers to
native code present in many JVM todays and use of large tables. Precomputed
literal arrays are provided in this class to speed up load time. These
precomputed tables are used in the default configuration, to improve speed
even at first use of the class. If users prefer to compute the tables
automatically at load time, they can change a compile-time constant. This will
increase class load time at first use, but this overhead will occur only once
per run, regardless of the number of subsequent calls to computation methods.
Note that FastMath is extensively used inside Apache Commons Math, so by
calling some algorithms, the one-shot overhead when the constant is set to
false will occur regardless of the end-user calling FastMath methods directly
or not. Performance figures for a specific JVM and hardware can be evaluated by
running the FastMathTestPerformance tests in the test directory of the source
distribution.
</p>
<p>
FastMath accuracy should be mostly independent of the JVM as it relies only
on IEEE-754 basic operations and on embedded tables. Almost all operations
are accurate to about 0.5 ulp throughout the domain range. This statement, of
course is only a rough global observed behavior, it is <em>not</em> a guarantee
for <em>every</em> double numbers input (see William Kahan's <a
href="http://en.wikipedia.org/wiki/Rounding#The_table-maker.27s_dilemma">Table
Maker's Dilemma</a>).
</p>
<p>
FastMath additionally implements the following methods not found in Math/StrictMath:
<ul>
<li>asinh(double)</li>
<li>acosh(double)</li>
<li>atanh(double)</li>
<li>pow(double,int)</li>
</ul>
The following methods are found in Math/StrictMath since 1.6 only, they are
provided by FastMath even in 1.5 Java virtual machines
<ul>
<li>copySign(double, double)</li>
<li>getExponent(double)</li>
<li>nextAfter(double,double)</li>
<li>nextUp(double)</li>
<li>scalb(double, int)</li>
<li>copySign(float, float)</li>
<li>getExponent(float)</li>
<li>nextAfter(float,double)</li>
<li>nextUp(float)</li>
<li>scalb(float, int)</li>
</ul>
</p>
</subsection>
<subsection name="6.7 Miscellaneous" href="miscellaneous">
The <a href="../commons-math-docs/apidocs/org/apache/commons/math4/legacy/util/MultidimensionalCounter.html">
MultidimensionalCounter</a> is a utility class that converts a set of indices
(identifying points in a multidimensional space) to a single index (e.g. identifying
a location in a one-dimensional array.
</subsection>
</section>
</body>
</document>