<?xml version="1.0"?>

<!--
   Copyright 2003-2004 The Apache Software Foundation

   Licensed 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.
  -->
  
<?xml-stylesheet type="text/xsl" href="xdoc.xsl"?>
<!-- $Revision$ $Date$ -->
<document>

  <properties>
    <title>Proposal for math Package</title>
    <author email="martin@mvdb.net">Robert Burrell Donkin</author>
  </properties>

    <body>

    <section name='Proposal for math Package'>

    <subsection name='(0) Rationale'>
<p>The Java programming language and the math extensions in commons-lang provide implementations 
for only the most basic mathematical algorithms. Routine development tasks such as computing 
basic statistics or solving a system of linear equations require components not available in java 
or commons-lang.</p>

<p>Most basic mathematical or statistical algorithms are available in open source implementations, 
but to assemble a simple set of capabilities one has to use multiple libraries, many of which have 
more restrictive licensing terms than the ASF. In addition, many of the best open source 
implementations (e.g. the R statistical package) are either not available in Java or require large 
support libraries and/or external dependencies to work.</p>

<p>A commons-math community will provide a productive environment for aggregation, testing and 
support of efficient Java implementations of commonly used mathematical and statistical algorithms.</p>

    </subsection>

    <subsection name='(1) Scope of the Package'>

<p>The Math project shall create and maintain a library of lightweight, self-contained mathematics 
and statistics components addressing the most common practical problems not immediately available in 
the Java programming language or commons-lang. The guiding principles for commons-math will be:

<ol>
<li>Real-world application use cases determine priority</li>
<li>Emphasis on small, easily integrated components rather than large libraries with complex 
dependencies</li>
<li>All algorithms are fully documented and follow generally accepted best practices</li>
<li>In situations where multiple standard algorithms exist, use the Strategy pattern to support 
multiple implementations</li>
<li>Limited dependencies. No external dependencies beyond Commons components and the JDK</li>
</ol>
</p>
    </subsection>
    
    <subsection name='(1.5) Interaction With Other Packages'>

<p><em>math</em> relies only on standard JDK 1.2 (or later) APIs for
production deployment.  It utilizes the JUnit unit testing framework for
developing and executing unit tests, but this is of interest only to
developers of the component.</p>

<p>No external configuration files are utilized.</p>

    </subsection>
    <subsection name='(2) Initial Source of the Package'>

<p>The initial codebase will consist of implementations of basic statistical algorithms such 
as the following:
<ul>
<li>Simple univariate statistics (mean, standard deviation, n, confidence intervals)</li>
<li>Frequency distributions</li>
<li>t-test, chi-square test</li>
<li>Random numbers from Gaussian, Exponential, Poisson distributions</li>
<li>Random sampling/resampling</li>
<li>Bivariate regression, corellation</li>
</ul>

and mathematical algorithms such as the following:
<ul>
<li>Basic Complex Number representation with algebraic operations</li>
<li>Newton's method for finding roots</li>
<li>Binomial coefficients</li>
<li>Exponential growth and decay (set up for financial applications)</li>
<li>Polynomial Interpolation (curve fitting)</li>
<li>Basic Matrix representation with algebraic operations</li>
</ul>
</p>

<p>The proposed package name for the new component is
<code>org.apache.commons.math</code>.</p>

    </subsection>
    <subsection name='(3)  Required Jakarta-Commons Resources'>

<ul>
<li>CVS Repository - New directory <code>math</code> in the
    <code>jakarta-commons</code> CVS repository.</li>
<li>Mailing List - Discussions will take place on the general
    <em>commons-dev@jakarta.apache.org</em> mailing list.  To help
    list subscribers identify messages of interest, it is suggested that
    the message subject of messages about this component be prefixed with
    [math].</li>
<li>Bugzilla - New component "math" under the "Commons" product
    category, with appropriate version identifiers as needed.</li>
<li>Jyve FAQ - New category "commons-math" (when available).</li>
</ul>

    </subsection>
    <subsection name='(4) Initial Committers'>

<p>The initial committers on the math component shall be:
<ul>
  <li><a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a></li>
  <li><a href="mailto:tobrien@apache.org">Tim O'Brien</a></li>
</ul>
</p>
    </subsection>
    </section>
    </body>
</document>
