summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2023-06-25 00:06:43 -0500
committersanine <sanine.not@pm.me>2023-06-25 00:06:43 -0500
commit1fa9872ad4683de387b2594ed25677cf3fd99309 (patch)
tree003cb57e325d6423387deb0de8a3fa3ac79ca56c
parent9f233aa540f01848fea62f6f5031142c6e96621a (diff)
add protein
-rw-r--r--src/mind/topology.test.js28
-rw-r--r--src/protein/protein.js10
-rw-r--r--src/protein/protein.test.js29
3 files changed, 53 insertions, 14 deletions
diff --git a/src/mind/topology.test.js b/src/mind/topology.test.js
index 9776132..52c196f 100644
--- a/src/mind/topology.test.js
+++ b/src/mind/topology.test.js
@@ -175,20 +175,20 @@ test('arbitrary hidden neurons', () => {
.connect(1, 2, -1)
.connect(2, 3, 2)
- const [output, state] = n.compute([1], [0, 0]);
-
- expect(output).toEqual([
- Math.tanh(
- 2*Math.tanh(
- -1*Math.tanh(1)
- )
- )
- ]);
-
- expect(state).toEqual([
- Math.tanh(1),
- Math.tanh( -Math.tanh(1) ),
- ]);
+ const [output, state] = n.compute([1], [0, 0]);
+
+ expect(output).toEqual([
+ Math.tanh(
+ 2*Math.tanh(
+ -1*Math.tanh(1)
+ )
+ )
+ ]);
+
+ expect(state).toEqual([
+ Math.tanh(1),
+ Math.tanh( -Math.tanh(1) ),
+ ]);
});
diff --git a/src/protein/protein.js b/src/protein/protein.js
new file mode 100644
index 0000000..0223203
--- /dev/null
+++ b/src/protein/protein.js
@@ -0,0 +1,10 @@
+const xnor = (a, b) => a === b ? 1 : 0;
+
+export function compare(pa, pb) {
+ if (pa.length !== pb.length) {
+ throw new Error(`attempted to compare proteins with different lengths: ${pa.length} vs ${pb.length}`);
+ }
+ return (1/pa.length) * pa
+ .map((_, i) => xnor(pa[i], pb[i]))
+ .reduce((acc, val) => acc + val, 0)
+}
diff --git a/src/protein/protein.test.js b/src/protein/protein.test.js
new file mode 100644
index 0000000..61c4896
--- /dev/null
+++ b/src/protein/protein.test.js
@@ -0,0 +1,29 @@
+'use strict';
+
+import { compare } from './protein';
+
+test('compare size-1 proteins', () => {
+ expect(compare([0], [0])).toBe(1);
+ expect(compare([0], [1])).toBe(0);
+ expect(compare([1], [0])).toBe(0);
+ expect(compare([1], [1])).toBe(1);
+});
+
+
+test('compare larger proteins', () => {
+ expect(compare([0,0], [0,0])).toBe(1);
+ expect(compare([1,1], [1,1])).toBe(1);
+ expect(compare([0,1], [1,1])).toBeCloseTo(0.5);
+ expect(compare([0,1,0], [1,1,1])).toBeCloseTo(1/3);
+ expect(compare([0,1,0,1], [1,1,1,1])).toBeCloseTo(0.5);
+ expect(compare([0,1,0,1], [0,1,1,1])).toBeCloseTo(0.75);
+ expect(compare([0,1,0,1], [0,1,1,0])).toBeCloseTo(0.5);
+ expect(compare([0,1,0,0], [0,1,1,0])).toBeCloseTo(0.75);
+ expect(compare([0,1,1,0], [0,1,1,0])).toBeCloseTo(1);
+});
+
+
+test('comparisons between differently-sized proteins throw', () => {
+ expect(() => compare([0], [0, 0])).toThrow();
+ expect(() => compare([0, 0], [0])).toThrow();
+});