Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
72eb43db26 |
2 changed files with 353 additions and 4 deletions
|
@ -45,6 +45,23 @@ void pair_vector_init(struct pair_vector *);
|
||||||
void pair_vector_clear(struct pair_vector *);
|
void pair_vector_clear(struct pair_vector *);
|
||||||
void pair_vector_push(struct pair_vector *v, int fst, int snd);
|
void pair_vector_push(struct pair_vector *v, int fst, int snd);
|
||||||
|
|
||||||
|
// Red black tree implementation adapted from:
|
||||||
|
// https://www.programiz.com/dsa/red-black-tree
|
||||||
|
enum nodeColor { RED, BLACK };
|
||||||
|
struct rbNode {
|
||||||
|
int data;
|
||||||
|
void *otherData;
|
||||||
|
enum nodeColor color;
|
||||||
|
struct rbNode *link[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct int_map {
|
||||||
|
rbNode *map_root;
|
||||||
|
};
|
||||||
|
void int_map_init(struct int_map *);
|
||||||
|
void int_map_insert(struct int_map *, int key, void *value);
|
||||||
|
void *int_map_get(struct int_map *, int key);
|
||||||
|
|
||||||
pair compute_node_range(int p, int total_num_nodes, int each_num_nodes,
|
pair compute_node_range(int p, int total_num_nodes, int each_num_nodes,
|
||||||
int process);
|
int process);
|
||||||
int lookup_assignment(int *base_node_assignment, pair my_node_range,
|
int lookup_assignment(int *base_node_assignment, pair my_node_range,
|
||||||
|
@ -58,6 +75,12 @@ int main(int argc, char **argv) {
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &p);
|
MPI_Comm_size(MPI_COMM_WORLD, &p);
|
||||||
|
|
||||||
|
struct int_map helloge;
|
||||||
|
int_map_init(&helloge);
|
||||||
|
int_map_insert(&helloge, 10, (void *)"hello");
|
||||||
|
int_map_insert(&helloge, 1, (void *)"world");
|
||||||
|
printf("%s\n", (char *)int_map_get(&helloge, 10));
|
||||||
|
|
||||||
MPI_Datatype IntPairType;
|
MPI_Datatype IntPairType;
|
||||||
init_pair_type(&IntPairType);
|
init_pair_type(&IntPairType);
|
||||||
|
|
||||||
|
@ -171,7 +194,6 @@ int main(int argc, char **argv) {
|
||||||
// of the graph.
|
// of the graph.
|
||||||
#pragma region
|
#pragma region
|
||||||
int node_label_assignment_vec[num_my_nodes];
|
int node_label_assignment_vec[num_my_nodes];
|
||||||
// std::map<int, int> node_label_assignment;
|
|
||||||
pair my_node_range = node_ranges[rank];
|
pair my_node_range = node_ranges[rank];
|
||||||
|
|
||||||
// Initial node assignment
|
// Initial node assignment
|
||||||
|
@ -449,3 +471,332 @@ int lookup_assignment(int *base_node_assignment, pair my_node_range,
|
||||||
// Pull the corresponding value from the map
|
// Pull the corresponding value from the map
|
||||||
return recvbuf[recv_displs[process_from] + index];
|
return recvbuf[recv_displs[process_from] + index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Red black tree implementation adapted from:
|
||||||
|
// https://www.programiz.com/dsa/red-black-tree
|
||||||
|
#pragma region
|
||||||
|
// Create a red-black tree
|
||||||
|
struct rbNode *createNode(int data, void *otherData) {
|
||||||
|
struct rbNode *newnode;
|
||||||
|
newnode = (struct rbNode *)malloc(sizeof(struct rbNode));
|
||||||
|
newnode->data = data;
|
||||||
|
newnode->otherData = otherData;
|
||||||
|
newnode->color = RED;
|
||||||
|
newnode->link[0] = newnode->link[1] = NULL;
|
||||||
|
return newnode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert an node
|
||||||
|
void insertion(struct rbNode *root, int data, void *otherData) {
|
||||||
|
struct rbNode *stack[98], *ptr, *newnode, *xPtr, *yPtr;
|
||||||
|
int dir[98], ht = 0, index;
|
||||||
|
ptr = root;
|
||||||
|
if (!root) {
|
||||||
|
root = createNode(data, otherData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stack[ht] = root;
|
||||||
|
dir[ht++] = 0;
|
||||||
|
while (ptr != NULL) {
|
||||||
|
if (ptr->data == data) {
|
||||||
|
printf("Duplicates Not Allowed!!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index = (data - ptr->data) > 0 ? 1 : 0;
|
||||||
|
stack[ht] = ptr;
|
||||||
|
ptr = ptr->link[index];
|
||||||
|
dir[ht++] = index;
|
||||||
|
}
|
||||||
|
stack[ht - 1]->link[index] = newnode = createNode(data, otherData);
|
||||||
|
while ((ht >= 3) && (stack[ht - 1]->color == RED)) {
|
||||||
|
if (dir[ht - 2] == 0) {
|
||||||
|
yPtr = stack[ht - 2]->link[1];
|
||||||
|
if (yPtr != NULL && yPtr->color == RED) {
|
||||||
|
stack[ht - 2]->color = RED;
|
||||||
|
stack[ht - 1]->color = yPtr->color = BLACK;
|
||||||
|
ht = ht - 2;
|
||||||
|
} else {
|
||||||
|
if (dir[ht - 1] == 0) {
|
||||||
|
yPtr = stack[ht - 1];
|
||||||
|
} else {
|
||||||
|
xPtr = stack[ht - 1];
|
||||||
|
yPtr = xPtr->link[1];
|
||||||
|
xPtr->link[1] = yPtr->link[0];
|
||||||
|
yPtr->link[0] = xPtr;
|
||||||
|
stack[ht - 2]->link[0] = yPtr;
|
||||||
|
}
|
||||||
|
xPtr = stack[ht - 2];
|
||||||
|
xPtr->color = RED;
|
||||||
|
yPtr->color = BLACK;
|
||||||
|
xPtr->link[0] = yPtr->link[1];
|
||||||
|
yPtr->link[1] = xPtr;
|
||||||
|
if (xPtr == root) {
|
||||||
|
root = yPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 3]->link[dir[ht - 3]] = yPtr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
yPtr = stack[ht - 2]->link[0];
|
||||||
|
if ((yPtr != NULL) && (yPtr->color == RED)) {
|
||||||
|
stack[ht - 2]->color = RED;
|
||||||
|
stack[ht - 1]->color = yPtr->color = BLACK;
|
||||||
|
ht = ht - 2;
|
||||||
|
} else {
|
||||||
|
if (dir[ht - 1] == 1) {
|
||||||
|
yPtr = stack[ht - 1];
|
||||||
|
} else {
|
||||||
|
xPtr = stack[ht - 1];
|
||||||
|
yPtr = xPtr->link[0];
|
||||||
|
xPtr->link[0] = yPtr->link[1];
|
||||||
|
yPtr->link[1] = xPtr;
|
||||||
|
stack[ht - 2]->link[1] = yPtr;
|
||||||
|
}
|
||||||
|
xPtr = stack[ht - 2];
|
||||||
|
yPtr->color = BLACK;
|
||||||
|
xPtr->color = RED;
|
||||||
|
xPtr->link[1] = yPtr->link[0];
|
||||||
|
yPtr->link[0] = xPtr;
|
||||||
|
if (xPtr == root) {
|
||||||
|
root = yPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 3]->link[dir[ht - 3]] = yPtr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root->color = BLACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete a node
|
||||||
|
void deletion(struct rbNode *root, int data) {
|
||||||
|
struct rbNode *stack[98], *ptr, *xPtr, *yPtr;
|
||||||
|
struct rbNode *pPtr, *qPtr, *rPtr;
|
||||||
|
int dir[98], ht = 0, diff, i;
|
||||||
|
enum nodeColor color;
|
||||||
|
|
||||||
|
if (!root) {
|
||||||
|
printf("Tree not available\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = root;
|
||||||
|
while (ptr != NULL) {
|
||||||
|
if ((data - ptr->data) == 0)
|
||||||
|
break;
|
||||||
|
diff = (data - ptr->data) > 0 ? 1 : 0;
|
||||||
|
stack[ht] = ptr;
|
||||||
|
dir[ht++] = diff;
|
||||||
|
ptr = ptr->link[diff];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptr->link[1] == NULL) {
|
||||||
|
if ((ptr == root) && (ptr->link[0] == NULL)) {
|
||||||
|
free(ptr);
|
||||||
|
root = NULL;
|
||||||
|
} else if (ptr == root) {
|
||||||
|
root = ptr->link[0];
|
||||||
|
free(ptr);
|
||||||
|
} else {
|
||||||
|
stack[ht - 1]->link[dir[ht - 1]] = ptr->link[0];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
xPtr = ptr->link[1];
|
||||||
|
if (xPtr->link[0] == NULL) {
|
||||||
|
xPtr->link[0] = ptr->link[0];
|
||||||
|
color = xPtr->color;
|
||||||
|
xPtr->color = ptr->color;
|
||||||
|
ptr->color = color;
|
||||||
|
|
||||||
|
if (ptr == root) {
|
||||||
|
root = xPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 1]->link[dir[ht - 1]] = xPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir[ht] = 1;
|
||||||
|
stack[ht++] = xPtr;
|
||||||
|
} else {
|
||||||
|
i = ht++;
|
||||||
|
while (1) {
|
||||||
|
dir[ht] = 0;
|
||||||
|
stack[ht++] = xPtr;
|
||||||
|
yPtr = xPtr->link[0];
|
||||||
|
if (!yPtr->link[0])
|
||||||
|
break;
|
||||||
|
xPtr = yPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir[i] = 1;
|
||||||
|
stack[i] = yPtr;
|
||||||
|
if (i > 0)
|
||||||
|
stack[i - 1]->link[dir[i - 1]] = yPtr;
|
||||||
|
|
||||||
|
yPtr->link[0] = ptr->link[0];
|
||||||
|
|
||||||
|
xPtr->link[0] = yPtr->link[1];
|
||||||
|
yPtr->link[1] = ptr->link[1];
|
||||||
|
|
||||||
|
if (ptr == root) {
|
||||||
|
root = yPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
color = yPtr->color;
|
||||||
|
yPtr->color = ptr->color;
|
||||||
|
ptr->color = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ht < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ptr->color == BLACK) {
|
||||||
|
while (1) {
|
||||||
|
pPtr = stack[ht - 1]->link[dir[ht - 1]];
|
||||||
|
if (pPtr && pPtr->color == RED) {
|
||||||
|
pPtr->color = BLACK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ht < 2)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (dir[ht - 2] == 0) {
|
||||||
|
rPtr = stack[ht - 1]->link[1];
|
||||||
|
|
||||||
|
if (!rPtr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (rPtr->color == RED) {
|
||||||
|
stack[ht - 1]->color = RED;
|
||||||
|
rPtr->color = BLACK;
|
||||||
|
stack[ht - 1]->link[1] = rPtr->link[0];
|
||||||
|
rPtr->link[0] = stack[ht - 1];
|
||||||
|
|
||||||
|
if (stack[ht - 1] == root) {
|
||||||
|
root = rPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 2]->link[dir[ht - 2]] = rPtr;
|
||||||
|
}
|
||||||
|
dir[ht] = 0;
|
||||||
|
stack[ht] = stack[ht - 1];
|
||||||
|
stack[ht - 1] = rPtr;
|
||||||
|
ht++;
|
||||||
|
|
||||||
|
rPtr = stack[ht - 1]->link[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!rPtr->link[0] || rPtr->link[0]->color == BLACK) &&
|
||||||
|
(!rPtr->link[1] || rPtr->link[1]->color == BLACK)) {
|
||||||
|
rPtr->color = RED;
|
||||||
|
} else {
|
||||||
|
if (!rPtr->link[1] || rPtr->link[1]->color == BLACK) {
|
||||||
|
qPtr = rPtr->link[0];
|
||||||
|
rPtr->color = RED;
|
||||||
|
qPtr->color = BLACK;
|
||||||
|
rPtr->link[0] = qPtr->link[1];
|
||||||
|
qPtr->link[1] = rPtr;
|
||||||
|
rPtr = stack[ht - 1]->link[1] = qPtr;
|
||||||
|
}
|
||||||
|
rPtr->color = stack[ht - 1]->color;
|
||||||
|
stack[ht - 1]->color = BLACK;
|
||||||
|
rPtr->link[1]->color = BLACK;
|
||||||
|
stack[ht - 1]->link[1] = rPtr->link[0];
|
||||||
|
rPtr->link[0] = stack[ht - 1];
|
||||||
|
if (stack[ht - 1] == root) {
|
||||||
|
root = rPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 2]->link[dir[ht - 2]] = rPtr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rPtr = stack[ht - 1]->link[0];
|
||||||
|
if (!rPtr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (rPtr->color == RED) {
|
||||||
|
stack[ht - 1]->color = RED;
|
||||||
|
rPtr->color = BLACK;
|
||||||
|
stack[ht - 1]->link[0] = rPtr->link[1];
|
||||||
|
rPtr->link[1] = stack[ht - 1];
|
||||||
|
|
||||||
|
if (stack[ht - 1] == root) {
|
||||||
|
root = rPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 2]->link[dir[ht - 2]] = rPtr;
|
||||||
|
}
|
||||||
|
dir[ht] = 1;
|
||||||
|
stack[ht] = stack[ht - 1];
|
||||||
|
stack[ht - 1] = rPtr;
|
||||||
|
ht++;
|
||||||
|
|
||||||
|
rPtr = stack[ht - 1]->link[0];
|
||||||
|
}
|
||||||
|
if ((!rPtr->link[0] || rPtr->link[0]->color == BLACK) &&
|
||||||
|
(!rPtr->link[1] || rPtr->link[1]->color == BLACK)) {
|
||||||
|
rPtr->color = RED;
|
||||||
|
} else {
|
||||||
|
if (!rPtr->link[0] || rPtr->link[0]->color == BLACK) {
|
||||||
|
qPtr = rPtr->link[1];
|
||||||
|
rPtr->color = RED;
|
||||||
|
qPtr->color = BLACK;
|
||||||
|
rPtr->link[1] = qPtr->link[0];
|
||||||
|
qPtr->link[0] = rPtr;
|
||||||
|
rPtr = stack[ht - 1]->link[0] = qPtr;
|
||||||
|
}
|
||||||
|
rPtr->color = stack[ht - 1]->color;
|
||||||
|
stack[ht - 1]->color = BLACK;
|
||||||
|
rPtr->link[0]->color = BLACK;
|
||||||
|
stack[ht - 1]->link[0] = rPtr->link[1];
|
||||||
|
rPtr->link[1] = stack[ht - 1];
|
||||||
|
if (stack[ht - 1] == root) {
|
||||||
|
root = rPtr;
|
||||||
|
} else {
|
||||||
|
stack[ht - 2]->link[dir[ht - 2]] = rPtr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ht--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
void int_map_init(struct int_map *m) { m->map_root = NULL; }
|
||||||
|
|
||||||
|
void int_map_insert(struct int_map *m, int key, void *value) {
|
||||||
|
// If empty
|
||||||
|
if (m->map_root == NULL) {
|
||||||
|
m->map_root = createNode(key, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Else, insert
|
||||||
|
insertion(m->map_root, key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *int_map_get(struct int_map *m, int key) {
|
||||||
|
if (m->map_root == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
struct rbNode *current = m->map_root;
|
||||||
|
while (true) {
|
||||||
|
if (current->link[0] == NULL && current->link[1] == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (key < current->data) {
|
||||||
|
current = current->link[0];
|
||||||
|
} else if (key > current->data) {
|
||||||
|
current = current->link[1];
|
||||||
|
} else {
|
||||||
|
return current->otherData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
|
@ -1,5 +1,3 @@
|
||||||
set pagination off
|
set pagination off
|
||||||
run dataset/both_1000.txt
|
run dataset/both_1000.txt
|
||||||
bt
|
bt
|
||||||
frame 3
|
|
||||||
print k
|
|
Loading…
Reference in a new issue