Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion c/lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ USEARCH_EXPORT void usearch_exact_search( //

metric_punned_t metric(dimensions, metric_kind_to_cpp(metric_kind), scalar_kind_to_cpp(scalar_kind));
executor_default_t executor(threads);
static exact_search_t search;
exact_search_t search;
exact_search_results_t result = search( //
(byte_t const*)dataset, dataset_count, dataset_stride, //
(byte_t const*)queries, queries_count, queries_stride, //
Expand Down
42 changes: 24 additions & 18 deletions golang/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ func (index *Index) SearchUnsafe(query unsafe.Pointer, limit uint) (keys []Key,
// - numThreads: Number of threads to use (0 for auto-detection)
func ExactSearch(dataset []float32, queries []float32, datasetSize uint, queryCount uint,
datasetStride uint, queryStride uint, vectorDimensions uint, metric Metric,
maxResults uint, numThreads uint, resultKeysStride uint, resultDistancesStride uint) (keys []Key, distances []float32, err error) {
maxResults uint, numThreads uint) (keys []Key, distances []float32, err error) {

if len(dataset) == 0 || len(queries) == 0 {
return nil, nil, errors.New("dataset and queries cannot be empty")
Expand All @@ -703,9 +703,15 @@ func ExactSearch(dataset []float32, queries []float32, datasetSize uint, queryCo
if (len(queries) % int(vectorDimensions)) != 0 {
return nil, nil, errors.New("queries length must be a multiple of the dimensions")
}
if maxResults == 0 {
return nil, nil, errors.New("maxResults must be greater than zero")
}

keys = make([]Key, queryCount*maxResults)
distances = make([]float32, queryCount*maxResults)
resultKeysStride := uint32(maxResults * 8) // int64 - 8 bytes
resultDistancesStride := uint32(maxResults * 4) // float32 - 4 bytes

keys = make([]Key, maxResults)
distances = make([]float32, maxResults)
var errorMessage *C.char
C.usearch_exact_search(unsafe.Pointer(&dataset[0]), C.size_t(datasetSize), C.size_t(datasetStride), unsafe.Pointer(&queries[0]), C.size_t(queryCount), C.size_t(queryStride),
C.usearch_scalar_f32_k, C.size_t(vectorDimensions), metric.CValue(), C.size_t(maxResults), C.size_t(numThreads),
Expand All @@ -718,8 +724,6 @@ func ExactSearch(dataset []float32, queries []float32, datasetSize uint, queryCo
return nil, nil, errors.New(C.GoString(errorMessage))
}

keys = keys[:maxResults]
distances = distances[:maxResults]
return keys, distances, nil
}

Expand All @@ -736,17 +740,19 @@ func ExactSearch(dataset []float32, queries []float32, datasetSize uint, queryCo
// For contiguous data, use vectorDimensions * sizeof(element_type).
func ExactSearchUnsafe(dataset unsafe.Pointer, queries unsafe.Pointer, datasetSize uint, queryCount uint,
datasetStride uint, queryStride uint, vectorDimensions uint, metric Metric, quantization Quantization,
maxResults uint, numThreads uint, resultKeysStride uint, resultDistancesStride uint) (keys []Key, distances []float32, err error) {
maxResults uint, numThreads uint) (keys []Key, distances []float32, err error) {

if dataset == nil || queries == nil {
return nil, nil, errors.New("dataset and queries pointers cannot be nil")
}
if vectorDimensions == 0 || datasetSize == 0 || queryCount == 0 {
return nil, nil, errors.New("dimensions and sizes must be greater than zero")
if vectorDimensions == 0 || datasetSize == 0 || queryCount == 0 || maxResults == 0 {
return nil, nil, errors.New("dimensions, query count, max results and sizes must be greater than zero")
}

keys = make([]Key, maxResults)
distances = make([]float32, maxResults)
keys = make([]Key, queryCount*maxResults)
distances = make([]float32, queryCount*maxResults)
resultKeysStride := uint32(maxResults * 8) // int64 - 8 bytes
resultDistancesStride := uint32(maxResults * 4) // float32 - 4 bytes
var errorMessage *C.char
C.usearch_exact_search(dataset, C.size_t(datasetSize), C.size_t(datasetStride), queries, C.size_t(queryCount), C.size_t(queryStride),
quantization.CValue(), C.size_t(vectorDimensions), metric.CValue(), C.size_t(maxResults), C.size_t(numThreads),
Expand All @@ -757,8 +763,6 @@ func ExactSearchUnsafe(dataset unsafe.Pointer, queries unsafe.Pointer, datasetSi
return nil, nil, errors.New(C.GoString(errorMessage))
}

keys = keys[:maxResults]
distances = distances[:maxResults]
return keys, distances, nil
}

Expand Down Expand Up @@ -850,17 +854,21 @@ func DistanceI8(vec1 []int8, vec2 []int8, vectorDimensions uint, metric Metric)
// For contiguous int8 data, use vectorDimensions * 1 byte.
func ExactSearchI8(dataset []int8, queries []int8, datasetSize uint, queryCount uint,
datasetStride uint, queryStride uint, vectorDimensions uint, metric Metric,
maxResults uint, numThreads uint, resultKeysStride uint, resultDistancesStride uint) (keys []Key, distances []float32, err error) {
maxResults uint, numThreads uint) (keys []Key, distances []float32, err error) {

if len(dataset) == 0 || len(queries) == 0 {
return nil, nil, errors.New("dataset and queries cannot be empty")
}
if vectorDimensions == 0 {
return nil, nil, errors.New("dimensions must be greater than zero")
}

keys = make([]Key, maxResults)
distances = make([]float32, maxResults)
if maxResults == 0 {
return nil, nil, errors.New("maxResults must be greater than zero")
}
keys = make([]Key, queryCount*maxResults)
distances = make([]float32, queryCount*maxResults)
resultKeysStride := uint32(maxResults * 8) // int64 - 8 bytes
resultDistancesStride := uint32(maxResults * 4) // float32 - 4 bytes
var errorMessage *C.char
C.usearch_exact_search(unsafe.Pointer(&dataset[0]), C.size_t(datasetSize), C.size_t(datasetStride), unsafe.Pointer(&queries[0]), C.size_t(queryCount), C.size_t(queryStride),
C.usearch_scalar_i8_k, C.size_t(vectorDimensions), metric.CValue(), C.size_t(maxResults), C.size_t(numThreads),
Expand All @@ -872,8 +880,6 @@ func ExactSearchI8(dataset []int8, queries []int8, datasetSize uint, queryCount
if errorMessage != nil {
return nil, nil, errors.New(C.GoString(errorMessage))
}
keys = keys[:maxResults]
distances = distances[:maxResults]
return keys, distances, nil
}

Expand Down
Loading