comparison query.cpp @ 427:adaa6a688a04 api-inversion

Move sequence_foo() functions out of audioDB:: namespace... ... and into the internals header, mostly to get them out of the way. That means they have to be inline, which is probably suboptimal but will do for now.
author mas01cr
date Wed, 24 Dec 2008 10:55:24 +0000
parents 4a22a0bdf9a9
children 2d14d21f826b
comparison
equal deleted inserted replaced
426:4a22a0bdf9a9 427:adaa6a688a04
143 return k; 143 return k;
144 error("Key not found",key); 144 error("Key not found",key);
145 return O2_ERR_KEYNOTFOUND; 145 return O2_ERR_KEYNOTFOUND;
146 } 146 }
147 147
148 // This is a common pattern in sequence queries: what we are doing is
149 // taking a window of length seqlen over a buffer of length length,
150 // and placing the sum of the elements in that window in the first
151 // element of the window: thus replacing all but the last seqlen
152 // elements in the buffer with the corresponding windowed sum.
153 void audioDB::sequence_sum(double *buffer, int length, int seqlen) {
154 double tmp1, tmp2, *ps;
155 int j, w;
156
157 tmp1 = *buffer;
158 j = 1;
159 w = seqlen - 1;
160 while(w--) {
161 *buffer += buffer[j++];
162 }
163 ps = buffer + 1;
164 w = length - seqlen; // +1 - 1
165 while(w--) {
166 tmp2 = *ps;
167 if(isfinite(tmp1)) {
168 *ps = *(ps - 1) - tmp1 + *(ps + seqlen - 1);
169 } else {
170 for(int i = 1; i < seqlen; i++) {
171 *ps += *(ps + i);
172 }
173 }
174 tmp1 = tmp2;
175 ps++;
176 }
177 }
178
179 // In contrast to sequence_sum() above, sequence_sqrt() and
180 // sequence_average() below are simple mappers across the sequence.
181 void audioDB::sequence_sqrt(double *buffer, int length, int seqlen) {
182 int w = length - seqlen + 1;
183 while(w--) {
184 *buffer = sqrt(*buffer);
185 buffer++;
186 }
187 }
188
189 void audioDB::sequence_average(double *buffer, int length, int seqlen) {
190 int w = length - seqlen + 1;
191 while(w--) {
192 *buffer /= seqlen;
193 buffer++;
194 }
195 }
196
197 void audioDB::initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD) { 148 void audioDB::initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD) {
198 unsigned int j, k, l, w; 149 unsigned int j, k, l, w;
199 double *dp, *qp, *sp; 150 double *dp, *qp, *sp;
200 151
201 const unsigned HOP_SIZE = sequenceHop; 152 const unsigned HOP_SIZE = sequenceHop;
338 *qp = new double[*nvp * dbH->dim]; 289 *qp = new double[*nvp * dbH->dim];
339 memcpy(*qp, indata+sizeof(int), *nvp * dbH->dim * sizeof(double)); 290 memcpy(*qp, indata+sizeof(int), *nvp * dbH->dim * sizeof(double));
340 *qnp = new double[*nvp]; 291 *qnp = new double[*nvp];
341 audiodb_l2norm_buffer(*qp, dbH->dim, *nvp, *qnp); 292 audiodb_l2norm_buffer(*qp, dbH->dim, *nvp, *qnp);
342 293
343 sequence_sum(*qnp, *nvp, sequenceLength); 294 audiodb_sequence_sum(*qnp, *nvp, sequenceLength);
344 sequence_sqrt(*qnp, *nvp, sequenceLength); 295 audiodb_sequence_sqrt(*qnp, *nvp, sequenceLength);
345 296
346 if (usingPower) { 297 if (usingPower) {
347 *qpp = new double[*nvp]; 298 *qpp = new double[*nvp];
348 if (lseek(powerfd, sizeof(int), SEEK_SET) == (off_t) -1) { 299 if (lseek(powerfd, sizeof(int), SEEK_SET) == (off_t) -1) {
349 error("error seeking to data", powerFileName, "lseek"); 300 error("error seeking to data", powerFileName, "lseek");
354 } 305 }
355 if ((unsigned) count != *nvp * sizeof(double)) { 306 if ((unsigned) count != *nvp * sizeof(double)) {
356 error("short read", powerFileName); 307 error("short read", powerFileName);
357 } 308 }
358 309
359 sequence_sum(*qpp, *nvp, sequenceLength); 310 audiodb_sequence_sum(*qpp, *nvp, sequenceLength);
360 sequence_average(*qpp, *nvp, sequenceLength); 311 audiodb_sequence_average(*qpp, *nvp, sequenceLength);
361 } 312 }
362 313
363 if (usingTimes) { 314 if (usingTimes) {
364 unsigned int k; 315 unsigned int k;
365 *mqdp = 0.0; 316 *mqdp = 0.0;
452 403
453 Uns32T trackIndexOffset = trackOffsetTable[queryIndex]/dbH->dim; // Convert num data elements to num vectors 404 Uns32T trackIndexOffset = trackOffsetTable[queryIndex]/dbH->dim; // Convert num data elements to num vectors
454 // Copy L2 norm partial-sum coefficients 405 // Copy L2 norm partial-sum coefficients
455 assert(*qnp = new double[*nvp]); 406 assert(*qnp = new double[*nvp]);
456 memcpy(*qnp, l2normTable+trackIndexOffset, *nvp*sizeof(double)); 407 memcpy(*qnp, l2normTable+trackIndexOffset, *nvp*sizeof(double));
457 sequence_sum(*qnp, *nvp, sequenceLength); 408 audiodb_sequence_sum(*qnp, *nvp, sequenceLength);
458 sequence_sqrt(*qnp, *nvp, sequenceLength); 409 audiodb_sequence_sqrt(*qnp, *nvp, sequenceLength);
459 410
460 if( usingPower ){ 411 if( usingPower ){
461 // Copy Power partial-sum coefficients 412 // Copy Power partial-sum coefficients
462 assert(*qpp = new double[*nvp]); 413 assert(*qpp = new double[*nvp]);
463 memcpy(*qpp, powerTable+trackIndexOffset, *nvp*sizeof(double)); 414 memcpy(*qpp, powerTable+trackIndexOffset, *nvp*sizeof(double));
464 sequence_sum(*qpp, *nvp, sequenceLength); 415 audiodb_sequence_sum(*qpp, *nvp, sequenceLength);
465 sequence_average(*qpp, *nvp, sequenceLength); 416 audiodb_sequence_average(*qpp, *nvp, sequenceLength);
466 } 417 }
467 418
468 if (usingTimes) { 419 if (usingTimes) {
469 unsigned int k; 420 unsigned int k;
470 *mqdp = 0.0; 421 *mqdp = 0.0;
525 memcpy(*spp, powerTable, *dvp * sizeof(double)); 476 memcpy(*spp, powerTable, *dvp * sizeof(double));
526 } 477 }
527 478
528 for(unsigned int i = 0; i < dbH->numFiles; i++){ 479 for(unsigned int i = 0; i < dbH->numFiles; i++){
529 if(trackTable[i] >= sequenceLength) { 480 if(trackTable[i] >= sequenceLength) {
530 sequence_sum(snpp, trackTable[i], sequenceLength); 481 audiodb_sequence_sum(snpp, trackTable[i], sequenceLength);
531 sequence_sqrt(snpp, trackTable[i], sequenceLength); 482 audiodb_sequence_sqrt(snpp, trackTable[i], sequenceLength);
532 483
533 if (usingPower) { 484 if (usingPower) {
534 sequence_sum(sppp, trackTable[i], sequenceLength); 485 audiodb_sequence_sum(sppp, trackTable[i], sequenceLength);
535 sequence_average(sppp, trackTable[i], sequenceLength); 486 audiodb_sequence_average(sppp, trackTable[i], sequenceLength);
536 } 487 }
537 } 488 }
538 snpp += trackTable[i]; 489 snpp += trackTable[i];
539 if (usingPower) { 490 if (usingPower) {
540 sppp += trackTable[i]; 491 sppp += trackTable[i];