Skip to content

Commit d7595ae

Browse files
authored
Merge pull request #16 from SaintAngeLs/c_impl
(#8) C implementation
2 parents 429432d + cdcf400 commit d7595ae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+6100
-2
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.vscode
2+
mini_ml
3+
build
4+
future

README.md

Lines changed: 0 additions & 2 deletions
This file was deleted.

c_implementation/Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
all: mini_ml
2+
mini_ml:
3+
gcc -Wall -fsanitize=address,undefined -o mini_ml *.c -lm -lcsfml-graphics -lcsfml-system -lcsfml-window
4+
.PHONY:
5+
clean all
6+
clean:
7+
rm mini_ml

c_implementation/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# mini_ml
2+
3+
## C implementation
4+
5+
Pros:
6+
- [ ] Fast execution
7+
- [ ] Relies on CSFML library
8+
- [ ] Hackable code
9+
- [ ] Suitable for big data models
10+
11+
Cons:
12+
- [ ] Steep learning curve
13+
- [ ] Limited features

c_implementation/avl.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#include "avl.h"
2+
#include "avl_impl.h"
3+
#include <string.h>
4+
5+
DataQueryKeyAvlNode *avl_insert(DataQueryKeyAvlNode *tree_root,
6+
DataQueryKey elem,
7+
DataQueryKeyAvlNode *allocMem,
8+
int (*comp)(const void *, const void *)) {
9+
DataQueryKeyAvlNode fakeNode;
10+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
11+
fakeNode.value = elem;
12+
return avl_insert_impl(
13+
tree_root, &fakeNode, allocMem, sizeof(DataQueryKeyAvlNode), comp,
14+
offsetof(DataQueryKeyAvlNode, left), offsetof(DataQueryKeyAvlNode, right),
15+
offsetof(DataQueryKeyAvlNode, ht));
16+
}
17+
18+
DataQueryKeyAvlNode *avl_delete_value(DataQueryKeyAvlNode *tree_root,
19+
DataQueryKey valueElem,
20+
int (*comp)(const void *, const void *)) {
21+
DataQueryKeyAvlNode fakeNode;
22+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
23+
fakeNode.value = valueElem;
24+
return avl_erase_by_value_impl(
25+
tree_root, &fakeNode, sizeof(DataQueryKeyAvlNode), comp,
26+
offsetof(DataQueryKeyAvlNode, left), offsetof(DataQueryKeyAvlNode, right),
27+
offsetof(DataQueryKeyAvlNode, ht));
28+
}
29+
30+
DataQueryKeyAvlNode *avl_find(DataQueryKeyAvlNode *tree_root,
31+
DataQueryKey valueElem,
32+
int (*comp)(const void *, const void *)) {
33+
DataQueryKeyAvlNode fakeNode;
34+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode));
35+
fakeNode.value = valueElem;
36+
return avl_find_impl(tree_root, comp, &fakeNode,
37+
offsetof(DataQueryKeyAvlNode, left),
38+
offsetof(DataQueryKeyAvlNode, right));
39+
}
40+
41+
DataQueryKeyAvlNode2 *avl_insert2(DataQueryKeyAvlNode2 *tree_root,
42+
DataQueryKey elem,
43+
DataQueryKeyAvlNode2 *allocMem,
44+
int (*comp)(const void *, const void *)) {
45+
DataQueryKeyAvlNode2 fakeNode;
46+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
47+
fakeNode.value = elem;
48+
return avl_insert_impl(tree_root, &fakeNode, allocMem,
49+
sizeof(DataQueryKeyAvlNode2), comp,
50+
offsetof(DataQueryKeyAvlNode2, left),
51+
offsetof(DataQueryKeyAvlNode2, right),
52+
offsetof(DataQueryKeyAvlNode2, ht));
53+
}
54+
55+
DataQueryKeyAvlNode2 *
56+
avl_delete_value2(DataQueryKeyAvlNode2 *tree_root, DataQueryKey elem,
57+
int (*comp)(const void *, const void *)) {
58+
DataQueryKeyAvlNode2 fakeNode;
59+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
60+
fakeNode.value = elem;
61+
return avl_erase_by_value_impl(tree_root, &fakeNode,
62+
sizeof(DataQueryKeyAvlNode2), comp,
63+
offsetof(DataQueryKeyAvlNode2, left),
64+
offsetof(DataQueryKeyAvlNode2, right),
65+
offsetof(DataQueryKeyAvlNode2, ht));
66+
}
67+
68+
DataQueryKeyAvlNode2 *avl_find2(DataQueryKeyAvlNode2 *tree_root,
69+
DataQueryKey elem,
70+
int (*comp)(const void *, const void *)) {
71+
DataQueryKeyAvlNode2 fakeNode;
72+
memset(&fakeNode, 0, sizeof(DataQueryKeyAvlNode2));
73+
fakeNode.value = elem;
74+
return avl_find_impl(tree_root, comp, &fakeNode,
75+
offsetof(DataQueryKeyAvlNode2, left),
76+
offsetof(DataQueryKeyAvlNode2, right));
77+
}

c_implementation/avl.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#ifndef AVL_H
2+
#define AVL_H
3+
#include "data_query.h"
4+
#include <stddef.h>
5+
#include <stdint.h>
6+
7+
/* Preparing AVL trees for each type */
8+
9+
/* AVL of data query keys */
10+
typedef struct DataQueryKeyAvlNode_ {
11+
DataQueryKey value;
12+
size_t nr;
13+
struct DataQueryKeyAvlNode_ *parent_optional;
14+
15+
struct DataQueryKeyAvlNode_ *left;
16+
struct DataQueryKeyAvlNode_ *right;
17+
size_t ht;
18+
19+
} DataQueryKeyAvlNode;
20+
21+
/* AVL of AVLs */
22+
typedef struct DataQueryKeyAvlNode2_ {
23+
DataQueryKey value;
24+
DataQueryKeyAvlNode *subavl;
25+
size_t nr;
26+
struct DataQueryKeyAvlNode2_ *parent_optional;
27+
28+
struct DataQueryKeyAvlNode2_ *left;
29+
struct DataQueryKeyAvlNode2_ *right;
30+
size_t ht;
31+
32+
} DataQueryKeyAvlNode2;
33+
34+
DataQueryKeyAvlNode *avl_insert(DataQueryKeyAvlNode *tree_root,
35+
DataQueryKey elem,
36+
DataQueryKeyAvlNode *allocMem,
37+
int (*comp)(const void *, const void *));
38+
39+
DataQueryKeyAvlNode *avl_delete_value(DataQueryKeyAvlNode *tree_root,
40+
DataQueryKey valueElem,
41+
int (*comp)(const void *, const void *));
42+
43+
DataQueryKeyAvlNode *avl_find(DataQueryKeyAvlNode *tree_root,
44+
DataQueryKey valueElem,
45+
int (*comp)(const void *, const void *));
46+
47+
DataQueryKeyAvlNode2 *avl_insert2(DataQueryKeyAvlNode2 *tree_root,
48+
DataQueryKey elem,
49+
DataQueryKeyAvlNode2 *allocMem,
50+
int (*comp)(const void *, const void *));
51+
52+
DataQueryKeyAvlNode2 *
53+
avl_delete_value2(DataQueryKeyAvlNode2 *tree_root, DataQueryKey elem,
54+
int (*comp)(const void *, const void *));
55+
56+
DataQueryKeyAvlNode2 *avl_find2(DataQueryKeyAvlNode2 *tree_root,
57+
DataQueryKey elem,
58+
int (*comp)(const void *, const void *));
59+
60+
#endif

0 commit comments

Comments
 (0)