Skip to content

Commit a25f76f

Browse files
authored
Merge pull request #20 from Wonseo-C/ts_savina
Implement Sieve.lf
2 parents e21f9f9 + 0b20d96 commit a25f76f

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

TS/Savina/src/parallelism/Sieve.lf

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* Copyright (C) 2022 Hanyang University
3+
*
4+
* refer to https://github.com/lf-lang/reactor-ts/blob/master/src/benchmark/Sieve.ts
5+
*
6+
* @author Wonseo Choi
7+
*/
8+
9+
target TypeScript {
10+
fast: true
11+
};
12+
13+
import BenchmarkRunner from "../BenchmarkRunner.lf";
14+
15+
reactor Ramp(totalNumber:number(100000), period:time(1 nsec)) {
16+
input start: boolean;
17+
output value: number;
18+
output end: boolean;
19+
20+
logical action next(period): number;
21+
22+
reaction (start) -> next {=
23+
actions.next.schedule(0, 2);
24+
=}
25+
26+
reaction (next) -> next, value, end {=
27+
const n: number = next as number;
28+
29+
if (n <= totalNumber) {
30+
actions.next.schedule(0, n+1);
31+
value = n;
32+
} else{
33+
end = true;
34+
}
35+
=}
36+
}
37+
38+
reactor Filter(primeStart: number(2), primeNumber: number(1000)) {
39+
40+
input inp: number;
41+
output out: number;
42+
43+
state localPrimes: {=Array<number>=}({= [] =});
44+
state hasChild: boolean(false);
45+
46+
mutation (inp) -> out {=
47+
let div = false;
48+
const size = localPrimes.length;
49+
const p = inp as number;
50+
51+
for (const q of localPrimes) {
52+
if (Number.isInteger(p / q)) {
53+
div = true;
54+
break
55+
}
56+
}
57+
58+
if (!div) {
59+
if (size < primeNumber) {
60+
localPrimes.push(p);
61+
// Print finded prime number if want
62+
// console.log("New prime number : " + p);
63+
} else {
64+
// Potential prime found.
65+
if (!hasChild) {
66+
let n = new Filter(this.getReactor(), p, primeNumber);
67+
var port = __out.getPort();
68+
this.connect(port, n.inp);
69+
hasChild = true;
70+
} else {
71+
out = p;
72+
}
73+
}
74+
}
75+
=}
76+
}
77+
78+
79+
main reactor Sieve(numIterations:number(12), totalNumber:number(100000), primeStart: number(2), primeNumber: number(1000), period: time(1 nsec)) {
80+
runner = new BenchmarkRunner(numIterations=numIterations);
81+
source = new Ramp(totalNumber=totalNumber, period=period);
82+
filter = new Filter(primeStart=primeStart, primeNumber=primeNumber);
83+
84+
reaction (startup) {=
85+
console.log("Start Sieve of Eratosthenes LF Benchmark!");
86+
=}
87+
88+
runner.start -> source.start;
89+
source.value -> filter.inp;
90+
source.end -> runner.finish;
91+
}

0 commit comments

Comments
 (0)