summaryrefslogtreecommitdiff
path: root/src/mind/topology.js
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2023-06-11 23:05:46 -0500
committersanine <sanine.not@pm.me>2023-06-11 23:05:46 -0500
commitb3b2ebddba2dad9f9213ac80cb95033ad48eb7e2 (patch)
treea57f3ea2088d9ca0d6a88ade923f314bd0d4c3fb /src/mind/topology.js
parent980a5350b5a4845db2bd5d6feb9f463a3c1a3aa6 (diff)
add deep networks
Diffstat (limited to 'src/mind/topology.js')
-rw-r--r--src/mind/topology.js26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/mind/topology.js b/src/mind/topology.js
index 19eb399..320b499 100644
--- a/src/mind/topology.js
+++ b/src/mind/topology.js
@@ -91,7 +91,10 @@ function edge_ends(n, edge) {
}
-function get_value(n, index, input) {
+function get_value(n, index, input, cache) {
+ if (cache !== undefined && cache[index]) {
+ return cache[index];
+ }
if (is_input(n, index)) {
return input[index];
}
@@ -102,13 +105,26 @@ function get_value(n, index, input) {
.map(x => edge_ends(n, x).source);
const sum = sources
- .reduce((acc, x, i) => acc + (weight[i] * get_value(n, x, input)), 0);
+ .reduce((acc, x, i) =>
+ acc + (weight[i] * get_value(n, x, input, cache)),
+ 0
+ );
+
+ const value = Math.tanh(sum);
+
+ // !!! impure caching !!!
+ if (cache !== undefined) {
+ cache[index] = value;
+ }
- return Math.tanh(sum);
+ return value;
}
function network_compute(n, input, state) {
+ // !!! impure caching !!!
+ const value_cache = {};
+
const hidden = n.adjacency
.map((x, i) =>
(
@@ -121,11 +137,11 @@ function network_compute(n, input, state) {
.filter(i => i !== null);
const output = Object.freeze(
- outputs.map(x => get_value(n, x, input))
+ outputs.map(x => get_value(n, x, input, value_cache))
);
const newstate = Object.freeze(
- hidden.map(x => get_value(n, x, input))
+ hidden.map(x => get_value(n, x, input, value_cache))
);
return Object.freeze([output, newstate]);