//void xcorr(float *tr1, float *tr2, double *corp, long long shift, void knn (float *buffer_delayembedding_selec, float * density_vals , vl_size len_array, int num_neighbours) { VL_PRINT ("KNN search !") ; printf("size of each frame = %llu\n", len_array); // instantiate a KD TREE object // VlKDForest returns new KDForest. // The data dimension dimension and the number of trees numTrees must not be smaller than one. VlKDForest* kdtree_obj; // define params for the object kdtree_obj = vl_kdforest_new(VL_TYPE_FLOAT, 3, 1, VlDistanceL2); // populate it with the data to be subsampled vl_kdforest_build (kdtree_obj,len_array,buffer_delayembedding_selec); // instantiate a searcher object for querying knn // A searcher is an object attached to the forest which must be created before running the queries. Each query has to be invoked with the searcher as its argument; make it point to the declared and defined kdtree VlKDForestSearcher* kdforest_search_obj=vl_kdforest_new_searcher(kdtree_obj); VlKDForestNeighbor neighbours[num_neighbours+1]; float *query = malloc(3*sizeof(float)); /* for (int i=0; i<len_array; i++) { printf("% d th original :%f %f %f\n",i, buffer_delayembedding_selec [3*i],buffer_delayembedding_selec [3*i+1],buffer_delayembedding_selec [3*i+2]); } */ for (int i=0; i<len_array; i++) { // printf("DBG: buffer selec[%d] :%f %f %f\n",i, buffer_delayembedding_selec [3*i],buffer_delayembedding_selec [3*i+1],buffer_delayembedding_selec [3*i+2]); get_query(buffer_delayembedding_selec , query , i); int nvisited = vl_kdforestsearcher_query(kdforest_search_obj, &neighbours[0], num_neighbours+1, query); // printf("visited nodes = %d ", nvisited); // printf("for knn of %dth node : (%f,%f,%f) :", i,*query,*(query+1),*(query+2)); density_vals[i]=1/sqrtf(neighbours[num_neighbours].distance); // printf("DB %f \n",( density_vals[i])); } // Destroy all created instances vl_kdforest_delete ( kdtree_obj ); free(query); }
vl_size vl_kdforest_query_with_array (VlKDForest * self, vl_uint32 * indexes, vl_size numNeighbors, vl_size numQueries, void * distances, void const * queries) { vl_size numComparisons = 0; vl_type dataType = vl_kdforest_get_data_type(self) ; vl_size dimension = vl_kdforest_get_data_dimension(self) ; #ifdef _OPENMP #pragma omp parallel default(shared) num_threads(vl_get_max_threads()) #endif { vl_index qi ; vl_size thisNumComparisons = 0 ; VlKDForestSearcher * searcher ; VlKDForestNeighbor * neighbors ; #ifdef _OPENMP #pragma omp critical #endif { searcher = vl_kdforest_new_searcher(self) ; neighbors = vl_calloc (sizeof(VlKDForestNeighbor), numNeighbors) ; } #ifdef _OPENMP #pragma omp for #endif for(qi = 0 ; qi < (signed)numQueries; ++ qi) { switch (dataType) { case VL_TYPE_FLOAT: { vl_size ni; thisNumComparisons += vl_kdforestsearcher_query (searcher, neighbors, numNeighbors, (float const *) (queries) + qi * dimension) ; for (ni = 0 ; ni < numNeighbors ; ++ni) { indexes [qi*numNeighbors + ni] = (vl_uint32) neighbors[ni].index ; if (distances){ *((float*)distances + qi*numNeighbors + ni) = neighbors[ni].distance ; } } break ; } case VL_TYPE_DOUBLE: { vl_size ni; thisNumComparisons += vl_kdforestsearcher_query (searcher, neighbors, numNeighbors, (double const *) (queries) + qi * dimension) ; for (ni = 0 ; ni < numNeighbors ; ++ni) { indexes [qi*numNeighbors + ni] = (vl_uint32) neighbors[ni].index ; if (distances){ *((double*)distances + qi*numNeighbors + ni) = neighbors[ni].distance ; } } break ; } default: abort() ; } } #ifdef _OPENMP #pragma omp critical #endif { numComparisons += thisNumComparisons ; vl_kdforestsearcher_delete (searcher) ; vl_free (neighbors) ; } } return numComparisons ; }