Skip to content

Commit 5fa79fb

Browse files
plajjanKristian Larsson
authored andcommitted
Add Acton merkletrees
1 parent f7992aa commit 5fa79fb

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

bench/algorithm/merkletrees/1.act

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
2+
class Node(object):
3+
hash: ?int
4+
def __init__(self, value: ?int, left: ?Node, right: ?Node):
5+
self.value = value
6+
self.left = left
7+
self.right = right
8+
self.hash = None
9+
10+
def check(self) -> bool:
11+
h = self.hash
12+
v = self.value
13+
l = self.left
14+
r = self.right
15+
if h != None:
16+
if v != None:
17+
return True
18+
elif l is not None and r is not None:
19+
return l.check() and r.check()
20+
return False
21+
22+
def calc_hash(self):
23+
h = self.hash
24+
v = self.value
25+
if h is None:
26+
l = self.left
27+
r = self.right
28+
if v is not None:
29+
self.hash = self.value
30+
elif l is not None and r is not None:
31+
l.calc_hash()
32+
r.calc_hash()
33+
self.hash = l.get_hash() + r.get_hash()
34+
35+
def get_hash(self) -> int:
36+
h = self.hash
37+
if h is not None:
38+
return h
39+
else:
40+
return -1
41+
42+
def make(depth):
43+
if depth == 0:
44+
return Node(1, None, None)
45+
else:
46+
depth -= 1
47+
return Node(None, make(depth), make(depth))
48+
49+
def mtree(n):
50+
min_depth=4
51+
max_depth = max([min_depth + 2, n], 0)
52+
stretch_depth = max_depth + 1
53+
stretch_tree = make(stretch_depth)
54+
stretch_tree.calc_hash()
55+
56+
print("stretch tree of depth %d\t root hash: %d check: %s" % (stretch_depth, stretch_tree.get_hash(), str(stretch_tree.check()).lower()))
57+
58+
long_lived_tree = make(max_depth)
59+
60+
mmd = max_depth + min_depth
61+
for d in range(min_depth, stretch_depth, 2):
62+
iterations = 2 ** (mmd - d)
63+
sum = 0
64+
for _ in range(0, iterations, 1):
65+
tree = make(d)
66+
tree.calc_hash()
67+
sum += tree.get_hash()
68+
print("%d\t trees of depth %d\t root hash sum: %d" % (iterations, d, sum))
69+
70+
long_lived_tree.calc_hash()
71+
print("long lived tree of depth %d\t root hash: %d check: %s" % (max_depth, long_lived_tree.get_hash(), str(long_lived_tree.check()).lower()))
72+
73+
actor main(env):
74+
n = int(env.argv[1]) if len(env.argv) > 1 else 6
75+
mtree(n)
76+
await async env.exit(0)

bench/bench_acton.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ problems:
99
- name: helloworld
1010
source:
1111
- 1.act
12+
- name: merkletrees
13+
source:
14+
- 1.act
1215
- name: nsieve
1316
source:
1417
- 1.act

0 commit comments

Comments
 (0)