-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreadme.html
More file actions
352 lines (299 loc) · 77.3 KB
/
readme.html
File metadata and controls
352 lines (299 loc) · 77.3 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="ExDoc v0.38.2">
<meta name="project" content="nn v1.0.0">
<title>Feed-Forward Neural Network in Erlang/OTP — nn v1.0.0</title>
<link rel="stylesheet" href="dist/html-erlang-DQDXQC7W.css" />
<script defer src="dist/sidebar_items-40E37E96.js"></script>
<script defer src="docs_config.js"></script>
<script defer src="dist/html-DPJLHKSM.js"></script>
</head>
<body>
<script>(()=>{var t="ex_doc:settings",e="dark";var o="dark",s="light";var E="sidebar_state",n="closed";var r="sidebar_width";var a="sidebar-open";var i=new URLSearchParams(window.location.search),S=i.get("theme")||JSON.parse(localStorage.getItem(t)||"{}").theme;(S===o||S!==s&&window.matchMedia("(prefers-color-scheme: dark)").matches)&&document.body.classList.add(e);var d=sessionStorage.getItem(E),A=d!==n&&!window.matchMedia(`screen and (max-width: ${768}px)`).matches;document.body.classList.toggle(a,A);var c=sessionStorage.getItem(r);c&&document.body.style.setProperty("--sidebarWidth",`${c}px`);var p=/(Macintosh|iPhone|iPad|iPod)/.test(window.navigator.userAgent);document.documentElement.classList.toggle("apple-os",p);})();
</script>
<div class="body-wrapper">
<button id="sidebar-menu" class="sidebar-button sidebar-toggle" aria-label="toggle sidebar" aria-controls="sidebar">
<i class="ri-menu-line ri-lg" title="Collapse/expand sidebar"></i>
</button>
<nav id="sidebar" class="sidebar">
<div class="sidebar-header">
<div class="sidebar-projectInfo">
<div>
<a href="readme.html" class="sidebar-projectName" translate="no">
nn
</a>
<div class="sidebar-projectVersion" translate="no">
v1.0.0
</div>
</div>
</div>
<ul id="sidebar-list-nav" class="sidebar-list-nav" role="tablist" data-extras=""></ul>
</div>
</nav>
<output role="status" id="toast"></output>
<main class="content page-extra" id="main" data-type="extras">
<div id="content" class="content-inner">
<div class="top-search">
<div class="search-settings">
<form class="search-bar" action="search.html">
<label class="search-label">
<span class="sr-only">Search documentation of nn</span>
<input name="q" type="text" class="search-input" placeholder="Press / to search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />
</label>
<button type="submit" class="search-button" aria-label="Submit Search" tabindex="-1">
<i class="ri-search-2-line ri-lg" aria-hidden="true"></i>
</button>
<button type="button" tabindex="-1" class="search-close-button" aria-hidden="true">
<i class="ri-close-line ri-lg" title="Cancel search"></i>
</button>
</form>
<div class="autocomplete">
</div>
<button class="icon-settings display-settings">
<i class="ri-settings-3-line"></i>
<span class="sr-only">Settings</span>
</button>
</div>
</div>
<div id="top-content">
<div class="heading-with-actions top-heading">
<h1>Feed-Forward Neural Network in Erlang/OTP</h1>
<a href="https://github.com/yourusername/NN/blob/v1.0.0/README.md#L1" title="View Source" class="icon-action" rel="help">
<i class="ri-code-s-slash-line" aria-hidden="true"></i>
<span class="sr-only">View Source</span>
</a>
</div>
<p><a href="https://www.erlang.org/"><img src="https://img.shields.io/badge/Erlang%2FOTP-26%2B-red.svg" alt="Erlang/OTP"/></a>
<a href="doc/readme.html"><img src="https://img.shields.io/badge/docs-ExDoc-blue.svg" alt="Documentation"/></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"/></a></p><blockquote><p>A concurrent, message-passing based neural network implementation using Erlang's actor model</p></blockquote><h2 id="overview" class="section-heading"><a href="#overview" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Overview</span></h2><p>This project implements a <strong>Feed-Forward Neural Network (FFNN)</strong> using Erlang/OTP's actor model with a <strong>perturbation-based learning algorithm</strong>. Each component of the neural network (neurons, sensors, actuators, cortex, and scapes) is implemented as a separate concurrent process, allowing for <strong>parallel execution</strong> and <strong>message-passing based communication</strong>.</p><h3 id="key-features" class="section-heading"><a href="#key-features" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Key Features</span></h3><ul><li>🧠 <strong>Actor-based architecture</strong> - Each neuron, sensor, and actuator runs as an independent process</li><li>⚡ <strong>Concurrent execution</strong> - Natural parallelism through Erlang's process model</li><li>🔄 <strong>Perturbation learning</strong> - Evolutionary-style weight optimization without backpropagation</li><li>📊 <strong>Built-in benchmarking</strong> - Statistical analysis across multiple training runs</li><li>💾 <strong>Persistent genotypes</strong> - Save and load trained networks via Mnesia/ETS</li><li>📚 <strong>Complete documentation</strong> - ExDoc-generated API documentation with examples</li></ul><h2 id="architecture" class="section-heading"><a href="#architecture" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Architecture</span></h2><h3 id="system-components" class="section-heading"><a href="#system-components" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">System Components</span></h3><p>The system consists of several key modules:</p><ol><li><code class="inline">exoself.erl</code> - Orchestrates the network creation, lifecycle, and training loop</li><li><code class="inline">genotype.erl</code> - Generates and persists network structure and weights</li><li><code class="inline">morphology.erl</code> - Defines problem-specific sensor/actuator configurations</li><li><code class="inline">scape.erl</code> - Implements environment simulations (e.g., XOR problem)</li><li><code class="inline">sensor.erl</code> - Handles input generation from scapes</li><li><code class="inline">neuron.erl</code> - Implements neuron behavior with weight management</li><li><code class="inline">actuator.erl</code> - Manages output processing and fitness collection</li><li><code class="inline">cortex.erl</code> - Orchestrates synchronous network operation cycles</li><li><code class="inline">trainer.erl</code> - Manages training sessions with fitness tracking</li><li><code class="inline">benchmarker.erl</code> - Runs statistical benchmarks across multiple training runs</li><li><code class="inline">platform.erl</code> - Gen_server for managing shared scapes and modules</li><li><code class="inline">records.hrl</code> - Defines data structures</li></ol><h3 id="process-hierarchy" class="section-heading"><a href="#process-hierarchy" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Process Hierarchy</span></h3><pre><code class="mermaid">graph TD
P[Platform] -.->|Manages| PSC[Public Scapes]
P -.->|Mnesia| DB[(Database)]
B[Benchmarker] -->|Spawns| T[Trainer]
T -->|Spawns| E[ExoSelf]
E -->|Creates| SC[Private Scapes]
E -->|Creates| C[Cortex]
E -->|Creates| S[Sensors]
E -->|Creates| N[Neurons]
E -->|Creates| A[Actuators]
C -->|Sync| S
S -->|Percepts| SC
S -.->|Can use| PSC
S -->|Forward| N
N -->|Forward| A
A -->|Actions| SC
A -.->|Can use| PSC
SC -->|Fitness| A
PSC -.->|Fitness| A
A -->|Sync| C
C -->|Results| E
E -->|Best Fitness| T
T -->|Statistics| B</code></pre><h3 id="message-flow-one-evaluation-cycle" class="section-heading"><a href="#message-flow-one-evaluation-cycle" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Message Flow (One Evaluation Cycle)</span></h3><pre><code class="mermaid">sequenceDiagram
participant E as ExoSelf
participant C as Cortex
participant S as Sensor
participant SC as Scape
participant N as Neuron
participant A as Actuator
E->>C: Send PIDs & IDs
C->>S: {sync}
S->>SC: {sense}
SC->>S: {percept, Input}
S->>N: {forward, Input}
N->>N: Compute: tanh(dot(Input, Weights))
N->>A: {forward, Output}
A->>SC: {action, Output}
SC->>A: {Fitness, HaltFlag}
A->>C: {sync, Fitness, HaltFlag}
C->>E: {evaluation_completed, Fitness, Cycles, Time}</code></pre><h3 id="key-data-structures" class="section-heading"><a href="#key-data-structures" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Key Data Structures</span></h3><h4>Core Neural Network Records</h4><pre><code class="makeup erlang" translate="no"><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="9907044861-1">(</span><span class="ss">sensor</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9907044861-2">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">cortex_id</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">,</span><span class="w"> </span><span class="ss">scape</span><span class="p">,</span><span class="w"> </span><span class="ss">vector_length</span><span class="p">,</span><span class="w"> </span><span class="ss">fanout_ids</span><span class="p" data-group-id="9907044861-2">}</span><span class="p" data-group-id="9907044861-1">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="9907044861-3">(</span><span class="ss">actuator</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9907044861-4">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">cortex_id</span><span class="p">,</span><span class="w"> </span><span class="ss">name</span><span class="p">,</span><span class="w"> </span><span class="ss">scape</span><span class="p">,</span><span class="w"> </span><span class="ss">vector_length</span><span class="p">,</span><span class="w"> </span><span class="ss">fanin_ids</span><span class="p" data-group-id="9907044861-4">}</span><span class="p" data-group-id="9907044861-3">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="9907044861-5">(</span><span class="ss">neuron</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9907044861-6">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">cortex_id</span><span class="p">,</span><span class="w"> </span><span class="ss">activation_function</span><span class="p">,</span><span class="w"> </span><span class="ss">input_ids</span><span class="p">,</span><span class="w"> </span><span class="ss">output_ids</span><span class="p" data-group-id="9907044861-6">}</span><span class="p" data-group-id="9907044861-5">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="9907044861-7">(</span><span class="ss">cortex</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9907044861-8">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">sensor_ids</span><span class="p">,</span><span class="w"> </span><span class="ss">actuator_ids</span><span class="p">,</span><span class="w"> </span><span class="ss">neuron_ids</span><span class="p" data-group-id="9907044861-8">}</span><span class="p" data-group-id="9907044861-7">)</span><span class="p">.</span></code></pre><p><strong>Note:</strong> Sensors and actuators include a <code class="inline">scape</code> field which specifies the environment (e.g., <code class="inline">{private, xor_sim}</code> for a private XOR simulator).</p><h4>Evolutionary Algorithm Records (Future Support)</h4><pre><code class="makeup erlang" translate="no"><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="3668707110-1">(</span><span class="ss">agent</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3668707110-2">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">generation</span><span class="p">,</span><span class="w"> </span><span class="ss">population_id</span><span class="p">,</span><span class="w"> </span><span class="ss">specie_id</span><span class="p">,</span><span class="w"> </span><span class="ss">cortex_id</span><span class="p">,</span><span class="w"> </span><span class="ss">fingerprint</span><span class="p">,</span><span class="w">
</span><span class="ss">constraint</span><span class="p">,</span><span class="w"> </span><span class="ss">evolution_history</span><span class="o">=</span><span class="p" data-group-id="3668707110-3">[</span><span class="p" data-group-id="3668707110-3">]</span><span class="p">,</span><span class="w"> </span><span class="ss">fitness</span><span class="p">,</span><span class="w"> </span><span class="ss">innovation_factor</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="ss">pattern</span><span class="o">=</span><span class="p" data-group-id="3668707110-4">[</span><span class="p" data-group-id="3668707110-4">]</span><span class="p" data-group-id="3668707110-2">}</span><span class="p" data-group-id="3668707110-1">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="3668707110-5">(</span><span class="ss">specie</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3668707110-6">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">population_id</span><span class="p">,</span><span class="w"> </span><span class="ss">fingerprint</span><span class="p">,</span><span class="w"> </span><span class="ss">constraint</span><span class="p">,</span><span class="w"> </span><span class="ss">agent_ids</span><span class="o">=</span><span class="p" data-group-id="3668707110-7">[</span><span class="p" data-group-id="3668707110-7">]</span><span class="p">,</span><span class="w"> </span><span class="ss">dead_pool</span><span class="o">=</span><span class="p" data-group-id="3668707110-8">[</span><span class="p" data-group-id="3668707110-8">]</span><span class="p">,</span><span class="w">
</span><span class="ss">champion_ids</span><span class="o">=</span><span class="p" data-group-id="3668707110-9">[</span><span class="p" data-group-id="3668707110-9">]</span><span class="p">,</span><span class="w"> </span><span class="ss">fitness</span><span class="p">,</span><span class="w"> </span><span class="ss">innovation_factor</span><span class="o">=</span><span class="mi">0</span><span class="p" data-group-id="3668707110-6">}</span><span class="p" data-group-id="3668707110-5">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="3668707110-10">(</span><span class="ss">population</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3668707110-11">{</span><span class="ss">id</span><span class="p">,</span><span class="w"> </span><span class="ss">platform_id</span><span class="p">,</span><span class="w"> </span><span class="ss">specie_ids</span><span class="o">=</span><span class="p" data-group-id="3668707110-12">[</span><span class="p" data-group-id="3668707110-12">]</span><span class="p">,</span><span class="w"> </span><span class="ss">morphologies</span><span class="o">=</span><span class="p" data-group-id="3668707110-13">[</span><span class="p" data-group-id="3668707110-13">]</span><span class="p">,</span><span class="w"> </span><span class="ss">innovation_factor</span><span class="p" data-group-id="3668707110-11">}</span><span class="p" data-group-id="3668707110-10">)</span><span class="p">.</span><span class="w">
</span><span class="p">-</span><span class="na">record</span><span class="p" data-group-id="3668707110-14">(</span><span class="ss">constraint</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3668707110-15">{</span><span class="ss">morphology</span><span class="o">=</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="ss">neural_afs</span><span class="o">=</span><span class="p" data-group-id="3668707110-16">[</span><span class="ss">tanh</span><span class="p">,</span><span class="w"> </span><span class="ss">cos</span><span class="p">,</span><span class="w"> </span><span class="ss">gauss</span><span class="p">,</span><span class="w"> </span><span class="nb">abs</span><span class="p" data-group-id="3668707110-16">]</span><span class="p" data-group-id="3668707110-15">}</span><span class="p" data-group-id="3668707110-14">)</span><span class="p">.</span></code></pre><p>These records support evolutionary/genetic algorithm capabilities:</p><ul><li><strong>agent</strong>: Individual neural network in a population with evolutionary history</li><li><strong>specie</strong>: Group of similar agents sharing a fingerprint</li><li><strong>population</strong>: Collection of species being evolved</li><li><strong>constraint</strong>: Evolutionary constraints (morphology type, available activation functions)</li></ul><h2 id="neural-network-mathematics" class="section-heading"><a href="#neural-network-mathematics" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Neural Network Mathematics</span></h2><h3 id="dot-product" class="section-heading"><a href="#dot-product" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Dot Product</span></h3><p>The dot product is used in neurons to compute the weighted sum of inputs:</p><pre><code class="makeup erlang" translate="no"><span class="nf">dot</span><span class="p" data-group-id="5645458947-1">(</span><span class="p" data-group-id="5645458947-2">[</span><span class="n">I</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">Input</span><span class="p" data-group-id="5645458947-2">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5645458947-3">[</span><span class="n">W</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">Weights</span><span class="p" data-group-id="5645458947-3">]</span><span class="p">,</span><span class="w"> </span><span class="n">Acc</span><span class="p" data-group-id="5645458947-1">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="nf">dot</span><span class="p" data-group-id="5645458947-4">(</span><span class="n">Input</span><span class="p">,</span><span class="w"> </span><span class="n">Weights</span><span class="p">,</span><span class="w"> </span><span class="n">I</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">W</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">Acc</span><span class="p" data-group-id="5645458947-4">)</span><span class="p">;</span><span class="w">
</span><span class="nf">dot</span><span class="p" data-group-id="5645458947-5">(</span><span class="p" data-group-id="5645458947-6">[</span><span class="p" data-group-id="5645458947-6">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5645458947-7">[</span><span class="p" data-group-id="5645458947-7">]</span><span class="p">,</span><span class="w"> </span><span class="n">Acc</span><span class="p" data-group-id="5645458947-5">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="n">Acc</span><span class="p">.</span></code></pre><p>This operation:</p><ul><li>Multiplies each input by its corresponding weight</li><li>Sums all products</li><li>Determines neuron activation strength</li></ul><h3 id="activation-function-tanh" class="section-heading"><a href="#activation-function-tanh" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Activation Function (tanh)</span></h3><p>The network uses hyperbolic tangent (tanh) as its activation function:</p><pre><code class="makeup erlang" translate="no"><span class="nf">tanh</span><span class="p" data-group-id="8498980663-1">(</span><span class="n">Val</span><span class="p" data-group-id="8498980663-1">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="nc">math</span><span class="p">:</span><span class="nf">tanh</span><span class="p" data-group-id="8498980663-2">(</span><span class="n">Val</span><span class="p" data-group-id="8498980663-2">)</span><span class="p">.</span></code></pre><p>Key properties:</p><ul><li>Bounds output between -1 and 1</li><li>Non-linear transformation</li><li>Smooth gradient</li><li>Zero-centered output</li></ul><p>Benefits for neural networks:</p><ol><li>Prevents numerical overflow</li><li>Allows for negative outputs</li><li>Strong gradients near zero</li><li>Smooth activation curves</li></ol><h2 id="detailed-component-descriptions" class="section-heading"><a href="#detailed-component-descriptions" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Detailed Component Descriptions</span></h2><h3 id="exoself-exoself-erl" class="section-heading"><a href="#exoself-exoself-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">ExoSelf (exoself.erl)</span></h3><p>The ExoSelf process is the top-level orchestrator responsible for:</p><ol><li><strong>Genotype Loading</strong>: Reads network configuration from ETS table files</li><li><strong>Process Spawning</strong>: Creates all cerebral units (cortex, sensors, neurons, actuators) and scapes</li><li><strong>Connection Mapping</strong>: Establishes IdsNPIds ETS table mapping element IDs to PIDs</li><li><strong>Process Linking</strong>: Sends initialization messages with connection information</li><li><strong>Training Loop</strong>: Implements perturbation-based learning:<ul><li>Perturbs random subset of neuron weights (probability = 1/sqrt(total_neurons))</li><li>Backs up weights when fitness improves</li><li>Restores weights when fitness degrades</li><li>Terminates after MAX_ATTEMPTS (50) consecutive failures</li></ul></li><li><strong>Genotype Persistence</strong>: Saves trained weights back to genotype file</li><li><strong>Result Reporting</strong>: Communicates final fitness/statistics to trainer process</li></ol><h3 id="cortex-cortex-erl" class="section-heading"><a href="#cortex-cortex-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Cortex (cortex.erl)</span></h3><p>The Cortex orchestrates the synchronous operation of the neural network:</p><ul><li><strong>Cycle Management</strong>: Triggers sensors to begin each evaluation cycle</li><li><strong>Synchronization</strong>: Collects sync messages from all actuators before starting next cycle</li><li><strong>Fitness Accumulation</strong>: Aggregates fitness scores from actuators</li><li><strong>Evaluation Completion</strong>: Detects end of evaluation (via EndFlag) and reports to ExoSelf</li><li><strong>State Transitions</strong>: Switches between active (running) and inactive (waiting for reactivation) states</li><li><strong>Timing</strong>: Tracks cycle count and execution time for performance metrics</li></ul><h3 id="scapes-scape-erl" class="section-heading"><a href="#scapes-scape-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Scapes (scape.erl)</span></h3><p>Scapes implement the problem environments:</p><ul><li><strong>XOR Simulator</strong> (<code class="inline">xor_sim/1</code>): Provides XOR training data<ul><li>Cycles through 4 XOR cases: <code class="inline">[{[-1,-1],[-1]}, {[1,-1],[1]}, {[-1,1],[1]}, {[1,1],[-1]}]</code></li><li>Calculates Mean Squared Error (MSE) between network output and target</li><li>Returns fitness as <code class="inline">1/(MSE + 0.00001)</code> after completing all 4 cases</li></ul></li><li><strong>Protocol</strong>: Responds to <code class="inline">{sense}</code> messages with percepts, receives <code class="inline">{action, Output}</code> messages</li><li><strong>Scope</strong>: Can be private (spawned per network) or public (shared across networks)</li></ul><h3 id="sensors-sensor-erl" class="section-heading"><a href="#sensors-sensor-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Sensors (sensor.erl)</span></h3><p>Sensors generate or retrieve input data:</p><ul><li><strong>Scape Communication</strong>: Sends <code class="inline">{sense}</code> message and receives <code class="inline">{percept, Vector}</code> response</li><li><strong>Data Forwarding</strong>: Broadcasts sensory vector to all connected neurons (fanout)</li><li><strong>Sensor Types</strong>:<ul><li><code class="inline">xor_GetInput/2</code>: Retrieves input from XOR scape</li><li><code class="inline">rng/1</code>: Generates random numbers (for testing)</li></ul></li><li><strong>Synchronization</strong>: Triggered by cortex <code class="inline">{sync}</code> messages</li></ul><h3 id="neurons-neuron-erl" class="section-heading"><a href="#neurons-neuron-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Neurons (neuron.erl)</span></h3><p>Neurons perform the core neural computation:</p><ul><li><strong>Weighted Sum</strong>: Computes dot product of inputs and weights</li><li><strong>Activation</strong>: Applies tanh activation function</li><li><strong>Weight Management</strong>:<ul><li><code class="inline">weight_backup</code>: Stores current weights in process dictionary</li><li><code class="inline">weight_restore</code>: Reverts to backed up weights</li><li><code class="inline">weight_perturb</code>: Randomly perturbs weights (probability = 1/sqrt(total_weights))</li></ul></li><li><strong>Saturation</strong>: Limits weight values to ±2π range</li><li><strong>Delta Multiplier</strong>: Uses 2π for perturbation magnitude</li></ul><h3 id="actuators-actuator-erl" class="section-heading"><a href="#actuators-actuator-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Actuators (actuator.erl)</span></h3><p>Actuators collect network outputs and interact with scapes:</p><ul><li><strong>Output Collection</strong>: Gathers outputs from all connected neurons (fanin)</li><li><strong>Scape Interaction</strong>: Sends <code class="inline">{action, Output}</code> to scape, receives <code class="inline">{Fitness, HaltFlag}</code></li><li><strong>Fitness Reporting</strong>: Forwards fitness and halt flag to cortex</li><li><strong>Actuator Types</strong>:<ul><li><code class="inline">xor_SendOutput/2</code>: Sends output to XOR scape and gets fitness</li><li><code class="inline">pts/2</code>: Prints result to screen (for debugging)</li></ul></li></ul><h3 id="platform-platform-erl" class="section-heading"><a href="#platform-platform-erl" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Platform (platform.erl)</span></h3><p>The Platform module is a gen_server that manages shared infrastructure:</p><ul><li><strong>Scape Management</strong>: Hosts public scapes that can be shared across multiple networks</li><li><strong>Module Supervision</strong>: Starts and stops supervised modules</li><li><strong>Mnesia Integration</strong>: Initializes and manages Mnesia database for evolutionary algorithms</li><li><strong>Database Schema</strong>: Creates tables for populations, species, agents, and neural components</li><li><strong>Utility Functions</strong>:<ul><li><code class="inline">platform:sync()</code>: Recompiles all modules using <code class="inline">make:all([load])</code></li><li><code class="inline">platform:create()</code>: Creates Mnesia schema and tables</li><li><code class="inline">platform:reset()</code>: Deletes and recreates Mnesia schema</li><li><code class="inline">platform:start()</code>: Starts the platform gen_server</li><li><code class="inline">platform:stop()</code>: Gracefully stops the platform</li></ul></li></ul><p><strong>Note</strong>: Currently configured with empty module and scape lists. Designed for future evolutionary algorithm support with persistent storage in Mnesia.</p><h2 id="documentation" class="section-heading"><a href="#documentation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Documentation</span></h2><p><strong>Full API documentation</strong> is available via ExDoc. To generate and view:</p><pre><code class="makeup bash" translate="no"><span class=""># Generate documentation
</span><span class="">rebar3 ex_doc
</span><span class="">
</span><span class=""># Open in browser (macOS)
</span><span class="">open doc/readme.html
</span><span class="">
</span><span class=""># Or navigate to doc/readme.html in your browser
</span></code></pre><p>The documentation includes:</p><ul><li><strong>Module documentation</strong> with detailed descriptions</li><li><strong>Function specifications</strong> with types and examples</li><li><strong>Type definitions</strong> for all records and custom types</li><li><strong>Interactive search</strong> and navigation</li><li><strong>Mermaid diagrams</strong> for architecture visualization</li></ul><h2 id="getting-started" class="section-heading"><a href="#getting-started" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Getting Started</span></h2><h3 id="prerequisites" class="section-heading"><a href="#prerequisites" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Prerequisites</span></h3><ul><li><strong>Erlang/OTP 26+</strong> - Required for running the neural network</li><li><strong>Rebar3</strong> - Build tool and dependency manager</li></ul><h3 id="installation" class="section-heading"><a href="#installation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Installation</span></h3><pre><code class="makeup bash" translate="no"><span class=""># Clone the repository
</span><span class="">git clone https://github.com/yourusername/NN.git
</span><span class="">cd NN
</span><span class="">
</span><span class=""># Compile the project
</span><span class="">rebar3 compile
</span><span class="">
</span><span class=""># Generate documentation (optional)
</span><span class="">rebar3 ex_doc
</span></code></pre><h3 id="quick-start" class="section-heading"><a href="#quick-start" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Quick Start</span></h3><pre><code class="makeup bash" translate="no"><span class=""># Start an Erlang shell with the compiled project
</span><span class="">rebar3 shell
</span></code></pre><pre><code class="makeup erlang" translate="no"><span class="c1">% Create a neural network for XOR problem with 3 hidden neurons</span><span class="gp unselectable">
1> </span><span class="nc">genotype</span><span class="p">:</span><span class="nf">construct</span><span class="p" data-group-id="2940711314-1">(</span><span class="ss">my_network</span><span class="p">,</span><span class="w"> </span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2940711314-2">[</span><span class="mi">3</span><span class="p" data-group-id="2940711314-2">]</span><span class="p" data-group-id="2940711314-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Train the network (runs until convergence or max attempts)</span><span class="gp unselectable">
2> </span><span class="nc">exoself</span><span class="p">:</span><span class="nf">map</span><span class="p" data-group-id="2940711314-3">(</span><span class="ss">my_network</span><span class="p" data-group-id="2940711314-3">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% The trained network is automatically saved to 'my_network' file</span></code></pre><h2 id="usage" class="section-heading"><a href="#usage" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Usage</span></h2><h3 id="creating-a-network" class="section-heading"><a href="#creating-a-network" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Creating a Network</span></h3><p>Create a network genotype (blueprint) with custom topology:</p><pre><code class="makeup erlang" translate="no"><span class="c1">% Basic: One hidden layer with 3 neurons</span><span class="w">
</span><span class="nc">genotype</span><span class="p">:</span><span class="nf">construct</span><span class="p" data-group-id="7545135262-1">(</span><span class="ss">my_network</span><span class="p">,</span><span class="w"> </span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7545135262-2">[</span><span class="mi">3</span><span class="p" data-group-id="7545135262-2">]</span><span class="p" data-group-id="7545135262-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Advanced: Two hidden layers with 5 and 3 neurons</span><span class="w">
</span><span class="nc">genotype</span><span class="p">:</span><span class="nf">construct</span><span class="p" data-group-id="7545135262-3">(</span><span class="ss">deep_network</span><span class="p">,</span><span class="w"> </span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7545135262-4">[</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p" data-group-id="7545135262-4">]</span><span class="p" data-group-id="7545135262-3">)</span><span class="p">.</span></code></pre><p><strong>Parameters:</strong></p><ul><li><code class="inline">my_network</code> - Filename for saving the genotype</li><li><code class="inline">xor_mimic</code> - Morphology (problem domain configuration)</li><li><code class="inline">[3]</code> or <code class="inline">[5, 3]</code> - Hidden layer sizes (number of neurons per layer)</li></ul><h3 id="training-a-network" class="section-heading"><a href="#training-a-network" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Training a Network</span></h3><h4>Simple Training (Single Run)</h4><pre><code class="makeup erlang" translate="no"><span class="c1">% Create and train in one go</span><span class="w">
</span><span class="nc">exoself</span><span class="p">:</span><span class="nf">map</span><span class="p" data-group-id="6979061549-1">(</span><span class="ss">my_network</span><span class="p" data-group-id="6979061549-1">)</span><span class="p">.</span></code></pre><p><strong>What happens:</strong></p><ol><li>Loads genotype from file</li><li>Spawns all neural processes (cortex, sensors, neurons, actuators, scapes)</li><li>Runs perturbation-based training (up to 50 attempts)</li><li>Saves improved weights back to genotype file</li><li>Prints final fitness and statistics</li></ol><h4>Advanced Training with Trainer</h4><pre><code class="makeup erlang" translate="no"><span class="c1">% Basic training (5 attempts, infinite eval limit, infinite fitness target)</span><span class="w">
</span><span class="nc">trainer</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="2554186486-1">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2554186486-2">[</span><span class="mi">2</span><span class="p" data-group-id="2554186486-2">]</span><span class="p" data-group-id="2554186486-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Training with custom parameters</span><span class="w">
</span><span class="n">MaxAttempts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w">
</span><span class="n">EvalLimit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1000</span><span class="p">,</span><span class="w">
</span><span class="n">FitnessTarget</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.9</span><span class="p">,</span><span class="w">
</span><span class="nc">trainer</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="2554186486-3">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2554186486-4">[</span><span class="mi">2</span><span class="p" data-group-id="2554186486-4">]</span><span class="p">,</span><span class="w"> </span><span class="n">MaxAttempts</span><span class="p">,</span><span class="w"> </span><span class="n">EvalLimit</span><span class="p">,</span><span class="w"> </span><span class="n">FitnessTarget</span><span class="p" data-group-id="2554186486-3">)</span><span class="p">.</span></code></pre><p>The trainer will:</p><ul><li>Create a new genotype for each training run</li><li>Run until MaxAttempts, EvalLimit, or FitnessTarget is reached</li><li>Save the best genotype to a file (e.g., <code class="inline">best_12345</code>)</li><li>Print the final results</li></ul><h3 id="running-benchmarks" class="section-heading"><a href="#running-benchmarks" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Running Benchmarks</span></h3><pre><code class="makeup erlang" translate="no"><span class="c1">% Run 100 training sessions and collect statistics</span><span class="w">
</span><span class="nc">benchmarker</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="0175479514-1">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="0175479514-2">[</span><span class="mi">2</span><span class="p" data-group-id="0175479514-2">]</span><span class="p" data-group-id="0175479514-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Custom number of runs</span><span class="w">
</span><span class="nc">benchmarker</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="0175479514-3">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="0175479514-4">[</span><span class="mi">2</span><span class="p" data-group-id="0175479514-4">]</span><span class="p">,</span><span class="w"> </span><span class="mi">50</span><span class="p" data-group-id="0175479514-3">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Full control over all parameters</span><span class="w">
</span><span class="nc">benchmarker</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="0175479514-5">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="0175479514-6">[</span><span class="mi">2</span><span class="p" data-group-id="0175479514-6">]</span><span class="p">,</span><span class="w"> </span><span class="n">MaxAttempts</span><span class="p">,</span><span class="w"> </span><span class="n">EvalLimit</span><span class="p">,</span><span class="w"> </span><span class="n">FitnessTarget</span><span class="p">,</span><span class="w"> </span><span class="n">TotRuns</span><span class="p" data-group-id="0175479514-5">)</span><span class="p">.</span></code></pre><p>Benchmark output includes:</p><ul><li>Fitness: Max, Min, Avg, Std</li><li>Evaluations: Max, Min, Avg, Std</li><li>Cycles: Max, Min, Avg, Std</li><li>Time: Max, Min, Avg, Std</li></ul><h2 id="development-commands" class="section-heading"><a href="#development-commands" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Development Commands</span></h2><h3 id="building-and-testing" class="section-heading"><a href="#building-and-testing" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Building and Testing</span></h3><pre><code class="makeup bash" translate="no"><span class=""># Compile the project
</span><span class="">rebar3 compile
</span><span class="">
</span><span class=""># Start interactive shell with compiled modules
</span><span class="">rebar3 shell
</span><span class="">
</span><span class=""># Clean build artifacts
</span><span class="">rebar3 clean
</span><span class="">
</span><span class=""># Generate documentation
</span><span class="">rebar3 ex_doc
</span><span class="">
</span><span class=""># Open documentation in browser (macOS)
</span><span class="">open doc/readme.html
</span></code></pre><h3 id="alternative-manual-compilation-without-rebar3" class="section-heading"><a href="#alternative-manual-compilation-without-rebar3" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Alternative: Manual Compilation (without rebar3)</span></h3><p>If you prefer to work directly in the Erlang shell:</p><pre><code class="makeup erlang" translate="no"><span class="c1">% Start Erlang shell</span><span class="w">
</span><span class="ss">erl</span><span class="w">
</span><span class="c1">% Compile all modules</span><span class="gp unselectable">
1> </span><span class="nc">make</span><span class="p">:</span><span class="nf">all</span><span class="p" data-group-id="6636737502-1">(</span><span class="p" data-group-id="6636737502-2">[</span><span class="ss">load</span><span class="p" data-group-id="6636737502-2">]</span><span class="p" data-group-id="6636737502-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Or compile individual modules</span><span class="gp unselectable">
2> </span><span class="nf">c</span><span class="p" data-group-id="6636737502-3">(</span><span class="ss">genotype</span><span class="p" data-group-id="6636737502-3">)</span><span class="p">.</span><span class="gp unselectable">
3> </span><span class="nf">c</span><span class="p" data-group-id="6636737502-4">(</span><span class="ss">neuron</span><span class="p" data-group-id="6636737502-4">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Recompile changed modules (via platform)</span><span class="gp unselectable">
4> </span><span class="nc">platform</span><span class="p">:</span><span class="nf">sync</span><span class="p" data-group-id="6636737502-5">(</span><span class="p" data-group-id="6636737502-5">)</span><span class="p">.</span></code></pre><h2 id="network-flow" class="section-heading"><a href="#network-flow" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Network Flow</span></h2><h3 id="1-initialization-phase" class="section-heading"><a href="#1-initialization-phase" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">1. Initialization Phase</span></h3><ul><li>ExoSelf loads genotype from ETS file</li><li>Spawns scape processes for environment simulation</li><li>Spawns cortex, sensors, neurons, and actuators</li><li>Creates IdsNPIds mapping table (ID ↔ PID)</li><li>Links all processes by sending initialization messages with connection info</li></ul><h3 id="2-evaluation-cycle" class="section-heading"><a href="#2-evaluation-cycle" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">2. Evaluation Cycle</span></h3><ul><li><strong>Cortex</strong> sends <code class="inline">{sync}</code> to all sensors</li><li><strong>Sensors</strong> request percepts from scapes, forward to neurons</li><li><strong>Neurons</strong> compute weighted sum + tanh activation, forward to next layer</li><li><strong>Actuators</strong> collect outputs, send to scape, receive fitness</li><li><strong>Actuators</strong> send <code class="inline">{sync, Fitness, HaltFlag}</code> to cortex</li><li><strong>Cortex</strong> accumulates fitness, checks for evaluation completion</li></ul><h3 id="3-learning-phase-perturbation-based" class="section-heading"><a href="#3-learning-phase-perturbation-based" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">3. Learning Phase (Perturbation-Based)</span></h3><ul><li><strong>ExoSelf</strong> receives evaluation results from cortex</li><li>If fitness improved:<ul><li>Send <code class="inline">{weight_backup}</code> to all neurons → saves current weights</li><li>Reset attempt counter</li></ul></li><li>If fitness degraded:<ul><li>Send <code class="inline">{weight_restore}</code> to perturbed neurons → revert to backup</li><li>Increment attempt counter</li></ul></li><li>Select random neuron subset (probability = 1/sqrt(N))</li><li>Send <code class="inline">{weight_perturb}</code> to selected neurons</li><li>Send <code class="inline">{reactivate}</code> to cortex to start next evaluation</li></ul><h3 id="4-termination" class="section-heading"><a href="#4-termination" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">4. Termination</span></h3><ul><li>After MAX_ATTEMPTS (50) consecutive failures, training ends</li><li>ExoSelf collects final weights from neurons</li><li>Updates genotype and saves to file</li><li>Sends results to trainer process (if registered)</li><li>All processes receive <code class="inline">{terminate}</code> messages and shut down</li></ul><h2 id="implementation-details" class="section-heading"><a href="#implementation-details" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Implementation Details</span></h2><h3 id="concurrency-model" class="section-heading"><a href="#concurrency-model" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Concurrency Model</span></h3><ul><li>Each component (cortex, sensor, neuron, actuator, scape) runs as a separate Erlang process</li><li>Communication exclusively via asynchronous message passing</li><li>ExoSelf manages the phenotype lifecycle without OTP supervision trees</li><li>Processes use receive loops to handle messages</li><li>IdsNPIds ETS table provides O(1) ID-to-PID and PID-to-ID lookups</li></ul><h3 id="data-persistence-genotype-phenotype-separation" class="section-heading"><a href="#data-persistence-genotype-phenotype-separation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Data Persistence (Genotype/Phenotype Separation)</span></h3><ul><li><strong>Genotype</strong>: Static network blueprint stored in ETS table files<ul><li>Contains structure (connectivity), initial weights, morphology</li><li>Created by <a href="genotype.html#construct/3"><code class="inline">genotype:construct/3</code></a></li><li>Updated with trained weights after successful training</li><li>Loaded via <a href="genotype.html#load_from_file/1"><code class="inline">genotype:load_from_file/1</code></a></li></ul></li><li><strong>Phenotype</strong>: Running network of concurrent processes<ul><li>Spawned from genotype by <a href="exoself.html#map/1"><code class="inline">exoself:map/1</code></a></li><li>Lives only during training/evaluation</li><li>Neurons maintain current weights and backup weights in memory</li><li>Terminated after training; weights persisted back to genotype</li></ul></li></ul><h3 id="process-spawning-pattern" class="section-heading"><a href="#process-spawning-pattern" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Process Spawning Pattern</span></h3><p>All processes follow a common spawning pattern:</p><pre><code class="makeup erlang" translate="no"><span class="nf">gen</span><span class="p" data-group-id="7646502502-1">(</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="n">Node</span><span class="p" data-group-id="7646502502-1">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="nf">spawn</span><span class="p" data-group-id="7646502502-2">(</span><span class="n">Node</span><span class="p">,</span><span class="w"> </span><span class="o">?</span><span class="n">MODULE</span><span class="p">,</span><span class="w"> </span><span class="ss">prep</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7646502502-3">[</span><span class="n">ExoSelf_PId</span><span class="p" data-group-id="7646502502-3">]</span><span class="p" data-group-id="7646502502-2">)</span><span class="p">.</span><span class="w">
</span><span class="nf">prep</span><span class="p" data-group-id="7646502502-4">(</span><span class="n">ExoSelf_PId</span><span class="p" data-group-id="7646502502-4">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="k">receive</span><span class="w">
</span><span class="p" data-group-id="7646502502-5">{</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="n">InitData</span><span class="p" data-group-id="7646502502-5">}</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="nf">loop</span><span class="p" data-group-id="7646502502-6">(</span><span class="n">InitData</span><span class="p" data-group-id="7646502502-6">)</span><span class="w">
</span><span class="k">end</span><span class="p">.</span></code></pre><p>This allows distributed deployment and clean initialization.</p><h3 id="weight-perturbation-algorithm" class="section-heading"><a href="#weight-perturbation-algorithm" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Weight Perturbation Algorithm</span></h3><p>Neurons use a random perturbation strategy:</p><ul><li>Perturbation probability per weight: <code class="inline">MP = 1/sqrt(TotalWeights)</code></li><li>Perturbation magnitude: <code class="inline">(rand:uniform() - 0.5) * 2π</code></li><li>Weights saturated to range <code class="inline">[-2π, 2π]</code></li><li>Same perturbation applied to bias weights</li></ul><h3 id="morphology-system" class="section-heading"><a href="#morphology-system" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Morphology System</span></h3><p>Morphologies define problem-specific interfaces:</p><ul><li><code class="inline">morphology:Morphology(sensors)</code> returns sensor specifications</li><li><code class="inline">morphology:Morphology(actuators)</code> returns actuator specifications</li><li>Each sensor/actuator specifies its scape (environment)</li><li>Currently implemented: <code class="inline">xor_mimic</code> for XOR problem</li></ul><h3 id="scape-protocol" class="section-heading"><a href="#scape-protocol" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Scape Protocol</span></h3><p>Scapes must implement:</p><ul><li><code class="inline">{ScapePId, sense}</code> → respond with <code class="inline">{ScapePId, percept, Vector}</code></li><li><code class="inline">{ActuatorPId, action, Output}</code> → respond with <code class="inline">{ScapePId, Fitness, HaltFlag}</code></li><li><code class="inline">{ExoSelfPId, terminate}</code> → cleanup and terminate</li></ul><p>HaltFlag = 1 signals evaluation complete; 0 means continue.</p><h2 id="resources" class="section-heading"><a href="#resources" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Resources</span></h2><p>For learning more about Erlang/OTP and neural networks:</p><ul><li><a href="https://learnyousomeerlang.com/">Learn You Some Erlang</a> - Excellent Erlang tutorial</li><li><a href="https://www.erlang.org/docs">Erlang Documentation</a> - Official documentation</li><li><a href="https://erlang.org/download/armstrong_thesis_2003.pdf">Making reliable distributed systems in the presence of software errors</a> - Joe Armstrong's thesis on Erlang</li></ul><h2 id="example-sessions" class="section-heading"><a href="#example-sessions" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Example Sessions</span></h2><h3 id="basic-network-creation-and-training" class="section-heading"><a href="#basic-network-creation-and-training" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Basic Network Creation and Training</span></h3><pre><code class="makeup erlang" translate="no"><span class="n">Eshell</span><span class="w"> </span><span class="n">V14</span><span class="p">.</span><span class="mf">1.1</span><span class="w">
</span><span class="c1">% Compile all modules</span><span class="gp unselectable">
1> </span><span class="nc">make</span><span class="p">:</span><span class="nf">all</span><span class="p" data-group-id="2636794330-1">(</span><span class="p" data-group-id="2636794330-2">[</span><span class="ss">load</span><span class="p" data-group-id="2636794330-2">]</span><span class="p" data-group-id="2636794330-1">)</span><span class="p">.</span><span class="w">
</span><span class="c1">% Create a genotype for XOR problem with 2 hidden neurons</span><span class="gp unselectable">
2> </span><span class="nc">genotype</span><span class="p">:</span><span class="nf">construct</span><span class="p" data-group-id="2636794330-3">(</span><span class="ss">test_nn_genotype</span><span class="p">,</span><span class="w"> </span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2636794330-4">[</span><span class="mi">2</span><span class="p" data-group-id="2636794330-4">]</span><span class="p" data-group-id="2636794330-3">)</span><span class="p">.</span><span class="w">
</span><span class="ss">ok</span><span class="w">
</span><span class="c1">% Print the genotype structure</span><span class="gp unselectable">
3> </span><span class="nc">genotype</span><span class="p">:</span><span class="nf">print</span><span class="p" data-group-id="2636794330-5">(</span><span class="ss">test_nn_genotype</span><span class="p" data-group-id="2636794330-5">)</span><span class="p">.</span><span class="w">
</span><span class="p" data-group-id="2636794330-6">{</span><span class="ss">cortex</span><span class="p">,</span><span class="ss">cortex</span><span class="p">,</span><span class="p" data-group-id="2636794330-7">[</span><span class="p" data-group-id="2636794330-8">{</span><span class="ss">sensor</span><span class="p">,</span><span class="p" data-group-id="2636794330-9">{</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span><span class="mf">1.234</span><span class="p" data-group-id="2636794330-9">}</span><span class="p" data-group-id="2636794330-8">}</span><span class="p" data-group-id="2636794330-7">]</span><span class="p">,</span><span class="p" data-group-id="2636794330-10">[</span><span class="p" data-group-id="2636794330-11">{</span><span class="ss">actuator</span><span class="p">,</span><span class="p" data-group-id="2636794330-12">{</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span><span class="mf">5.678</span><span class="p" data-group-id="2636794330-12">}</span><span class="p" data-group-id="2636794330-11">}</span><span class="p" data-group-id="2636794330-10">]</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="2636794330-13">[</span><span class="p" data-group-id="2636794330-14">{</span><span class="ss">neuron</span><span class="p">,</span><span class="p" data-group-id="2636794330-15">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p" data-group-id="2636794330-15">}</span><span class="p" data-group-id="2636794330-14">}</span><span class="p">,</span><span class="p" data-group-id="2636794330-16">{</span><span class="ss">neuron</span><span class="p">,</span><span class="p" data-group-id="2636794330-17">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p" data-group-id="2636794330-17">}</span><span class="p" data-group-id="2636794330-16">}</span><span class="p">,</span><span class="p" data-group-id="2636794330-18">{</span><span class="ss">neuron</span><span class="p">,</span><span class="p" data-group-id="2636794330-19">{</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p" data-group-id="2636794330-19">}</span><span class="p" data-group-id="2636794330-18">}</span><span class="p" data-group-id="2636794330-13">]</span><span class="p" data-group-id="2636794330-6">}</span><span class="w">
</span><span class="p" data-group-id="2636794330-20">{</span><span class="ss">sensor</span><span class="p">,</span><span class="p" data-group-id="2636794330-21">{</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span><span class="mf">1.234</span><span class="p" data-group-id="2636794330-21">}</span><span class="p">,</span><span class="ss">cortex</span><span class="p">,</span><span class="ss">xor_GetInput</span><span class="p">,</span><span class="p" data-group-id="2636794330-22">{</span><span class="ss">private</span><span class="p">,</span><span class="ss">xor_sim</span><span class="p" data-group-id="2636794330-22">}</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="2636794330-23">[</span><span class="p" data-group-id="2636794330-24">{</span><span class="ss">neuron</span><span class="p">,</span><span class="p" data-group-id="2636794330-25">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p" data-group-id="2636794330-25">}</span><span class="p" data-group-id="2636794330-24">}</span><span class="p">,</span><span class="p" data-group-id="2636794330-26">{</span><span class="ss">neuron</span><span class="p">,</span><span class="p" data-group-id="2636794330-27">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p" data-group-id="2636794330-27">}</span><span class="p" data-group-id="2636794330-26">}</span><span class="p" data-group-id="2636794330-23">]</span><span class="p" data-group-id="2636794330-20">}</span><span class="w">
</span><span class="p">.</span><span class="p">.</span><span class="p">.</span><span class="w">
</span><span class="c1">% Train the network</span><span class="gp unselectable">
4> </span><span class="nc">exoself</span><span class="p">:</span><span class="nf">map</span><span class="p" data-group-id="2636794330-28">(</span><span class="ss">test_nn_genotype</span><span class="p" data-group-id="2636794330-28">)</span><span class="p">.</span><span class="w">
</span><span class="n">ExoSelf</span><span class="p">:</span><span class="w"> </span><span class="n">Starting</span><span class="w"> </span><span class="ss">prep</span><span class="w"> </span><span class="ss">for</span><span class="w"> </span><span class="ss">test_nn_genotype</span><span class="w">
</span><span class="n">Cortex</span><span class="p">:</span><span class="w"> </span><span class="n">Starting</span><span class="w"> </span><span class="ss">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="ss">sensors</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="ss">neurons</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="ss">actuators</span><span class="w">
</span><span class="n">Actuator</span><span class="w"> </span><span class="p" data-group-id="2636794330-29">{</span><span class="ss">actuator</span><span class="p">,</span><span class="p" data-group-id="2636794330-30">{</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span><span class="mf">5.678</span><span class="p" data-group-id="2636794330-30">}</span><span class="p" data-group-id="2636794330-29">}</span><span class="p">:</span><span class="w"> </span><span class="n">Got</span><span class="w"> </span><span class="ss">fitness</span><span class="w"> </span><span class="mf">12.5</span><span class="p">,</span><span class="w"> </span><span class="ss">endflag</span><span class="w"> </span><span class="mi">1</span><span class="w">
</span><span class="n">Cortex</span><span class="p">:</span><span class="o"><</span><span class="mf">0.95</span><span class="p">.</span><span class="mi">0</span><span class="o">></span><span class="w"> </span><span class="ss">finished</span><span class="w"> </span><span class="ss">training</span><span class="p">.</span><span class="w"> </span><span class="n">Genotype</span><span class="w"> </span><span class="ss">has</span><span class="w"> </span><span class="ss">been</span><span class="w"> </span><span class="ss">backed</span><span class="w"> </span><span class="ss">up</span><span class="p">.</span><span class="w">
</span><span class="n">Fitness</span><span class="p">:</span><span class="mf">156.78</span><span class="w">
</span><span class="n">TotEvaluations</span><span class="p">:</span><span class="mi">8</span><span class="w">
</span><span class="n">TotCycles</span><span class="p">:</span><span class="mi">32</span><span class="w">
</span><span class="n">TimeAcc</span><span class="p">:</span><span class="mi">45678</span><span class="w">
</span><span class="o"><</span><span class="mf">0.89</span><span class="p">.</span><span class="mi">0</span><span class="o">></span></code></pre><h3 id="running-a-benchmark" class="section-heading"><a href="#running-a-benchmark" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Running a Benchmark</span></h3><pre><code class="makeup erlang" translate="no"><span class="c1">% Run 10 training sessions to collect statistics</span><span class="gp unselectable">
5> </span><span class="nc">benchmarker</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="5135988066-1">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5135988066-2">[</span><span class="mi">2</span><span class="p" data-group-id="5135988066-2">]</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p" data-group-id="5135988066-1">)</span><span class="p">.</span><span class="w">
</span><span class="o"><</span><span class="mf">0.120</span><span class="p">.</span><span class="mi">0</span><span class="o">></span><span class="w">
</span><span class="n">Starting</span><span class="w"> </span><span class="ss">benchmark</span><span class="w"> </span><span class="ss">run</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="mi">10</span><span class="w">
</span><span class="n">Run</span><span class="w"> </span><span class="nc">complete</span><span class="p">:</span><span class="w"> </span><span class="n">Fitness</span><span class="o">=</span><span class="mf">145.67</span><span class="w"> </span><span class="n">Evals</span><span class="o">=</span><span class="mi">12</span><span class="w">
</span><span class="p">.</span><span class="p">.</span><span class="p">.</span><span class="w">
</span><span class="n">Benchmark</span><span class="w"> </span><span class="ss">results</span><span class="w"> </span><span class="nc">for</span><span class="p">:</span><span class="w"> </span><span class="ss">xor_mimic</span><span class="w">
</span><span class="n">Fitness</span><span class="p">:</span><span class="p">:</span><span class="w">
</span><span class="n">Max</span><span class="p">:</span><span class="mf">245.89</span><span class="w">
</span><span class="n">Min</span><span class="p">:</span><span class="mf">98.45</span><span class="w">
</span><span class="n">Avg</span><span class="p">:</span><span class="mf">156.23</span><span class="w">
</span><span class="n">Std</span><span class="p">:</span><span class="mf">34.56</span><span class="w">
</span><span class="n">Evals</span><span class="p">:</span><span class="p">:</span><span class="w">
</span><span class="n">Max</span><span class="p">:</span><span class="mi">25</span><span class="w">
</span><span class="n">Min</span><span class="p">:</span><span class="mi">5</span><span class="w">
</span><span class="n">Avg</span><span class="p">:</span><span class="mf">12.3</span><span class="w">
</span><span class="n">Std</span><span class="p">:</span><span class="mf">5.2</span><span class="w">
</span><span class="p">.</span><span class="p">.</span><span class="p">.</span></code></pre><h3 id="using-the-trainer" class="section-heading"><a href="#using-the-trainer" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Using the Trainer</span></h3><pre><code class="makeup erlang" translate="no"><span class="c1">% Train with custom limits</span><span class="gp unselectable">
6> </span><span class="nc">trainer</span><span class="p">:</span><span class="nf">go</span><span class="p" data-group-id="1361056344-1">(</span><span class="ss">xor_mimic</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1361056344-2">[</span><span class="mi">2</span><span class="p" data-group-id="1361056344-2">]</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w"> </span><span class="mf">200.0</span><span class="p" data-group-id="1361056344-1">)</span><span class="p">.</span><span class="w">
</span><span class="o"><</span><span class="mf">0.130</span><span class="p">.</span><span class="mi">0</span><span class="o">></span><span class="w">
</span><span class="c1">% Trainer will create unique genotype files like:</span><span class="w">
</span><span class="c1">% - experimental_123456 (working copy)</span><span class="w">
</span><span class="c1">% - best_123456 (best solution found)</span></code></pre><h2 id="key-concepts" class="section-heading"><a href="#key-concepts" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Key Concepts</span></h2><h3 id="genotype-vs-phenotype" class="section-heading"><a href="#genotype-vs-phenotype" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Genotype vs Phenotype</span></h3><ul><li><strong>Genotype</strong> = Blueprint (ETS table file with structure and weights)</li><li><strong>Phenotype</strong> = Running network (living processes doing computation)</li><li>Training happens in phenotype, results saved to genotype</li></ul><h3 id="perturbation-based-learning" class="section-heading"><a href="#perturbation-based-learning" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Perturbation-Based Learning</span></h3><p>Instead of backpropagation, this system uses evolutionary-style learning:</p><ol><li>Randomly tweak some weights</li><li>If performance improves → keep changes</li><li>If performance degrades → revert changes</li><li>Repeat until convergence or max attempts</li></ol><h3 id="message-passing-architecture" class="section-heading"><a href="#message-passing-architecture" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Message-Passing Architecture</span></h3><ul><li>No shared memory between components</li><li>All communication via Erlang messages</li><li>Natural parallelism and fault isolation</li><li>Supports distributed deployment across nodes</li></ul><h3 id="morphologies" class="section-heading"><a href="#morphologies" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Morphologies</span></h3><p>Define the "body" of the neural network:</p><ul><li>What sensors does it have? (inputs)</li><li>What actuators does it have? (outputs)</li><li>What scape (environment) does it interact with?</li></ul><h2 id="extending-the-system" class="section-heading"><a href="#extending-the-system" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Extending the System</span></h2><h3 id="adding-a-new-morphology" class="section-heading"><a href="#adding-a-new-morphology" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i></a><span class="text">Adding a New Morphology</span></h3><ol><li><p>Define sensors and actuators in <code class="inline">morphology.erl</code>:</p><pre><code class="makeup erlang" translate="no"><span class="nf">my_problem</span><span class="p" data-group-id="2852177929-1">(</span><span class="ss">sensors</span><span class="p" data-group-id="2852177929-1">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="p" data-group-id="2852177929-2">[</span><span class="o">#</span><span class="ss">sensor</span><span class="p" data-group-id="2852177929-3">{</span><span class="ss">id</span><span class="o">=</span><span class="p" data-group-id="2852177929-4">{</span><span class="ss">sensor</span><span class="p">,</span><span class="nc">helpers</span><span class="p">:</span><span class="nf">generate_id</span><span class="p" data-group-id="2852177929-5">(</span><span class="p" data-group-id="2852177929-5">)</span><span class="p" data-group-id="2852177929-4">}</span><span class="p">,</span><span class="w">
</span><span class="ss">name</span><span class="o">=</span><span class="ss">my_GetInput</span><span class="p">,</span><span class="w">
</span><span class="ss">scape</span><span class="o">=</span><span class="p" data-group-id="2852177929-6">{</span><span class="ss">private</span><span class="p">,</span><span class="ss">my_sim</span><span class="p" data-group-id="2852177929-6">}</span><span class="p">,</span><span class="w">
</span><span class="ss">vector_length</span><span class="o">=</span><span class="mi">4</span><span class="p" data-group-id="2852177929-3">}</span><span class="p" data-group-id="2852177929-2">]</span><span class="p">;</span><span class="w">
</span><span class="nf">my_problem</span><span class="p" data-group-id="2852177929-7">(</span><span class="ss">actuators</span><span class="p" data-group-id="2852177929-7">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="p" data-group-id="2852177929-8">[</span><span class="o">#</span><span class="ss">actuator</span><span class="p" data-group-id="2852177929-9">{</span><span class="ss">id</span><span class="o">=</span><span class="p" data-group-id="2852177929-10">{</span><span class="ss">actuator</span><span class="p">,</span><span class="nc">helpers</span><span class="p">:</span><span class="nf">generate_id</span><span class="p" data-group-id="2852177929-11">(</span><span class="p" data-group-id="2852177929-11">)</span><span class="p" data-group-id="2852177929-10">}</span><span class="p">,</span><span class="w">
</span><span class="ss">name</span><span class="o">=</span><span class="ss">my_SendOutput</span><span class="p">,</span><span class="w">
</span><span class="ss">scape</span><span class="o">=</span><span class="p" data-group-id="2852177929-12">{</span><span class="ss">private</span><span class="p">,</span><span class="ss">my_sim</span><span class="p" data-group-id="2852177929-12">}</span><span class="p">,</span><span class="w">
</span><span class="ss">vector_length</span><span class="o">=</span><span class="mi">2</span><span class="p" data-group-id="2852177929-9">}</span><span class="p" data-group-id="2852177929-8">]</span><span class="p">.</span></code></pre></li><li><p>Implement sensor/actuator functions in their respective modules</p></li><li><p>Implement scape in <code class="inline">scape.erl</code>:</p><pre><code class="makeup erlang" translate="no"><span class="nf">my_sim</span><span class="p" data-group-id="6295486795-1">(</span><span class="n">ExoSelf_PId</span><span class="p" data-group-id="6295486795-1">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="c1">% Initialize environment</span><span class="w">
</span><span class="nf">my_sim</span><span class="p" data-group-id="6295486795-2">(</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="n">InitialState</span><span class="p" data-group-id="6295486795-2">)</span><span class="p">.</span><span class="w">
</span><span class="nf">my_sim</span><span class="p" data-group-id="6295486795-3">(</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="n">State</span><span class="p" data-group-id="6295486795-3">)</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="k">receive</span><span class="w">
</span><span class="p" data-group-id="6295486795-4">{</span><span class="n">From</span><span class="p">,</span><span class="w"> </span><span class="ss">sense</span><span class="p" data-group-id="6295486795-4">}</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="n">From</span><span class="w"> </span><span class="o">!</span><span class="w"> </span><span class="p" data-group-id="6295486795-5">{</span><span class="nf">self</span><span class="p" data-group-id="6295486795-6">(</span><span class="p" data-group-id="6295486795-6">)</span><span class="p">,</span><span class="w"> </span><span class="ss">percept</span><span class="p">,</span><span class="w"> </span><span class="n">InputVector</span><span class="p" data-group-id="6295486795-5">}</span><span class="p">,</span><span class="w">
</span><span class="nf">my_sim</span><span class="p" data-group-id="6295486795-7">(</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="n">State</span><span class="p" data-group-id="6295486795-7">)</span><span class="p">;</span><span class="w">
</span><span class="p" data-group-id="6295486795-8">{</span><span class="n">From</span><span class="p">,</span><span class="w"> </span><span class="ss">action</span><span class="p">,</span><span class="w"> </span><span class="n">Output</span><span class="p" data-group-id="6295486795-8">}</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="n">Fitness</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">evaluate</span><span class="p" data-group-id="6295486795-9">(</span><span class="n">Output</span><span class="p">,</span><span class="w"> </span><span class="n">State</span><span class="p" data-group-id="6295486795-9">)</span><span class="p">,</span><span class="w">
</span><span class="n">HaltFlag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">check_done</span><span class="p" data-group-id="6295486795-10">(</span><span class="n">State</span><span class="p" data-group-id="6295486795-10">)</span><span class="p">,</span><span class="w">
</span><span class="n">From</span><span class="w"> </span><span class="o">!</span><span class="w"> </span><span class="p" data-group-id="6295486795-11">{</span><span class="nf">self</span><span class="p" data-group-id="6295486795-12">(</span><span class="p" data-group-id="6295486795-12">)</span><span class="p">,</span><span class="w"> </span><span class="n">Fitness</span><span class="p">,</span><span class="w"> </span><span class="n">HaltFlag</span><span class="p" data-group-id="6295486795-11">}</span><span class="p">,</span><span class="w">
</span><span class="nf">my_sim</span><span class="p" data-group-id="6295486795-13">(</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="nf">update_state</span><span class="p" data-group-id="6295486795-14">(</span><span class="n">State</span><span class="p" data-group-id="6295486795-14">)</span><span class="p" data-group-id="6295486795-13">)</span><span class="p">;</span><span class="w">
</span><span class="p" data-group-id="6295486795-15">{</span><span class="n">ExoSelf_PId</span><span class="p">,</span><span class="w"> </span><span class="ss">terminate</span><span class="p" data-group-id="6295486795-15">}</span><span class="w"> </span><span class="p">-></span><span class="w">
</span><span class="ss">ok</span><span class="w">
</span><span class="k">end</span><span class="p">.</span></code></pre></li></ol>
</div>
<div class="bottom-actions" id="bottom-actions">
<div class="bottom-actions-item">
</div>
<div class="bottom-actions-item">
<a href="claude.html" class="bottom-actions-button" rel="next">
<span class="subheader">
Next Page →
</span>
<span class="title">
CLAUDE.md
</span>
</a>
</div>
</div>
<footer class="footer">
<p>
<span class="line">
<a href="https://hex.pm/packages/nn/1.0.0" class="footer-hex-package">Hex Package</a>
<a href="https://preview.hex.pm/preview/nn/1.0.0">Hex Preview</a>
(<a href="https://preview.hex.pm/preview/nn/1.0.0/show/README.md">current file</a>)
</span>
<span class="line">
<button class="a-main footer-button display-quick-switch" title="Search HexDocs packages">
Search HexDocs
</button>
<a href="nn.epub" title="ePub version">
Download ePub version
</a>
</span>
</p>
<p class="built-using">
Built using
<a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener" translate="no">ExDoc</a> (v0.38.2) for the
<a href="https://erlang.org" title="Erlang" target="_blank" translate="no">Erlang programming language</a>
</p>
</footer>
</div>
</main>
</div>
</body>
</html>