annotate l2norm.cpp @ 755:37c2b9cce23a multiprobeLSH

Adding mkc_lsh_update branch, trunk candidate with improved LSH: merged trunk 1095 and branch multiprobe_lsh
author mas01mc
date Thu, 25 Nov 2010 13:42:40 +0000
parents fdcd436d7cbd
children
rev   line source
mas01cr@498 1 extern "C" {
mas01cr@498 2 #include "audioDB_API.h"
mas01cr@509 3 }
mas01cr@498 4 #include "audioDB-internals.h"
mas01cr@498 5
mas01cr@498 6 static int audiodb_l2norm_existing(adb_t *adb) {
mas01mc@519 7 double *data_buffer = 0, *l2norm_buffer = 0;
mas01cr@498 8 adb_header_t *header = adb->header;
mas01cr@509 9 size_t data_buffer_size = align_page_up(header->length);
mas01cr@498 10 size_t nvectors = header->length / (sizeof(double) * header->dim);
mas01cr@498 11 /* FIXME: this map of the vector data will lose if we ever turn the
mas01cr@498 12 * l2norm flag on when we have already inserted a large number of
mas01cr@498 13 * vectors, as the mmap() will fail. "Don't do that, then" is one
mas01cr@498 14 * possible answer. */
mas01cr@498 15 mmap_or_goto_error(double *, data_buffer, header->dataOffset, data_buffer_size);
mas01cr@498 16 l2norm_buffer = (double *) malloc(nvectors * sizeof(double));
mas01cr@498 17 if(!l2norm_buffer) {
mas01cr@498 18 goto error;
mas01cr@498 19 }
mas01cr@498 20 audiodb_l2norm_buffer(data_buffer, header->dim, nvectors, l2norm_buffer);
mas01cr@498 21 if(lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET) == (off_t) -1) {
mas01cr@498 22 goto error;
mas01cr@498 23 }
mas01cr@498 24 write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double));
mas01cr@498 25
mas01cr@498 26 munmap(data_buffer, data_buffer_size);
mas01cr@498 27 free(l2norm_buffer);
mas01cr@498 28
mas01cr@498 29 return 0;
mas01cr@498 30
mas01cr@498 31 error:
mas01cr@498 32 maybe_munmap(data_buffer, data_buffer_size);
mas01cr@498 33 if(l2norm_buffer) {
mas01cr@498 34 free(l2norm_buffer);
mas01cr@498 35 }
mas01cr@498 36 return 1;
mas01cr@498 37 }
mas01cr@498 38
mas01cr@498 39 int audiodb_l2norm(adb_t *adb) {
mas01cr@498 40 adb_header_t *header = adb->header;
mas01cr@498 41 if(!(adb->flags & O_RDWR)) {
mas01cr@498 42 return 1;
mas01cr@498 43 }
mas01cr@509 44 if(header->flags & ADB_HEADER_FLAG_L2NORM) {
mas01cr@498 45 /* non-error code for forthcoming backwards-compatibility
mas01cr@498 46 * reasons */
mas01cr@498 47 return 0;
mas01cr@498 48 }
mas01cr@509 49 if((!(header->flags & ADB_HEADER_FLAG_REFERENCES)) && (header->length > 0)) {
mas01cr@498 50 if(audiodb_l2norm_existing(adb)) {
mas01cr@498 51 goto error;
mas01cr@498 52 }
mas01cr@498 53 }
mas01cr@509 54 adb->header->flags |= ADB_HEADER_FLAG_L2NORM;
mas01cr@498 55 return audiodb_sync_header(adb);
mas01cr@498 56
mas01cr@498 57 error:
mas01cr@498 58 return 1;
mas01cr@498 59 }