void find_parents(int64_t ngroups) { int64_t i, j, *halo_order = NULL; struct fast3tree_results *nearest; struct fast3tree *halo_tree; FAST3TREE_TYPE *h1, *h2; float max_dist = BOX_SIZE/2.01, range; halo_order = check_realloc(halo_order, sizeof(int64_t)*ngroups, "Allocating halo order."); halo_tree = fast3tree_init(ngroups, GROUP_LIST); for (i=0; i<ngroups; i++) { GROUP_LIST[i].parent = -1; halo_order[i] = i; } qsort(halo_order, ngroups, sizeof(int64_t), sort_halo_order); nearest = fast3tree_results_init(); for (i=0; i<ngroups; i++) { h1 = &(GROUP_LIST[halo_order[i]]); range = h1->RADIUS*RADIUS_CONVERSION; if (max_dist < range) range = max_dist; fast3tree_find_sphere_periodic(halo_tree, nearest, h1->pos, range); for (j=0; j<nearest->num_points; j++) { h2 = nearest->points[j]; if (h2->RADIUS < h1->RADIUS) h2->parent = h1->id; } } fast3tree_results_free(nearest); fast3tree_free(&halo_tree); free(halo_order); }
static PyObject * uberseg_tree(PyObject* self, PyObject* args) { int x=0,y=0,k=0,segmin=0; float dmin=0,r=0,dx=0,d=0; float pos[2],fac=0; PyObject* seg = NULL; PyObject* weight = NULL; int Nx; int Ny; int object_number; PyObject* obj_inds_x = NULL; PyObject* obj_inds_y = NULL; int Ninds; int *ptrx,*ptry,*ptrs; float *ptrw; struct mytype *obj = NULL; struct fast3tree *tree = NULL; struct fast3tree_results *res = NULL; if (!PyArg_ParseTuple(args, (char*)"OOiiiOOi", &seg, &weight, &Nx, &Ny, &object_number, &obj_inds_x, &obj_inds_y, &Ninds)) { return NULL; } obj = (struct mytype *)malloc(sizeof(struct mytype)*Ninds); if(obj == NULL) exit(1); for(k=0;k<Ninds;++k) { ptrx = (int*)PyArray_GETPTR1(obj_inds_x,k); ptry = (int*)PyArray_GETPTR1(obj_inds_y,k); ptrs = (int*)PyArray_GETPTR2(seg,*ptrx,*ptry); obj[k].idx = k; obj[k].seg = *ptrs; obj[k].pos[0] = (float)(*ptrx); obj[k].pos[1] = (float)(*ptry); } tree = fast3tree_init(Ninds,obj); if(tree == NULL) exit(1); res = fast3tree_results_init(); if(res == NULL) exit(1); float maxr = 1.1*sqrt(Nx*Nx+Ny*Ny); for(x=0;x<Nx;++x) { for(y=0;y<Ny;++y) { //shortcuts ptrs = (int*)PyArray_GETPTR2(seg,x,y); if(*ptrs == object_number) continue; if(*ptrs > 0 && *ptrs != object_number) { ptrw = (float*)PyArray_GETPTR2(weight,x,y); *ptrw = 0.0; continue; } //must do search pos[0] = (float)x; pos[1] = (float)y; r = fast3tree_find_next_closest_distance(tree,res,pos); fac = 1.0/1.1; do { fac *= 1.1; fast3tree_results_clear(res); fast3tree_find_sphere(tree,res,pos,r*fac); } while(res->num_points == 0 && r*fac <= maxr); segmin = -1; for(k=0;k<res->num_points;++k) { dx = res->points[k]->pos[0]-x; d = dx*dx; dx = res->points[k]->pos[1]-y; d += dx*dx; if(segmin == -1 || d < dmin) { segmin = res->points[k]->seg; dmin = d; } } if(segmin == -1) { continue; } if(segmin != object_number) { ptrw = (float*)PyArray_GETPTR2(weight,x,y); *ptrw = 0.0; } } } free(obj); fast3tree_free(&tree); fast3tree_results_free(res); Py_INCREF(Py_None); return Py_None; }