Skip to content
Snippets Groups Projects
Commit a2cf4bc4 authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Merge branch 'cli_app'

parents 06264902 37b14afa
No related branches found
No related tags found
No related merge requests found
...@@ -93,9 +93,7 @@ public class VectorQuantizationBenchmark extends BenchmarkBase { ...@@ -93,9 +93,7 @@ public class VectorQuantizationBenchmark extends BenchmarkBase {
for (final int planeIndex : planes) { for (final int planeIndex : planes) {
System.out.println(String.format("Loading plane %d ...", planeIndex)); System.out.println(String.format("Loading plane %d ...", planeIndex));
// NOTE(Moravec): Actual planeIndex is zero based. final ImageU16 plane = loadPlane(planeIndex);
final ImageU16 plane = loadPlane(planeIndex - 1);
if (plane == null) { if (plane == null) {
System.err.println(String.format("Failed to load plane %d data. Skipping plane.", planeIndex)); System.err.println(String.format("Failed to load plane %d data. Skipping plane.", planeIndex));
......
...@@ -26,7 +26,7 @@ public class LBGVectorQuantizer { ...@@ -26,7 +26,7 @@ public class LBGVectorQuantizer {
this.trainingVectors = new TrainingVector[vectors.length]; this.trainingVectors = new TrainingVector[vectors.length];
for (int i = 0; i < vectors.length; i++) { for (int i = 0; i < vectors.length; i++) {
trainingVectors[i] = new TrainingVector(vectors[i]); trainingVectors[i] = new TrainingVector(Arrays.copyOf(vectors[i], vectors[i].length));
} }
this.vectorSize = vectors[0].length; this.vectorSize = vectors[0].length;
...@@ -245,7 +245,7 @@ public class LBGVectorQuantizer { ...@@ -245,7 +245,7 @@ public class LBGVectorQuantizer {
} }
// We always want to carry zero vector to next iteration. // We always want to carry zero vector to next iteration.
if (isZeroVector(entryToSplit.getVector())) { if (VectorQuantizer.isZeroVector(entryToSplit.getVector())) {
// Use zero vector in next iteration. // Use zero vector in next iteration.
newCodebook[cbIndex++] = entryToSplit; newCodebook[cbIndex++] = entryToSplit;
...@@ -261,7 +261,7 @@ public class LBGVectorQuantizer { ...@@ -261,7 +261,7 @@ public class LBGVectorQuantizer {
continue; continue;
} }
if (isZeroVector(prtV)) { if (VectorQuantizer.isZeroVector(prtV)) {
// Zero perturbation vector can't create two different entries. // Zero perturbation vector can't create two different entries.
// The original entry is going to be moved to the next codebook with the new // The original entry is going to be moved to the next codebook with the new
// random entry, which will get improved in the LBG algorithm. // random entry, which will get improved in the LBG algorithm.
...@@ -321,36 +321,6 @@ public class LBGVectorQuantizer { ...@@ -321,36 +321,6 @@ public class LBGVectorQuantizer {
return randomVector; return randomVector;
} }
/**
* Check whether all vector elements are equal to 0.0
*
* @param vector Vector array.
* @return True if all elements are zeros.
*/
private boolean isZeroVector(final double[] vector) {
for (final double value : vector) {
if (value != 0.0) {
return false;
}
}
return true;
}
/**
* Check whether all vector elements are equal to 0
*
* @param vector Vector array.
* @return True if all elements are zeros.
*/
private boolean isZeroVector(final int[] vector) {
for (final double value : vector) {
if (value != 0.0) {
return false;
}
}
return true;
}
/** /**
* Execute the LBG algorithm with default epsilon value. * Execute the LBG algorithm with default epsilon value.
...@@ -657,7 +627,9 @@ public class LBGVectorQuantizer { ...@@ -657,7 +627,9 @@ public class LBGVectorQuantizer {
int largestEntrySize = codebook[emptyEntryIndex].getVectorCount(); int largestEntrySize = codebook[emptyEntryIndex].getVectorCount();
// NOTE(Moravec): We can't select random training vector, because zero vector would create another zero vector. // NOTE(Moravec): We can't select random training vector, because zero vector would create another zero vector.
for (int i = 0; i < codebook.length; i++) { for (int i = 0; i < codebook.length; i++) {
if ((codebook[i].getVectorCount() > largestEntrySize) && !isZeroVector(codebook[i].getVector())) { if ((codebook[i].getVectorCount() > largestEntrySize) &&
!VectorQuantizer.isZeroVector(codebook[i].getVector())) {
largestEntryIndex = i; largestEntryIndex = i;
largestEntrySize = codebook[i].getVectorCount(); largestEntrySize = codebook[i].getVectorCount();
} }
......
...@@ -2,6 +2,7 @@ package azgracompress.quantization.vector; ...@@ -2,6 +2,7 @@ package azgracompress.quantization.vector;
public class VectorQuantizer { public class VectorQuantizer {
private final VectorDistanceMetric metric = VectorDistanceMetric.Euclidean;
private final CodebookEntry[] codebook; private final CodebookEntry[] codebook;
private final int vectorSize; private final int vectorSize;
...@@ -12,7 +13,7 @@ public class VectorQuantizer { ...@@ -12,7 +13,7 @@ public class VectorQuantizer {
public int[] quantize(final int[] dataVector) { public int[] quantize(final int[] dataVector) {
assert (dataVector.length > 0 && dataVector.length % vectorSize == 0) : "Wrong vector size"; assert (dataVector.length > 0 && dataVector.length % vectorSize == 0) : "Wrong vector size";
final CodebookEntry closestEntry = findClosestCodebookEntry(dataVector, VectorDistanceMetric.Euclidean); final CodebookEntry closestEntry = findClosestCodebookEntry(dataVector, metric);
return closestEntry.getVector(); return closestEntry.getVector();
} }
...@@ -22,8 +23,7 @@ public class VectorQuantizer { ...@@ -22,8 +23,7 @@ public class VectorQuantizer {
if (workerCount == 1) { if (workerCount == 1) {
for (int vectorIndex = 0; vectorIndex < dataVectors.length; vectorIndex++) { for (int vectorIndex = 0; vectorIndex < dataVectors.length; vectorIndex++) {
final CodebookEntry closestEntry = findClosestCodebookEntry(dataVectors[vectorIndex], final CodebookEntry closestEntry = findClosestCodebookEntry(dataVectors[vectorIndex], metric);
VectorDistanceMetric.Euclidean);
result[vectorIndex] = closestEntry.getVector(); result[vectorIndex] = closestEntry.getVector();
} }
} else { } else {
...@@ -48,8 +48,7 @@ public class VectorQuantizer { ...@@ -48,8 +48,7 @@ public class VectorQuantizer {
if (maxWorkerCount == 1) { if (maxWorkerCount == 1) {
for (int vectorIndex = 0; vectorIndex < dataVectors.length; vectorIndex++) { for (int vectorIndex = 0; vectorIndex < dataVectors.length; vectorIndex++) {
indices[vectorIndex] = findClosestCodebookEntryIndex(dataVectors[vectorIndex], indices[vectorIndex] = findClosestCodebookEntryIndex(dataVectors[vectorIndex], metric);
VectorDistanceMetric.Euclidean);
} }
} else { } else {
// Cap the worker count on 8 // Cap the worker count on 8
...@@ -63,8 +62,7 @@ public class VectorQuantizer { ...@@ -63,8 +62,7 @@ public class VectorQuantizer {
workers[wId] = new Thread(() -> { workers[wId] = new Thread(() -> {
for (int vectorIndex = fromIndex; vectorIndex < toIndex; vectorIndex++) { for (int vectorIndex = fromIndex; vectorIndex < toIndex; vectorIndex++) {
indices[vectorIndex] = findClosestCodebookEntryIndex(dataVectors[vectorIndex], indices[vectorIndex] = findClosestCodebookEntryIndex(dataVectors[vectorIndex], metric);
VectorDistanceMetric.Euclidean);
} }
}); });
...@@ -117,7 +115,7 @@ public class VectorQuantizer { ...@@ -117,7 +115,7 @@ public class VectorQuantizer {
} }
private CodebookEntry findClosestCodebookEntry(final int[] dataVector) { private CodebookEntry findClosestCodebookEntry(final int[] dataVector) {
return findClosestCodebookEntry(dataVector, VectorDistanceMetric.Euclidean); return findClosestCodebookEntry(dataVector, metric);
} }
private CodebookEntry findClosestCodebookEntry(final int[] dataVector, final VectorDistanceMetric metric) { private CodebookEntry findClosestCodebookEntry(final int[] dataVector, final VectorDistanceMetric metric) {
...@@ -125,21 +123,58 @@ public class VectorQuantizer { ...@@ -125,21 +123,58 @@ public class VectorQuantizer {
} }
private int findClosestCodebookEntryIndex(final int[] dataVector, final VectorDistanceMetric metric) { private int findClosestCodebookEntryIndex(final int[] dataVector, final VectorDistanceMetric metric) {
boolean closesIsZero = false;
double minDist = Double.MAX_VALUE; double minDist = Double.MAX_VALUE;
int closestEntryIndex = 0; int closestEntryIndex = 0;
final int codebookSize = codebook.length; for (int entryIndex = 0; entryIndex < codebook.length; entryIndex++) {
for (int i = 0; i < codebookSize; i++) {
final double dist = distanceBetweenVectors(dataVector, codebook[i].getVector(), metric);
final double dist = distanceBetweenVectors(dataVector, codebook[entryIndex].getVector(), metric);
if (dist < minDist) { if (dist < minDist) {
minDist = dist; minDist = dist;
closestEntryIndex = i; closestEntryIndex = entryIndex;
closesIsZero = isZeroVector(codebook[entryIndex].getVector());
} }
} }
if (closesIsZero) {
// System.out.println("One of zero vectors.");
}
return closestEntryIndex; return closestEntryIndex;
} }
public CodebookEntry[] getCodebook() { public CodebookEntry[] getCodebook() {
return codebook; return codebook;
} }
/**
* Check whether all vector elements are equal to 0.0
*
* @param vector Vector array.
* @return True if all elements are zeros.
*/
public static boolean isZeroVector(final double[] vector) {
for (final double value : vector) {
if (value != 0.0) {
return false;
}
}
return true;
}
/**
* Check whether all vector elements are equal to 0
*
* @param vector Vector array.
* @return True if all elements are zeros.
*/
public static boolean isZeroVector(final int[] vector) {
for (final double value : vector) {
if (value != 0.0) {
return false;
}
}
return true;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment