FWIW, I like the calling pattern with the static DecompositionSolver
too...
RealVector solution =
DecompositionSolver.solve(constant, new QRDecompositionImpl(matrix));
-sujit
On Fri, 2008-12-05 at 10:37 +0100, [EMAIL PROTECTED] wrote:
> ----- "Phil Steitz" <[EMAIL PROTECTED]> a écrit :
>
>
> > Looks good. Just one last question / suggestion. In the
> > DecompositionSolver, why to we keep the argumentless decompose()
> > methods
> > and the matrix as an instance variable? The argumentless methods just
> >
> > delegate to the ones that take a matrix as an argument and the
> > instance
> > variable is otherwise unused.
> >
> > Phil
>
> This also bothers me. I tried different things and ended up with that but
> didn't feel comfortable with it. Since it was already very late, I commited
> it for review.
>
> In addition to the fact the instance field is almost not used, the calling
> code is awkward:
>
> DecompositionSolver solver = new DecompositionSolver(matrix);
> QRDecomposition decomposition = solver.qrDecompose();
> RealVector solution = solver.solve(constant, decomposition);
>
> I would prefer a one-liner. After one night sleeping, I see two better
> approaches. The first one would be to remove completely the field instance,
> the xyzDecompose methods and change all other methods (solve, isNonSingular
> ...) to static, thus making DecompositionSolver a utility class never
> instantiated. The second one would be to have a DecompositionSolver that can
> be instantiated but instead of storing the matrix, it would store a
> configuration flag specifying which decomposition algorithm to use, in this
> case, the undecomposed matrix would be passed in the solve method and
> decomposed on the fly.
>
> The first approach leads to:
> RealVector solution =
> DecompositionSolver.solve(constant, new QRDecompositionImpl(matrix));
>
> The second approach leads to:
> RealVector solution =
> new DecompositionSolver(DecompositionSolver.USE_QR).solve(constant,
> matrix);
>
> I prefer the first one. The decomposition algorithm is more explicit to users
> and they can reuse it. The second approach only advantage is if someone wants
> to configure a solver with some algorithm type once and for all and to reuse
> it several time in his code. However I think this use case is not a common
> one and it could be done by a suitable wrapper.
>
> There is also one other thing I don't really like in my current
> implementation: the overloaded methods with the four types of decomposition
> (EigenDecomposition, SingularValuesDecomposition, QRDecomposition,
> LUDecomposition). However, simplifying this would require reintroducing some
> common base interface and wrappers like this:
>
> public class Solver {
> public RealVector solve(RealVector constant) {
> ...
> }
> }
> public class QRSolver implements Solver {
> ...
> }
>
> public class DecompositionSolver {
> public RealVector solve(RealVector constant, Solver solver) {
> return solver.solve(constant);
> }
> }
>
> and we would end up with a DecompositionSolver that has no purpose at all! So
> I think it is better to stick with the four signatures types.
>
> I will therefore implement and commit today the first approach without the
> four signatures types, just to see how it looks once implemented. It is
> straightforward and could be changed afterwards if something better is found.
>
>
> Luc
>
> ---------------------------------------------------------------------
> 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]