/
oct_19_2016_experiment.clj
101 lines (77 loc) · 3.98 KB
/
oct_19_2016_experiment.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(ns dmm.examples.oct-19-2016-experiment
(:require [dmm.core :as dc
:refer [v-accum v-identity
down-movement up-movement
rec-map-sum]]))
; trying to build a very small network to reproduce the essence of
; Project Fluid Aug 27, 2016 experiment
(def init-matrix
{v-accum {:self {:accum {v-accum {:self {:single 1}}}}}})
(def update-1-matrix-hook
{v-identity {:update-1 {:single {v-identity {:update-1 {:single 1}}}}}})
(def update-2-matrix-hook
{v-identity {:update-2 {:single {v-identity {:update-2 {:single 1}}}}}})
(def update-3-matrix-hook
{v-identity {:update-3 {:single {v-identity {:update-3 {:single 1}}}}}})
(def start-update-of-network-matrix
{v-accum {:self {:delta {v-identity {:update-1 {:single 1}}}}}})
(def start-matrix
(rec-map-sum
init-matrix update-1-matrix-hook update-2-matrix-hook
update-3-matrix-hook start-update-of-network-matrix))
(def update-1-matrix
(rec-map-sum {v-accum {:self {:delta {v-identity {:update-1 {:single -1}}}}}}
{v-accum {:self {:delta {v-identity {:update-2 {:single 1}}}}}}))
(def update-2-matrix
(rec-map-sum {v-accum {:self {:delta {v-identity {:update-2 {:single -1}}}}}}
{v-accum {:self {:delta {v-identity {:update-3 {:single 1}}}}}}))
(def update-3-matrix
(rec-map-sum {v-accum {:self {:delta {v-identity {:update-3 {:single -1}}}}}}
{v-accum {:self {:delta {v-identity {:update-1 {:single 1}}}}}}))
; (def init-output {v-accum {:self {:single init-matrix}}})
(def init-output
(rec-map-sum {v-accum {:self {:single start-matrix}}}
{v-identity {:update-1 {:single update-1-matrix}}}
{v-identity {:update-2 {:single update-2-matrix}}}
{v-identity {:update-3 {:single update-3-matrix}}}))
(defn extract-matrix [current-output]
(((current-output v-accum) :self) :single))
(defn extract-delta [current-output]
((((extract-matrix current-output) v-accum) :self) :delta))
;;; recording the experiment here on Oct 20 after the switch from
;;; accum to (var accum), and from identity to (var identity)
;;;
;;; also the difference here is that we are using iter-apply-fns to
;;; run network steps and that we actually re-run the network from the
;;; start each time (just because it's less typing and because we can)
(comment
(->> (dc/iter-apply-fns init-output down-movement up-movement)
rest (dc/map-every-other extract-delta)
(take 20)
(filter v-identity)
clojure.pprint/pprint)
user>
({#'clojure.core/identity {:update-2 {:single 1}}}
{#'clojure.core/identity {:update-3 {:single 1}}}
{#'clojure.core/identity {:update-1 {:single 1}}}
{#'clojure.core/identity {:update-2 {:single 1}}}
{#'clojure.core/identity {:update-3 {:single 1}}}
{#'clojure.core/identity {:update-1 {:single 1}}}
{#'clojure.core/identity {:update-2 {:single 1}}}
{#'clojure.core/identity {:update-3 {:single 1}}}
{#'clojure.core/identity {:update-1 {:single 1}}}
{#'clojure.core/identity {:update-2 {:single 1}}}))
; user=> (extract-delta init-output)
; {#'clojure.core/identity {:update-1 {:single 1}}}
; user=> (extract-delta (first (drop 2 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-2 {:single 1}}}
; user=> (extract-delta (first (drop 4 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-3 {:single 1}}}
; user=> (extract-delta (first (drop 6 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-1 {:single 1}}}
; user=> (extract-delta (first (drop 8 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-2 {:single 1}}}
; user=> (extract-delta (first (drop 10 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-3 {:single 1}}}
; user=> (extract-delta (first (drop 12 (iter-apply-fns init-output down-movement up-movement))))
; {#'clojure.core/identity {:update-1 {:single 1}}}