\ * initialize structure, allocate buffers and generate initial golution * \************************************************************************************/
| 321 | * initialize structure, allocate buffers and generate initial golution * |
| 322 | \************************************************************************************/ |
| 323 | static int icvInitEMD( const float* signature1, int size1, |
| 324 | const float* signature2, int size2, |
| 325 | int dims, CvDistanceFunction dist_func, void* user_param, |
| 326 | const float* cost, int cost_step, |
| 327 | CvEMDState* state, float* lower_bound, |
| 328 | cv::AutoBuffer<char>& _buffer ) |
| 329 | { |
| 330 | float s_sum = 0, d_sum = 0, diff; |
| 331 | int i, j; |
| 332 | int ssize = 0, dsize = 0; |
| 333 | int equal_sums = 1; |
| 334 | int buffer_size; |
| 335 | float max_cost = 0; |
| 336 | char *buffer, *buffer_end; |
| 337 | |
| 338 | memset( state, 0, sizeof( *state )); |
| 339 | assert( cost_step % sizeof(float) == 0 ); |
| 340 | cost_step /= sizeof(float); |
| 341 | |
| 342 | /* calculate buffer size */ |
| 343 | buffer_size = (size1+1) * (size2+1) * (sizeof( float ) + /* cost */ |
| 344 | sizeof( char ) + /* is_x */ |
| 345 | sizeof( float )) + /* delta matrix */ |
| 346 | (size1 + size2 + 2) * (sizeof( CvNode2D ) + /* _x */ |
| 347 | sizeof( CvNode2D * ) + /* cols_x & rows_x */ |
| 348 | sizeof( CvNode1D ) + /* u & v */ |
| 349 | sizeof( float ) + /* s & d */ |
| 350 | sizeof( int ) + sizeof(CvNode2D*)) + /* idx1 & idx2 */ |
| 351 | (size1+1) * (sizeof( float * ) + sizeof( char * ) + /* rows pointers for */ |
| 352 | sizeof( float * )) + 256; /* cost, is_x and delta */ |
| 353 | |
| 354 | if( buffer_size < (int) (dims * 2 * sizeof( float ))) |
| 355 | { |
| 356 | buffer_size = dims * 2 * sizeof( float ); |
| 357 | } |
| 358 | |
| 359 | /* allocate buffers */ |
| 360 | _buffer.allocate(buffer_size); |
| 361 | |
| 362 | state->buffer = buffer = _buffer; |
| 363 | buffer_end = buffer + buffer_size; |
| 364 | |
| 365 | state->idx1 = (int*) buffer; |
| 366 | buffer += (size1 + 1) * sizeof( int ); |
| 367 | |
| 368 | state->idx2 = (int*) buffer; |
| 369 | buffer += (size2 + 1) * sizeof( int ); |
| 370 | |
| 371 | state->s = (float *) buffer; |
| 372 | buffer += (size1 + 1) * sizeof( float ); |
| 373 | |
| 374 | state->d = (float *) buffer; |
| 375 | buffer += (size2 + 1) * sizeof( float ); |
| 376 | |
| 377 | /* sum up the supply and demand */ |
| 378 | for( i = 0; i < size1; i++ ) |
| 379 | { |
| 380 | float weight = signature1[i * (dims + 1)]; |
no test coverage detected