annotate audioDB.h @ 249:1da9a9ed55a3

Slightly refactored the new trackSequenceQueryNNReporter so that it is a derived class of trackAveragingReporter. This reduces code duplication significantly. The reporter is still accessed via the nsequence QUERY directive from the command line.
author mas01mc
date Sun, 17 Feb 2008 16:39:57 +0000
parents 5682c7d7444b
children a6c9a1c68646
rev   line source
mas01cr@0 1 #include <stdio.h>
mas01cr@0 2 #include <stdlib.h>
mas01cr@0 3 #include <sys/types.h>
mas01cr@0 4 #include <sys/stat.h>
mas01cr@0 5 #include <sys/mman.h>
mas01cr@0 6 #include <fcntl.h>
mas01cr@0 7 #include <string.h>
mas01cr@0 8 #include <iostream>
mas01cr@0 9 #include <fstream>
mas01cr@0 10 #include <math.h>
mas01cr@0 11 #include <sys/time.h>
mas01cr@0 12 #include <assert.h>
mas01cr@62 13 #include <float.h>
mas01cr@104 14 #include <signal.h>
mas01cr@0 15
mas01cr@0 16 // includes for web services
mas01cr@0 17 #include "soapH.h"
mas01cr@0 18 #include "cmdline.h"
mas01cr@0 19
mas01cr@0 20 #define MAXSTR 512
mas01cr@0 21
mas01cr@0 22 // Databse PRIMARY commands
mas01cr@0 23 #define COM_CREATE "--NEW"
mas01cr@0 24 #define COM_INSERT "--INSERT"
mas01cr@0 25 #define COM_BATCHINSERT "--BATCHINSERT"
mas01cr@0 26 #define COM_QUERY "--QUERY"
mas01cr@0 27 #define COM_STATUS "--STATUS"
mas01cr@0 28 #define COM_L2NORM "--L2NORM"
mas01cr@193 29 #define COM_POWER "--POWER"
mas01cr@0 30 #define COM_DUMP "--DUMP"
mas01cr@0 31 #define COM_SERVER "--SERVER"
mas01cr@0 32
mas01cr@0 33 // parameters
mas01cr@0 34 #define COM_CLIENT "--client"
mas01cr@0 35 #define COM_DATABASE "--database"
mas01cr@0 36 #define COM_QTYPE "--qtype"
mas01cr@0 37 #define COM_SEQLEN "--sequencelength"
mas01cr@0 38 #define COM_SEQHOP "--sequencehop"
mas01cr@0 39 #define COM_POINTNN "--pointnn"
mas01mc@18 40 #define COM_TRACKNN "--resultlength"
mas01cr@0 41 #define COM_QPOINT "--qpoint"
mas01cr@0 42 #define COM_FEATURES "--features"
mas01cr@0 43 #define COM_QUERYKEY "--key"
mas01cr@0 44 #define COM_KEYLIST "--keyList"
mas01cr@0 45 #define COM_TIMES "--times"
mas01cr@193 46 #define COM_QUERYPOWER "--power"
mas01cr@193 47 #define COM_RELATIVE_THRESH "--relative-threshold"
mas01cr@193 48 #define COM_ABSOLUTE_THRESH "--absolute-threshold"
mas01cr@0 49
mas01cr@108 50 #define O2_OLD_MAGIC ('O'|'2'<<8|'D'<<16|'B'<<24)
mas01cr@108 51 #define O2_MAGIC ('o'|'2'<<8|'d'<<16|'b'<<24)
mas01cr@210 52 #define O2_FORMAT_VERSION (4U)
mas01cr@0 53
mas01cr@0 54 #define O2_DEFAULT_POINTNN (10U)
mas01mc@18 55 #define O2_DEFAULT_TRACKNN (10U)
mas01cr@0 56
mas01mc@248 57 //#define O2_DEFAULTDBSIZE (4000000000) // 4GB table size
mas01mc@7 58 #define O2_DEFAULTDBSIZE (2000000000) // 2GB table size
mas01cr@0 59
mas01cr@239 60 #define O2_MAXFILES (20000U)
mas01cr@0 61 #define O2_MAXFILESTR (256U)
mas01cr@0 62 #define O2_FILETABLESIZE (O2_MAXFILESTR)
mas01mc@18 63 #define O2_TRACKTABLESIZE (sizeof(unsigned))
mas01cr@0 64 #define O2_HEADERSIZE (sizeof(dbTableHeaderT))
mas01cr@0 65 #define O2_MEANNUMVECTORS (1000U)
mas01cr@0 66 #define O2_MAXDIM (1000U)
mas01mc@17 67 #define O2_MAXNN (10000U)
mas01cr@0 68
mas01cr@0 69 // Flags
mas01cr@0 70 #define O2_FLAG_L2NORM (0x1U)
mas01cr@0 71 #define O2_FLAG_MINMAX (0x2U)
mas01cr@193 72 #define O2_FLAG_POWER (0x4U)
mas01cr@0 73 #define O2_FLAG_TIMES (0x20U)
mas01cr@0 74
mas01cr@105 75 // Query types
mas01cr@105 76 #define O2_POINT_QUERY (0x4U)
mas01cr@105 77 #define O2_SEQUENCE_QUERY (0x8U)
mas01cr@105 78 #define O2_TRACK_QUERY (0x10U)
mas01mc@248 79 #define O2_N_SEQUENCE_QUERY (0x20U)
mas01mc@248 80
mas01cr@105 81
mas01cr@0 82 // Error Codes
mas01cr@0 83 #define O2_ERR_KEYNOTFOUND (0xFFFFFF00)
mas01cr@0 84
mas01cr@0 85 // Macros
mas01cr@0 86 #define O2_ACTION(a) (strcmp(command,a)==0)
mas01cr@0 87
mas01cr@108 88 #define ALIGN_UP(x,w) ((x) + ((1<<w)-1) & ~((1<<w)-1))
mas01cr@108 89 #define ALIGN_DOWN(x,w) ((x) & ~((1<<w)-1))
mas01cr@108 90
mas01cr@196 91 #define ALIGN_PAGE_UP(x) ((x) + (getpagesize()-1) & ~(getpagesize()-1))
mas01cr@196 92 #define ALIGN_PAGE_DOWN(x) ((x) & ~(getpagesize()-1))
mas01cr@196 93
mas01cr@166 94 #define ENSURE_STRING(x) ((x) ? (x) : "")
mas01cr@166 95
mas01cr@239 96 #define CHECKED_MMAP(type, var, start, length) \
mas01cr@239 97 { void *tmp = mmap(0, length, (PROT_READ | (forWrite ? PROT_WRITE : 0)), MAP_SHARED, dbfid, (start)); \
mas01cr@239 98 if(tmp == (void *) -1) { \
mas01cr@239 99 error("mmap error for db table", #var, "mmap"); \
mas01cr@239 100 } \
mas01cr@239 101 var = (type) tmp; \
mas01cr@239 102 }
mas01cr@239 103
mas01cr@239 104 #define VERB_LOG(vv, ...) \
mas01cr@239 105 if(verbosity > vv) { \
mas01cr@239 106 fprintf(stderr, __VA_ARGS__); \
mas01cr@239 107 fflush(stderr); \
mas01cr@239 108 }
mas01cr@0 109
mas01cr@210 110 typedef struct dbTableHeader {
mas01cr@114 111 uint32_t magic;
mas01cr@114 112 uint32_t version;
mas01cr@114 113 uint32_t numFiles;
mas01cr@114 114 uint32_t dim;
mas01cr@114 115 uint32_t flags;
mas01cr@210 116 uint32_t headerSize;
mas01cr@196 117 off_t length;
mas01cr@196 118 off_t fileTableOffset;
mas01cr@196 119 off_t trackTableOffset;
mas01cr@196 120 off_t dataOffset;
mas01cr@196 121 off_t l2normTableOffset;
mas01cr@196 122 off_t timesTableOffset;
mas01cr@196 123 off_t powerTableOffset;
mas01cr@196 124 off_t dbSize;
mas01cr@0 125 } dbTableHeaderT, *dbTableHeaderPtr;
mas01cr@0 126
mas01cr@239 127 class Reporter;
mas01cr@0 128
mas01cr@0 129 class audioDB{
mas01cr@0 130
mas01cr@0 131 private:
mas01cr@0 132 gengetopt_args_info args_info;
mas01cr@0 133 unsigned dim;
mas01cr@0 134 const char *dbName;
mas01cr@0 135 const char *inFile;
mas01cr@0 136 const char *hostport;
mas01cr@0 137 const char *key;
mas01mc@18 138 const char* trackFileName;
mas01cr@239 139 std::ifstream *trackFile;
mas01cr@0 140 const char *command;
mas01cr@131 141 const char *output;
mas01cr@0 142 const char *timesFileName;
mas01cr@239 143 std::ifstream *timesFile;
mas01cr@193 144 const char *powerFileName;
mas01cr@239 145 std::ifstream *powerFile;
mas01cr@193 146 int powerfd;
mas01cr@0 147
mas01cr@0 148 int dbfid;
mas01cr@196 149 bool forWrite;
mas01cr@0 150 int infid;
mas01cr@0 151 char* db;
mas01cr@0 152 char* indata;
mas01cr@0 153 struct stat statbuf;
mas01cr@0 154 dbTableHeaderPtr dbH;
mas01cr@0 155
mas01cr@0 156 char *fileTable;
mas01mc@18 157 unsigned* trackTable;
mas01cr@0 158 double* dataBuf;
mas01cr@0 159 double* inBuf;
mas01cr@0 160 double* l2normTable;
mas01cr@196 161 double* timesTable;
mas01cr@193 162 double* powerTable;
mas01cr@0 163
mas01cr@196 164 size_t fileTableLength;
mas01cr@196 165 size_t trackTableLength;
mas01cr@196 166 off_t dataBufLength;
mas01cr@196 167 size_t timesTableLength;
mas01cr@196 168 size_t powerTableLength;
mas01cr@196 169 size_t l2normTableLength;
mas01cr@196 170
mas01cr@0 171 // Flags and parameters
mas01cr@0 172 unsigned verbosity; // how much do we want to know?
mas01cr@196 173 off_t size; // given size (for creation)
mas01cr@0 174 unsigned queryType; // point queries default
mas01cr@0 175 unsigned pointNN; // how many point NNs ?
mas01mc@18 176 unsigned trackNN; // how many track NNs ?
mas01cr@0 177 unsigned sequenceLength;
mas01cr@0 178 unsigned sequenceHop;
mas01cr@239 179 bool normalizedDistance;
mas01cr@0 180 unsigned queryPoint;
mas01cr@0 181 unsigned usingQueryPoint;
mas01cr@0 182 unsigned usingTimes;
mas01cr@193 183 unsigned usingPower;
mas01cr@0 184 unsigned isClient;
mas01cr@0 185 unsigned isServer;
mas01cr@0 186 unsigned port;
mas01cr@0 187 double timesTol;
mas01mc@17 188 double radius;
mas01cr@193 189
mas01cr@193 190 bool use_absolute_threshold;
mas01cr@193 191 double absolute_threshold;
mas01cr@193 192 bool use_relative_threshold;
mas01cr@193 193 double relative_threshold;
mas01cr@193 194
mas01mc@17 195
mas01cr@0 196 // Timers
mas01cr@0 197 struct timeval tv1;
mas01cr@0 198 struct timeval tv2;
mas01cr@0 199
mas01cr@0 200 // private methods
mas01cr@32 201 void error(const char* a, const char* b = "", const char *sysFunc = 0);
mas01cr@193 202 void sequence_sum(double *buffer, int length, int seqlen);
mas01cr@193 203 void sequence_sqrt(double *buffer, int length, int seqlen);
mas01cr@193 204 void sequence_average(double *buffer, int length, int seqlen);
mas01cr@193 205
mas01cr@239 206 void initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD);
mas01cr@239 207 void delete_arrays(int track, unsigned int numVectors, double **D, double **DD);
mas01cr@239 208 void read_data(int track, double **data_buffer_p, size_t *data_buffer_size_p);
mas01cr@239 209 void set_up_query(double **qp, double **vqp, double **qnp, double **vqnp, double **qpp, double **vqpp, double *mqdp, unsigned int *nvp);
mas01cr@239 210 void set_up_db(double **snp, double **vsnp, double **spp, double **vspp, double **mddp, unsigned int *dvp);
mas01cr@240 211 void query_loop(const char* dbName, const char* inFile, Reporter *reporter);
mas01cr@0 212
mas01cr@196 213 void initDBHeader(const char *dbName);
mas01cr@169 214 void initInputFile(const char *inFile);
mas01cr@196 215 void initTables(const char* dbName, const char* inFile);
mas01cr@0 216 void unitNorm(double* X, unsigned d, unsigned n, double* qNorm);
mas01cr@0 217 void unitNormAndInsertL2(double* X, unsigned dim, unsigned n, unsigned append);
mas01cr@239 218 void insertTimeStamps(unsigned n, std::ifstream* timesFile, double* timesdata);
mas01cr@193 219 void insertPowerData(unsigned n, int powerfd, double *powerdata);
mas01cr@0 220 unsigned getKeyPos(char* key);
mas01cr@0 221 public:
mas01cr@0 222
mas01cr@76 223 audioDB(const unsigned argc, char* const argv[]);
mas01cr@133 224 audioDB(const unsigned argc, char* const argv[], adb__queryResponse *adbQueryResponse);
mas01cr@133 225 audioDB(const unsigned argc, char* const argv[], adb__statusResponse *adbStatusResponse);
mas01cr@97 226 void cleanup();
mas01cr@0 227 ~audioDB();
mas01cr@0 228 int processArgs(const unsigned argc, char* const argv[]);
mas01cr@30 229 void get_lock(int fd, bool exclusive);
mas01cr@30 230 void release_lock(int fd);
mas01cr@0 231 void create(const char* dbName);
mas01cr@0 232 void drop();
mas01cr@196 233 bool enough_data_space_free(off_t size);
mas01cr@196 234 void insert_data_vectors(off_t offset, void *buffer, size_t size);
mas01cr@0 235 void insert(const char* dbName, const char* inFile);
mas01cr@0 236 void batchinsert(const char* dbName, const char* inFile);
mas01cr@133 237 void query(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0);
mas01cr@133 238 void status(const char* dbName, adb__statusResponse *adbStatusResponse=0);
mas01cr@0 239 void ws_status(const char*dbName, char* hostport);
mas01mc@18 240 void ws_query(const char*dbName, const char *trackKey, const char* hostport);
mas01cr@0 241 void l2norm(const char* dbName);
mas01cr@193 242 void power_flag(const char *dbName);
mas01cr@193 243 bool powers_acceptable(double p1, double p2);
mas01cr@0 244 void dump(const char* dbName);
mas01cr@0 245
mas01cr@0 246 // web services
mas01cr@0 247 void startServer();
mas01cr@0 248
mas01cr@0 249 };
mas01mc@17 250
mas01cr@105 251 #define O2_AUDIODB_INITIALIZERS \
mas01cr@105 252 dim(0), \
mas01cr@105 253 dbName(0), \
mas01cr@105 254 inFile(0), \
mas01cr@105 255 key(0), \
mas01cr@105 256 trackFileName(0), \
mas01cr@105 257 trackFile(0), \
mas01cr@105 258 command(0), \
mas01cr@131 259 output(0), \
mas01cr@105 260 timesFileName(0), \
mas01cr@105 261 timesFile(0), \
mas01cr@193 262 powerFileName(0), \
mas01cr@193 263 powerFile(0), \
mas01cr@193 264 powerfd(0), \
mas01cr@105 265 dbfid(0), \
mas01cr@196 266 forWrite(false), \
mas01cr@105 267 infid(0), \
mas01cr@105 268 db(0), \
mas01cr@105 269 indata(0), \
mas01cr@105 270 dbH(0), \
mas01cr@105 271 fileTable(0), \
mas01cr@105 272 trackTable(0), \
mas01cr@105 273 dataBuf(0), \
mas01cr@105 274 l2normTable(0), \
mas01cr@105 275 timesTable(0), \
mas01cr@196 276 fileTableLength(0), \
mas01cr@196 277 trackTableLength(0), \
mas01cr@196 278 dataBufLength(0), \
mas01cr@196 279 timesTableLength(0), \
mas01cr@196 280 powerTableLength(0), \
mas01cr@196 281 l2normTableLength(0), \
mas01cr@105 282 verbosity(1), \
mas01cr@129 283 size(O2_DEFAULTDBSIZE), \
mas01cr@105 284 queryType(O2_POINT_QUERY), \
mas01cr@105 285 pointNN(O2_DEFAULT_POINTNN), \
mas01cr@105 286 trackNN(O2_DEFAULT_TRACKNN), \
mas01cr@105 287 sequenceLength(16), \
mas01cr@105 288 sequenceHop(1), \
mas01cr@239 289 normalizedDistance(true), \
mas01cr@105 290 queryPoint(0), \
mas01cr@105 291 usingQueryPoint(0), \
mas01cr@105 292 usingTimes(0), \
mas01cr@193 293 usingPower(0), \
mas01cr@105 294 isClient(0), \
mas01cr@105 295 isServer(0), \
mas01cr@105 296 port(0), \
mas01cr@105 297 timesTol(0.1), \
mas01cr@193 298 radius(0), \
mas01cr@193 299 use_absolute_threshold(false), \
mas01cr@193 300 absolute_threshold(0.0), \
mas01cr@193 301 use_relative_threshold(false), \
mas01cr@193 302 relative_threshold(0.0)