Mercurial > hg > Gears > Gears
changeset 1055:81439e83c4d2
copyRedBlackTree v1
author | matac42 <matac@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 26 Jan 2024 15:45:56 +0900 |
parents | 7274db9ef926 |
children | b76db8c133b8 |
files | src/parallel_execution/RedBlackTree.cbc src/parallel_execution/plautogen/impl/RedBlackTree.h |
diffstat | 2 files changed, 81 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc Thu Jan 25 22:58:56 2024 +0900 +++ b/src/parallel_execution/RedBlackTree.cbc Fri Jan 26 15:45:56 2024 +0900 @@ -94,13 +94,22 @@ __code copyRedBlackTree(struct RedBlackTree* tree) { tree->current = tree->root; - // 最初にrootノードをコピーしておきたい - goto leftDown(tree); + tree->copied = 0; + + struct Stack* inputStack = tree->inputStack; + struct Node* newNode = &ALLOCATE(context, Node)->Node; + newNode->key = tree->current->key; + newNode->value = (union Data*)new Integer(); + ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value; + newNode->color = tree->current->color; + + goto inputStack->push(newNode, leftDown); } // // leftDown*() -// currentをinputStackにpushして、current->leftがあれば降りる +// current->leftがある場合、コピーしてから降りる。 +// ない場合はrightを見に行く(rightDown) // __code leftDown(struct RedBlackTree* tree) { @@ -112,13 +121,17 @@ } __code leftDown1(struct RedBlackTree* tree, struct Stack* stack) { + if (tree->current->left == NULL) { + goto rightDown(); + } + struct Stack* inputStack = tree->inputStack; struct Node* newNode = &ALLOCATE(context, Node)->Node; struct Node* data = (Node*)(stack->data); - newNode->key = tree->current->key; + newNode->key = tree->current->left->key; newNode->value = (union Data*)new Integer(); - ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value; - newNode->color = tree->current->color; + ((Integer*)newNode->value)->value = ((Integer*)tree->current->left->value)->value; + newNode->color = tree->current->left->color; if(data) { data->left = newNode; @@ -126,7 +139,7 @@ printf("leftDown1\n"); - // 新規ノードをpushしている + // 新規leftノードをpushしている goto inputStack->push(newNode, leftDown2); } @@ -165,15 +178,31 @@ } __code rightDown(struct RedBlackTree* tree) { - struct Stack* inputStack = tree->inputStack; + struct Stack* nodeStack = tree->nodeStack; + printf("rightDown\n"); + goto nodeStack->isEmpty(rightDownWhenNoEmpty, rightDownWhenEmpty); +} - printf("rightDown\n"); - +__code rightDownWhenNoEmpty(struct RedBlackTree* tree) { + struct Stack* inputStack = tree->inputStack; + printf("rightDownWhenNoEmpty\n"); + goto inputStack->get(rightDown1); +} +__code rightDownWhenEmpty(struct RedBlackTree* tree) { + struct Stack* inputStack = tree->inputStack; + printf("rightDownWhenEmpty\n"); + tree->copied = 1; goto inputStack->get(rightDown1); } // inputStackに2をpushしてなくない? __code rightDown1(struct RedBlackTree* tree, struct Stack* stack) { + printf("rightDown1\n"); + if (tree->current->right == NULL) { + // ここでupする時にrightから来たかleftから来たかを知る必要がある + // rightから来た場合でnodeStackが空ならば木の入れ替えへ + goto up(); + } struct Stack* inputStack = tree->inputStack; struct Node* newNode = &ALLOCATE(context, Node)->Node; struct Node* data = (Node*)(stack->data); @@ -186,8 +215,6 @@ data->right = newNode; } - printf("rightDown1\n"); - // 新規ノードをpushしている goto inputStack->push(newNode, rightDown2); } @@ -226,9 +253,8 @@ struct Stack* nodeStack = tree->nodeStack; printf("up\n"); - // current付け替えしたい - // getして付け替えてpopだな... - goto nodeStack->get(up1); + + goto nodeStack->pop(up1); } __code up1(struct RedBlackTree* tree, struct Stack* stack) { @@ -236,27 +262,35 @@ struct Node* data = (Node*)(stack->data); tree->current = data; - if (tree->current == NULL) { + // if (tree->current == NULL) { // 木の入れ替え // copyの終了 - printf("copy finished!\n"); - } + // printf("copy finished!\n"); + // } printf("up1\n"); - // rightの状態を見る前にpopしてしまっている気がする goto inputStack->pop(up2); } // rightを見てさらにupするか考える __code up2(struct RedBlackTree* tree) { + printf("up2\n"); struct Stack* inputStack = tree->inputStack; - printf("up2\n"); + if (tree->current->right) { - goto rightDown(tree); + // ここでrootからDownする場合を考える + goto up0(tree); + } else { + goto inputStack->pop(up); } +} - goto inputStack->pop(up); +// Gearefがうまく挿入されないため、一度別CGに遷移している +__code up0(struct RedBlackTree* tree) { + struct Stack* nodeStack = tree->nodeStack; + + goto nodeStack->isEmpty(rightDown, swap); } __code up3(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) { @@ -265,16 +299,32 @@ goto up(tree, inputStack); } -__code popWhenEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, __code next(...)) { - // treeの入れ替え - // struct Tree* newTree = new Tree(); +// copiedであればtreeの入れ替え +__code swap(struct RedBlackTree* tree) { + printf("swap\n"); + if (tree->copied) { + goto swap0(tree); + } + goto rightDown(tree); +} + +__code swap0(struct RedBlackTree* tree) { + struct Stack* inputStack = tree->inputStack; + goto inputStack->pop(swap1); +} + +__code swap1(struct RedBlackTree* tree, struct Stack* stack, __code next(...)) { + // このキャストがうまくいってない + struct Node* toTree = (Node*)(stack->data); + struct RedBlackTree* newRedBlackTree = new RedBlackTree(); - // newTree->tree = (union Data*)newRedBlackTree; - // ここtreeじゃなくてinputStackからpopしたNodeを入れてあげないといけない。 - newRedBlackTree->root = tree->newNode; - newRedBlackTree->current = tree->newNode; + newRedBlackTree->root = toTree; + newRedBlackTree->current = toTree; tree = newRedBlackTree; - printf("popWhenEmpty\n"); + + printf("swap1\n"); + printf("copied\n"); + goto next(...); }