annotate lshlib.h @ 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 83e37b76b483
children 11dd6eab15c8
rev   line source
mas01mc@292 1 // lshlib.h - a library for locality sensitive hashtable insertion and retrieval
mas01mc@292 2 //
mas01mc@292 3 // Author: Michael Casey
mas01mc@292 4 // Copyright (c) 2008 Michael Casey, All Rights Reserved
mas01mc@292 5
mas01mc@292 6 /* GNU GENERAL PUBLIC LICENSE
mas01mc@292 7 Version 2, June 1991
mas01mc@292 8 See LICENSE.txt
mas01mc@292 9 */
mas01mc@292 10
mas01mc@292 11 #ifndef __LSHLIB_H
mas01mc@292 12 #define __LSHLIB_H
mas01mc@292 13
mas01mc@292 14 #include <vector>
mas01mc@292 15 #include <queue>
mas01mc@292 16 #include <stdio.h>
mas01mc@292 17 #include <stdlib.h>
mas01mc@292 18 #include <sys/types.h>
mas01mc@292 19 #include <sys/stat.h>
mas01mc@292 20 #include <sys/mman.h>
mas01mc@292 21 #include <fcntl.h>
mas01mc@292 22 #include <string.h>
mas01mc@292 23 #include <iostream>
mas01mc@292 24 #include <fstream>
mas01mc@292 25 #include <math.h>
mas01mc@292 26 #include <sys/time.h>
mas01mc@292 27 #include <assert.h>
mas01mc@292 28 #include <float.h>
mas01mc@292 29 #include <signal.h>
mas01mc@292 30 #include <time.h>
mas01mc@292 31 #include <limits.h>
mas01mc@292 32 #include <errno.h>
mas01mc@292 33 #ifdef MT19937
mas01mc@292 34 #include "mt19937/mt19937ar.h"
mas01mc@292 35 #endif
mas01mc@519 36 #include "multiprobe.h"
mas01mc@292 37
mas01mc@292 38 #define IntT int
mas01mc@292 39 #define LongUns64T long long unsigned
mas01mc@292 40 #define Uns32T unsigned
mas01mc@292 41 #define Int32T int
mas01mc@292 42 #define BooleanT int
mas01mc@292 43 #define TRUE 1
mas01mc@292 44 #define FALSE 0
mas01mc@292 45
mas01mc@292 46 // A big number (>> max # of points)
mas01mc@292 47 #define INDEX_START_EMPTY 1000000000U
mas01mc@292 48
mas01mc@292 49 // 4294967291 = 2^32-5
mas01mc@292 50 #define UH_PRIME_DEFAULT 4294967291U
mas01mc@292 51
mas01mc@292 52 // 2^29
mas01mc@292 53 #define MAX_HASH_RND 536870912U
mas01mc@292 54
mas01mc@292 55 // 2^32-1
mas01mc@292 56 #define TWO_TO_32_MINUS_1 4294967295U
mas01mc@292 57
mas01mc@292 58 #define O2_SERIAL_VERSION 1 // Sync with SVN version
mas01mc@292 59 #define O2_SERIAL_HEADER_SIZE sizeof(SerialHeaderT)
mas01mc@292 60 #define O2_SERIAL_ELEMENT_SIZE sizeof(SerialElementT)
mas01mc@292 61 #define O2_SERIAL_MAX_TABLES (200)
mas01mc@324 62 #define O2_SERIAL_MAX_ROWS (1000000000)
mas01mc@324 63 #define O2_SERIAL_MAX_COLS (1000000)
mas01mc@464 64 #define O2_SERIAL_MAX_DIM (20000)
mas01mc@292 65 #define O2_SERIAL_MAX_FUNS (100)
mas01mc@292 66 #define O2_SERIAL_MAX_BINWIDTH (200)
mas01mc@296 67 #define O2_SERIAL_MAXFILESIZE (4000000000UL)
mas01mc@292 68
mas01mc@292 69 // Flags for Serial Header
mas01mc@324 70 #define O2_SERIAL_FILEFORMAT1 (0x1U) // Optimize disk format for on-disk search
mas01mc@324 71 #define O2_SERIAL_FILEFORMAT2 (0x2U) // Optimize disk format for in-core search
mas01mc@324 72 #define O2_SERIAL_COREFORMAT1 (0x4U)
mas01mc@324 73 #define O2_SERIAL_COREFORMAT2 (0x8U)
mas01mc@292 74
mas01mc@292 75 // Flags for serialization fileformat2: use high 3 bits of Uns32T
mas01mc@324 76 #define O2_SERIAL_TOKEN_T1 (0xFFFFFFFCU)
mas01mc@306 77 #define O2_SERIAL_TOKEN_T2 (0xFFFFFFFDU)
mas01mc@306 78 #define O2_SERIAL_TOKEN_ENDTABLE (0xFFFFFFFEU)
mas01mc@292 79
mas01mc@324 80 #define O2_INDEX_MAXSTR (256)
mas01mc@309 81
mas01mc@292 82 unsigned align_up(unsigned x, unsigned w);
mas01mc@292 83
mas01mc@292 84 #define O2_SERIAL_FUNCTIONS_SIZE (align_up(sizeof(float) * O2_SERIAL_MAX_TABLES * O2_SERIAL_MAX_FUNS * O2_SERIAL_MAX_DIM \
mas01mc@292 85 + sizeof(float) * O2_SERIAL_MAX_TABLES * O2_SERIAL_MAX_FUNS + \
mas01mc@292 86 + sizeof(Uns32T) * O2_SERIAL_MAX_TABLES * O2_SERIAL_MAX_FUNS * 2 \
mas01mc@292 87 + O2_SERIAL_HEADER_SIZE,get_page_logn()))
mas01mc@292 88
mas01mc@292 89 #define O2_SERIAL_MAX_LSH_SIZE (O2_SERIAL_ELEMENT_SIZE * O2_SERIAL_MAX_TABLES \
mas01mc@292 90 * O2_SERIAL_MAX_ROWS * O2_SERIAL_MAX_COLS + O2_SERIAL_FUNCTIONS_SIZE)
mas01mc@292 91
mas01mc@292 92 #define O2_SERIAL_MAGIC ('o'|'2'<<8|'l'<<16|'s'<<24)
mas01mc@292 93
mas01mc@340 94 #define WRITE_UNS32(VAL, TOKENSTR) if( fwrite(VAL, sizeof(Uns32T), 1, dbFile) != 1 ){\
mas01mc@340 95 fclose(dbFile);error("write error in serial_write_format2",TOKENSTR);}
mas01mc@340 96
mas01mc@524 97 //#define LSH_DUMP_CORE_TABLES // set to dump hashtables on load
mas01mc@523 98 #define _LSH_DEBUG_ // turn on debugging information
mas01mc@523 99
mas01mc@514 100 //#define USE_U_FUNCTIONS // set to use partial hashfunction re-use
mas01mc@514 101
mas01mc@523 102
mas01mc@523 103
mas01mc@514 104 // Backward-compatible CORE ARRAY lsh index
mas01mc@514 105 #define LSH_CORE_ARRAY // Set to use arrays for hashtables rather than linked-lists
mas01mc@514 106 #define LSH_LIST_HEAD_COUNTERS // Enable counters in hashtable list heads
mas01mc@514 107
mas01mc@514 108 // Critical path logic
mas01mc@514 109 #if defined LSH_CORE_ARRAY && !defined LSH_LIST_HEAD_COUNTERS
mas01mc@514 110 #define LSH_LIST_HEAD_COUNTERS
mas01mc@514 111 #endif
mas01mc@514 112
mas01mc@514 113 #define LSH_CORE_ARRAY_BIT (0x80000000) // LSH_CORE_ARRAY test bit for list head
mas01mc@514 114
mas01mc@519 115 #ifndef LSH_MULTI_PROBE_COUNT
mas01mc@519 116 #define LSH_MULTI_PROBE_COUNT 1 // How many adjacent hash-buckets to probe in LSH retrieval
mas01mc@519 117 #endif
mas01mc@292 118
mas01mc@292 119 Uns32T get_page_logn();
mas01mc@292 120
mas01mc@519 121 using namespace std;
mas01mc@519 122
mas01mc@292 123 // Disk table entry
mas01mc@292 124 typedef class SerialElement SerialElementT;
mas01mc@292 125 class SerialElement {
mas01mc@292 126 public:
mas01mc@292 127 Uns32T hashValue;
mas01mc@292 128 Uns32T pointID;
mas01mc@292 129
mas01mc@292 130 SerialElement(Uns32T h, Uns32T pID):
mas01mc@292 131 hashValue(h),
mas01mc@292 132 pointID(pID){}
mas01mc@292 133 };
mas01mc@292 134
mas01mc@292 135 // Disk header
mas01mc@292 136 typedef class SerialHeader SerialHeaderT;
mas01mc@292 137 class SerialHeader {
mas01mc@292 138 public:
mas01mc@292 139 Uns32T lshMagic; // unique identifier for file header
mas01mc@292 140 float binWidth; // hash-function bin width
mas01mc@292 141 Uns32T numTables; // number of hash tables in file
mas01mc@292 142 Uns32T numRows; // size of each hash table
mas01mc@292 143 Uns32T numCols; // max collisions in each hash table
mas01mc@292 144 Uns32T elementSize; // size of a hash bucket
mas01mc@292 145 Uns32T version; // version number of file format
mas01mc@292 146 Uns32T size; // total size of database (bytes)
mas01mc@292 147 Uns32T flags; // 32 bits of useful information
mas01mc@292 148 Uns32T dataDim; // vector dimensionality
mas01mc@292 149 Uns32T numFuns; // number of independent hash functions
mas01mc@292 150 float radius; // 32-bit floating point radius
mas01mc@292 151 Uns32T maxp; // number of unique IDs in the database
mas01mc@296 152 unsigned long long size_long; // long version of size
mas01mc@296 153 Uns32T pointCount; // number of points in the database
mas01mc@292 154
mas01mc@292 155 SerialHeader();
mas01mc@296 156 SerialHeader(float W, Uns32T L, Uns32T N, Uns32T C, Uns32T k, Uns32T d, float radius, Uns32T p, Uns32T FMT, Uns32T pointCount);
mas01mc@292 157
mas01mc@292 158 float get_binWidth(){return binWidth;}
mas01mc@292 159 Uns32T get_numTables(){return numTables;}
mas01mc@292 160 Uns32T get_numRows(){return numRows;}
mas01mc@292 161 Uns32T get_numCols(){return numCols;}
mas01mc@292 162 Uns32T get_elementSize(){return elementSize;}
mas01mc@292 163 Uns32T get_version(){return version;}
mas01mc@292 164 Uns32T get_flags(){return flags;}
mas01mc@296 165 unsigned long long get_size(){return size_long;}
mas01mc@292 166 Uns32T get_dataDim(){return dataDim;}
mas01mc@292 167 Uns32T get_numFuns(){return numFuns;}
mas01mc@292 168 Uns32T get_maxp(){return maxp;}
mas01mc@296 169 Uns32T get_pointCount(){return pointCount;}
mas01mc@292 170 };
mas01mc@292 171
mas01mc@292 172 #define IFLAG 0xFFFFFFFF
mas01mc@292 173
mas01mc@292 174 // Point-set collision bucket (sbucket).
mas01mc@292 175 // sbuckets form a collision chain that identifies PointIDs falling in the same locale.
mas01mc@292 176 // sbuckets are chained from a bucket containing the collision list's t2 identifier
mas01mc@292 177 class sbucket {
mas01mc@292 178 friend class bucket;
mas01mc@292 179 friend class H;
mas01mc@292 180 friend class G;
mas01mc@292 181
mas01mc@292 182 public:
mas01mc@292 183 class sbucket* snext;
mas01mc@292 184 unsigned int pointID;
mas01mc@292 185
mas01mc@292 186 sbucket(){
mas01mc@292 187 snext=0;
mas01mc@292 188 pointID=IFLAG;
mas01mc@292 189 }
mas01mc@292 190 ~sbucket(){delete snext;}
mas01mc@292 191 sbucket* get_snext(){return snext;}
mas01mc@292 192 };
mas01mc@292 193
mas01mc@292 194 // bucket structure for a linked list of locales that collide with the same hash value t1
mas01mc@292 195 // different buckets represent different locales, collisions within a locale are chained
mas01mc@292 196 // in sbuckets
mas01mc@292 197 class bucket {
mas01mc@292 198 friend class H;
mas01mc@292 199 friend class G;
mas01mc@292 200 bucket* next;
mas01mc@344 201 union {
mas01mc@344 202 sbucket* ptr;
mas01mc@344 203 Uns32T numBuckets;
mas01mc@344 204 } snext;
mas01mc@292 205 public:
mas01mc@292 206 unsigned int t2;
mas01mc@292 207 bucket(){
mas01mc@292 208 next=0;
mas01mc@344 209 snext.ptr=0;
mas01mc@292 210 t2=IFLAG;
mas01mc@292 211 }
mas01mc@344 212 ~bucket(){delete next;delete snext.ptr;}
mas01mc@292 213 bucket* get_next(){return next;}
mas01mc@292 214 };
mas01mc@292 215
mas01mc@292 216
mas01mc@292 217 // The hash_functions for locality-sensitive hashing
mas01mc@292 218 class H{
mas01mc@292 219 friend class G;
mas01mc@292 220 private:
mas01mc@293 221
mas01mc@293 222 float *** A; // m x k x d random projectors from R^d->R^k
mas01mc@293 223 float ** b; // m x k uniform additive constants
mas01mc@293 224
mas01mc@293 225 Uns32T ** g; // L x k random hash projections \in Z^k
mas01mc@292 226 Uns32T** r1; // random ints for hashing
mas01mc@292 227 Uns32T** r2; // random ints for hashing
mas01mc@293 228
mas01mc@293 229 bucket*** h; // The LSH hash tables
mas01mc@293 230
mas01mc@293 231 bool use_u_functions; // flag to optimize computation of hashes
mas01mc@514 232 #ifdef USE_U_FUNCTIONS
mas01mc@293 233 vector<vector<Uns32T> > uu; // Storage for m patial hash evaluations ( g_j = [u_a,u_b] )
mas01mc@514 234 #endif
mas01mc@293 235 Uns32T maxp; // highest pointID stored in database
mas01mc@293 236 Uns32T bucketCount; // count of number of point buckets allocated
mas01mc@293 237 Uns32T pointCount; // count of number of points inserted
mas01mc@296 238 Uns32T collisionCount; // number of points collided in a hash-table row
mas01mc@523 239 Uns32T tablesPointCount; // count of points per hash table on load
mas01mc@293 240
mas01mc@292 241 Uns32T t1; // first hash table key
mas01mc@292 242 Uns32T t2; // second hash table key
mas01mc@292 243 Uns32T P; // hash table prime number
mas01mc@292 244
mas01mc@519 245
mas01mc@292 246 Uns32T N; // num rows per table
mas01mc@292 247 Uns32T C; // num collision per row
mas01mc@292 248 Uns32T k; // num projections per hash function
mas01mc@292 249 Uns32T m; // ~sqrt num hash tables
mas01mc@292 250 Uns32T L; // L = m*(m-1)/2, conversely, m = (1 + sqrt(1 + 8.0*L)) / 2.0
mas01mc@292 251 Uns32T d; // dimensions
mas01mc@292 252 Uns32T p; // current point
mas01mc@293 253 float w; // width of hash slots (relative to normalized feature space)
mas01mc@293 254 float radius;// scaling coefficient for data (1./radius)
mas01mc@292 255
mas01mc@519 256 MultiProbe* multiProbePtr; // Utility class for handling multi-probe queries
mas01mc@519 257 float ** boundaryDistances; // Array of query bucket-boundary-distances per hashtable
mas01mc@519 258
mas01mc@293 259 void initialize_data_structures();
mas01mc@293 260 void initialize_lsh_functions();
mas01mc@293 261 void initialize_partial_functions();
mas01mc@293 262 void __bucket_insert_point(bucket*);
mas01mc@293 263 void __sbucket_insert_point(sbucket*);
mas01mc@340 264 bucket** get_pointer_to_bucket_linked_list(bucket* rowPtr);
mas01mc@293 265 Uns32T computeProductModDefaultPrime(Uns32T*,Uns32T*,IntT);
mas01mc@293 266 Uns32T randr();
mas01mc@293 267 float randn();
mas01mc@293 268 float ranf();
mas01mc@293 269 bucket** get_bucket(int j);
mas01mc@293 270 void error(const char* a, const char* b = "", const char *sysFunc = 0);
mas01mc@293 271
mas01mc@293 272 public:
mas01mc@293 273
mas01mc@293 274 H();
mas01mc@293 275 H(Uns32T k, Uns32T m, Uns32T d, Uns32T N, Uns32T C, float w, float r);
mas01mc@474 276 virtual ~H();
mas01mc@292 277
mas01mc@293 278 float get_w(){return w;}
mas01mc@293 279 float get_radius(){return radius;}
mas01mc@293 280 Uns32T get_numRows(){return N;}
mas01mc@293 281 Uns32T get_numCols(){return C;}
mas01mc@293 282 Uns32T get_numFuns(){return k;}
mas01mc@293 283 Uns32T get_numTables(){return L;}
mas01mc@293 284 Uns32T get_dataDim(){return d;}
mas01mc@293 285 Uns32T get_maxp(){return maxp;}
mas01mc@292 286
mas01mc@292 287 Uns32T bucket_insert_point(bucket**);
mas01mc@292 288
mas01mc@293 289 // Interface to hash functions
mas01mc@293 290 void compute_hash_functions(vector<float>& v);
mas01mc@293 291 void generate_hash_keys(Uns32T* g, Uns32T* r1, Uns32T* r2);
mas01mc@519 292 void generate_multiprobe_keys(Uns32T*g, Uns32T* r1, Uns32T* r2);
mas01mc@293 293 Uns32T get_t1(){return t1;} // hash-key t1
mas01mc@293 294 Uns32T get_t2(){return t2;} // hash-key t2
mas01mc@292 295 };
mas01mc@292 296
mas01mc@293 297 // Typedef for point-reporting callback function. Used to collect points during LSH retrieval
mas01mc@292 298 typedef void (*ReporterCallbackPtr)(void* objPtr, Uns32T pointID, Uns32T queryIndex, float squaredDistance);
mas01mc@292 299
mas01mc@292 300 // Interface for indexing and retrieval
mas01mc@292 301 class G: public H{
mas01mc@292 302 private:
mas01mc@308 303 char* indexName;
mas01mc@308 304
mas01mc@293 305 // LSH serial data structure file handling
mas01mc@292 306 void get_lock(int fd, bool exclusive);
mas01mc@292 307 void release_lock(int fd);
mas01mc@292 308 int serial_create(char* filename, Uns32T FMT);
mas01mc@292 309 int serial_create(char* filename, float binWidth, Uns32T nTables, Uns32T nRows, Uns32T nCols, Uns32T k, Uns32T d, Uns32T FMT);
mas01mc@292 310 char* serial_mmap(int dbfid, Uns32T sz, Uns32T w, off_t offset = 0);
mas01mc@292 311 void serial_munmap(char* db, Uns32T N);
mas01mc@292 312 int serial_open(char* filename,int writeFlag);
mas01mc@292 313 void serial_close(int dbfid);
mas01mc@292 314
mas01mc@292 315 // Function to write hashfunctions to disk
mas01mc@292 316 int serialize_lsh_hashfunctions(int fid);
mas01mc@292 317
mas01mc@292 318 // Functions to write hashtables to disk in format1 (optimized for on-disk retrieval)
mas01mc@292 319 int serialize_lsh_hashtables_format1(int fid, int merge);
mas01mc@292 320 void serial_write_hashtable_row_format1(SerialElementT*& pe, bucket* h, Uns32T& colCount);
mas01mc@292 321 void serial_write_element_format1(SerialElementT*& pe, sbucket* sb, Uns32T t2, Uns32T& colCount);
mas01mc@292 322 void serial_merge_hashtable_row_format1(SerialElementT* pr, bucket* h, Uns32T& colCount);
mas01mc@292 323 void serial_merge_element_format1(SerialElementT* pe, sbucket* sb, Uns32T t2, Uns32T& colCount);
mas01mc@292 324 int serial_can_merge(Uns32T requestedFormat); // Test to see whether core and on-disk structures are compatible
mas01mc@292 325
mas01mc@292 326 // Functions to write hashtables to disk in format2 (optimized for in-core retrieval)
mas01mc@336 327 int serialize_lsh_hashtables_format2(FILE* dbFile, int merge);
mas01mc@336 328 void serial_write_hashtable_row_format2(FILE* dbFile, bucket* h, Uns32T& colCount);
mas01mc@336 329 void serial_write_element_format2(FILE* dbFile, sbucket* sb, Uns32T& colCount);
mas01mc@340 330 Uns32T count_buckets_and_points_hashtable_row(bucket* bPtr);
mas01mc@340 331 Uns32T count_points_hashtable_row(bucket* bPtr);
mas01mc@292 332
mas01mc@292 333 // Functions to read serial header and hash functions (format1 and format2)
mas01mc@292 334 int unserialize_lsh_header(char* filename); // read lsh header from disk into core
mas01mc@292 335 void unserialize_lsh_functions(int fid); // read the lsh hash functions into core
mas01mc@292 336
mas01mc@292 337 // Functions to read hashtables in format1
mas01mc@292 338 void unserialize_lsh_hashtables_format1(int fid); // read FORMAT1 hash tables into core (disk format)
mas01mc@292 339 void unserialize_hashtable_row_format1(SerialElementT* pe, bucket** b); // read lsh hash table row into core
mas01mc@292 340
mas01mc@292 341 // Functions to read hashtables in format2
mas01mc@340 342 void unserialize_lsh_hashtables_format2(FILE* dbFile, bool forMerge = 0);
mas01mc@340 343 Uns32T unserialize_hashtable_row_format2(FILE* dbFile, bucket** b, Uns32T token=0); // to dynamic linked list
mas01mc@340 344 Uns32T unserialize_hashtable_row_to_array(FILE* dbFile, bucket** b, Uns32T numElements); // to core array
mas01mc@292 345
mas01mc@292 346 // Helper functions
mas01mc@292 347 void serial_print_header(Uns32T requestedFormat);
mas01mc@292 348 float* get_serial_hashfunction_base(char* db);
mas01mc@292 349 SerialElementT* get_serial_hashtable_base(char* db);
mas01mc@292 350 Uns32T get_serial_hashtable_offset(); // Size of SerialHeader + HashFunctions
mas01mc@292 351 SerialHeaderT* serial_get_header(char* db);
mas01mc@292 352 SerialHeaderT* lshHeader;
mas01mc@292 353
mas01mc@292 354 // Core Retrieval/Inspections Functions
mas01mc@292 355 void bucket_chain_point(bucket* p, Uns32T qpos);
mas01mc@292 356 void sbucket_chain_point(sbucket* p, Uns32T qpos);
mas01mc@292 357 void dump_hashtable_row(bucket* p);
mas01mc@513 358 void dump_core_hashtable_array(Uns32T* p);
mas01mc@292 359
mas01mc@292 360 // Serial (Format 1) Retrieval/Inspection Functions
mas01mc@292 361 void serial_bucket_chain_point(SerialElementT* pe, Uns32T qpos);
mas01mc@292 362 void serial_bucket_dump(SerialElementT* pe);
mas01mc@292 363
mas01mc@340 364 // Core ARRAY Retrieval Functions
mas01mc@340 365 void retrieve_from_core_hashtable_array(Uns32T* p, Uns32T qpos);
mas01mc@340 366
mas01mc@340 367
mas01mc@293 368 // Callback Function for point reporting
mas01mc@293 369 void* calling_instance; // store calling object instance for member-function callback
mas01mc@324 370 ReporterCallbackPtr add_point_callback; // Pointer to the callback function
mas01mc@292 371
mas01mc@292 372 public:
mas01mc@292 373 G(char* lshFile, bool lshInCore = false); // unserialize constructor
mas01mc@292 374 G(float w, Uns32T k,Uns32T m, Uns32T d, Uns32T N, Uns32T C, float r); // core constructor
mas01mc@474 375 virtual ~G();
mas01mc@292 376
mas01mc@292 377 Uns32T insert_point(vector<float>&, Uns32T pointID);
mas01mc@292 378 void insert_point_set(vector<vector<float> >& vv, Uns32T basePointID);
mas01mc@292 379
mas01mc@292 380 // point retrieval from core
mas01mc@292 381 void retrieve_point(vector<float>& v, Uns32T qpos, ReporterCallbackPtr, void* me=NULL);
mas01mc@292 382 // point set retrieval from core
mas01mc@292 383 void retrieve_point_set(vector<vector<float> >& vv, ReporterCallbackPtr, void* me=NULL);
mas01mc@292 384 // serial point set retrieval
mas01mc@292 385 void serial_retrieve_point_set(char* filename, vector<vector<float> >& vv, ReporterCallbackPtr, void* me=NULL);
mas01mc@292 386 // serial point retrieval
mas01mc@292 387 void serial_retrieve_point(char* filename, vector<float>& vv, Uns32T qpos, ReporterCallbackPtr, void* me=NULL);
mas01mc@292 388
mas01mc@292 389 void serialize(char* filename, Uns32T serialFormat = O2_SERIAL_FILEFORMAT1); // write hashfunctions and hashtables to disk
mas01mc@292 390
mas01mc@292 391 SerialHeaderT* get_lshHeader(){return lshHeader;}
mas01mc@292 392 void serial_dump_tables(char* filename);
mas01mc@292 393 float get_mean_collision_rate(){ return (float) pointCount / bucketCount ; }
mas01mc@308 394 char* get_indexName(){return indexName;}
mas01mc@513 395 void dump_hashtables();
mas01mc@513 396
mas01mc@292 397 };
mas01mc@292 398
mas01mc@292 399 typedef class G LSH;
mas01mc@292 400
mas01mc@292 401
mas01mc@292 402
mas01mc@292 403 #endif