blob: dd7f87a989b73570b62cf741ef8133df90ae00c4 [file] [log] [blame]
/* AUTORIGHTS
Copyright (C) 2007 Princeton University
This file is part of Ferret Toolkit.
Ferret Toolkit is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <cass.h>
#include <cass_bench.h>
extern size_t D, N;
/* extern float *weight; */
extern float **points;
int
benchT_read(benchT *bench, const char *fname, int Q)
{
int i, j;
FILE *fp = fopen(fname, "r");
queryT *query;
if (fp == NULL) return -1;
bench->qrys = (queryT *)calloc(Q, sizeof(queryT));
for (i=0; i<Q; i++) {
query = &bench->qrys[i];
if (fscanf(fp, "%d", &(query->qry)) != 1) break;
fscanf(fp, "%d", &(query->knn));
query->nabors = (int *)calloc(query->knn, sizeof(int));
query->dist = (float *)calloc(query->knn, sizeof(float));
/*
query->dists = (float *)calloc(query->knn, sizeof(float));
*/
for (j=0; j<query->knn; j++) {
fscanf(fp, "%d", &(query->nabors[j]));
fscanf(fp, "%g", &(query->dist[j]));
/*
query->dists[j] = dist_l2(D, points[query->qry], points[query->nabors[j]], weight);
*/
}
}
fclose(fp);
bench->Q = Q;
bench->score = NULL;
return 0;
}
void
benchT_free(benchT *bench)
{
int i;
for (i=0; i<bench->Q; i++) {
free(bench->qrys[i].nabors);
free(bench->qrys[i].dist);
}
free(bench->qrys);
}
int
benchT_qry(benchT *bench, int x)
{
if (x < bench->Q)
return bench->qrys[x].qry;
else
return -1;
}
int *
benchT_nabors(benchT *bench, int x)
{
if (x < bench->Q)
return bench->qrys[x].nabors;
else
return NULL;
}
void
benchT_print(benchT *bench, int x)
{
int i;
queryT *query = &bench->qrys[x];
printf("qry %d:\n", query->qry);
for (i=0; i<query->knn; i++)
printf(" %d", query->nabors[i]);
printf("\n");
}
float
benchT_score_topk(benchT *bench, int x, int K, int cnt, cass_list_entry_t *results)
{
int i, j;
int matched = 0;
float recall;
queryT *query = &bench->qrys[x];
// benchT_print(bench, x);
for (i=0; i<K; i++) {
j = 0;
while ((j < cnt) && (results[j].id != query->nabors[i]))
j++;
if (j < cnt) {
matched++;
if (matched == K)
break;
}
}
recall = (float)matched / K;
return recall;
}
float
benchT_prec_topk(benchT *bench, int x, int K, int cnt, ftopk_t *results, float *prec)
{
int i, j;
float p;
queryT *query = &bench->qrys[x];
// benchT_print(bench, x);
p = 0;
for (i=0; i<K; i++) {
j = 0;
while ((j < cnt) && (results[j].index != query->nabors[i]))
j++;
if (j < cnt) {
prec[i] = (float) (i + 1) / (float) (j + 1);
}
else
{
prec[i] = 0.0;
}
p += prec[i];
}
p /= K;
return p;
}
float
benchT_score(benchT *bench, int x, int K, int cnt, int *results)
{
int i, j;
int matched = 0;
float recall;
queryT *query = &bench->qrys[x];
// benchT_print(bench, x);
for (i=0; i<K; i++) {
j = 0;
while ((j < cnt) && (results[j] != query->nabors[i]))
j++;
if (j < cnt) {
matched++;
if (matched == K)
break;
}
}
recall = (float)matched / K;
return recall;
}
/*
float
benchT_score_dist(benchT *bench, int x, int K, int cnt, float *dists)
{
int i;
float error;
queryT *query = &bench->qrys[x];
error = 0.0;
for (i=0; i<cnt; i++) {
if (query->dists[i] > 0)
error += dists[i] / query->dists[i];
else if (dists[i] == 0)
error += 1.0;
else
printf("ERROR:\t%d\t%.3f\t%.3f\n", i, dists[i], query->dists[i]);
//printf("%d\t%.3f\t%.3f\t%.3f\n", i, dists[i], query->dists[i], error);
}
return error/cnt;
}
*/