Very brief README on the BallTree and BallTreeDensity classes ============================================================= Really, these should be called "KDTree" classes, since we use bounding boxes rather than spheres (balls), but I've never changed the name. A KD-Tree is a heirarchical data structure for storing point sets, which caches statistics of subsets of the points to speed up computations. We are concerned with kernel density estimates, which have three components: locations (d-dimensional) bandwidths, assumed diagonal (d-dimensional) weights (1-dimensional) At each level of the tree, we cache statistics of a set S The weighted mean of all points in S The total weight of all points in S A bounding box containing all points of S, described by its center and half-width (in each dimension) "Bandwidth" info: The variance of a Gaussian approximation to the kernels in S The min. and max. BW of any kernel in S (if non-uniform BWs) All points in S are stored contiguously, and thus can be described by a lower & upper index in the leaf nodes of the tree Because they are now spatially contiguous, there is a permutation to restore their original ordering, which is stored in the structure. The left & right child nodes, typically each containing about half the points in S. For leaf nodes, "left" is a self-reference to the same node and "right" is NO_CHILD. The code itself uses branch-and-bound style computations to perform approximate and exact operations more efficiently.