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); }
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; }
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); } }
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); }