-
Notifications
You must be signed in to change notification settings - Fork 0
/
cortex.erl
46 lines (42 loc) · 2.84 KB
/
cortex.erl
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
-module(cortex).
-compile(export_all).
-include("records.hrl").
gen(ExoSelf_PId,Node) ->
spawn(Node,?MODULE,loop,[ExoSelf_PId]).
loop(ExoSelf_PId) ->
receive
{ExoSelf_PId,{Id,SPIds,APIds,NPIds},TotSteps} ->
[SPId ! {self(),sync} || SPId <- SPIds ],
loop(Id,ExoSelf_PId,SPIds,{APIds,APIds},NPIds,TotSteps)
end.
%The gen/2 function spawns the cortex element, which immediately starts to wait for the state message from the same process that spawned itself, exoself. The initial state message contains the sensor, actuator and neuron PId lists. The message also specifies how many total Sense-Think-Act cycles the Cortex should execute before terminating the NN system. Once we implement the learning algorithm, the termination criteria will depend on the fitness of the NN, or some other useful property.
loop(Id,ExoSelf_PId,SPIds,{_APIds,MAPIds},NPIds,0) ->
io:format("Cortex:~p is backing up and terminating.~n",[Id]),
Neuron_IdsNWeights = get_backup(NPIds,[]),
ExoSelf_PId ! {self(),backup,Neuron_IdsNWeights},
[PId ! {self(),terminate} || PId <- SPIds],
[PId ! {self(),terminate} || PId <- MAPIds],
[PId ! {self(),terminate} || PId <- NPIds];
loop(Id,ExoSelf_PId,SPIds,{[APId|APIds],MAPIds},NPIds,Step) ->
receive
{APId,sync} ->
loop(Id,ExoSelf_PId,SPIds,{APIds,MAPIds},NPIds,Step);
terminate ->
io:format("Cortex:~p is terminating.~n",[Id]),
[PId ! {self(),terminate} || PId <- SPIds],
[PId ! {self(),terminate} || PId <- MAPIds],
[PId ! {self(),terminate} || PId <- NPIds]
end;
loop(Id,ExoSelf_PId,SPIds,{[],MAPIds},NPIds,Step) ->
[PId ! {self(),sync} || PId <- SPIds],
loop(Id,ExoSelf_PId,SPIds,{MAPIds,MAPIds},NPIds,Step-1).
%The cortex's goal is to synchronize the NN system such that when the actuators have received all their control signals, the sensors are once again triggered to gather new sensory information. Thus the cortex waits for the sync messages from the actuator PIds in its system, and once it has received all the sync messages, it triggers the sensors and then drops back to waiting for a new set of sync messages. The cortex stores 2 copies of the actuator PIds: the APIds, and the MemoryAPIds (MAPIds). Once all the actuators have sent it the sync messages, it can restore the APIds list from the MAPIds. Finally, there is also the Step variable which decrements every time a full cycle of Sense-Think-Act completes, once this reaches 0, the NN system begints its termination and backup process.
get_backup([NPId|NPIds],Acc) ->
NPId ! {self(),get_backup},
receive
{NPId,NId,WeightTuples} ->
get_backup(NPIds,[{NId,WeightTuples}|Acc])
end;
get_backup([],Acc) ->
Acc.
%During backup, the cortex contacts all the neurons in its NN and requests for the neuron's Ids and their Input_IdPs. Once the updated Input_IdPs from all the neurons have been accumulated, te list is sent to exoself for the actual backup and storage.