Skip to content

Commit 3f7a21f

Browse files
committed
squash
1 parent bce6352 commit 3f7a21f

File tree

6 files changed

+255
-35
lines changed

6 files changed

+255
-35
lines changed

src/benchmark/sucoverrelax/actor.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable @typescript-eslint/prefer-readonly */
22
// The SOR (Re)actor
3-
import { Reactor, State } from "../../core/internal";
3+
import { InPort, Reactor, State } from "../../core/internal";
4+
import { Message } from "./sorutils";
45

56
export class SORActor extends Reactor {
67
constructor(
@@ -22,6 +23,8 @@ export class SORActor extends Reactor {
2223
const omegaOverFour = 0.25 * omega;
2324
const oneMinusOmega = 1.0 - omega;
2425

26+
this.portFromRunner = new InPort<Message>(this);
27+
2528
const neighbours = (() => {
2629
const calPos = (x: number, y: number): number => (x * ny + y);
2730

@@ -60,5 +63,5 @@ export class SORActor extends Reactor {
6063
private msgRcv = new State(0);
6164
private sorActors = new State<Reactor[]>([]);
6265

63-
protected
66+
public portFromRunner: InPort<Message>;
6467
}

src/benchmark/sucoverrelax/peer.ts

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,71 @@
1-
import { Reactor, State } from "../../core/internal";
1+
import { InPort, MutationSandbox, OutPort, Reactor, State } from "../../core/internal";
2+
import { SORActor } from "./actor";
23
import { SORRunner } from "./runner";
3-
import { SorBorder } from "./sorutils";
4+
import { Message, MessageTypes, SorBorder as SORBorder, SorBorder } from "./sorutils";
45

56
export class SORPeer extends Reactor {
7+
8+
s: State<number>;
9+
partStart: State<number>;
10+
matrixPart: State<number[][]>;
11+
border: State<SORBorder>;
12+
sorSource: State<SORRunner>
13+
14+
615
sorActors: State<Reactor[]>;
16+
public portFromSORRunner: InPort<Message>;
17+
718
constructor(
819
parent: Reactor,
920
s: number,
1021
partStart: number,
1122
matrixPart: number[][],
12-
border: SorBorder,
23+
border: SORBorder,
1324
sorSource: SORRunner
1425
) {
1526
super(parent, "SORPeer");
1627
this.sorActors = new State([]);
28+
this.s = new State(s);
29+
this.partStart = new State(partStart);
30+
this.matrixPart = new State(matrixPart);
31+
this.border = new State(border);
32+
this.sorSource = new State(sorSour ce);
33+
34+
this.portFromSORRunner = new InPort(this);
1735
}
18-
}
36+
37+
static boot(this: MutationSandbox, args: BootProcessingArgs) {
38+
const myBorder: SORActor[] = [];
39+
const {_s, border, sorActors, partStart} = args;
40+
const s = _s.get();
41+
const partStartVal = partStart.get();
42+
43+
const sorActorsValue = sorActors.get();
44+
const borderValue = border.get();
45+
for (let i = 0; i < s; ++i) {
46+
sorActorsValue[i * (s - partStartVal + 1)] = borderValue.borderActors[i];
47+
}
48+
sorActors.set(sorActorsValue);
49+
50+
for ()
51+
}
52+
}
53+
54+
interface BootProcessingArgs {
55+
type: MessageTypes.sorBootMessage,
56+
_s: State<number>,
57+
border: State<SORBorder>,
58+
sorActors: State<SORActor[]>,
59+
partStart: State<number>,
60+
}
61+
interface ResultProcessingArgs {
62+
type: MessageTypes.sorResultMessage,
63+
expectingBoot: State<boolean>,
64+
totalMsgRcv: State<number>,
65+
returned: State<number>,
66+
gTotal: State<number>,
67+
s: State<number>,
68+
part: State<number>
69+
}
70+
71+
type ProcessingArgs = BootProcessingArgs | ResultProcessingArgs;
Lines changed: 155 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,35 @@
1-
import { InMultiPort, InPort, OutMultiPort, OutPort, Parameter, Reactor, State, } from "../../core/internal";
1+
import { InMultiPort, InPort, MutationSandbox, OutMultiPort, OutPort, Parameter, Reactor, State, Variable, } from "../../core/internal";
22
import { SORActor } from "./actor";
33
import { SORPeer } from "./peer";
4-
import { Message, SorBorder, omega } from "./sorutils";
4+
import { Message, MessageTypes, SORBootMessage, SORResultMessage, SorBorder, jacobi, omega } from "./sorutils";
55

66
export class SORRunner extends Reactor {
7-
protected sorActors: State<Reactor[]>;
8-
protected sorPeer: State<Reactor | undefined>;
7+
protected s: State<number>;
8+
protected part: State<number>;
9+
10+
protected sorActors: State<SORActor[]>;
11+
protected sorPeer: State<SORPeer | undefined>;
912

1013
protected portToSORActors: OutPort<Message>;
1114
protected portToSORPeer: OutPort<Message>;
1215
// Unsure if this would work, let's just try......
1316
protected portFromSORActor: InPort<Message>;
1417
protected portFromSORPeer: InPort<Message>;
1518

19+
protected gTotal = new State(0.0);
20+
protected returned = new State(0);
21+
protected totalMsgRcv = new State(0);
22+
protected expectingBoot = new State(true);
23+
24+
// In Savina, randoms is accessed directly from SucOverRelaxConfig.
25+
// Here we pass it in to the closure.
1626
constructor(parent: Reactor, size: number, _randoms: number[][]) {
1727
super(parent, "SORRunner");
1828
// These are in SorRunner;
19-
const s = size;
29+
this.s = new State(size);
2030
// In the scala implementation a simple /2 was used.
2131
// In JS we might need to enforce some sort of guarantee as it was used to calculate position
22-
const part = Math.floor(s / 2);
32+
this.part = new State(Math.floor(size / 2));
2333
/** These are from Savina. They should be rather irrelevant, actually. */
2434
this.sorActors = new State([]);
2535
this.sorPeer = new State(undefined);
@@ -28,16 +38,105 @@ export class SORRunner extends Reactor {
2838
// This creates a bunch of ports.
2939
this.portToSORActors = new OutPort(this);
3040
this.portToSORPeer = new OutPort(this);
31-
32-
// SorRunner::boot()
41+
this.portFromSORActor = new InPort(this);
42+
this.portFromSORPeer = new InPort(this);
43+
3344
this.addMutation(
3445
[this.startup],
35-
[this.sorActors, this.sorPeer],
36-
function (this, sorActors, sorPeer) {
37-
const myBorder: Reactor[] = [];
38-
const randoms = _randoms;
46+
[this.sorActors, this.sorPeer, this.portToSORActors, this.portToSORPeer],
47+
function (this, sorActors, sorPeer, portToSORActors, portToSORPeer) {
48+
// TODO: Add actual stuff
49+
;
50+
}
51+
);
52+
}
53+
54+
// This is to be used WITHIN mutation react functions.
55+
static process(this: MutationSandbox, message: Message, args: ProcessingArgs): void {
56+
switch (message.messageType) {
57+
case MessageTypes.sorBootMessage: {
58+
if (args.type !== MessageTypes.sorBootMessage) {
59+
throw new Error("Wrong type of arguments passed.");
60+
}
61+
// expectingBoot is args[0]
62+
args.expectingBoot.set(false);
63+
SORRunner.boot.apply(this, [args]);
64+
break;
65+
}
66+
case MessageTypes.sorResultMessage: {
67+
if (args.type !== MessageTypes.sorResultMessage) {
68+
throw new Error("Wrong type of arguments passed.");
69+
}
3970

40-
// In scala, (i <- 0 until s) is loop excluding s.
71+
const {mv, msgRcv} = message;
72+
const {expectingBoot, totalMsgRcv, returned, gTotal, s, part} = args;
73+
74+
if (expectingBoot.get()) {
75+
throw new Error("SORRunner not booted yet!");
76+
}
77+
78+
totalMsgRcv.set(totalMsgRcv.get() + msgRcv);
79+
returned.set(returned.get() + 1);
80+
gTotal.set(gTotal.get() + mv);
81+
82+
if (returned.get() === (s.get() * part.get()) + 1) {
83+
// TODO: validate
84+
// TODO: exit
85+
;
86+
}
87+
break;
88+
}
89+
case MessageTypes.sorBorderMessage: {
90+
if (args.type !== MessageTypes.sorBorderMessage) {
91+
throw new Error("Wrong type of arguments passed.");
92+
}
93+
94+
const {mBorder} = message;
95+
const {expectingBoot, s, part, sorActors, portToSORActors} = args;
96+
97+
if (expectingBoot.get()) {
98+
throw new Error("SORRunner not booted yet!");
99+
}
100+
const sorActorsValue = sorActors.get();
101+
for (let i = 0; i <= s.get(); ++i) {
102+
sorActorsValue[(i + 1) * (part.get() + 1) - 1] = mBorder.borderActors[i];
103+
}
104+
sorActors.set(sorActorsValue);
105+
for (let i = 0; i <= s.get(); ++i) {
106+
for (let j = 0; j <= part.get(); ++j) {
107+
const pos = (i * (part.get() + 1)) + j;
108+
// Ibidem, connect then disconnect to simulate
109+
// "fire and forget" in scala.
110+
this.connect(portToSORActors, sorActorsValue[pos].portFromRunner);
111+
this.getReactor().writable(portToSORActors).set(
112+
{
113+
messageType: MessageTypes.sorStartMessage,
114+
mi: jacobi,
115+
mActors: sorActorsValue
116+
}
117+
);
118+
this.disconnect(portToSORActors, sorActorsValue[pos].portFromRunner);
119+
}
120+
}
121+
break;
122+
}
123+
default: {
124+
throw new Error("Received wrong message from port");
125+
}
126+
}
127+
}
128+
129+
// SorRunner::boot()
130+
static boot(this: MutationSandbox,
131+
args: BootProcessingArgs
132+
): void {
133+
const {_randoms, _s, _part, sorActors, sorPeer, portToSORPeer} = args;
134+
135+
const myBorder: SORActor[] = [];
136+
const randoms = _randoms;
137+
const s = _s.get();
138+
const part = _part.get();
139+
// In scala, (i <- 0 until s) is a loop excluding s.
41140
const sorActorsValue = sorActors.get();
42141
for (let i = 0; i < s; ++i) {
43142
let c = i % 2;
@@ -51,7 +150,7 @@ export class SORRunner extends Reactor {
51150
SORActor,
52151
pos, randoms[i][j], c, s, part + 1, omega, this.getReactor(), false
53152
);
54-
// TODO: Make connections
153+
55154
if (j === (part - 1)) {
56155
myBorder[i] = sorActorsValue[pos];
57156
}
@@ -69,14 +168,50 @@ export class SORRunner extends Reactor {
69168

70169
const sorPeerValue = this.getReactor()._uncheckedAddSibling(
71170
SORPeer,
72-
s, part, partialMatrix, new SorBorder(myBorder),
171+
s, part, partialMatrix, new SorBorder(myBorder),
73172
// A dirty hack. Maybe this will be removed as ports get added.
74173
this.getReactor() as SORRunner
75-
);
174+
);
76175
sorPeer.set(sorPeerValue);
77-
// TODO: Add connections.
78-
79-
}
80-
);
176+
// Pass message.
177+
// This is similar to Scala's !; but it looks pretty...... interesting in LF.
178+
// If node is concurrent or parallel, this might be a problem, so direct copy-pastaing to C++ runtime might not work.
179+
this.connect(portToSORPeer, sorPeerValue.portFromSORRunner);
180+
this.getReactor().writable(portToSORPeer).set({messageType: MessageTypes.sorBootMessage});
181+
// Disconnect immediately.
182+
this.disconnect(portToSORPeer, sorPeerValue.portFromSORRunner);
81183
}
82184
}
185+
186+
187+
interface BootProcessingArgs {
188+
type: MessageTypes.sorBootMessage,
189+
expectingBoot: State<boolean>,
190+
_randoms: number[][],
191+
_s: State<number>,
192+
_part: State<number>,
193+
sorActors: State<SORActor[]>,
194+
sorPeer: State<SORPeer>,
195+
portToSORPeer: OutPort<Message>
196+
}
197+
198+
interface ResultProcessingArgs {
199+
type: MessageTypes.sorResultMessage,
200+
expectingBoot: State<boolean>,
201+
totalMsgRcv: State<number>,
202+
returned: State<number>,
203+
gTotal: State<number>,
204+
s: State<number>,
205+
part: State<number>
206+
}
207+
208+
interface BorderProcessingArgs {
209+
type: MessageTypes.sorBorderMessage,
210+
expectingBoot: State<boolean>,
211+
s: State<number>,
212+
part: State<number>,
213+
sorActors: State<SORActor[]>,
214+
portToSORActors: OutPort<Message>
215+
}
216+
217+
type ProcessingArgs = BootProcessingArgs | ResultProcessingArgs | BorderProcessingArgs;

src/benchmark/sucoverrelax/sorutils.ts

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Reactor } from "../../core/reactor";
2+
import { SORActor } from "./actor";
23

34
// Savina implementation of PRNG
45
export class SavinaPRNG {
@@ -62,21 +63,47 @@ export function jgfValidate(gTotal: number, size: number): void {
6263
}
6364

6465
export enum MessageTypes {
66+
sorBootMessage,
67+
sorResultMessage,
6568
sorBorderMessage,
6669
sorStartMessage,
6770
sorValueMessage,
68-
sorBootMessage,
69-
sorResuleMessage
7071
}
7172

7273
export class SorBorder {
73-
borderActors: Reactor[];
74-
constructor(borderActors: Reactor[]) {
74+
borderActors: SORActor[];
75+
constructor(borderActors: SORActor[]) {
7576
this.borderActors = borderActors;
7677
}
7778
}
7879

79-
export interface Message {
80-
messageType: MessageTypes;
80+
export interface SORBootMessage {
81+
messageType: MessageTypes.sorBootMessage;
82+
}
83+
84+
export interface SORResultMessage {
85+
messageType: MessageTypes.sorResultMessage;
86+
mx: number;
87+
my: number;
88+
mv: number;
89+
msgRcv: number;
90+
}
91+
92+
export interface SORBorderMessage {
93+
messageType: MessageTypes.sorBorderMessage;
94+
95+
mBorder: SorBorder;
96+
}
97+
98+
export interface SORStartMessage {
99+
messageType: MessageTypes.sorStartMessage;
100+
mi: number;
101+
mActors: SORActor[];
81102
}
82103

104+
export interface SORValueMessage {
105+
messageType: MessageTypes.sorValueMessage;
106+
}
107+
108+
export type Message = SORBootMessage | SORResultMessage | SORBorderMessage | SORStartMessage | SORValueMessage;
109+

0 commit comments

Comments
 (0)