mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01cr@498: #include mas01ik@355: mas01cr@498: #define TESTDB "testdb" mas01ik@355: mas01cr@498: void clean_remove_db(char * dbname) { mas01cr@498: unlink(dbname); mas01ik@355: } mas01ik@355: mas01cr@498: void maketestfile(const char *path, int dim, double *doubles, int ndoubles) { mas01cr@498: FILE *file; mas01ik@355: mas01cr@498: file = fopen(path, "w"); mas01cr@498: fwrite(&dim, sizeof(int), 1, file); mas01cr@498: fwrite(doubles, sizeof(double), ndoubles, file); mas01cr@498: fflush(file); mas01cr@498: fclose(file); mas01ik@355: } mas01ik@355: mas01cr@498: int close_enough(double a, double b, double epsilon) { mas01cr@498: return (fabs(a-b) < epsilon); mas01ik@355: } mas01ik@355: mas01cr@498: int result_position(adb_query_results_t *r, const char *key, float dist, uint32_t qpos, uint32_t ipos) { mas01cr@498: for(uint32_t k = 0; k < r->nresults; k++) { mas01cr@498: adb_result_t result = r->results[k]; mas01cr@498: if(close_enough(dist, result.dist, 1e-4) && (qpos == result.qpos) && mas01cr@672: (ipos == result.ipos) && !(strcmp(key, result.ikey))) { mas01cr@498: return k; mas01cr@498: } mas01cr@498: } mas01cr@498: return -1; mas01ik@355: } mas01ik@355: mas01cr@498: #define result_present_or_fail(r, k, d, q, i) \ mas01cr@498: if(result_position(r, k, d, q, i) < 0) return 1; mas01cr@548: mas01cr@548: int entry_position(adb_liszt_results_t *l, const char *key, uint32_t nvectors) { mas01cr@548: for(uint32_t k = 0; k < l->nresults; k++) { mas01cr@548: adb_track_entry_t entry = l->entries[k]; mas01cr@548: if((nvectors == entry.nvectors) && !strcmp(key, entry.key)) { mas01cr@548: return k; mas01cr@548: } mas01cr@548: } mas01cr@548: return -1; mas01cr@548: } mas01cr@548: mas01cr@548: #define entry_present_or_fail(l, k, n) \ mas01cr@548: if(entry_position(l, k, n) < 0) return 1;