Phil Steitz a écrit :
On Feb 12, 2008 7:25 PM, Michael Heuer <[EMAIL PROTECTED]> wrote:
On Sun, 10 Feb 2008, Phil Steitz wrote:

The zips / tars are here:
http://people.apache.org/~psteitz/math-1.2-RC1/

The site included in the binary distro is here:
http://people.apache.org/~psteitz/math-1.2-RC1/docs/

Release notes:
http://people.apache.org/~psteitz/math-1.2-RC1/RELEASE-NOTES.txt

Ant, Maven 1 and Maven 2 builds should all work from the unpacked
source distribution.
Comments / suggestions for improvement welcome!

Phil
A few comments for consideration:

Thanks, Michael!

Thanks Michael! We're happy to see such deep analysis.

Null parameter checks are not consistent.

Some classes throw NPE (PolynomialFunction, Complex, ComplexUtils,
RealMatrixImpl, MatrixUtils, etc.)

Some classes throw IAE (UnivariateRealSolverUtils,
StorelessUnivariateStatistic, StatUtils, etc.)

Many classes do neither (AbstractEstimator, GaussNewtonEstimator,
LevenbergMarquardEstimator, Rotation, RotationOrder, BigMatrix,
BigMatrixImpl, QRDecompositionImpl, RealMatrix, RealMatrixImpl,
AbstractStepInterpolator, DirectSearchOptimizer,
CorrelatedRandomVectorGenerator, EmpiricalDistribution,
EmpiricalDistributionImpl, RandomData, RandomDataImpl,
UncorrelatedRandomVectorGenerator, VectorialCovariance, VectorialMean,
etc.)

e.g. EmpiricalDistributionImpl.StreamDataAdapter ctr is especially
problematic since NPE wouldn't be thrown until later, when either
computeBinStats or computeStats was called


Patches welcome on the last one.  The others need to be looked at and
discussed individually if we want to change behavior and API
documentation.  Javadoc patches welcome.


As far as I know, the only place where NPE is explicitely thrown is in Complex.pow. All other references to NPE I found in the src/java/**/*.java file are only in the javadoc comments. They do not correspond to checks performed at [math] level. This seems quite reasonable to me.

The case for IllegalArgumentException being thrown for null parameters is different and must be addressed on a case by case basis. I agree this is inconsistent, so we should either still perform the check and throw the exception ourselves (just like Complex.pow does) or let the JVM throw the exception automatically and not specify it in the javadoc. However, this would be an API change and cannot be done in 1.2. We have to wait for 2.0 for such changes.

Could you open a JIRA ticket with an objective fix set to 2.0 for this issue ?



complex

Complex and ComplexFormat could be final

Not a good idea at this time, IMO.

This would break compatibility. Once again, wait for 2.0. This is the same sort of problem we encountered with the TOO_SMALL fields in the matrix classes and which we cannot fix now for compatibility sake.


estimation

AbstractEstimator has several protected fields and public methods that
are not final

Here again,  -1 on making these final.

There are no compatibility issues here since this class is new in [math]. The maxCostEval and costEvaluations fields should be private and the corresponding accessors should be final (they are public). Im am +1 on these two.

I'm not really sure about other fields and methods. Having private fields and protected final accessors seems unnecessary verbose to me. Those fields are really useful to the implementation classes and they can change depending on the way the user calls the library (I sometime use solvers in a loop and change the settings, sometimes even changing the number of parameters or measurements between iterations).


SimpleEstimationProblem ArrayList unbound --> List unbound
SimpleEstimationProblem fields private ArrayList --> private final List

Sounds reasonable.  Any problems with these changes, Luc?

Why not ? Neither ArrayList nor List appear anywhere on the public interface, this is really an implementation detail. If you prefer using List, go ahead.

Declaring the fields to be final is a good idea.


fraction

Fraction and FractionFormat could be final

-1 for 1.2 at least.

I don't understand. [math] is a quite low level library, so we really cannot know how it will be used and if users won't need to extends the classes we propose.

The FractionFormat could be guaranteed to be immutable and the two format fields could be made final in 2.0, though.


geometry

Rotation minor javadoc fix "if axis norm is null" vs if (norm == 0) { ... }

Patch welcome.

Good catch ! This appears at several places and should also be changed in the exception error messages.


the API of Vector3D should be similar to RealMatrix/BigMatrix and
follow the same implementation pattern

Good point, but I am OK with the inconsistency and I suspect Luc and
migrating Mantissa users would rather keep this as is.  Luc?

This API is quite consistent as is, the getNorm(), add()and subtract() methods are similar to the methods with the same names in the linear package. The multiply(double) method is similar to the scalarMultiply(double) method and has a name inconsistency. The other methods are specific to this class.

If you consider changing multiply() to scalarMultiply() would bring a more consistent package, then go for it, it is the right to do this before we release the class in [math] for the first time. This is a small change with regard to the package changes mantissa users will have to do. If you want more important changes like removing some methods like add and subtract with factor and vector, or generalizing the class to any dimension or replacing the getX()/getY()/getZ() by getEntry(index), then I would strongly argue against it.



linear

BigMatrixImpl minor javadoc fix (data vs. d parameter name)
RealMatrixImpl minor javadoc fix (data vs. d parameter name)

Patch welcome

ode

AbstractStepInterpolator has several methods that are protected and
modify private state or that are public and not final

Comments on this, Luc?

The only private parts of the state are the finalized and forward boolean fields. They are modified by the protected constructors and reinitialize (which acts as a disguised constructor called as part of the prototype design pattern used in Runge-Kutta and embedded Runge-Kutta implementations). The finalized field is also modified by the public finalizeStep method which is final. All of this is intentional. The weirdest thing is the prototype design pattern and the reinitialize method, but I didn't find a clean way to do what I wanted.

What do you suggest here and for which fields ?


optimization

method name change, DirectSearchOptimizer.minimizes(... --> minimize(...

Personally +1 on this change, but again need to think about Mantissa users.

You are right, and it is also a small change for Mantissa users, go ahead.


random

refactor the decomposition in CorrelatedRandomVectorGenerator to a
separate class in linear package

+1 but this is a little work.  Could wait for 2.0, though this amounts
to release-with-intention-to-deprecate.

I agree this slightly modified Cholesky decomposition may be useful elsewhere, taking care of clashes with regular Cholesky decomposition. Here, we add permutations and a stop condition on small vectors to handle rank-deficient matrices (i.e. matrices that are only semi-definite positive, not definite positive).

This could wait for 2.0 as a new feature with more bells and whistles. There is no need to deprecate anything as it is a private method modifying a private field.


ValueServer replace static ints with typesafe enum, minor javadoc fixes
(periods at end of sentences, etc.);

Patches welcome

 >candidate for its own package, with
interface and multiple implementations

Can do this in 2.0.

transform

better documentation as to difference between transform and transform2
and between inversetransform and inversetransform2
method name change, inversetransform --> inverseTransform
method name change, inversetransform2 --> inverseTransform2

+1 on these.  Any objections, Luc?

No problem.

Luc

util

DefaultTransformer, NumberTransformer, TransformerMap not related to the
transform package desipe their names, better to delegate to
commons-convert? (or possibly use a similar pattern, e.g.
DoubleToStringConversion)

These should be deprecated.
For "later":

Generify matrix API
Package interfaces and implementation classes separately

+1 for 2.0
I realize that some of these cannot happen in a 1.2 release because of
API compatibility.  I can provide patches for the others if desired.


Thanks again for the review and feedback and thanks in advance for patches.

Phil

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to