Tree Families
| Tree | Geometry | Builder | Needs | Deterministic | Use when |
|---|---|---|---|---|---|
TwoNTree | axis-aligned boxes, $2^n$ children | TwoNTreeBuilder | — | yes | grid-like geometry; protrusion control matters (e.g. BEAST basis functions) |
BoundingBallTree | bounding balls | BoundingBallTreeBuilder | — | depends on splitter | generic clustering with a custom splitter |
KMeansTree | balls from k-means clusters | KMeansTreeBuilder | ParallelKMeans.jl | yes (seeded rng by default) | irregular point clouds without grid structure |
MetisTree | balls from graph partitions | MetisTreeBuilder | Metis.jl | yes | mesh/graph connectivity should drive clustering |
MetisForest | one MetisTree per component | MetisForestBuilder | Metis.jl | yes | disconnected geometry (e.g. multiple bodies) |
SimpleHybridTree | wraps a TwoNTree, splits upper/lower levels | SimpleHybridTreeBuilder | — | yes | different treatment above/below a chosen level |
BlockTree | a pair of trees (test + trial) | BlockTreeBuilder | — | yes | Petrov-Galerkin, test space ≠ trial space — see BlockTree and Petrov Trees |
All builders are constructed through buildtree/buildforest — see Builder Workflow.
Box vs. ball clustering
The same points, split into boxes (TwoNTree, pink) and balls (KMeansTree, blue) at the same level:
using CompScienceMeshes, PlotlyJS, BEAST
using H2Trees
using ParallelKMeans
m = meshsphere(1.0, 0.1)
boxtree = TwoNTree(lagrangecxd0(m); builder=TwoNTreeBuilder(; minhalfsize=0.1, minvalues=0))
balltree = KMeansTree(
lagrangecxd0(m); builder=KMeansTreeBuilder(; numberofclusters=4, minvalues=60)
)