From 32a996285b12f05ac112852841cafe61718cbdb0 Mon Sep 17 00:00:00 2001 From: Oliver Kennedy Date: Thu, 21 Mar 2024 17:04:16 -0400 Subject: [PATCH] WIP on spatial indexes --- .../mimirdb/pip/index/SimilarityIndex.scala | 0 lib/src/org/mimirdb/pip/lib/KDTree.scala | 77 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 lib/src/org/mimirdb/pip/index/SimilarityIndex.scala create mode 100644 lib/src/org/mimirdb/pip/lib/KDTree.scala diff --git a/lib/src/org/mimirdb/pip/index/SimilarityIndex.scala b/lib/src/org/mimirdb/pip/index/SimilarityIndex.scala new file mode 100644 index 0000000..e69de29 diff --git a/lib/src/org/mimirdb/pip/lib/KDTree.scala b/lib/src/org/mimirdb/pip/lib/KDTree.scala new file mode 100644 index 0000000..6c2c53c --- /dev/null +++ b/lib/src/org/mimirdb/pip/lib/KDTree.scala @@ -0,0 +1,77 @@ +package org.mimirdb.pip.lib + +class KDTree[I: Ordered, V](dimensions: Int) +{ + type Key = Array[I] + var root: Option[Node] = None + + def insert(position: Key, value: V): Unit = + { + assert(position.size == dimensions) + root = root match { + case Some(node) => node.insert(position, value) + case None => Leaf(position, value, 0) + } + } + + + sealed trait Node + { + def insert(position: Key, value: V): Node + } + + class Inner( + split: I, + idx: Int, + var left: Option[Node] = None, + var right: Option[Node] = None + ) + { + + def insert(position: Key, value: V): Node = + { + if(position(idx).compare(split) >= 0){ + // position(idx) >= split + if(right.isEmpty){ + right = Some(Leaf(position, value, idx+1 % dimensions)) + } else { + right = Some(right.get.insert(position, value)) + } + } else { + // position(idx) < split + if(left.isEmpty){ + left = Some(Leaf(position, value, idx+1 % dimensions)) + } else { + left = Some(left.get.insert(position, value)) + } + + } + return this + } + } + + + class Leaf(position: Key, value: V, idx: Int) + { + def insert(otherPosition: Key, otherValue: V): Node = + { + if(position(idx).compare(otherPosition(idx)) >= 0){ + Inner( + split = position(idx), + idx = idx, + left = Some(Leaf(otherPosition, otherValue, idx+1 % dimensions)), + right = Some(copy(idx = idx+1 % dimensions)), + ) + } else { + Inner( + split = otherPosition(idx), + idx = idx, + left = Some(copy(idx = idx+1 % dimensions)), + right = Some(Leaf(otherPosition, otherValue, idx+1 % dimensions)), + ) + } + } + } + + +}