Beispiel #1
0
void deserializeTree(struct Node **root, FILE *fp)
{
		int val;
	if(! fscanf(fp, "%d", &val) || val == -1)
	{
		return;
		
	}
	
	*root = newNode(val);
	deserializeTree(&((*root)->l), fp);
	deserializeTree(&((*root)->r), fp);
	
	
}
Beispiel #2
0
int main()
{
	TNode *root = newNode(10);
	root->left = newNode(15);
	root->right = newNode(20);
	root->left->left = newNode(25);
	root->left->left->left = newNode(30);

#ifdef SERIALIZETREE
	TNode *newRoot = NULL;
	FILE *fp = fopen("./serializeTree.txt","w");
	if(NULL == fp)
	{
		printf("fopen error write mode...return");
		return -1;
	}
	serializeTree(root, fp);
	fclose(fp);

	fp = fopen("./serializeTree.txt","r");
	if(NULL == fp)
	{
		printf("fopen error read mode...return");
		return -1;
	}
	deserializeTree(&newRoot, fp);
	fclose(fp);
	
	serializeTree(newRoot, stdout);
#endif
	return 0;
}
Beispiel #3
0
void Population::migrate(std::vector<std::pair<float, std::shared_ptr<Node>>> &newPop){
	std::uniform_real_distribution<double> migrateDist(0, 1);
	int next = (rank + 1) % processors;
	int prev = (rank - 1 < 0) ? processors - 1 : rank - 1;
	std::vector<std::pair<float, std::shared_ptr<Node>>> tempPop;
	if(rank % 2 == 0){
		for(int i = 0; i < newPop.size() / 10; ++i){
			int index = migrateDist(rng) * newPop.size();
			auto treeString = serializeTree(newPop[index].second);
			int size = treeString.length();
			MPI_Send(&size, 1, MPI_INT, next, 0, MPI_COMM_WORLD);
			MPI_Send(&treeString[0], treeString.length(), MPI_CHAR, next, 0, MPI_COMM_WORLD);
		}
		for(int i = 0; i < newPop.size() / 10; ++i){
			int size = 0;
			MPI_Recv(&size, 1, MPI_INT, prev, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			std::string temp;
			temp.resize(size);
			MPI_Recv(&temp[0], size, MPI_CHAR, prev, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			std::stringstream stream(temp);
			tempPop.push_back(std::make_pair(0.0, deserializeTree(stream)));
		}	
	}
	else{
		for(int i = 0; i < newPop.size() / 10; ++i){
			int size = 0;
			MPI_Recv(&size, 1, MPI_INT, prev, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			std::string temp;
			temp.resize(size);
			MPI_Recv(&temp[0], size, MPI_CHAR, prev, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			std::stringstream stream(temp);
			tempPop.push_back(std::make_pair(0.0, deserializeTree(stream)));
		}
		for(int i = 0; i < newPop.size() / 10; ++i){
			int index = migrateDist(rng) * newPop.size();
			auto treeString = serializeTree(newPop[index].second);
			int size = treeString.length();
			MPI_Send(&size, 1, MPI_INT, next, 0, MPI_COMM_WORLD);
			MPI_Send(&treeString[0], treeString.length(), MPI_CHAR, next, 0, MPI_COMM_WORLD);
		}	
	}
	for(auto &thing : tempPop){
		newPop.push_back(thing);
	}
}
Beispiel #4
0
int  main()
		{
			struct Node *root = newNode(1);
			root->l  =  newNode(2);
			root->r  =  newNode(3);
			root->l->l =  newNode(4);
			root->l->r = newNode(5);
			root->r->l=  newNode(6);
			root->r->r = newNode(7);
			
			FILE *fp  = fopen("tree.txt", "w");
			
			serializeTree(root, fp);
			fclose(fp);
			struct Node *root1 = NULL;
			FILE *fp1 = fopen("tree.txt", "r");
			
			deserializeTree(&root1, fp1);
			fclose(fp1);	
			inorder(root1);
			
		
		}