From eb03b3a341f3c8152db4ee2ee99b85cffb27796e Mon Sep 17 00:00:00 2001 From: sanine-a Date: Tue, 1 Aug 2023 17:40:53 -0500 Subject: add util.js --- src/genome/genome.js | 2 ++ src/mind/topology.js | 49 +++++++++++++++++++++++++------------------------ src/util.js | 10 ++++++++++ 3 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 src/util.js diff --git a/src/genome/genome.js b/src/genome/genome.js index 16de162..8e0c9f0 100644 --- a/src/genome/genome.js +++ b/src/genome/genome.js @@ -47,3 +47,5 @@ export function mutate(gene, type, value) { throw new Error(`unknown mutation type: '${type}'`); }; } + + diff --git a/src/mind/topology.js b/src/mind/topology.js index 8e59c54..576ee83 100644 --- a/src/mind/topology.js +++ b/src/mind/topology.js @@ -1,5 +1,7 @@ 'use strict'; +import { create } from '../util'; + const DEFAULT_WEIGHT_MAX = 4; @@ -18,12 +20,13 @@ const network_proto = { // create a new network export function network(input_count, internal_count, output_count, weight_max = 4) { const count = input_count + internal_count + output_count; - const n = Object.create(network_proto); - n.input_count = input_count; - n.output_count = output_count; - n.adjacency = new Array(count).fill([]); - n.weight = []; - return Object.freeze(n); + const n = create({ + input_count, + output_count, + adjacency: new Array(count).fill([]), + weight: [], + }, network_proto); + return n; } @@ -53,24 +56,22 @@ function network_connect(n, source, sink, weight) { throw new Error("attempt to use output as source"); } - const nn = Object.create(network_proto); - nn.input_count = n.input_count; - nn.output_count = n.output_count; - nn.adjacency = n.adjacency.map((row, i) => { - if (i === source && i === sink) { - // self-loop - return [...row, 2]; - } else if (i === source) { - return [...row, 1]; - } else if (i === sink) { - return [...row, -1]; - } else { - return [...row, 0]; - } - }); - nn.weight = [...n.weight, weight]; - - return Object.freeze(nn); + return create({ + ...n, + adjacency: n.adjacency.map((row, i) => { + if (i === source && i === sink) { + // self-loop + return [...row, 2]; + } else if (i === source) { + return [...row, 1]; + } else if (i === sink) { + return [...row, -1]; + } else { + return [...row, 0]; + } + }), + weight: [...n.weight, weight], + }, network_proto); } diff --git a/src/util.js b/src/util.js new file mode 100644 index 0000000..9f52551 --- /dev/null +++ b/src/util.js @@ -0,0 +1,10 @@ +'use strict'; + + +export function create(obj, proto=Object.prototype) { + const props = Object.keys(obj) + .map((key) => [ key, { value: obj[key], enumerable: true } ]) + .reduce((acc, [ key, value ]) => ({ ...acc, [key]: value }), {}); + + return Object.create(proto, props); +}; -- cgit v1.2.1