annotate audioDB_API.h @ 419:f3b5d8aebd17 api-inversion

Map out "new" audiodb_query() API.
author mas01cr
date Wed, 24 Dec 2008 10:54:51 +0000
parents 6e6f4c1cc14d
children 166312a124bc
rev   line source
mas01cr@392 1 #include <stdbool.h>
mas01cr@398 2 #include <stdint.h>
mas01cr@398 3
mas01ik@355 4 /* for API questions contact
mas01ik@355 5 * Christophe Rhodes c.rhodes@gold.ac.uk
mas01ik@355 6 * Ian Knopke mas01ik@gold.ac.uk, ian.knopke@gmail.com */
mas01ik@355 7
mas01cr@392 8 /* Temporary workarounds */
mas01cr@388 9 typedef struct dbTableHeader adb_header_t;
mas01cr@392 10 int acquire_lock(int, bool);
mas01cr@388 11
mas01cr@400 12
mas01cr@401 13 /*******************************************************************/
mas01cr@401 14 /* Data types for API */
mas01cr@400 15
mas01ik@355 16 /* The main struct that stores the name of the database, and in future will hold all
mas01ik@355 17 * kinds of other interesting information */
mas01ik@355 18 /* This basically gets passed around to all of the other functions */
mas01cr@388 19
mas01cr@388 20 /* FIXME: it might be that "adb_" isn't such a good prefix to use, and
mas01cr@419 21 that we should prefer "audiodb_". Or else maybe we should be
mas01cr@419 22 calling ourselves libadb? */
mas01ik@355 23 typedef struct adb adb_t, *adb_ptr;
mas01ik@355 24
mas01cr@404 25 struct adb_datum {
mas01cr@404 26 uint32_t nvectors;
mas01cr@404 27 uint32_t dim;
mas01cr@404 28 const char *key;
mas01cr@404 29 double *data;
mas01cr@404 30 double *power;
mas01cr@404 31 double *times;
mas01cr@404 32 };
mas01cr@404 33 typedef struct adb_datum adb_datum_t;
mas01cr@404 34
mas01ik@355 35 //used for both insert and batchinsert
mas01ik@355 36 struct adbinsert {
mas01cr@405 37 const char *features;
mas01cr@405 38 const char *power;
mas01cr@405 39 const char *key;
mas01cr@405 40 const char *times;
mas01ik@355 41 };
mas01ik@355 42 typedef struct adbinsert adb_insert_t, *adb_insert_ptr;
mas01ik@355 43
mas01ik@355 44 /* struct for returning status results */
mas01ik@355 45 struct adbstatus {
mas01ik@355 46 unsigned int numFiles;
mas01ik@355 47 unsigned int dim;
mas01ik@355 48 unsigned int dudCount;
mas01ik@355 49 unsigned int nullCount;
mas01ik@355 50 unsigned int flags;
mas01cr@398 51 uint64_t length;
mas01cr@398 52 uint64_t data_region_size;
mas01ik@355 53 };
mas01ik@355 54 typedef struct adbstatus adb_status_t, *adb_status_ptr;
mas01ik@355 55
mas01ik@355 56 /* needed for constructing a query */
mas01ik@355 57 struct adbquery {
mas01ik@355 58
mas01ik@355 59 char * querytype;
mas01ik@355 60 char * feature; //usually a file of some kind
mas01ik@355 61 char * power; //also a file
mas01ik@355 62 char * keylist; //also a file
mas01ik@355 63 char * qpoint; //position
mas01ik@355 64 char * numpoints;
mas01ik@355 65 char * radius;
mas01ik@355 66 char * resultlength; //how many results to make
mas01ik@355 67 char * sequencelength;
mas01ik@355 68 char * sequencehop;
mas01ik@355 69 double absolute_threshold;
mas01ik@355 70 double relative_threshold;
mas01ik@355 71 int exhaustive; //hidden option in gengetopt
mas01ik@355 72 double expandfactor; //hidden
mas01ik@355 73 int rotate; //hidden
mas01ik@355 74
mas01ik@355 75 };
mas01ik@355 76 typedef struct adbquery adb_query_t,*adb_query_ptr;
mas01ik@355 77
mas01ik@355 78 /* ... and for getting query results back */
mas01ik@355 79 struct adbqueryresult {
mas01ik@355 80
mas01ik@355 81 int sizeRlist; /* do I really need to return all 4 sizes here */
mas01ik@355 82 int sizeDist;
mas01ik@355 83 int sizeQpos;
mas01ik@355 84 int sizeSpos;
mas01ik@355 85 char **Rlist;
mas01ik@355 86 double *Dist;
mas01ik@355 87 unsigned int *Qpos;
mas01ik@355 88 unsigned int *Spos;
mas01ik@355 89
mas01ik@355 90 };
mas01ik@355 91 typedef struct adbqueryresult adb_queryresult_t, *adb_queryresult_ptr;
mas01ik@355 92
mas01cr@419 93 /* New ("new" == December 2008) query API */
mas01cr@419 94
mas01cr@419 95 typedef struct adbresult {
mas01cr@419 96 const char *key;
mas01cr@419 97 double dist;
mas01cr@419 98 uint32_t qpos;
mas01cr@419 99 uint32_t ipos;
mas01cr@419 100 } adb_result_t;
mas01cr@419 101
mas01cr@419 102 #define ADB_REFINE_KEYLIST 1
mas01cr@419 103 #define ADB_REFINE_RADIUS 2
mas01cr@419 104 #define ADB_REFINE_ABSOLUTE_THRESHOLD 4
mas01cr@419 105 #define ADB_REFINE_RELATIVE_THRESHOLD 8
mas01cr@419 106 #define ADB_REFINE_DURATION_RATIO 16
mas01cr@419 107 #define ADB_REFINE_HOP_SIZE 32
mas01cr@419 108
mas01cr@419 109 typedef struct adbqueryrefine {
mas01cr@419 110 uint32_t flags;
mas01cr@419 111 uint32_t nkeys;
mas01cr@419 112 const char **keys;
mas01cr@419 113 double radius;
mas01cr@419 114 double absolute_threshold;
mas01cr@419 115 double relative_threshold;
mas01cr@419 116 double duration_ratio; /* expandfactor */
mas01cr@419 117 uint32_t hopsize;
mas01cr@419 118 } adb_query_refine_t;
mas01cr@419 119
mas01cr@419 120 #define ADB_ACCUMULATION_DB 1
mas01cr@419 121 #define ADB_ACCUMULATION_PER_TRACK 2
mas01cr@419 122 #define ADB_ACCUMULATION_ONE_TO_ONE 3
mas01cr@419 123
mas01cr@419 124 #define ADB_DISTANCE_DOT_PRODUCT 1
mas01cr@419 125 #define ADB_DISTANCE_EUCLIDEAN_NORMED 2
mas01cr@419 126 #define ADB_DISTANCE_EUCLIDEAN 3
mas01cr@419 127
mas01cr@419 128 typedef struct adbqueryparameters {
mas01cr@419 129 uint32_t accumulation;
mas01cr@419 130 uint32_t distance;
mas01cr@419 131 uint32_t npoints;
mas01cr@419 132 uint32_t ntracks;
mas01cr@419 133 } adb_query_parameters_t;
mas01cr@419 134
mas01cr@419 135 typedef struct adbqueryresults {
mas01cr@419 136 uint32_t nresults;
mas01cr@419 137 adb_result_t *results;
mas01cr@419 138 } adb_query_results_t;
mas01cr@419 139
mas01cr@419 140 typedef struct adbqueryid {
mas01cr@419 141 adb_datum_t *datum;
mas01cr@419 142 uint32_t sequence_length;
mas01cr@419 143 uint32_t sequence_start;
mas01cr@419 144 uint32_t exhaustive;
mas01cr@419 145 } adb_query_id_t;
mas01cr@419 146
mas01cr@419 147 typedef struct adbqueryspec {
mas01cr@419 148 adb_query_id_t qid;
mas01cr@419 149 adb_query_parameters_t qparms;
mas01cr@419 150 adb_query_refine_t qrefines;
mas01cr@419 151 } adb_query_spec_t;
mas01ik@355 152
mas01ik@355 153 /*******************************************************************/
mas01ik@355 154 /* Function prototypes for API */
mas01ik@355 155
mas01ik@355 156 /* open an existing database */
mas01ik@355 157 /* returns a struct or NULL on failure */
mas01cr@392 158 adb_ptr audiodb_open(const char *path, int flags);
mas01ik@355 159
mas01ik@355 160 /* create a new database */
mas01ik@355 161 /* returns a struct or NULL on failure */
mas01cr@381 162 adb_ptr audiodb_create(const char *path, unsigned datasize, unsigned ntracks, unsigned datadim);
mas01ik@355 163
mas01ik@355 164 /* close a database */
mas01ik@355 165 void audiodb_close(adb_ptr db);
mas01ik@355 166
mas01ik@355 167 /* You'll need to turn both of these on to do anything useful */
mas01ik@355 168 int audiodb_l2norm(adb_ptr mydb);
mas01ik@355 169 int audiodb_power(adb_ptr mydb);
mas01ik@355 170
mas01ik@355 171 /* insert functions */
mas01cr@404 172 int audiodb_insert_datum(adb_t *, adb_datum_t *);
mas01ik@355 173 int audiodb_insert(adb_ptr mydb, adb_insert_ptr ins);
mas01ik@355 174 int audiodb_batchinsert(adb_ptr mydb, adb_insert_ptr ins, unsigned int size);
mas01ik@355 175
mas01ik@355 176 /* query function */
mas01ik@355 177 int audiodb_query(adb_ptr mydb, adb_query_ptr adbq, adb_queryresult_ptr adbqres);
mas01cr@419 178 int audiodb_query_csr(adb_t *, adb_query_spec_t *, adb_query_results_t *);
mas01cr@419 179
mas01ik@355 180 /* database status */
mas01ik@355 181 int audiodb_status(adb_ptr mydb, adb_status_ptr status);
mas01ik@355 182
mas01ik@355 183 /* varoius dump formats */
mas01cr@399 184 int audiodb_dump(adb_ptr mydb, const char *outputdir);