Le 11/05/11 06:34, Phil Steitz a écrit :
On 5/10/11 9:18 PM, Sébastien Brisard wrote:
Great!
So we are more or less back to my initial proposition (see
corresponding wiki).
To sum up, we will define a new interface, called LinearOperator
(should we make it RealLinearOperator? That would be consistent
with the hierarchy AnyMatrix/RealMatrix), with the following methods
LinearOperator
   +- void operate(double[] x, double[] y)
   +- int getDomainDimension()
   +- int getCodomainDimension()

NOTA: I thought that operate(x, y) should *not* create the vector
y = A.x, in order to avoid memory allocations for very large data
sets. Is it a good idea?
Why, exactly?  The memory has to get allocated at some point anyway
- either when you create the vector to pass in or when the operator
creates its output.  I think it is more natural and consistent with
the rest of [math] to represent it as it is: double[]
operate(double[x]).  It is probably best to also have a version that
operates on and returns RealVectors.  In answer to the name question
above, yes, it should probably be called RealLinearOperator.  If we
ever have need for a more general linear operator that works on
Complex or other vectors, we can define a base LinearOperator that
operates on FieldVectors (resp FieldElement[]).
This allows reusing previously allocated vectors. I'm using these solvers with large data sets (eg tomography), and I'm worried about the GC being too heavily sollicitated if I keep allocating new vectors. For example, each iteration of the iterative solver calls operate(x, y). If we had it create a new vector, then a new double[1024*1024] (say) would be allocated at the begining of the iteration, and garbage collected at the end. Although I've never done any monitoring, I feel that it's not very efficient. Am I wrong? I might well be, because the GC seems to be such a clever piece of work... I actually would like to have some time to do some proper monitoring on this issue...

Some people go for the mixed solution
double[] operate(double[] x, double[] y)
which actually returns y! This allows chaining calls, but I think this is HORRIBLE, and leads to error prone code, so I personally gave up on chaining calls.

As for operating on RealVectors, you're right, I'll do that.
Regarding exceptions, we would have two new exceptions
NonAdjointLinearOperator
   +- double[] getFirstOffendingVector()
   +- double[] getSecondOffendingVector()
   +- double getThreshold()

NonPositiveDefiniteLinearMapException
   +- double[] getOffendingVector()
   +- double getThreshold()

Since LinearOperator no longer extends AnyMatrix (or any daughter
classes), I no longer feel the need to create a base exception
from which NonAdjointLinearOperator and NonSymmetricMatrix would
be derived. What do you think? Same goes to NonPositiveDefinite
LinearMap/Matrix.
+1, but for consistency, maybe in the second exception name,
s/Map/Operator
My mistake... Of course, it will be LinearOperator.
Thanks for this very constructive discussion. I now need to work
on my code before I can submit it.
Thanks!

Phil
Best regards,
Sebastien


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to