-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic intandBitCount(byte[] a, byte[] b) AND bit count computed over signed bytes.static voidbFloat16ToFloat(byte[] bfBytes, int bfOffset, float[] floats, int floatOffset, int floatCount, ByteOrder byteOrder) static voidcalculateOSQGridPoints(float[] target, int[] quantize, int points, float[] pts) Calculate the grid points for optimized-scalar quantizationstatic floatcalculateOSQLoss(float[] target, float lowerInterval, float upperInterval, int points, float norm2, float lambda, int[] quantize) Calculate the loss for optimized-scalar quantization for the given parameteresstatic voidcenterAndCalculateOSQStatsDp(byte[] target, byte[] centroid, float[] centered, float[] stats) Center the byte target vector against a byte centroid and calculate the optimized-scalar quantization statistics for dot-product similarity.static voidcenterAndCalculateOSQStatsDp(float[] target, float[] centroid, float[] centered, float[] stats) Center the target vector and calculate the optimized-scalar quantization statisticsstatic voidcenterAndCalculateOSQStatsEuclidean(byte[] target, byte[] centroid, float[] centered, float[] stats) Center the byte target vector against a byte centroid and calculate the optimized-scalar quantization statistics for euclidean similarity.static voidcenterAndCalculateOSQStatsEuclidean(float[] target, float[] centroid, float[] centered, float[] stats) Center the target vector and calculate the optimized-scalar quantization statisticsstatic intcodePointCount(org.apache.lucene.util.BytesRef bytesRef) Count the number of Unicode code points in a utf-8 encoded string.static booleancontains(byte[] value, int valueOffset, int valueLength, byte[] term, int termOffset, int termLength) Checks whether the byte sequencetermappears as a contiguous subsequence withinvalue.static floatcosine(byte[] a, byte[] b) static voidcosineBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of cosine similarity from a byte query vector to four byte candidate vectors.static floatdotProduct(byte[] a, byte[] b) static floatdotProduct(byte[] a, byte[] b, int length) Dot product of the firstlengthcomponents ofaandb.static floatdotProduct(byte[] a, byte[] b, int offset, int length) Dot product over[offset, offset + length).static floatdotProduct(float[] a, float[] b) static floatdotProduct(float[] a, float[] b, int length) Dot product of the firstlengthcomponents ofaandb.static floatdotProduct(float[] a, float[] b, int offset, int length) Dot product over[offset, offset + length).static voiddotProductBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of dot product from a byte query vector to four byte candidate vectors.static voiddotProductBulk(float[] q, float[] v0, float[] v1, float[] v2, float[] v3, int distancesOffset, float[] distances) Bulk computation of square distances between a query vector and four vectors.Result is stored in the provided distances array.static voidfloatToBFloat16(float[] floats, int floatOffset, byte[] bfBytes, int bfOffset, int floatCount, ByteOrder byteOrder) static ES91OSQVectorsScorergetES91OSQVectorsScorer(org.apache.lucene.store.IndexInput input, int dimension, int bulkSize) static ES92Int7VectorsScorergetES92Int7VectorsScorer(org.apache.lucene.store.IndexInput input, int dimension, int bulkSize) getES93BinaryQuantizedVectorScorer(org.apache.lucene.store.IndexInput input, int dimension, int vectorLengthInBytes) static ES940OSQVectorsScorergetES940OSQVectorsScorer(org.apache.lucene.store.IndexInput input, byte queryBits, byte indexBits, int dimension, int dataLength, int bulkSize, ES940OSQVectorsScorer.BitEncoding bitEncoding) static intindexOf(byte[] bytes, int offset, int length, byte marker) Searches for the first occurrence of the given marker byte in the specified range of the array.static voidinRangeBitmask(long[] values, long lowerValue, long upperValue, long[] matches) For every indexiin[0, values.length), sets bitiinmatches(matches[i>>>6], bit positioni & 0x3f) whenvalues[i]lies in[lowerValue, upperValue].static longipByteBinByte(byte[] q, byte[] d) static intipByteBit(byte[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a byte vector and the document vector is a bit vector.static floatipFloatBit(float[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a float vector and the document vector is a bit vector.static floatipFloatByte(float[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a float vector and the document vector is a byte vector.static voidl2Normalize(byte[] v) L2-normalizes all components ofvin place.static voidl2Normalize(byte[] v, int length) L2-normalizes the prefixv[0..length)in place using signed byte values as real components.static voidl2Normalize(byte[] v, int offset, int length) L2-normalizesv[offset:offset + length)in place using signed byte values as real components.static voidl2Normalize(float[] v) L2-normalizes all components ofvin place.static voidl2Normalize(float[] v, int length) L2-normalizes the prefixv[0..length)in place.static voidl2Normalize(float[] v, int offset, int length) L2-normalizesv[offset:offset + length)in place.static voidlinearCombination(float scaleOther, byte[] other, float[] dest) Computes dest = scale * other + dest, widening byte src to float.static voidlinearCombination(float scaleOther, byte[] other, float scaleDest, float[] dest) Computes dest[d] = scaleSrc * src[d] + scaleDest * dest[d], widening byte src to float.static voidlinearCombination(float scaleOther, float[] other, float[] dest) Computes dest = scale * other + deststatic voidlinearCombination(float scaleOther, float[] other, float scaleDest, float[] dest) Computes dest = scale * other + scaledDes * deststatic floatlogSumExpNQT(float[] vector) Calculates an approximation of the LogSumExp of the input array in base 2.static floatlogSumExpNQTDiff(float[] v1, float[] v2, float eps) Calculates a shifted and scaled LogSumExp of the input arrays in base 2, according to the formula: log2(sum_i(pow(2, (v1[i] - v2[i]) / eps))) This implementation uses the log-sum-exp trick for numerical stability and Not-Quite-Trascendental functions for speed.static floatmax(float[] values, int length) static floatmaxSimDotProduct(MultiBFloat16VectorsSource source, float[][] query, float[] scoresScratch) Computes max-sim dot product for float query vectors against a bfloat16 multi-vector source.static floatmaxSimDotProduct(MultiByteVectorsSource source, byte[][] query, float[] scoresScratch) Computes max-sim dot product for byte query vectors against a multi-vector source.static floatmaxSimDotProduct(MultiFloatVectorsSource source, float[][] query, float[] scoresScratch) Computes max-sim dot product for float query vectors against a multi-vector source.static voidpackAsBinary(int[] vector, byte[] packed) Packs the provided int array populated with "0" and "1" values into a byte array.static voidpackAsBytes(int[] src, byte[] dst, int len) Narrows each of the firstlenints to a byte by truncating to the low 8 bits, writing intodst[0..len).static voidpackDibit(int[] vector, byte[] packed) static voidpackDibitQuad(int[] vector, byte[] packed) static voidpow2DiffAndScaleNQT(float[] v1, float[] v2, float a, float eps, float[] result) Compute the following operation: result[i] = pow(2, (a + v1[i] - v2[i]) / eps) This implementation uses the log-sum-exp trick for numerical stability.static intquantizeVectorWithIntervals(float[] vector, int[] destination, float lowInterval, float upperInterval, byte bit) Optimized-scalar quantization of the provided vector to the provided destination array.static floatsoarDistance(byte[] v1, byte[] centroid, float[] originalResidual, float soarLambda, float rnorm) Compute the SOAR distance between a byte vector and a byte centroid.static floatsoarDistance(float[] v1, float[] centroid, float[] originalResidual, float soarLambda, float rnorm) calculates the soar distance for a vector and a centroidstatic voidsoarDistanceBulk(byte[] v1, byte[] c0, byte[] c1, byte[] c2, byte[] c3, float[] originalResidual, float soarLambda, float rnorm, float[] distances) Calculates SOAR distances between a byte query vector and 4 byte centroid vectors in bulk.static voidsoarDistanceBulk(float[] v1, float[] c0, float[] c1, float[] c2, float[] c3, float[] originalResidual, float soarLambda, float rnorm, float[] distances) Bulk computation of the soar distance for a vector to four centroidsstatic floatsquareDistance(byte[] a, byte[] b) static floatsquareDistance(byte[] a, byte[] b, int offset, int length) Returns the sum of squared differences of the two byte vectors over a sub-range.static floatsquareDistance(float[] a, float[] b) static floatsquareDistance(float[] a, float[] b, int offset, int length) static voidsquareDistanceBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of square distances from a byte query vector to four byte candidate vectors.static voidsquareDistanceBulk(byte[] q, int qOffset, int length, byte[] v0, byte[] v1, byte[] v2, byte[] v3, float[] distances) Bulk computation of square distances from a sub-range of a byte query vector to four byte candidate vectors.static voidsquareDistanceBulk(float[] q, float[] v0, float[] v1, float[] v2, float[] v3, int distancesOffset, float[] distances) Bulk computation of square distances between a query vector and four vectors.Result is stored in the provided distances array.static voidsquareDistanceBulk(float[] q, int qOffset, int length, float[] v0, float[] v1, float[] v2, float[] v3, float[] distances) static voidsubtract(float[] v1, float[] v2, float[] result) Calculates the difference between two vectors and stores the result in a third vector.static floatsum(float[] values, int length) static voidtransposeHalfByte(int[] q, byte[] quantQueryByte) The idea here is to organize the query vector bits such that the first bit of every dimension is in the first set dimensions bits, or (dimensions/8) bytes.
-
Constructor Details
-
ESVectorUtil
public ESVectorUtil()
-
-
Method Details
-
getES91OSQVectorsScorer
public static ES91OSQVectorsScorer getES91OSQVectorsScorer(org.apache.lucene.store.IndexInput input, int dimension, int bulkSize) throws IOException - Throws:
IOException
-
getES940OSQVectorsScorer
public static ES940OSQVectorsScorer getES940OSQVectorsScorer(org.apache.lucene.store.IndexInput input, byte queryBits, byte indexBits, int dimension, int dataLength, int bulkSize, ES940OSQVectorsScorer.BitEncoding bitEncoding) throws IOException - Throws:
IOException
-
getES92Int7VectorsScorer
public static ES92Int7VectorsScorer getES92Int7VectorsScorer(org.apache.lucene.store.IndexInput input, int dimension, int bulkSize) throws IOException - Throws:
IOException
-
getES93BinaryQuantizedVectorScorer
public static ES93BinaryQuantizedVectorScorer getES93BinaryQuantizedVectorScorer(org.apache.lucene.store.IndexInput input, int dimension, int vectorLengthInBytes) throws IOException - Throws:
IOException
-
bFloat16ToFloat
public static void bFloat16ToFloat(byte[] bfBytes, int bfOffset, float[] floats, int floatOffset, int floatCount, ByteOrder byteOrder) -
floatToBFloat16
public static void floatToBFloat16(float[] floats, int floatOffset, byte[] bfBytes, int bfOffset, int floatCount, ByteOrder byteOrder) -
dotProduct
public static float dotProduct(float[] a, float[] b) -
dotProduct
public static float dotProduct(float[] a, float[] b, int length) Dot product of the firstlengthcomponents ofaandb. -
dotProduct
public static float dotProduct(float[] a, float[] b, int offset, int length) Dot product over[offset, offset + length). -
l2Normalize
public static void l2Normalize(float[] v, int length) L2-normalizes the prefixv[0..length)in place. Elements at indiceslengthand beyond are left unchanged. A zero prefix is a no-op; unlikeVectorUtil.l2normalize(float[]), this method does not throw on a zero vector. -
l2Normalize
public static void l2Normalize(float[] v, int offset, int length) L2-normalizesv[offset:offset + length)in place. Elements outside the range are left unchanged. A zero range is a no-op. -
l2Normalize
public static void l2Normalize(float[] v) L2-normalizes all components ofvin place. -
squareDistance
public static float squareDistance(float[] a, float[] b) -
squareDistance
public static float squareDistance(float[] a, float[] b, int offset, int length) -
cosine
public static float cosine(byte[] a, byte[] b) -
dotProduct
public static float dotProduct(byte[] a, byte[] b) -
dotProduct
public static float dotProduct(byte[] a, byte[] b, int length) Dot product of the firstlengthcomponents ofaandb. -
dotProduct
public static float dotProduct(byte[] a, byte[] b, int offset, int length) Dot product over[offset, offset + length). -
l2Normalize
public static void l2Normalize(byte[] v, int length) L2-normalizes the prefixv[0..length)in place using signed byte values as real components. Elements at indiceslengthand beyond are left unchanged. A zero prefix is a no-op. -
l2Normalize
public static void l2Normalize(byte[] v, int offset, int length) L2-normalizesv[offset:offset + length)in place using signed byte values as real components. Elements outside the range are left unchanged. A zero range is a no-op. -
l2Normalize
public static void l2Normalize(byte[] v) L2-normalizes all components ofvin place. -
maxSimDotProduct
public static float maxSimDotProduct(MultiFloatVectorsSource source, float[][] query, float[] scoresScratch) Computes max-sim dot product for float query vectors against a multi-vector source.The provided
scoresScratchbuffer is reused as temporary per-document scores for each query vector to avoid per-call allocations. Its length must be at leastsource.vectorCount(). -
maxSimDotProduct
public static float maxSimDotProduct(MultiBFloat16VectorsSource source, float[][] query, float[] scoresScratch) Computes max-sim dot product for float query vectors against a bfloat16 multi-vector source.The provided
scoresScratchbuffer is reused as temporary per-document scores for each query vector to avoid per-call allocations. Its length must be at leastsource.vectorCount(). -
maxSimDotProduct
public static float maxSimDotProduct(MultiByteVectorsSource source, byte[][] query, float[] scoresScratch) Computes max-sim dot product for byte query vectors against a multi-vector source.The provided
scoresScratchbuffer is reused as temporary per-document scores for each query vector to avoid per-call allocations. Its length must be at leastsource.vectorCount(). -
squareDistance
public static float squareDistance(byte[] a, byte[] b) -
squareDistance
public static float squareDistance(byte[] a, byte[] b, int offset, int length) Returns the sum of squared differences of the two byte vectors over a sub-range. -
squareDistanceBulk
public static void squareDistanceBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of square distances from a byte query vector to four byte candidate vectors. -
squareDistanceBulk
public static void squareDistanceBulk(byte[] q, int qOffset, int length, byte[] v0, byte[] v1, byte[] v2, byte[] v3, float[] distances) Bulk computation of square distances from a sub-range of a byte query vector to four byte candidate vectors. -
dotProductBulk
public static void dotProductBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of dot product from a byte query vector to four byte candidate vectors. -
cosineBulk
public static void cosineBulk(byte[] q, byte[] v0, byte[] v1, byte[] v2, byte[] v3, int distancesOffset, float[] distances) Bulk computation of cosine similarity from a byte query vector to four byte candidate vectors. -
ipByteBinByte
public static long ipByteBinByte(byte[] q, byte[] d) -
ipByteBit
public static int ipByteBit(byte[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a byte vector and the document vector is a bit vector. This will return the sum of the query vector values using the document vector as a mask. When comparing the bits with the bytes, they are done in "big endian" order. For example, if the byte vector is [1, 2, 3, 4, 5, 6, 7, 8] and the bit vector is [0b10000000], the inner product will be 1.0.- Parameters:
q- the query vectord- the document vector- Returns:
- the inner product of the two vectors
-
ipFloatBit
public static float ipFloatBit(float[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a float vector and the document vector is a bit vector. This will return the sum of the query vector values using the document vector as a mask. When comparing the bits with the floats, they are done in "big endian" order. For example, if the float vector is [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0] and the bit vector is [0b10000000], the inner product will be 1.0.- Parameters:
q- the query vectord- the document vector- Returns:
- the inner product of the two vectors
-
ipFloatByte
public static float ipFloatByte(float[] q, byte[] d) Compute the inner product of two vectors, where the query vector is a float vector and the document vector is a byte vector.- Parameters:
q- the query vectord- the document vector- Returns:
- the inner product of the two vectors
-
andBitCount
public static int andBitCount(byte[] a, byte[] b) AND bit count computed over signed bytes. Copied from Lucene's XOR implementation- Parameters:
a- bytes containing a vectorb- bytes containing another vector, of the same dimension- Returns:
- the value of the AND bit count of the two vectors
-
max
public static float max(float[] values, int length) -
sum
public static float sum(float[] values, int length) -
calculateOSQLoss
public static float calculateOSQLoss(float[] target, float lowerInterval, float upperInterval, int points, float norm2, float lambda, int[] quantize) Calculate the loss for optimized-scalar quantization for the given parameteres- Parameters:
target- The vector being quantized, assumed to be centeredlowerInterval- The lower interval value for which to calculate the lossupperInterval- The upper interval value for which to calculate the losspoints- the quantization pointsnorm2- The norm squared of the target vectorlambda- The lambda parameter for controlling anisotropic loss calculationquantize- array to store the computed quantize vector.- Returns:
- The loss for the given parameters
-
calculateOSQGridPoints
public static void calculateOSQGridPoints(float[] target, int[] quantize, int points, float[] pts) Calculate the grid points for optimized-scalar quantization- Parameters:
target- The vector being quantized, assumed to be centeredquantize- The quantize vector which should have at least the target vector lengthpoints- the quantization pointspts- The array to store the grid points, must be of length 5
-
centerAndCalculateOSQStatsEuclidean
public static void centerAndCalculateOSQStatsEuclidean(float[] target, float[] centroid, float[] centered, float[] stats) Center the target vector and calculate the optimized-scalar quantization statistics- Parameters:
target- The vector being quantizedcentroid- The centroid of the target vectorcentered- The destination of the centered vector, will be overwrittenstats- The array to store the statistics, must be of length 5
-
centerAndCalculateOSQStatsDp
public static void centerAndCalculateOSQStatsDp(float[] target, float[] centroid, float[] centered, float[] stats) Center the target vector and calculate the optimized-scalar quantization statistics- Parameters:
target- The vector being quantizedcentroid- The centroid of the target vectorcentered- The destination of the centered vector, will be overwrittenstats- The array to store the statistics, must be of length 6
-
centerAndCalculateOSQStatsEuclidean
public static void centerAndCalculateOSQStatsEuclidean(byte[] target, byte[] centroid, float[] centered, float[] stats) Center the byte target vector against a byte centroid and calculate the optimized-scalar quantization statistics for euclidean similarity.- Parameters:
target- The byte vector being quantizedcentroid- The byte centroid of the target vectorcentered- The destination of the centered vector, will be overwrittenstats- The array to store the statistics, must be of length 5
-
centerAndCalculateOSQStatsDp
public static void centerAndCalculateOSQStatsDp(byte[] target, byte[] centroid, float[] centered, float[] stats) Center the byte target vector against a byte centroid and calculate the optimized-scalar quantization statistics for dot-product similarity.- Parameters:
target- The byte vector being quantizedcentroid- The byte centroid of the target vectorcentered- The destination of the centered vector, will be overwrittenstats- The array to store the statistics, must be of length 6
-
subtract
public static void subtract(float[] v1, float[] v2, float[] result) Calculates the difference between two vectors and stores the result in a third vector.- Parameters:
v1- the first vectorv2- the second vectorresult- the result vector, must be the same length as the input vectors
-
soarDistance
public static float soarDistance(float[] v1, float[] centroid, float[] originalResidual, float soarLambda, float rnorm) calculates the soar distance for a vector and a centroid- Parameters:
v1- the vectorcentroid- the centroidoriginalResidual- the residual with the actually nearest centroidsoarLambda- the lambda parameterrnorm- distance to the nearest centroid- Returns:
- the soar distance
-
soarDistance
public static float soarDistance(byte[] v1, byte[] centroid, float[] originalResidual, float soarLambda, float rnorm) Compute the SOAR distance between a byte vector and a byte centroid. SOAR distance:||x-c||^2 + lambda * ((x-c1)^T (x-c))^2 / ||x-c1||^2- Parameters:
v1- the byte vectorcentroid- the byte centroidoriginalResidual- the precomputed residual (x - c1) as floatsoarLambda- the SOAR lambda parameterrnorm- the squared norm of the original residual- Returns:
- the SOAR distance
-
quantizeVectorWithIntervals
public static int quantizeVectorWithIntervals(float[] vector, int[] destination, float lowInterval, float upperInterval, byte bit) Optimized-scalar quantization of the provided vector to the provided destination array.- Parameters:
vector- the vector to quantizedestination- the array to store the resultlowInterval- the minimum value, lower values in the original array will be replaced by this valueupperInterval- the maximum value, bigger values in the original array will be replaced by this valuebit- the number of bits to use for quantization, must be between 1 and 8- Returns:
- return the sum of all the elements of the resulting quantized vector.
-
squareDistanceBulk
public static void squareDistanceBulk(float[] q, float[] v0, float[] v1, float[] v2, float[] v3, int distancesOffset, float[] distances) Bulk computation of square distances between a query vector and four vectors.Result is stored in the provided distances array.- Parameters:
q- the query vectorv0- the first vectorv1- the second vectorv2- the third vectorv3- the fourth vectordistancesOffset- offset to the location in the distances array where we want to store the 4 results, we require distancesOffset to be between 0 and distances.length - 4distances- an array to store the computed square distances, must have length >= 4- Throws:
IllegalArgumentException- if the dimensions of the vectors do not match or if the distances array does not have length 4
-
dotProductBulk
public static void dotProductBulk(float[] q, float[] v0, float[] v1, float[] v2, float[] v3, int distancesOffset, float[] distances) Bulk computation of square distances between a query vector and four vectors.Result is stored in the provided distances array.- Parameters:
q- the query vectorv0- the first vectorv1- the second vectorv2- the third vectorv3- the fourth vectordistancesOffset- offset to the location in the distances array where we want to store the 4 results, we require distancesOffset to be between 0 and distances.length - 4distances- an array to store the computed square distances, must have length >= 4- Throws:
IllegalArgumentException- if the dimensions of the vectors do not match or if the distances array does not have length 4
-
squareDistanceBulk
public static void squareDistanceBulk(float[] q, int qOffset, int length, float[] v0, float[] v1, float[] v2, float[] v3, float[] distances) -
soarDistanceBulk
public static void soarDistanceBulk(float[] v1, float[] c0, float[] c1, float[] c2, float[] c3, float[] originalResidual, float soarLambda, float rnorm, float[] distances) Bulk computation of the soar distance for a vector to four centroids- Parameters:
v1- the vectorc0- the first centroidc1- the second centroidc2- the third centroidc3- the fourth centroidoriginalResidual- the residual with the actually nearest centroidsoarLambda- the lambda parameterrnorm- distance to the nearest centroiddistances- an array to store the computed soar distances, must have length 4
-
soarDistanceBulk
public static void soarDistanceBulk(byte[] v1, byte[] c0, byte[] c1, byte[] c2, byte[] c3, float[] originalResidual, float soarLambda, float rnorm, float[] distances) Calculates SOAR distances between a byte query vector and 4 byte centroid vectors in bulk. SOAR distance: ||x-c||^2 + lambda * ((x-c)^T * originalResidual)^2 / rnorm- Parameters:
v1- the query vectorc0- centroid 0c1- centroid 1c2- centroid 2c3- centroid 3originalResidual- the precomputed residual (x - globalCentroid) as floatsoarLambda- the SOAR lambda parameterrnorm- the squared norm of the original residualdistances- output array of length 4 for the computed distances
-
packAsBytes
public static void packAsBytes(int[] src, byte[] dst, int len) Narrows each of the firstlenints to a byte by truncating to the low 8 bits, writing intodst[0..len). No bounds check is performed; the caller must ensuredst.length >= len.- Parameters:
src- int array of quantized valuesdst- byte array to receive the narrowed valueslen- number of elements to convert
-
packAsBinary
public static void packAsBinary(int[] vector, byte[] packed) Packs the provided int array populated with "0" and "1" values into a byte array.- Parameters:
vector- the int array to pack, must contain only "0" and "1" values.packed- the byte array to store the packed result, must be large enough to hold the packed data.
-
packDibit
public static void packDibit(int[] vector, byte[] packed) -
packDibitQuad
public static void packDibitQuad(int[] vector, byte[] packed) -
transposeHalfByte
public static void transposeHalfByte(int[] q, byte[] quantQueryByte) The idea here is to organize the query vector bits such that the first bit of every dimension is in the first set dimensions bits, or (dimensions/8) bytes. The second, third, and fourth bits are in the second, third, and fourth set of dimensions bits, respectively. This allows for direct bitwise comparisons with the stored index vectors through summing the bitwise results with the relative required bit shifts.- Parameters:
q- the query vector, assumed to be half-byte quantized with values between 0 and 15quantQueryByte- the byte array to store the transposed query vector.
-
indexOf
public static int indexOf(byte[] bytes, int offset, int length, byte marker) Searches for the first occurrence of the given marker byte in the specified range of the array.The search starts at
offsetand examines at mostlengthbytes. The return value is the relative index of the first occurrence ofmarkerwithin this slice, or-1if not found.- Parameters:
bytes- the byte array to searchoffset- the starting index within the arraylength- the number of bytes to examinemarker- the byte to search for- Returns:
- the relative index (0..length-1) of the first match, or
-1if not found
-
contains
public static boolean contains(byte[] value, int valueOffset, int valueLength, byte[] term, int termOffset, int termLength) Checks whether the byte sequencetermappears as a contiguous subsequence withinvalue.- Parameters:
value- the byte array to search invalueOffset- the starting index within valuevalueLength- the number of bytes to searchterm- the byte array containing the term to search fortermOffset- the starting index within termtermLength- the number of bytes in the term- Returns:
- true if term is found within value
-
codePointCount
public static int codePointCount(org.apache.lucene.util.BytesRef bytesRef) Count the number of Unicode code points in a utf-8 encoded string. Assumes that the input string is correctly encoded. If the input string is incorrectly encoded, no errors will be thrown, but invalid results will be returned.- Parameters:
bytesRef- bytes reference containing a valid utf-8 encoded string- Returns:
- the number of code points in the bytes ref
-
linearCombination
public static void linearCombination(float scaleOther, float[] other, float scaleDest, float[] dest) Computes dest = scale * other + scaledDes * dest- Parameters:
scaleOther- a multiplicative factor for otherother- the other vectorscaleDest- a multiplicative factor for destdest- the destination vector
-
linearCombination
public static void linearCombination(float scaleOther, float[] other, float[] dest) Computes dest = scale * other + dest- Parameters:
scaleOther- a multiplicative factor for otherother- the other vectordest- the destination vector
-
linearCombination
public static void linearCombination(float scaleOther, byte[] other, float scaleDest, float[] dest) Computes dest[d] = scaleSrc * src[d] + scaleDest * dest[d], widening byte src to float.- Parameters:
scaleOther- a multiplicative factor for srcother- the byte source vector (widened to float for computation)scaleDest- a multiplicative factor for destdest- the destination float vector (modified in place)
-
linearCombination
public static void linearCombination(float scaleOther, byte[] other, float[] dest) Computes dest = scale * other + dest, widening byte src to float.- Parameters:
scaleOther- a multiplicative factor for srcother- the byte source vector (widened to float for computation)dest- the destination float vector (modified in place)
-
logSumExpNQT
public static float logSumExpNQT(float[] vector) Calculates an approximation of the LogSumExp of the input array in base 2. The formula used is: log2(sum_i(pow(2, x[i]))). This implementation uses the log-sum-exp trick for numerical stability and Not-Quite-Trascendental functions for speed.- Parameters:
vector- The input array of double values (log probabilities/values).- Returns:
- The log-sum-exp result.
-
logSumExpNQTDiff
public static float logSumExpNQTDiff(float[] v1, float[] v2, float eps) Calculates a shifted and scaled LogSumExp of the input arrays in base 2, according to the formula: log2(sum_i(pow(2, (v1[i] - v2[i]) / eps))) This implementation uses the log-sum-exp trick for numerical stability and Not-Quite-Trascendental functions for speed.- Parameters:
v1- The first input array of double values (log probabilities/values).v2- The second input array of double values (log probabilities/values).eps- The normalization constant (that is, the temperature parameter).- Returns:
- The log-sum-exp result.
-
pow2DiffAndScaleNQT
public static void pow2DiffAndScaleNQT(float[] v1, float[] v2, float a, float eps, float[] result) Compute the following operation: result[i] = pow(2, (a + v1[i] - v2[i]) / eps) This implementation uses the log-sum-exp trick for numerical stability.- Parameters:
v1- The first input array of double values (log probabilities/values).v2- The second input array of double values (log probabilities/values).eps- The normalization constant (that is, the temperature parameter).result- The output array.
-
inRangeBitmask
public static void inRangeBitmask(long[] values, long lowerValue, long upperValue, long[] matches) For every indexiin[0, values.length), sets bitiinmatches(matches[i>>>6], bit positioni & 0x3f) whenvalues[i]lies in[lowerValue, upperValue].Requires
values.lengthto be a multiple of 8 (the maximum supported SIMD lane count, for AVX-512) andmatches.length == values.length / 64.
-