⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xbuild.c

📁 xtree程序实现
💻 C
📖 第 1 页 / 共 4 页
字号:
  function : int minOverlapSplitAxis(node_type **overnode)  purpose  : to return the best split axis according to the minimum overlap  parameter: node_type **overnode - the array of the over nodes overnode  return   : int - the index of the best split axix according to the minimum overlap*/// **** Ray added// Min overlap splitint minOverlapSplitAxis(node_type **overnode){  int axis_chosen, *sorted_index;  node_type *group1, *group2;  // *** Ray changed  //double new_margin_value, min_margin_value;  double new_overlap_value, min_overlap_value;  int i, j, k, l, stop, cut;  // *** Ray added  node_type *parentNode;  int noOfOver;  // *** Ray added  parentNode = overnode[0]->parent;  noOfOver = parentNode->snodeSize*M+1;  // *** Ray changed  //sorted_index = (int *)malloc(sizeof(int) * (M+1));  sorted_index = (int *)malloc(sizeof(int) * noOfOver);  tree_node_allocate(&group1);  tree_node_allocate(&group2);  for (i=0; i<dim; i++) {	sort_entries(sorted_index, overnode, i, noOfOver);   // sort the entries by axis i	// *** Ray changed	//new_margin_value = 0.0;	new_overlap_value = 0.0;	// *** Ray changed	//stop = M - 2*m + 1;	stop = M*parentNode->snodeSize - 2*m + 1;	for (k=0; k<stop; k++) {        	for (l=0; l<dim; l++) {                	group1->a[l] = overnode[sorted_index[0]]->a[l];	                group1->b[l] = overnode[sorted_index[0]]->b[l];					// *** Ray changed        	        //group2->a[l] = overnode[sorted_index[M]]->a[l];                	//group2->b[l] = overnode[sorted_index[M]]->b[l];					group2->a[l] = overnode[sorted_index[M*parentNode->snodeSize]]->a[l];                	group2->b[l] = overnode[sorted_index[M*parentNode->snodeSize]]->b[l];        	}        		j = 0;		cut = m + k;		// *** Ray changed		//while (j < M+1) {		while (j < M*parentNode->snodeSize+1) {			if (j < cut) {				cal_MBR_node_node(group1->a, group1->b, group1, overnode[sorted_index[j]]);			}			else {				cal_MBR_node_node(group2->a, group2->b, group2, overnode[sorted_index[j]]);			}			j++;		}		// *** Ray modified		//for (l=0; l<dim; l++) {		//		//	new_margin_value = new_margin_value + group1->b[l] - group1->a[l];		//	new_margin_value = new_margin_value + group2->b[l] - group2->a[l];		//		//}		new_overlap_value = cal_overlap(group1, group2);	}	if (i == 0) {                axis_chosen = i;				// *** Ray modified                //min_margin_value = new_margin_value;				min_overlap_value = new_overlap_value;	}	else {		// *** Ray modified		//if (new_margin_value < min_margin_value) {		if (new_overlap_value < min_overlap_value) {			axis_chosen = i;			// *** Ray modified			//min_margin_value = new_margin_value;			min_overlap_value = new_overlap_value;		}	}	  }  tree_node_deallocate(group1);  tree_node_deallocate(group2);  free(sorted_index);  return(axis_chosen);} /* minOverlapSplitAxis *//*  function : void minOverlapSplitIndex(node_type **overnode, int axis_chosen, node_type              *group1_chosen, node_type *group2_chosen)  purpose  : to choose the best split index of the axis chosen axis_chosen according to             minimum overlap  parameter: node_type **overnode     - the array of the overflow nodes             int axis_chosen          - the index of the axis chosen	     node_type *group1_chosen - the first group to be split	     node_type *group2_chosen - the second group to be split  return   : none*/// *** Ray added// min overlap splitvoid minOverlapSplitIndex(node_type **overnode, int axis_chosen, node_type *group1_chosen, node_type *group2_chosen){  int split_index, *sorted_index;  node_type *group1, *group2;    double new_overlap_value, min_overlap_value;  double vol_at_index, new_vol;  int i, j, k, stop, cut;  //FILE *fp;  // *** Ray added  node_type *parentNode;  int noOfOver;  // *** Ray added (to be changed)  parentNode = overnode[0]->parent;  noOfOver = parentNode->snodeSize*M+1;  // **** Ray has changed  //sorted_index = (int *)malloc(sizeof(int) * (M+1));  sorted_index = (int *)malloc(sizeof(int) * noOfOver);  // *** Ray changed  tree_temp_node_allocate(&group1, parentNode->snodeSize);  tree_temp_node_allocate(&group2, parentNode->snodeSize);    sort_entries(sorted_index, overnode, axis_chosen, noOfOver);   // sort the entries by the axis, axis_chosen  new_overlap_value = 0.0;    // *** Ray has changed  //stop = M - 2*m + 1;  stop = M*parentNode->snodeSize - 2*m + 1;  for (k=1; k<stop; k++) {	for (i=0; i<dim; i++) {		group1->a[i] = overnode[sorted_index[0]]->a[i];		group1->b[i] = overnode[sorted_index[0]]->b[i];		// *** Ray changed		//group2->a[i] = overnode[sorted_index[M]]->a[i];		//group2->b[i] = overnode[sorted_index[M]]->b[i];		group2->a[i] = overnode[sorted_index[M*parentNode->snodeSize]]->a[i];		group2->b[i] = overnode[sorted_index[M*parentNode->snodeSize]]->b[i];	}	// *** Ray changed	//cut = m + k; 	cut = k; 	//for (j=0; j<M+1; j++) {	for (j=0; j<M*parentNode->snodeSize+1; j++) {  		if (j < cut) {  			cal_MBR_node_node(group1->a, group1->b, group1, overnode[sorted_index[j]]);                        		}		else {                        				cal_MBR_node_node(group2->a, group2->b, group2, overnode[sorted_index[j]]);  		}	}	new_overlap_value = cal_overlap(group1, group2);         	if (k == 1) {   		split_index = k;		min_overlap_value = new_overlap_value;		vol_at_index = cal_vol(group1->a, group1->b) + cal_vol(group2->a, group2->b);  	}	else {                   		if (new_overlap_value < min_overlap_value) {			split_index = k;			min_overlap_value = new_overlap_value;			vol_at_index = cal_vol(group1->a, group1->b) + cal_vol(group2->a, group2->b);		}		else {			// *** Ray modified			//new_vol = cal_vol(group1->a, group1->b) + cal_vol(group2->a, group2->b);			//if (new_vol < vol_at_index) {				split_index = k;			//}		}  	}  }	  for (i=0; i<dim; i++) {	group1_chosen->a[i] = overnode[sorted_index[0]]->a[i];	group1_chosen->b[i] = overnode[sorted_index[0]]->b[i];	// *** Ray changed	//group2_chosen->a[i] = overnode[sorted_index[M]]->a[i];	//group2_chosen->b[i] = overnode[sorted_index[M]]->b[i];	group2_chosen->a[i] = overnode[sorted_index[M*parentNode->snodeSize]]->a[i];	group2_chosen->b[i] = overnode[sorted_index[M*parentNode->snodeSize]]->b[i];  }  // *** Ray changed  //cut = m + split_index;  cut = split_index;  // *** Ray changed  //for (j=0; j<M+1; j++) {  for (j=0; j<M*parentNode->snodeSize+1; j++) {	if (j < cut) {                		group1_chosen->ptr[j] = overnode[sorted_index[j]];		overnode[sorted_index[j]]->parent = group1_chosen;		cal_MBR_node_node(group1_chosen->a, group1_chosen->b, group1_chosen, overnode[sorted_index[j]]);	}	else {		group2_chosen->ptr[j-cut] = overnode[sorted_index[j]];                overnode[sorted_index[j]]->parent = group2_chosen;                cal_MBR_node_node(group2_chosen->a, group2_chosen->b, group2_chosen, overnode[sorted_index[j]]);	}  }         // *** Ray changed  //group1_chosen->vacancy = M - cut;  //group2_chosen->vacancy = cut - 1;	// M - (M+1 - cut);  if (cut%M == 0)  {	group1_chosen->vacancy = 0;	group2_chosen->vacancy = M-1;	group1_chosen->snodeSize = cut/M;	group2_chosen->snodeSize = parentNode->snodeSize + 1 - group1_chosen->snodeSize;  }  else  {	group1_chosen->vacancy = M - cut%M;	group2_chosen->vacancy = cut%M - 1;	// M - (M+1 - cut);  // *** Ray added	group1_chosen->snodeSize = cut/M + 1;	group2_chosen->snodeSize = parentNode->snodeSize + 1 - group1_chosen->snodeSize;  }  tree_node_deallocate(group1);  tree_node_deallocate(group2);  free(sorted_index);                         return;        } /* minOverlapSplitIndex() *//*  function : int split(node_type *splitting_node, node_type *extra_node, node_type *node1, node_type *node2)   purpose  : to split the node splitting_node and the extra_node into two nodes (node1 and node2)  parameter: node_type *splitting_node - the splitting node             node_type *extra_node     - the extra node to be inserted	     node_type *node1          - the 1st splitted node	     node_type *node2          - the 2nd splitted node  return   : int - TRUE or FALSe : to indicate that this split is good or not*/// *** Ray changedint split(node_type *splitting_node, node_type *extra_node, node_type *node1, node_type *node2) //void split(node_type *splitting_node, node_type *extra_node, node_type *node1, node_type *node2) {  node_type **overnode;  int axis_chosen;  int i;  // *** Ray added  node_type *parentNode;  int noOfOver;  // *** Ray added   parentNode = splitting_node;  noOfOver = parentNode->snodeSize*M+1;  // **** Ray changed  //overnode = (node_type **)malloc((M+1) * sizeof(node_type *));  overnode = (node_type **)malloc(noOfOver * sizeof(node_type *));  // *** Ray changed  //for (i=0; i<M; i++) {  for (i=0; i<noOfOver-1; i++) {        overnode[i] = splitting_node->ptr[i];if (overnode[i] == NULL) printf(" ^^^^^^^^^^^^^ overnode %d is NULL\n", i);  }if (overnode[0] == NULL) printf(" ^^^^^^^^^^^^^@overnode 0 is NULL\n");  // *** Ray changed  //overnode[M] = extra_node;  overnode[noOfOver-1] = extra_node;if (overnode[0] == NULL){	printf("  !!!!!! sad0\n");}  // *** Ray changed  //for(i=0; i < M; i++) {  for(i=0; i < noOfOver-1; i++) {        node1->ptr[i]=NULL;        node2->ptr[i]=NULL;  }  // Topological split (in R*-tree)if (overnode[0] == NULL){	printf("  !!!!!! sad4\n");}  axis_chosen = ChooseSplitAxis(overnode);  ChooseSplitIndex(overnode, axis_chosen, node1, node2);  node1->attribute = NODE;  node1->parent = splitting_node->parent;  node1->id = NO_ID;  node2->attribute = NODE;  node2->parent = splitting_node->parent;  node2->id = NO_ID;    // *** Ray added//printf("overlap : %f\n", (float)cal_overlap(node1, node2));//if (cal_overlap(node1, node2) > MAX_OVERLAP)//{//	printf("larger overlap\n");//}  if (cal_overlap(node1, node2) > MAX_OVERLAP)  {//#ifdef RAYMOND	  // *** Min-overlap split	  // *** IMPORTANT	  overnode[0]->parent = parentNode;	  axis_chosen = minOverlapSplitAxis(overnode);	  	  minOverlapSplitIndex(overnode, axis_chosen, node1, node2);	  	  node1->attribute = NODE;	  node1->parent = splitting_node->parent;	  node1->id = NO_ID;	  	  node2->attribute = NODE;	  node2->parent = splitting_node->parent;	  node2->id = NO_ID;	  	  //free(overnode);	  //if ((M*parentNode->snodeSize - node1->vacancy < MIN_FANOUT) || (M*parentNode->snodeSize - node2->vacancy < MIN_FANOUT))	if ((node1->vacancy < 0) || (node1->vacancy > M) || (node2->vacancy < 0) || (node1->vacancy > M))	{		printf("@@@@@@@@@@@@@@@@@@ Vancancy is incorrect!\n");	}	  if ((M - node1->vacancy < MIN_FANOUT) || (M - node2->vacancy < MIN_FANOUT))	  {//printf("*******\n");		  return FALSE;	  }//#endif  }  free(overnode);  // *** Ray changed  //return;  return TRUE;} /* split() *//*  function : void adjust_tree(node_type *splitting_node, int over_level, int old_level, node_type              *node1, node_type *node2, node_type *root)  purpose  : to adjust the MBR of the trees from the splitting node at the node level over_level             from two splitted nodes (node1 and node2) up to the root  parameter: node_type *splitting_node - the splitting node             int over_level            - the overnode level	     int old_level             - the last level of the overnode level	     node_type *node1          - the first splitted node	     node_type *node2          - the second splitted node	     node_type *root           - the root node  return   : none*/// *** Ray has added the void return type of the functionvoid adjust_tree(node_type *splitting_node, int over_level, int old_level, node_type *node1, node_type *node2, node_type *root) {  int split_child_no = 0;  node_type *split_parent;  int i, j;  if(splitting_node->attribute == ROOT) { 	/* The splitting node is the root */	node1->parent = root;	node2->parent = root;	root->ptr[0] = node1;	root->ptr[1] = node2;if (node1 == NULL) printf("  ~~~~~~~~~ adjust_tree1\n");if (node2 == NULL) printf("  ~~~~~~~~~ adjust_tree2\n");	for (j=2; j<M; j++) 		root->ptr[j] = NULL;	root->parent = NULL;	root->vacancy=M-2;	root->attribute=ROOT;	// *** Ray added	root->snodeSize = 1;	cal_MBR_node_node(root->a, root->b, node1, node2);	extra_level++;  }  else { 	/* The splitted is an intermediate node */	split_parent = splitting_node->parent;	// **** Ray changed		//for(i=0; i < M; i++) {        for(i=0; i < M*split_parent->snodeSize; i++) {		if(split_parent->ptr[i] == splitting_node) { 			split_child_no = i;	             	break;		}        }// **** cwwong//	tree_node_deallocate(splitting_node);		/* insert first node */	split_parent->ptr[split_child_no] = node1;	node1->parent = split_parent;	adjust_MBR_delete(node1);	/* insert second node */		if(split_parent->vacancy != 0) { 		/* no need to split again */		// **** Ray changed           	//split_parent->ptr[M - split_parent->vacancy] = node2;			split_parent->ptr[M*split_parent->snodeSize - split_parent->vacancy] = node2;		node2->parent = split_parent;		split_parent->vacancy--;	//	cal_MBR_node_node(split_parent->a, split_parent->b, node1, split_parent);		cal_MBR_node_node(split_parent->a, split_parent->b, node2, split_parent);		adjust_MBR(split_parent);	}       	else { 		/* need to split again */		overflow(split_parent, over_level-1, old_level, node2, root);	}  }  return;} /* adjust_tree *//*  function : void choose_leaf_level(node_type **node_found, node_type *current_node, int              current_level, node_type *inserted_node, int desired_level)   purpose  : to choose the leaf node specified by the leaf level  parameter: node_type **node_found  - the node to be found as a a leaf node             node_type *current_node - the current node with its children to be found	                               with the best leaf	     int current_level       - the level of the current node current_node	     node_type *insert_node  - the node to be inserted	     int desired_level       - the desired level up to be checked  return   : none*/void choose_leaf_level(node_type **node_found, node_type *current_node, int current_level, node_type *inserted_node, int desired_level) {   int child_chosen;  if (current_level == desired_level) {        *node_found = current_node;//printf("7\n");        return;  }  //printf("current_level %d desired_level %d\n", current_level, desired_level);//printf("current_node->ptr[0]->ptr[0] %d\n", current_node->ptr[0]->ptr[0]);  if (current_node->ptr[0]->ptr[0]->attribute != LEAF) {  //printf("8\n");        child_chosen = least_area_enlarge(current_node, inserted_node);     }  else {        //printf("9\n");        child_chosen = least_overlap_enlarge(current_node, inserted_node);    }//printf("5\n");  current_node = current_node->ptr[child_chosen];//printf("current_level %d desired_level %d\n", current_level, desired_level);  choose_leaf_level(node_found, current_node, current_level+1, inserted_node, desired_level);    return;                        } /* choose_leaf_level *//*  function : void reinsert(node_type *over_node, int over_level, node_type *extra_node,              node_type *root)    purpose  : to reinsert the extra node extra_node into the over node over_node at the level             over_level given with the root node root  parameter: node_type *over_node  - the node to be overflown             int over_level        - the level of the over node	     node_type *extra_node - the extra node to be inserted	     node_type *root       - the root node  return   : none*/void reinsert(node_type *over_node, int over_level, node_type *extra_node, node_type *root) {  node_type *node_found;  node_type **overnode;  double *value;   int *sorted_index;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -