On 21/05/2009, Luc Maisonobe <luc.maison...@free.fr> wrote: > Sam Halliday a écrit : > > > Bill, I've had a look at some of the recent changes... some comments, > > including some new thoughts:- > > > > - changing the return type to be actual classes was only supposed to be for > > copy() for 2.0. Doing this on multiply, add, etc is a big mistake... there > > is no guarantee that is the best thing to do and it is likely this will > > change in the future. This stands for all implementations. Great thought > > needs to go into each method, not just by reading the current > > implementation. > > > It may help the compiler using directly the optimized versions in > statements like: > > m1.add(m2.multiply(m3.subtract(m4)) > > > > > > - I *strongly* urge you to remove Serializable from everything! Please, we > > did this in MTJ and it turned out to be a major pain. A more appropriate > > approach is to define a class for reading/writing Matrix Market files. This > > can be a new feature in 2.1. If you're going to leave it, at least document > > that the Serializable form is not guaranteed to remain compatible across > > versions. > > > I disagree with and I think its me who started adding this interface > everywhere. The rationale is explained in the following use case: > > As a user, I want to implement an interface for some xyz library where > the interface already extends Serializable. In my implementation, I want > to have an instance field that is some RealMatrix. If RealMatrix does > not declare it extends Serializable, I keep getting warnings about > having a non-serializable field in a serializable class. Looking the > other way round having serializable and not using it never caused me any > pain because it was really a generalized pattern. Mixing serializable > and non serializable is difficult, putting it everywhere and sticking to > this policy is simple.
One can use the "transient" marker for non-serializable fields. Merely implementing Serializable will prevent the warnings, however in general it's not trivial to ensure that serialization works correctly. > What kind of pain did Serializable cause in MTJ ? > > BTW, I'm really +1 to Matrix Market files, could you open a Jira issue > asking for this enhancement for 2.1 ? > > > > > > - I discourage the use of the classes named *Impl. They will get very > > confusing when other implementations are added later! Instead, I recommend > > the names ArrayRealVector, Array2DRowRealMatrix (to indicate a 2D array > > backed implementation using row ordering). This allows a column-based or 1D > > implementation in the future without names getting very confusing. These > > implementations are hidden from users who just use the MatrixUtils help > > > Phil suggested to change RealMatrixImpl to ArrayRealMatrix (and > DenseRealMatrix to BlockRealMatrix). This sounds good to me. > > > > > > - -1 for inclusion of methods in the sparse interfaces and shape type enum. > > This needs more thought and discussion before inclusion. I am happy enough > > for marker interfaces to be included (as long as it is documented that > these > > interfaces are subject to update in the next release), but strongly against > > including methods in them. > > > +1 to further thoughts and discussion and postponing declaring methods > in the interfaces after 2.0. Lets start with empty marker interfaces. > > > Luc > > > > > > - could you please describe the hashing algorithm that OpenMap is using? I > > have previously written a GNU Trove based sparse matrix implementation > which > > was a map from the primitive "long" to "double". It looks analagous. I > broke > > the row/column index into a long for the key using binary operations, but > > the hashcode was tricky as it had to be an integer (not long). A naive > > implementation can lead to collisions for typical or symmetric matrices. It > > looks like the current implementation is using an int -> double backing > map! > > Wouldn't it make more sense to use a long? > > > > The following code might be useful to you (don't forget the L marker and > > casts or the compiler will silently cast to an int), there are two options > > for a hashcode calculator... I've not stress tested the second one but it > > might be more appropriate as it gives more weight to lower bits. Remember > > that FF is 256, or a full byte... so a full 64 bit long is 8 bytes or 16 > hex > > characters in Java bitwise. > > > > int hash1(long val) { > > int first = Integer.reverse(key2row(val)); > > int second = key2col(val); > > return first + second; > > } > > > > int hash2(long val) { > > int first = key2row(val) & 0x0000FFFF; > > int second = key2col(val) << 16; > > return first + second; > > } > > > > long key(int row, int column) { > > return (((long) row) << 32) + (long) column; > > } > > > > int key2col(long key) { > > return (int) (key & 0x00000000FFFFFFFFL); > > } > > > > int key2row(long key) { > > return (int) (key >>> 32); > > } > > > > > > Bill Barker wrote: > >> I have a slight preference for leaving the markers empty until 3.0, but I > >> can remove them as well. But I can wait to see what the community > >> consensus > >> is before making changes. > >> > > > > > > --------------------------------------------------------------------- > 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