mirror of https://mirror.osredm.com/root/redis.git
w2v test: fix recall EF usage.
This commit is contained in:
parent
d94058fad9
commit
68d3067125
15
w2v.c
15
w2v.c
|
@ -29,6 +29,7 @@ uint64_t ms_time(void) {
|
||||||
void test_recall(HNSW *index, int ef) {
|
void test_recall(HNSW *index, int ef) {
|
||||||
const int num_test_vectors = 10000;
|
const int num_test_vectors = 10000;
|
||||||
const int k = 100; // Number of nearest neighbors to find.
|
const int k = 100; // Number of nearest neighbors to find.
|
||||||
|
if (ef < k) ef = k;
|
||||||
|
|
||||||
// Add recall distribution counters (2% bins from 0-100%).
|
// Add recall distribution counters (2% bins from 0-100%).
|
||||||
int recall_bins[50] = {0};
|
int recall_bins[50] = {0};
|
||||||
|
@ -81,10 +82,10 @@ void test_recall(HNSW *index, int ef) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate memory for results.
|
// Allocate memory for results.
|
||||||
hnswNode **hnsw_results = malloc(sizeof(hnswNode*) * k);
|
hnswNode **hnsw_results = malloc(sizeof(hnswNode*) * ef);
|
||||||
hnswNode **linear_results = malloc(sizeof(hnswNode*) * k);
|
hnswNode **linear_results = malloc(sizeof(hnswNode*) * ef);
|
||||||
float *hnsw_distances = malloc(sizeof(float) * k);
|
float *hnsw_distances = malloc(sizeof(float) * ef);
|
||||||
float *linear_distances = malloc(sizeof(float) * k);
|
float *linear_distances = malloc(sizeof(float) * ef);
|
||||||
|
|
||||||
if (!hnsw_results || !linear_results || !hnsw_distances || !linear_distances) {
|
if (!hnsw_results || !linear_results || !hnsw_distances || !linear_distances) {
|
||||||
printf("Failed to allocate memory for results\n");
|
printf("Failed to allocate memory for results\n");
|
||||||
|
@ -133,13 +134,15 @@ void test_recall(HNSW *index, int ef) {
|
||||||
|
|
||||||
// Perform HNSW search with the specified EF parameter.
|
// Perform HNSW search with the specified EF parameter.
|
||||||
int slot = hnsw_acquire_read_slot(index);
|
int slot = hnsw_acquire_read_slot(index);
|
||||||
int hnsw_found = hnsw_search_with_filter(index, test_vector, k, hnsw_results, hnsw_distances, slot, 0, NULL, NULL, ef);
|
int hnsw_found = hnsw_search(index, test_vector, ef, hnsw_results, hnsw_distances, slot, 0);
|
||||||
|
|
||||||
// Perform linear search (ground truth).
|
// Perform linear search (ground truth).
|
||||||
int linear_found = hnsw_ground_truth_with_filter(index, test_vector, k, linear_results, linear_distances, slot, 0, NULL, NULL);
|
int linear_found = hnsw_ground_truth_with_filter(index, test_vector, ef, linear_results, linear_distances, slot, 0, NULL, NULL);
|
||||||
hnsw_release_read_slot(index, slot);
|
hnsw_release_read_slot(index, slot);
|
||||||
|
|
||||||
// Calculate recall for this query (intersection size / k).
|
// Calculate recall for this query (intersection size / k).
|
||||||
|
if (hnsw_found > k) hnsw_found = k;
|
||||||
|
if (linear_found > k) linear_found = k;
|
||||||
int intersection_count = 0;
|
int intersection_count = 0;
|
||||||
for (int i = 0; i < linear_found; i++) {
|
for (int i = 0; i < linear_found; i++) {
|
||||||
for (int j = 0; j < hnsw_found; j++) {
|
for (int j = 0; j < hnsw_found; j++) {
|
||||||
|
|
Loading…
Reference in New Issue