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(...);
 }
 
--- a/src/parallel_execution/plautogen/impl/RedBlackTree.h	Thu Jan 25 22:58:56 2024 +0900
+++ b/src/parallel_execution/plautogen/impl/RedBlackTree.h	Fri Jan 26 15:45:56 2024 +0900
@@ -10,4 +10,5 @@
   struct Stack* outputStack;
   __code findNodeNext(...);
   int result;
+  int copied;
 } RedBlackTree;