On Aug 31, 2009, at 2:55 AM, Ted Dunning wrote:
I just did an exercise of implementing a faster sparse vector. In the
process, I uncovered a bunch of warts. I will be filing some Jiras
and
patches as soon as I can get to them, but here is a preview:
a) most serialization code for vectors would write vectors with null
names
out as if they had names of "". This causes grief in tests and
seems wrong.
b) the Vector/SparseVector hierarchy was oddly split out. I added a
HashVector and moved the current SparseVector into
IntDoubleMappingVector
with SparseVector remaining as an abstract class. This
unfortunately caused
lots of upheaval even up into the Vector class. I have yet to sort
this out
cleanly.
c) the squared distance functions were defined in multiple places. I
centralized these into SquaredEuclideanDistance as a static
function. These
definitions also were wrong and would ignore any components that had
opposite sign and equal magnitude. In fixing this, I went ahead and
wrote
an implementation that makes use of any sparsity present. To do
that, I
added a method to Vector so that I could tell if a vector is
sparse. This
subsumes all of the distance optimizations that we have discussed.
It also
makes it very easy for new code to use these optimizations without
knowing
about them.
d) the nonZeroIterator had to be substantially refactored to work in
an
abstract class without knowing to much about the internals of
everything.
e) in order ot make sure that all metrics worked reasonably with all
types,
I have heavily refactored the testing structure for metrics. I will
be
doing more of this as well. The goal is to test all vector types
against
all distance metrics to make sure that they give the same results as
DenseVector. Then, I will build tests for DenseVector to verify
that it
produces the correct result. This is important because so many
vectors have
special code to help metric computation.
f) I have uncovered some strangeness in the ARFF I/O code that I
introduced
with the SparseVector abstraction. The old code will work as it
did, but it
won't understand the new HashVector.
Soo....
I will be trying to break this down into as small a pieces as I can,
but the
total will be a bunch of interdependent patches. If anybody can
help me
apply these as quickly as possible, we should have minimal problems
with it
all. If it drags out, it will get hard to keep rebasing the patch
sequence
all the time.
These all sound reasonable. If you're happy w/ the changes, just put
up a big patch on an issue, give it a few days to percolate and then
commit.
--
Ted Dunning, CTO
DeepDyve
--------------------------
Grant Ingersoll
http://www.lucidimagination.com/
Search the Lucene ecosystem (Lucene/Solr/Nutch/Mahout/Tika/Droids)
using Solr/Lucene:
http://www.lucidimagination.com/search