-
Notifications
You must be signed in to change notification settings - Fork 0
/
ReactBrainJsXORExample.tsx
64 lines (53 loc) · 1.57 KB
/
ReactBrainJsXORExample.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import * as React from 'react';
import { RunTaskAPI, useBrainJsTask } from '@tynik/web-workers';
type Input = [number, number];
type Return = [number];
const ReactBrainJsXORExample = () => {
const [taskResults, setTaskResults] = React.useState<Record<string, number>>(null);
const [task] = useBrainJsTask<[Input], Return>(function* (this, brain, input) {
const net = new brain.NeuralNetwork<Input, Return>();
net.train([
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
]);
while (1) {
input = yield net.run(input);
}
});
const setTaskResult = (input: Input, result: Return): void => {
setTaskResults((taskResults) => (
{
...taskResults,
[JSON.stringify(input)]: result[0]
}
));
};
React.useEffect(() => {
if (!task) {
return;
}
const inputs: Input[] = [[0, 0], [0, 1], [1, 0], [1, 1]];
let taskInstance: RunTaskAPI<[Input], Return>;
inputs.forEach((input, index) => {
if (index) {
taskInstance.next(input).then(({ result }) =>
setTaskResult(input, result)
);
} else {
taskInstance = task.run(input);
task.whenNext(({ result }) => setTaskResult(input, result), true);
}
});
// stop the generator function
taskInstance.return();
}, [task]);
return (
<>
<p>Assumed XOR values:</p>
<pre>{taskResults && JSON.stringify(taskResults, null, 2)}</pre>
</>
);
};
export default ReactBrainJsXORExample;