diff options
author | sanine <sanine.not@pm.me> | 2023-06-11 23:05:46 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-06-11 23:05:46 -0500 |
commit | b3b2ebddba2dad9f9213ac80cb95033ad48eb7e2 (patch) | |
tree | a57f3ea2088d9ca0d6a88ade923f314bd0d4c3fb /src/mind/topology.js | |
parent | 980a5350b5a4845db2bd5d6feb9f463a3c1a3aa6 (diff) |
add deep networks
Diffstat (limited to 'src/mind/topology.js')
-rw-r--r-- | src/mind/topology.js | 26 |
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]); |