From b3b2ebddba2dad9f9213ac80cb95033ad48eb7e2 Mon Sep 17 00:00:00 2001 From: sanine Date: Sun, 11 Jun 2023 23:05:46 -0500 Subject: add deep networks --- src/mind/topology.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src/mind/topology.js') 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]); -- cgit v1.2.1