Skip to content

Commit 0ca614c

Browse files
committed
pony_only: sync .pony files, bench_pony.yaml, and include/pony from pony vs main
1 parent ad18b20 commit 0ca614c

File tree

12 files changed

+1420
-7
lines changed

12 files changed

+1420
-7
lines changed

bench/algorithm/binarytrees/1.pony

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// based on 1.cs
2+
13
primitive EmptyNode
24
fun check() : U32 => 0
35

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
actor Main
2+
new create(env: Env) =>
3+
let n: USize =
4+
try
5+
env.args(1)?.usize()?
6+
else
7+
100
8+
end
9+
10+
let primes = Array[U64]
11+
var count: USize = 0
12+
var i: U64 = 2
13+
while count < n do
14+
var is_prime = true
15+
for p in primes.values() do
16+
if (p * p) > i then break end
17+
if (i % p) == 0 then
18+
is_prime = false
19+
break
20+
end
21+
end
22+
if is_prime then
23+
env.out.write(i.string() + "\n")
24+
primes.push(i)
25+
count = count + 1
26+
end
27+
i = i + 1
28+
end
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
use "collections"
2+
3+
// based on 1.go and 1.zig
4+
// multi-threaded implementation (Go/Zig based)
5+
6+
actor Main
7+
new create(env: Env) =>
8+
let n: USize = try env.args(1)?.usize()? else 12 end
9+
let coordinator = Coordinator(env, n)
10+
coordinator.start()
11+
12+
class val Result
13+
let max_flips: USize
14+
let check_sum: ISize
15+
16+
new create(mf: USize, cs: ISize) =>
17+
max_flips = mf
18+
check_sum = cs
19+
20+
actor Coordinator
21+
let _env: Env
22+
let _n: USize
23+
let _workers: USize = 4
24+
var _results_received: USize = 0
25+
var _max_flips: USize = 0
26+
var _check_sum: ISize = 0
27+
let _fact: Array[USize] val
28+
let _chunks: USize = 720
29+
var _chunk_size: USize = 0
30+
var _tasks: USize = 0
31+
32+
new create(env: Env, n: USize) =>
33+
_env = env
34+
_n = n
35+
_fact = recover val
36+
var a = Array[USize](_n + 1)
37+
var prev: USize = 1
38+
a.push(prev)
39+
for i in Range[USize](1, _n + 1) do
40+
prev = prev * i
41+
a.push(prev)
42+
end
43+
a
44+
end
45+
46+
try
47+
let factn = _fact(_n)?
48+
let t1 = factn + _chunks
49+
let t2 = t1 - 1
50+
_chunk_size = t2 / _chunks
51+
_chunk_size = _chunk_size + (_chunk_size % 2)
52+
let t3 = factn + _chunk_size
53+
let t4 = t3 - 1
54+
_tasks = t4 / _chunk_size
55+
end
56+
57+
be start() =>
58+
for i in Range[USize](0, _tasks) do
59+
let worker = Worker(this, _n, _fact, i * _chunk_size, _chunk_size)
60+
worker.compute()
61+
end
62+
63+
be result(r: Result val) =>
64+
_results_received = _results_received + 1
65+
if r.max_flips > _max_flips then
66+
_max_flips = r.max_flips
67+
end
68+
_check_sum = _check_sum + r.check_sum
69+
70+
if _results_received == _tasks then
71+
_env.out.print(_check_sum.string())
72+
_env.out.print("Pfannkuchen(" + _n.string() + ") = " + _max_flips.string())
73+
end
74+
75+
actor Worker
76+
let _coordinator: Coordinator
77+
let _n: USize
78+
let _fact: Array[USize] val
79+
let _idx_min: USize
80+
let _chunk_size: USize
81+
82+
new create(coordinator: Coordinator, n: USize, fact: Array[USize] val,
83+
idx_min: USize, chunk_size: USize) =>
84+
_coordinator = coordinator
85+
_n = n
86+
_fact = fact
87+
_idx_min = idx_min
88+
_chunk_size = chunk_size
89+
90+
be compute() =>
91+
try
92+
var idx_max = _idx_min + _chunk_size
93+
if idx_max > _fact(_n)? then
94+
idx_max = _fact(_n)?
95+
end
96+
97+
let p = Array[USize](_n)
98+
let pp = Array[USize](_n)
99+
let count = Array[USize](_n)
100+
101+
// Initialize arrays
102+
for i in Range[USize](0, _n) do
103+
p.push(i)
104+
pp.push(0)
105+
count.push(0)
106+
end
107+
108+
// Generate first permutation
109+
var idx = _idx_min
110+
var i = _n - 1
111+
while i > 0 do
112+
let d = idx / _fact(i)?
113+
count(i)? = d
114+
idx = idx % _fact(i)?
115+
116+
// Copy p to pp
117+
for j in Range[USize](0, _n) do
118+
pp(j)? = p(j)?
119+
end
120+
121+
// Rotate
122+
for j in Range[USize](0, i + 1) do
123+
if (j + d) <= i then
124+
p(j)? = pp(j + d)?
125+
else
126+
p(j)? = pp((j + d) - i - 1)?
127+
end
128+
end
129+
i = i - 1
130+
end
131+
132+
var max_flips: USize = 1
133+
var check_sum: ISize = 0
134+
var sign = true
135+
idx = _idx_min
136+
137+
while idx < idx_max do
138+
// Count flips
139+
let first = p(0)?
140+
if first != 0 then
141+
var flips: USize = 1
142+
if p(first)? != 0 then
143+
// Copy p to pp
144+
for ii in Range[USize](0, _n) do
145+
pp(ii)? = p(ii)?
146+
end
147+
148+
var p0 = first
149+
while pp(p0)? != 0 do
150+
flips = flips + 1
151+
// Reverse
152+
var ii: USize = 1
153+
var j = p0 - 1
154+
while ii < j do
155+
let tmp = pp(ii)?
156+
pp(ii)? = pp(j)?
157+
pp(j)? = tmp
158+
ii = ii + 1
159+
j = j - 1
160+
end
161+
let t = pp(p0)?
162+
pp(p0)? = p0
163+
p0 = t
164+
end
165+
end
166+
167+
if flips > max_flips then
168+
max_flips = flips
169+
end
170+
171+
if sign then
172+
check_sum = check_sum + flips.isize()
173+
else
174+
check_sum = check_sum - flips.isize()
175+
end
176+
end
177+
178+
idx = idx + 1
179+
if idx == idx_max then break end
180+
181+
// Generate next permutation
182+
if sign then
183+
let tmp = p(0)?
184+
p(0)? = p(1)?
185+
p(1)? = tmp
186+
else
187+
let tmp = p(1)?
188+
p(1)? = p(2)?
189+
p(2)? = tmp
190+
191+
var k: USize = 2
192+
while true do
193+
let c = count(k)? + 1
194+
count(k)? = c
195+
if c <= k then break end
196+
197+
count(k)? = 0
198+
// rotate left p[0..k]
199+
let p0 = p(0)?
200+
for j in Range[USize](0, k) do
201+
p(j)? = p(j + 1)?
202+
end
203+
p(k)? = p0
204+
k = k + 1
205+
end
206+
end
207+
sign = not sign
208+
end
209+
210+
_coordinator.result(Result(max_flips, check_sum))
211+
end

bench/algorithm/fasta/1.pony

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
use "collections"
2+
3+
class RNG
4+
var seed: U32
5+
new create() =>
6+
seed = 42
7+
fun ref next(max: F64): F64 =>
8+
seed = ((seed * 3877) + 29573) % 139968
9+
(max * seed.f64()) / 139968.0
10+
11+
struct Amino
12+
let l: U8
13+
let p: F64
14+
new create(l': U8, p': F64) =>
15+
l = l'
16+
p = p'
17+
18+
actor Main
19+
new create(env: Env) =>
20+
let n: USize = try env.args(1)?.usize()? else 10 end
21+
let stdout = env.out
22+
let rng = RNG
23+
let alu: String val =
24+
"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC" +
25+
"AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG" +
26+
"TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG" +
27+
"AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
28+
29+
stdout.print(">ONE Homo sapiens alu")
30+
try _repeat_and_wrap(stdout, alu, 2 * n)? end
31+
32+
let iub = recover iso Array[Amino](15)
33+
.> push(Amino(97, 0.27)) .> push(Amino(99, 0.12)) .> push(Amino(103, 0.12)) .> push(Amino(116, 0.27))
34+
.> push(Amino(66, 0.02)) .> push(Amino(68, 0.02)) .> push(Amino(72, 0.02)) .> push(Amino(75, 0.02))
35+
.> push(Amino(77, 0.02)) .> push(Amino(78, 0.02)) .> push(Amino(82, 0.02)) .> push(Amino(83, 0.02))
36+
.> push(Amino(86, 0.02)) .> push(Amino(87, 0.02)) .> push(Amino(89, 0.02))
37+
end
38+
stdout.print(">TWO IUB ambiguity codes")
39+
try _generate_and_wrap(stdout, recover val consume iub end, 3 * n, rng)? end
40+
41+
let hs = recover iso Array[Amino](4)
42+
.> push(Amino(97, 0.3029549426680)) .> push(Amino(99, 0.1979883004921))
43+
.> push(Amino(103, 0.1975473066391)) .> push(Amino(116, 0.3015094502008))
44+
end
45+
stdout.print(">THREE Homo sapiens frequency")
46+
try _generate_and_wrap(stdout, recover val consume hs end, 5 * n, rng)? end
47+
48+
fun _repeat_and_wrap(out: OutStream, seq: String val, count: USize) ? =>
49+
let max_line: USize = 60
50+
let slen = seq.size()
51+
let sbytes: Array[U8] val = seq.array()
52+
let padded = recover iso Array[U8](slen + max_line) end
53+
var i: USize = 0
54+
while i < (slen + max_line) do
55+
padded.push(sbytes(i % slen)?)
56+
i = i + 1
57+
end
58+
var off: USize = 0
59+
var idx: USize = 0
60+
while idx < count do
61+
let rem = count - idx
62+
let line_len = if rem < max_line then rem else max_line end
63+
let line_arr = recover iso Array[U8](line_len) end
64+
var t: USize = 0
65+
while t < line_len do
66+
line_arr.push(padded(off + t)?)
67+
t = t + 1
68+
end
69+
out.print(String.from_array(consume line_arr))
70+
off = off + line_len
71+
if off >= slen then off = off - slen end
72+
idx = idx + line_len
73+
end
74+
75+
fun _generate_and_wrap(out: OutStream, nts: Array[Amino] val, count: USize, rng: RNG ref) ? =>
76+
let max_line: USize = 60
77+
var cum: F64 = 0
78+
let cum_tot = recover iso Array[F64](nts.size()) end
79+
var ni: USize = 0
80+
while ni < nts.size() do
81+
cum = cum + nts(ni)?.p
82+
cum_tot.push(cum)
83+
ni = ni + 1
84+
end
85+
var idx: USize = 0
86+
while idx < count do
87+
let rem = count - idx
88+
let line_len = if rem < max_line then rem else max_line end
89+
let line = recover iso Array[U8](line_len) end
90+
var j: USize = 0
91+
while j < line_len do
92+
let r = rng.next(1.0)
93+
var c: USize = 0
94+
var ti: USize = 0
95+
while ti < cum_tot.size() do
96+
let t = cum_tot(ti)?
97+
if r > t then c = c + 1 else break end
98+
ti = ti + 1
99+
end
100+
line.push(nts(c)?.l)
101+
j = j + 1
102+
end
103+
out.print(String.from_array(consume line))
104+
idx = idx + line_len
105+
end

0 commit comments

Comments
 (0)