| <?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> |
| <properties> |
| <title>Developers Guide</title> |
| </properties> |
| |
| <body> |
| <section name="Aims"> |
| <p> |
| Creating and maintaining a mathematical and statistical library that is |
| accurate requires a greater degree of communication than might be the |
| case for other components. It is important that developers follow |
| guidelines laid down by the community to ensure that the code they create |
| can be successfully maintained by others. |
| </p> |
| </section> |
| <section name='Guidelines'> |
| <p> |
| Developers are asked to comply with the following development guidelines. |
| Code that does not comply with the guidelines including the word <i>must</i> |
| will not be committed. Our aim will be to fix all of the exceptions to the |
| "<i>should</i>" guidelines prior to a release. |
| </p> |
| <subsection name="Contributing"> |
| <p><strong>Getting Started</strong></p> |
| <p> |
| <ol> |
| <li>Start by reviewing the overall objectives stated in the |
| <a href="proposal.html">proposal</a> upon which the project is |
| founded. |
| </li> |
| <li>Download the Commons Math source code. Follow the instructions |
| under the heading "Repository Checkout" on the |
| <a href="https://gitbox.apache.org/">Git at the ASF page</a>. |
| The git url for the current development sources of Commons Math |
| is <source>http://gitbox.apache.org/repos/asf/commons-math.git</source> |
| for anonymous read-only access and |
| <source>https://apacheid@gitbox.apache.org/repos/asf/commons-math.git</source> |
| (where apacheid should be replaced by each committer Apache ID) for committers |
| read-write access. |
| </li> |
| <li>Like most commons components, Commons Math uses Apache Maven as our |
| build tool. The sources can also be built using Ant (a working |
| Ant build.xml is included in the top level project directory). |
| To build Commons Math using Maven, you can follow the instructions for |
| <a href="http://maven.apache.org/run-maven/index.html">Building a |
| project with Maven</a>. Launch Maven from the top-level directory |
| in the checkout of Commons Math trunk. No special setup is required, |
| except that currently to build the site (i.e. to execute Maven's |
| "site" goal), you may need to increase the default memory allocation |
| (e.g. <code>export MAVEN_OPTS=-Xmx512m</code>) before launching |
| Maven. |
| </li> |
| <li>Have a look at the new features that users and developers have requested |
| on the <a href="http://wiki.apache.org/commons/MathWishList"> |
| Math Wish List Wiki Page.</a> |
| </li> |
| <li>Be sure to join the commons-dev and commons-user |
| <a href="mail-lists.html"> |
| email lists</a> and use them appropriately (make sure the string |
| "[math]" starts the Subject line of all your postings). |
| Make any proposals here where the group can comment on them. |
| </li> |
| <li> |
| <a href="https://issues.apache.org/jira/secure/Signup!default.jspa"> |
| Setup an account on JIRA</a> and use it to submit patches and |
| identify bugs. Read the |
| <a href="https://issues.apache.org/bugwritinghelp.html"> |
| directions</a> for submitting bugs and search the database to |
| determine if an issue exists or has already been dealt with. |
| <p> |
| See the <a href="http://commons.apache.org/math/issue-tracking.html"> |
| Commons Math Issue Tracking Page</a> for more information on how to |
| search for or submit bugs or enhancement requests. |
| </p> |
| <li> |
| Generating patches: The requested format for generating patches is |
| the Unified Diff format, which can be easily generated using the git |
| client or various IDEs. |
| <source>git diff -p > patch </source> |
| Run this command from the top-level project directory (where pom.xml |
| resides). |
| </li> |
| </li> |
| </ol> |
| </p> |
| <p><strong>Contributing ideas and code</strong></p> |
| <p> |
| Follow the steps below when making suggestions for additions or |
| enhancements to Commons Math. This will make it easier for the community |
| to comment on your ideas and for the committers to keep track of them. |
| Thanks in advance! |
| <ol> |
| <li>Start with a post to the commons-dev mailing list, with [math] at |
| the beginning of the subject line, followed by a good, short title |
| describing the new feature or enhancement. For example, "[math] |
| Principal Components Analysis." The body of the post should include each |
| of the following items (but be <strong>as brief as possible</strong>): |
| <ul> |
| <li>A concise description of the new feature / enhancement</li> |
| <li>References to definitions and algorithms. Using standard |
| definitions and algorithms makes communication much easier and will |
| greatly increase the chances that we will accept the code / idea</li> |
| <li>Some indication of why the addition / enhancement is practically |
| useful</li> |
| </ul></li> |
| <li>Assuming a generally favorable response to the idea on commons-dev, |
| the next step is to add an entry to the |
| <a href="http://wiki.apache.org/commons/MathWishList">Math Wish |
| List</a> corresponding to the idea. Include a reference to the |
| discussion thread. </li> |
| <li>Create a JIRA ticket using the the feature title as the short |
| description. Incorporate feedback from the initial posting in the |
| description. Add a reference to the JIRA ticket to the WishList entry. |
| </li> |
| <li>Submit code as attachments to the JIRA ticket. Please use one |
| ticket for each feature, adding multiple patches to the ticket |
| as necessary. Use the git diff command to generate your patches as |
| diffs. Please do not submit modified copies of existing java files. Be |
| patient (but not <strong>too</strong> patient) with committers reviewing |
| patches. Post a *nudge* message to commons-dev with a reference to the |
| ticket if a patch goes more than a few days with no comment or commit. |
| </li> |
| </ol> |
| </p> |
| </subsection> |
| <subsection name='Coding Style'> |
| <p> |
| Commons Math follows <a href="http://java.sun.com/docs/codeconv/">Code |
| Conventions for the Java Programming Language</a>. As part of the maven |
| build process, style checking is performed using the Checkstyle plugin, |
| using the properties specified in <code>checkstyle.xml</code>. |
| Committed code <i>should</i> generate no Checkstyle errors. One thing |
| that Checkstyle will complain about is tabs included in the source code. |
| Please make sure to set your IDE or editor to use spaces instead of tabs. |
| </p> |
| <p> |
| Committers should configure the <source>user.name</source>, |
| <source>user.email</source> and <source>core.autocrlf</source> |
| git repository or global settings with <source>git config</source>. |
| The first two settings define the identity and mail of the committer. |
| The third setting deals with line endings to achieve consistency |
| in line endings. Windows users should configure this setting to |
| <source>true</source> (thus forcing git to convert CR/LF line endings |
| in the workspace while maintaining LF only line endings in the repository) |
| while OS X and Linux users should configure it to <source>input</source> |
| (thus forcing git to only strip accidental CR/LF when committing into |
| the repository, but never when cheking out files from the repository). See <a |
| href="http://www.git-scm.com/book/en/Customizing-Git-Git-Configuration">Customizing |
| Git - Git Configuration</a> in the git book for explanation about how to |
| configure these settings and more. |
| </p> |
| </subsection> |
| <subsection name='Documentation'> |
| <ul> |
| <li> |
| Committed code <i>must</i> include full javadoc.</li> |
| <li> |
| All component contracts <i>must</i> be fully specified in the javadoc class, |
| interface or method comments, including specification of acceptable ranges |
| of values, exceptions or special return values.</li> |
| <li> |
| External references or full statements of definitions for all mathematical |
| terms used in component documentation <i>must</i> be provided.</li> |
| <li> |
| Commons math javadoc generation now supports embedded LaTeX formulas via the |
| <a href="http://www.mathjax.org">MathJax</a> javascript display engine. To |
| embed mathematical expressions formatted in LaTeX in javadoc, simply surround |
| the expression to be formatted with either <source>\( ... \)</source> for inline |
| formulas, or <source>\[ ... \]</source> to have the formula appear on a separate line. |
| For example, <source>\(a^2 + b^2 = c^2\)</source> will render an inline formula |
| saying that (a, b, c) is Pythagorean triplet: \( a^2 + b^2 = c^2 \). |
| See the MathJax and LaTex documentation for details on how to represent |
| formulas and escape special characters.</li> |
| <li> |
| Implementations <i>should</i> use standard algorithms and |
| references or full descriptions of all algorithms <i>should</i> be |
| provided.</li> |
| <li> |
| Additions and enhancements <i>should</i> include updates to the User |
| Guide.</li> |
| </ul> |
| </subsection> |
| <subsection name='Exceptions'> |
| <ul> |
| <li> |
| Exceptions generated by Commons Math are all unchecked.</li> |
| <li> |
| All public methods advertise all exceptions that they can generate. |
| Exceptions <i>must</i> be documented in both javadoc and method signatures |
| and the documentation in the javadoc <i>must</i> include full description |
| of the conditions under which exceptions are thrown.</li> |
| <li> |
| Methods <i>should</i> fully specify parameter preconditions required for |
| successful activation. When preconditions are violated, a |
| MathIllegalArgumentException should be thrown. Subclasses of |
| MathIllegalArgumentException may be used to represent common parameter |
| contract violations (for example, NoBracketingException). Exception |
| messages <i>must</i> contain sufficient information on parameter values to |
| determine the exact precondition failure.</li> |
| <li> |
| Exceptions generated by Commons Math make sense without knowing |
| implementation details other than those stated in the public API. |
| For example, a NoBracketingException makes sense thrown by a solver that |
| has a precondition requiring that initial points bracket a root. This |
| exception does not make sense, however, thrown by an inverse cumulative |
| probability estimator.</li> |
| <li> |
| MathIllegalArgumentException should only be thrown in situations |
| where preconditions can be exhaustively provided so that what arguments |
| are "illegal" can be specified fully to the caller. Domain-specific |
| exceptions need to be defined for cases where failures cannot be |
| attributed to parameter precondition violation. For example, the exact |
| domain of successful activation of a solver or quadrature method may be |
| impossible to specify because of numerical properties of the method. |
| If a solver fails to find a root or a quadrature method fails to converge |
| for a given set of parameters, <i>unless those parameters violate the |
| advertised preconditions</i> it is not appropriate to throw |
| MathIllegalArgumentException.</li> |
| <li> |
| State information included in exception messages <i>must</i> be available |
| in exception properties - i.e., successful handling or reporting of |
| Commons Math exceptions must not require parsing exception messages.</li> |
| </ul> |
| </subsection> |
| <subsection name='Unit Tests'> |
| <ul> |
| <li> |
| Committed code <i>must</i> include unit tests.</li> |
| <li> |
| Unit tests <i>should</i> provide full path coverage. </li> |
| <li> |
| Unit tests <i>should</i> verify all boundary conditions specified in |
| interface contracts, including verification that exceptions are thrown or |
| special values (e.g. Double.NaN, Double.Infinity) are returned as |
| expected. </li> |
| </ul> |
| </subsection> |
| <subsection name='Licensing and copyright'> |
| <ul> |
| <li> |
| All new source file submissions <i>must</i> include the Apache Software |
| License in a comment that begins the file </li> |
| <li> |
| All contributions must comply with the terms of the Apache |
| <a href="http://www.apache.org/licenses/cla.pdf">Contributor License |
| Agreement (CLA)</a></li> |
| <li> |
| Patches <i>must</i> be accompanied by a clear reference to a "source" |
| - if code has been "ported" from another language, clearly state the |
| source of the original implementation. If the "expression" of a given |
| algorithm is derivative, please note the original source (textbook, |
| paper, etc.).</li> |
| <li> |
| References to source materials covered by restrictive proprietary |
| licenses should be avoided. In particular, contributions should not |
| implement or include references to algorithms in |
| <a href="http://www.nr.com/">Numerical Recipes (NR)</a>. |
| Any questions about copyright or patent issues should be raised on |
| the commons-dev mailing list before contributing or committing code. |
| </li> |
| </ul> |
| </subsection> |
| </section> |
| <section name='Recommended Readings'> |
| <p> |
| Here is a list of relevant materials. Much of the discussion surrounding |
| the development of this component will refer to the various sources |
| listed below, and frequently the Javadoc for a particular class or |
| interface will link to a definition contained in these documents. |
| </p> |
| <subsection name='Recommended Readings'> |
| <dl> |
| <dt>Concerning floating point arithmetic.</dt> |
| <dd> |
| <a href="http://www.validlab.com/goldberg/paper.pdf"> |
| http://www.validlab.com/goldberg/paper.pdf |
| </a><br/> |
| <a href="http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF"> |
| http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF |
| </a><br/> |
| <a href="http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf"> |
| http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf |
| </a><br/> |
| </dd> |
| <dt>Numerical analysis</dt> |
| <dd> |
| <a href="http://www.mathcom.com/corpdir/techinfo.mdir/scifaq/index.html"> |
| Scientific Computing FAQ @ Mathcom |
| </a><br/> |
| <a href="http://www.ma.man.ac.uk/~higham/asna/asna2.pdf"> |
| Bibliography of accuracy and stability of numerical algorithms |
| </a><br/> |
| <a href="http://tonic.physics.sunysb.edu/docs/num_meth.html"> |
| SUNY Stony Brook numerical methods page |
| </a><br/> |
| <a href="http://epubs.siam.org/sam-bin/dbq/toclist/SINUM"> |
| SIAM Journal of Numerical Analysis Online |
| </a><br/> |
| </dd> |
| <dt>Probability and statistics</dt> |
| <dd> |
| <a href="http://lib.stat.cmu.edu/"> |
| Statlib at CMU |
| </a><br/> |
| <a href="http://www.itl.nist.gov/div898/handbook/"> |
| NIST Engineering Statistics Handbook |
| </a><br/> |
| <a href="http://www.psychstat.smsu.edu/sbk00.htm"> |
| Online Introductory Statistics (David W. Stockburger) |
| </a><br/> |
| <a href="http://www.jstatsoft.org/"> |
| Online Journal of Statistical Software |
| </a><br/> |
| </dd> |
| </dl> |
| </subsection> |
| <subsection name='Javadoc comment resources'> |
| <dl> |
| <dt>References for mathematical definitions.</dt> |
| <dd> |
| <a href="http://rd11.web.cern.ch/RD11/rkb/titleA.html"> |
| http://rd11.web.cern.ch/RD11/rkb/titleA.html |
| </a><br/> |
| <a href="http://mathworld.wolfram.com/"> |
| http://mathworld.wolfram.com/ |
| </a><br/> |
| <a href="http://www.itl.nist.gov/div898/handbook"> |
| http://www.itl.nist.gov/div898/handbook |
| </a><br/> |
| <a href="http://doi.acm.org/10.1145/359146.359152"> |
| Chan, T. F. and J. G. Lewis 1979, <i>Communications of the ACM</i>, |
| vol. 22 no. 9, pp. 526-531. |
| </a><br/> |
| </dd> |
| </dl> |
| </subsection> |
| <subsection name='XML'> |
| <dl> |
| <dt>XML related resources.</dt> |
| <dd> |
| <a href="http://www.openmath.org"> |
| http://www.openmath.org |
| </a><br/> |
| </dd> |
| </dl> |
| </subsection> |
| </section> |
| </body> |
| </document> |