Exemple #1
0
//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);
    
}
Exemple #2
0
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 ;
}