mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@0: #include mas01cr@78: #include mas01cr@107: #include mas01cr@0: mas01cr@0: // includes for web services mas01cr@0: #include "soapH.h" mas01cr@0: #include "cmdline.h" mas01cr@0: mas01cr@0: #define MAXSTR 512 mas01cr@0: mas01cr@0: // Databse PRIMARY commands mas01cr@0: #define COM_CREATE "--NEW" mas01cr@0: #define COM_INSERT "--INSERT" mas01cr@0: #define COM_BATCHINSERT "--BATCHINSERT" mas01cr@0: #define COM_QUERY "--QUERY" mas01cr@0: #define COM_STATUS "--STATUS" mas01cr@0: #define COM_L2NORM "--L2NORM" mas01cr@195: #define COM_POWER "--POWER" mas01cr@0: #define COM_DUMP "--DUMP" mas01cr@0: #define COM_SERVER "--SERVER" mas01cr@0: mas01cr@0: // parameters mas01cr@0: #define COM_CLIENT "--client" mas01cr@0: #define COM_DATABASE "--database" mas01cr@0: #define COM_QTYPE "--qtype" mas01cr@0: #define COM_SEQLEN "--sequencelength" mas01cr@0: #define COM_SEQHOP "--sequencehop" mas01cr@0: #define COM_POINTNN "--pointnn" mas01cr@23: #define COM_TRACKNN "--resultlength" mas01cr@0: #define COM_QPOINT "--qpoint" mas01cr@0: #define COM_FEATURES "--features" mas01cr@0: #define COM_QUERYKEY "--key" mas01cr@0: #define COM_KEYLIST "--keyList" mas01cr@0: #define COM_TIMES "--times" mas01cr@195: #define COM_QUERYPOWER "--power" mas01cr@195: #define COM_RELATIVE_THRESH "--relative-threshold" mas01cr@195: #define COM_ABSOLUTE_THRESH "--absolute-threshold" mas01cr@0: mas01cr@112: #define O2_OLD_MAGIC ('O'|'2'<<8|'D'<<16|'B'<<24) mas01cr@112: #define O2_MAGIC ('o'|'2'<<8|'d'<<16|'b'<<24) mas01cr@225: #define O2_FORMAT_VERSION (4U) mas01cr@0: mas01cr@0: #define O2_DEFAULT_POINTNN (10U) mas01cr@23: #define O2_DEFAULT_TRACKNN (10U) mas01cr@0: mas01cr@277: //#define O2_DEFAULTDBSIZE (4000000000) // 4GB table size mas01cr@15: #define O2_DEFAULTDBSIZE (2000000000) // 2GB table size mas01cr@0: mas01cr@277: #define O2_DEFAULT_DATASIZE (1355U) // in MB mas01cr@277: #define O2_DEFAULT_NTRACKS (20000U) mas01cr@277: #define O2_DEFAULT_DATADIM (9U) mas01cr@277: mas01cr@243: #define O2_MAXFILES (20000U) mas01cr@0: #define O2_MAXFILESTR (256U) mas01cr@277: #define O2_FILETABLE_ENTRY_SIZE (O2_MAXFILESTR) mas01cr@277: #define O2_TRACKTABLE_ENTRY_SIZE (sizeof(unsigned)) mas01cr@0: #define O2_HEADERSIZE (sizeof(dbTableHeaderT)) mas01cr@0: #define O2_MEANNUMVECTORS (1000U) mas01cr@0: #define O2_MAXDIM (1000U) mas01cr@277: #define O2_MAXNN (1000000U) mas01cr@0: mas01cr@0: // Flags mas01cr@0: #define O2_FLAG_L2NORM (0x1U) mas01cr@0: #define O2_FLAG_MINMAX (0x2U) mas01cr@195: #define O2_FLAG_POWER (0x4U) mas01cr@0: #define O2_FLAG_TIMES (0x20U) mas01cr@0: mas01cr@107: // Query types mas01cr@107: #define O2_POINT_QUERY (0x4U) mas01cr@107: #define O2_SEQUENCE_QUERY (0x8U) mas01cr@107: #define O2_TRACK_QUERY (0x10U) mas01cr@277: #define O2_N_SEQUENCE_QUERY (0x20U) mas01cr@277: #define O2_ONE_TO_ONE_N_SEQUENCE_QUERY (0x40U) mas01cr@277: mas01cr@107: mas01cr@0: // Error Codes mas01cr@0: #define O2_ERR_KEYNOTFOUND (0xFFFFFF00) mas01cr@0: mas01cr@0: // Macros mas01cr@0: #define O2_ACTION(a) (strcmp(command,a)==0) mas01cr@0: mas01cr@112: #define ALIGN_UP(x,w) ((x) + ((1< vv) { \ mas01cr@243: fprintf(stderr, __VA_ARGS__); \ mas01cr@243: fflush(stderr); \ mas01cr@243: } mas01cr@0: mas01cr@225: typedef struct dbTableHeader { mas01cr@123: uint32_t magic; mas01cr@123: uint32_t version; mas01cr@123: uint32_t numFiles; mas01cr@123: uint32_t dim; mas01cr@123: uint32_t flags; mas01cr@225: uint32_t headerSize; mas01cr@197: off_t length; mas01cr@197: off_t fileTableOffset; mas01cr@197: off_t trackTableOffset; mas01cr@197: off_t dataOffset; mas01cr@197: off_t l2normTableOffset; mas01cr@197: off_t timesTableOffset; mas01cr@197: off_t powerTableOffset; mas01cr@197: off_t dbSize; mas01cr@0: } dbTableHeaderT, *dbTableHeaderPtr; mas01cr@0: mas01cr@243: class Reporter; mas01cr@0: mas01cr@0: class audioDB{ mas01cr@0: mas01cr@0: private: mas01cr@0: gengetopt_args_info args_info; mas01cr@0: unsigned dim; mas01cr@0: const char *dbName; mas01cr@0: const char *inFile; mas01cr@0: const char *hostport; mas01cr@0: const char *key; mas01cr@23: const char* trackFileName; mas01cr@243: std::ifstream *trackFile; mas01cr@0: const char *command; mas01cr@136: const char *output; mas01cr@0: const char *timesFileName; mas01cr@243: std::ifstream *timesFile; mas01cr@195: const char *powerFileName; mas01cr@243: std::ifstream *powerFile; mas01cr@195: int powerfd; mas01cr@0: mas01cr@0: int dbfid; mas01cr@197: bool forWrite; mas01cr@0: int infid; mas01cr@0: char* db; mas01cr@0: char* indata; mas01cr@0: struct stat statbuf; mas01cr@0: dbTableHeaderPtr dbH; mas01cr@0: mas01cr@0: char *fileTable; mas01cr@23: unsigned* trackTable; mas01cr@0: double* dataBuf; mas01cr@0: double* inBuf; mas01cr@0: double* l2normTable; mas01cr@197: double* timesTable; mas01cr@195: double* powerTable; mas01cr@0: mas01cr@197: size_t fileTableLength; mas01cr@197: size_t trackTableLength; mas01cr@197: off_t dataBufLength; mas01cr@197: size_t timesTableLength; mas01cr@197: size_t powerTableLength; mas01cr@197: size_t l2normTableLength; mas01cr@197: mas01cr@0: // Flags and parameters mas01cr@0: unsigned verbosity; // how much do we want to know? mas01cr@277: mas01cr@277: //off_t size; // given size (for creation) mas01cr@277: unsigned datasize; // size in MB mas01cr@277: unsigned ntracks; mas01cr@277: unsigned datadim; mas01cr@277: mas01cr@0: unsigned queryType; // point queries default mas01cr@0: unsigned pointNN; // how many point NNs ? mas01cr@23: unsigned trackNN; // how many track NNs ? mas01cr@0: unsigned sequenceLength; mas01cr@0: unsigned sequenceHop; mas01cr@243: bool normalizedDistance; mas01cr@0: unsigned queryPoint; mas01cr@0: unsigned usingQueryPoint; mas01cr@0: unsigned usingTimes; mas01cr@195: unsigned usingPower; mas01cr@0: unsigned isClient; mas01cr@0: unsigned isServer; mas01cr@0: unsigned port; mas01cr@0: double timesTol; mas01cr@23: double radius; mas01cr@195: mas01cr@195: bool use_absolute_threshold; mas01cr@195: double absolute_threshold; mas01cr@195: bool use_relative_threshold; mas01cr@195: double relative_threshold; mas01cr@195: mas01cr@23: mas01cr@0: // Timers mas01cr@0: struct timeval tv1; mas01cr@0: struct timeval tv2; mas01cr@0: mas01cr@0: // private methods mas01cr@36: void error(const char* a, const char* b = "", const char *sysFunc = 0); mas01cr@195: void sequence_sum(double *buffer, int length, int seqlen); mas01cr@195: void sequence_sqrt(double *buffer, int length, int seqlen); mas01cr@195: void sequence_average(double *buffer, int length, int seqlen); mas01cr@195: mas01cr@243: void initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD); mas01cr@243: void delete_arrays(int track, unsigned int numVectors, double **D, double **DD); mas01cr@243: void read_data(int track, double **data_buffer_p, size_t *data_buffer_size_p); mas01cr@243: void set_up_query(double **qp, double **vqp, double **qnp, double **vqnp, double **qpp, double **vqpp, double *mqdp, unsigned int *nvp); mas01cr@243: void set_up_db(double **snp, double **vsnp, double **spp, double **vspp, double **mddp, unsigned int *dvp); mas01cr@243: void query_loop(const char* dbName, const char* inFile, Reporter *reporter); mas01cr@0: mas01cr@197: void initDBHeader(const char *dbName); mas01cr@195: void initInputFile(const char *inFile); mas01cr@197: void initTables(const char* dbName, const char* inFile); mas01cr@0: void unitNorm(double* X, unsigned d, unsigned n, double* qNorm); mas01cr@0: void unitNormAndInsertL2(double* X, unsigned dim, unsigned n, unsigned append); mas01cr@243: void insertTimeStamps(unsigned n, std::ifstream* timesFile, double* timesdata); mas01cr@195: void insertPowerData(unsigned n, int powerfd, double *powerdata); mas01cr@0: unsigned getKeyPos(char* key); mas01cr@0: public: mas01cr@0: mas01cr@78: audioDB(const unsigned argc, char* const argv[]); mas01cr@136: audioDB(const unsigned argc, char* const argv[], adb__queryResponse *adbQueryResponse); mas01cr@136: audioDB(const unsigned argc, char* const argv[], adb__statusResponse *adbStatusResponse); mas01cr@107: void cleanup(); mas01cr@0: ~audioDB(); mas01cr@0: int processArgs(const unsigned argc, char* const argv[]); mas01cr@36: void get_lock(int fd, bool exclusive); mas01cr@36: void release_lock(int fd); mas01cr@0: void create(const char* dbName); mas01cr@0: void drop(); mas01cr@277: bool enough_per_file_space_free(); mas01cr@197: bool enough_data_space_free(off_t size); mas01cr@197: void insert_data_vectors(off_t offset, void *buffer, size_t size); mas01cr@0: void insert(const char* dbName, const char* inFile); mas01cr@0: void batchinsert(const char* dbName, const char* inFile); mas01cr@136: void query(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0); mas01cr@136: void status(const char* dbName, adb__statusResponse *adbStatusResponse=0); mas01cr@0: void ws_status(const char*dbName, char* hostport); mas01cr@23: void ws_query(const char*dbName, const char *trackKey, const char* hostport); mas01cr@0: void l2norm(const char* dbName); mas01cr@195: void power_flag(const char *dbName); mas01cr@195: bool powers_acceptable(double p1, double p2); mas01cr@0: void dump(const char* dbName); mas01cr@0: mas01cr@0: // web services mas01cr@0: void startServer(); mas01cr@0: mas01cr@0: }; mas01cr@23: mas01cr@107: #define O2_AUDIODB_INITIALIZERS \ mas01cr@107: dim(0), \ mas01cr@107: dbName(0), \ mas01cr@107: inFile(0), \ mas01cr@107: key(0), \ mas01cr@107: trackFileName(0), \ mas01cr@107: trackFile(0), \ mas01cr@107: command(0), \ mas01cr@136: output(0), \ mas01cr@107: timesFileName(0), \ mas01cr@107: timesFile(0), \ mas01cr@195: powerFileName(0), \ mas01cr@195: powerFile(0), \ mas01cr@195: powerfd(0), \ mas01cr@107: dbfid(0), \ mas01cr@197: forWrite(false), \ mas01cr@107: infid(0), \ mas01cr@107: db(0), \ mas01cr@107: indata(0), \ mas01cr@107: dbH(0), \ mas01cr@107: fileTable(0), \ mas01cr@107: trackTable(0), \ mas01cr@107: dataBuf(0), \ mas01cr@107: l2normTable(0), \ mas01cr@107: timesTable(0), \ mas01cr@197: fileTableLength(0), \ mas01cr@197: trackTableLength(0), \ mas01cr@197: dataBufLength(0), \ mas01cr@197: timesTableLength(0), \ mas01cr@197: powerTableLength(0), \ mas01cr@197: l2normTableLength(0), \ mas01cr@107: verbosity(1), \ mas01cr@277: datasize(O2_DEFAULT_DATASIZE), \ mas01cr@277: ntracks(O2_DEFAULT_NTRACKS), \ mas01cr@277: datadim(O2_DEFAULT_DATADIM), \ mas01cr@107: queryType(O2_POINT_QUERY), \ mas01cr@107: pointNN(O2_DEFAULT_POINTNN), \ mas01cr@107: trackNN(O2_DEFAULT_TRACKNN), \ mas01cr@107: sequenceLength(16), \ mas01cr@107: sequenceHop(1), \ mas01cr@243: normalizedDistance(true), \ mas01cr@107: queryPoint(0), \ mas01cr@107: usingQueryPoint(0), \ mas01cr@107: usingTimes(0), \ mas01cr@195: usingPower(0), \ mas01cr@107: isClient(0), \ mas01cr@107: isServer(0), \ mas01cr@107: port(0), \ mas01cr@107: timesTol(0.1), \ mas01cr@195: radius(0), \ mas01cr@195: use_absolute_threshold(false), \ mas01cr@195: absolute_threshold(0.0), \ mas01cr@195: use_relative_threshold(false), \ mas01cr@195: relative_threshold(0.0)