annotate l2norm.cpp @ 524:469b50a3dd84 multiprobeLSH

Fixed a bug in LSH hashtable writing to disk that doesn't always sort the t2 entries into strict weak ordering. Now it does. Lots of debugging informational code inserted.
author mas01mc
date Wed, 28 Jan 2009 16:02:17 +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 }