From 4d09dc3b8a2128a67c174ab4caab5de590d4cff9 Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Mon, 7 Sep 2020 15:53:14 +0200
Subject: [PATCH] Experimental VectorQuantizer with KDTree.

---
 .../quantization/vector/VectorQuantizer.java  | 20 +++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/main/java/azgracompress/quantization/vector/VectorQuantizer.java b/src/main/java/azgracompress/quantization/vector/VectorQuantizer.java
index d00696e..a0e043a 100644
--- a/src/main/java/azgracompress/quantization/vector/VectorQuantizer.java
+++ b/src/main/java/azgracompress/quantization/vector/VectorQuantizer.java
@@ -1,5 +1,7 @@
 package azgracompress.quantization.vector;
 
+import azgracompress.kdtree.KDTree;
+import azgracompress.kdtree.KDTreeBuilder;
 import azgracompress.utilities.Utils;
 
 public class VectorQuantizer {
@@ -9,10 +11,14 @@ public class VectorQuantizer {
     private final int vectorSize;
     private final long[] frequencies;
 
+    private final KDTree kdTree;
+
     public VectorQuantizer(final VQCodebook codebook) {
         this.codebookVectors = codebook.getVectors();
-        vectorSize = codebookVectors[0].getVector().length;
+        this.vectorSize = codebookVectors[0].getVector().length;
         this.frequencies = codebook.getVectorFrequencies();
+
+        kdTree = new KDTreeBuilder(this.vectorSize, 8).buildTree(codebook.getRawVectors());
     }
 
     public int[] quantize(final int[] dataVector) {
@@ -49,8 +55,18 @@ public class VectorQuantizer {
         return quantizeIntoIndices(dataVectors, 1);
     }
 
-    public int[] quantizeIntoIndices(final int[][] dataVectors, final int maxWorkerCount) {
+    public int[] quantizeIntoIndicesUsingKDTree(final int[][] dataVectors, final int maxWorkerCount) {
+        assert (dataVectors.length > 0 && dataVectors[0].length % vectorSize == 0) : "Wrong vector size";
+        int[] indices = new int[dataVectors.length];
+
+        for (int vectorIndex = 0; vectorIndex < dataVectors.length; vectorIndex++) {
 
+            indices[vectorIndex] = kdTree.findNearestBBF(dataVectors[vectorIndex], 32);
+        }
+        return indices;
+    }
+
+    public int[] quantizeIntoIndices(final int[][] dataVectors, final int maxWorkerCount) {
         assert (dataVectors.length > 0 && dataVectors[0].length % vectorSize == 0) : "Wrong vector size";
         int[] indices = new int[dataVectors.length];
 
-- 
GitLab