annotate libtests/0027/prog1.c @ 548:e18843dc0aea

Implement a rudimentary API for audioDB::liszt The API is rudimentary because we've dropped support for the incremental retrieval of tracks and their number of vectors (at the API level; the SOAP and command-line support is still there -- no changes should be visible). This is potentially bad for the large-scale databases, of course; one million tracks will take of the order of 16MB of RAM, more if I'm unlucky about how std::string.c_str() is implemented. Both this liszt operation and querying (and sampling, forthcoming...) would benefit from a `cursor-like' interface to retrieval results: for an API like that, instead of getting a struct with the data there, you get a cookie with which you can ask the database for successive results. This would be neat for all sorts of reasons. In the meantime, at least this change fixes SOAP memory leaks related to liszt. Make liszt.o part of LIBOBJS rather than ordinary OBJS, so that the liszt functionality is actually compiled into the library. Add a test for this library functionality; also modify the command-line test file to run the SOAP server on its own port.
author mas01cr
date Wed, 11 Feb 2009 12:38:03 +0000
parents 342822c2d49a
children bcc7a6ddb2c8
rev   line source
mas01cr@498 1 #include "audioDB_API.h"
mas01cr@498 2 #include "test_utils_lib.h"
mas01ik@355 3
mas01cr@498 4 int main(int argc, char **argv) {
mas01cr@498 5 adb_t *adb;
mas01ik@355 6
mas01cr@498 7 clean_remove_db(TESTDB);
mas01cr@498 8 if(!(adb = audiodb_create(TESTDB, 0, 0, 0)))
mas01cr@498 9 return 1;
mas01ik@355 10
mas01cr@498 11 adb_datum_t feature = {2, 2, "testfeature", (double[4]){0, 1, 1, 0},
mas01cr@498 12 (double[2]){-0.5, -1}};
mas01cr@498 13 if(!audiodb_insert_datum(adb, &feature))
mas01cr@498 14 return 1;
mas01cr@498 15 if(audiodb_power(adb))
mas01cr@498 16 return 1;
mas01cr@498 17 feature.power = NULL;
mas01cr@498 18 if(!audiodb_insert_datum(adb, &feature))
mas01cr@498 19 return 1;
mas01cr@498 20 feature.power = (double[2]){-0.5, -1};
mas01cr@498 21 if(audiodb_insert_datum(adb, &feature))
mas01cr@498 22 return 1;
mas01ik@355 23
mas01cr@498 24 if(audiodb_l2norm(adb))
mas01cr@498 25 return 1;
mas01ik@355 26
mas01cr@498 27 adb_datum_t query = {1, 2, "testquery", (double[2]) {0, 0.5}};
mas01cr@498 28 adb_query_id_t qid = {0};
mas01cr@498 29 qid.datum = &query;
mas01cr@498 30 qid.sequence_length = 1;
mas01cr@498 31 qid.sequence_start = 0;
mas01cr@498 32 adb_query_parameters_t parms =
mas01cr@498 33 {ADB_ACCUMULATION_PER_TRACK, ADB_DISTANCE_EUCLIDEAN_NORMED, 10, 10};
mas01cr@498 34 adb_query_refine_t refine = {0};
mas01cr@498 35 refine.hopsize = 1;
mas01ik@355 36
mas01cr@498 37 adb_query_spec_t spec;
mas01cr@498 38 spec.qid = qid;
mas01cr@498 39 spec.params = parms;
mas01cr@498 40 spec.refine = refine;
mas01ik@355 41
mas01cr@498 42 adb_query_results_t *results = audiodb_query_spec(adb, &spec);
mas01cr@498 43 if(!results || results->nresults != 2) return 1;
mas01cr@498 44 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 45 result_present_or_fail(results, "testfeature", 2, 0, 1);
mas01cr@498 46 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 47
mas01cr@498 48 spec.params.npoints = 1;
mas01cr@498 49 results = audiodb_query_spec(adb, &spec);
mas01cr@498 50 if(!results || results->nresults != 1) return 1;
mas01cr@498 51 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 52 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 53
mas01cr@498 54 spec.qid.datum->data = (double [2]) {0.5, 0};
mas01cr@498 55 spec.params.npoints = 10;
mas01cr@498 56 results = audiodb_query_spec(adb, &spec);
mas01cr@498 57 if(!results || results->nresults != 2) return 1;
mas01cr@498 58 result_present_or_fail(results, "testfeature", 0, 0, 1);
mas01cr@498 59 result_present_or_fail(results, "testfeature", 2, 0, 0);
mas01cr@498 60 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 61
mas01cr@498 62 spec.params.npoints = 1;
mas01cr@498 63 results = audiodb_query_spec(adb, &spec);
mas01cr@498 64 if(!results || results->nresults != 1) return 1;
mas01cr@498 65 result_present_or_fail(results, "testfeature", 0, 0, 1);
mas01cr@498 66 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 67
mas01cr@498 68 /* queries with associated power data */
mas01cr@498 69 spec.qid.datum->data = (double [2]) {0, 0.5};
mas01cr@498 70 spec.qid.datum->power = (double [1]) {-0.5};
mas01cr@498 71 spec.params.npoints = 10;
mas01cr@498 72 spec.refine.flags = ADB_REFINE_ABSOLUTE_THRESHOLD;
mas01cr@498 73 spec.refine.absolute_threshold = -1.4;
mas01cr@498 74 results = audiodb_query_spec(adb, &spec);
mas01cr@498 75 if(!results || results->nresults != 2) return 1;
mas01cr@498 76 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 77 result_present_or_fail(results, "testfeature", 2, 0, 1);
mas01cr@498 78 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 79
mas01cr@498 80 spec.refine.absolute_threshold = -0.6;
mas01cr@498 81 results = audiodb_query_spec(adb, &spec);
mas01cr@498 82 if(!results || results->nresults != 1) return 1;
mas01cr@498 83 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 84 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 85
mas01cr@498 86 spec.refine.absolute_threshold = -0.2;
mas01cr@498 87 results = audiodb_query_spec(adb, &spec);
mas01cr@498 88 if(!results || results->nresults != 0) return 1;
mas01cr@498 89 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 90
mas01cr@498 91 spec.refine.absolute_threshold = 0;
mas01cr@498 92 spec.refine.flags = ADB_REFINE_RELATIVE_THRESHOLD;
mas01cr@498 93 spec.refine.relative_threshold = 1;
mas01cr@498 94 results = audiodb_query_spec(adb, &spec);
mas01cr@498 95 if(!results || results->nresults != 2) return 1;
mas01cr@498 96 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 97 result_present_or_fail(results, "testfeature", 2, 0, 1);
mas01cr@498 98 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 99
mas01cr@498 100 spec.refine.relative_threshold = 0.2;
mas01cr@498 101 results = audiodb_query_spec(adb, &spec);
mas01cr@498 102 if(!results || results->nresults != 1) return 1;
mas01cr@498 103 result_present_or_fail(results, "testfeature", 0, 0, 0);
mas01cr@498 104 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 105
mas01cr@498 106 spec.qid.datum->data = (double [2]) {0.5, 0};
mas01cr@498 107 spec.refine.flags = ADB_REFINE_ABSOLUTE_THRESHOLD;
mas01cr@498 108 spec.refine.absolute_threshold = -1.4;
mas01cr@498 109 results = audiodb_query_spec(adb, &spec);
mas01cr@498 110 if(!results || results->nresults != 2) return 1;
mas01cr@498 111 result_present_or_fail(results, "testfeature", 0, 0, 1);
mas01cr@498 112 result_present_or_fail(results, "testfeature", 2, 0, 0);
mas01cr@498 113 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 114
mas01cr@498 115 spec.refine.absolute_threshold = -0.6;
mas01cr@498 116 results = audiodb_query_spec(adb, &spec);
mas01cr@498 117 if(!results || results->nresults != 1) return 1;
mas01cr@498 118 result_present_or_fail(results, "testfeature", 2, 0, 0);
mas01cr@498 119 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 120
mas01cr@498 121 spec.refine.absolute_threshold = -0.2;
mas01cr@498 122 results = audiodb_query_spec(adb, &spec);
mas01cr@498 123 if(!results || results->nresults != 0) return 1;
mas01cr@498 124 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 125
mas01cr@498 126 spec.refine.absolute_threshold = 0;
mas01cr@498 127 spec.refine.flags = ADB_REFINE_RELATIVE_THRESHOLD;
mas01cr@498 128 spec.refine.relative_threshold = 1;
mas01cr@498 129 results = audiodb_query_spec(adb, &spec);
mas01cr@498 130 if(!results || results->nresults != 2) return 1;
mas01cr@498 131 result_present_or_fail(results, "testfeature", 0, 0, 1);
mas01cr@498 132 result_present_or_fail(results, "testfeature", 2, 0, 0);
mas01cr@498 133 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 134
mas01cr@498 135 spec.refine.relative_threshold = 0.2;
mas01cr@498 136 results = audiodb_query_spec(adb, &spec);
mas01cr@498 137 if(!results || results->nresults != 1) return 1;
mas01cr@498 138 result_present_or_fail(results, "testfeature", 2, 0, 0);
mas01cr@498 139 audiodb_query_free_results(adb, &spec, results);
mas01ik@355 140
mas01cr@498 141 audiodb_close(adb);
mas01ik@355 142
mas01cr@498 143 return 104;
mas01ik@355 144 }