<?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>Tasks: To Do</title>
  </properties>
  <body>
    <section name="Aim">
      <p>This page aims to be a handy reference of work pending for the next
      planned release.  Users who want new features should submit patches to this
      page in the unclassified section.  Developers who want to lend a hand can
      grab tasks from this page. Everyone can see the progress which is being
      made.</p>
    </section>
    <section name="TODO list">
      <p>The following is a list of items still <code>TODO</code> for Math.  
      Contributions are welcome!</p>
      <subsection name="Documentation and Code Conformance Tasks">
        <p>Many of these will always be a required. Please focus on applying
        format standards and provide as many test cases as possible for your
        code.</p>
        <dl>
          <dt>Performance and accuracy testing.</dt>
          <dd>If anyone is interested in helping out here, we could really use
           a wider selection of test cases for the core numerical functions and
           validation against either other packages (e.g. R for the statistical
           stuff), verified datasets, or experiments comparing implementions
           using floats to doubles.</dd>
          <dt>Test Coverage.</dt>
          <dd>Clover tests show some remaining gaps in test path coverage. Goal
           is to get all tests to 100% coverage.  Also improve test data and
           boundary conditions coverage.</dd>
          <dt>Code review.</dt>
          <dd>
            <p>Code review is a continuous process that all Contributors and
             Developers should practice while working on the code base.</p>
            <ul>
              <li>Verify that the code matches the documentation and identify
               inefficiencies or numerical problems.  All feedback/suggestions
               for improvement/patches are welcome.</li>
            </ul>
          </dd>
        </dl>
      </subsection>
    </section>
    <section name="Future Goals">
      <subsection name="Delayed Tasks slated for the next release of the Math library">
      <dl> 
        <dt>Statistics</dt>
          <dd>
            <ul>
              <li>More inference methods</li>
              <li>Multiple regression</li>
            </ul>
          </dd> 
          <dt>Linear Algebra</dt>
          <dd>
            <ul>
              <li>More matrix decompositions (Cholesky, QR, SVD) and framework
               to support.</li>
              <li>Sparse matrices</li>
            </ul>
          </dd> 
        </dl> 
      </subsection>
    </section>
  </body>
</document>
