-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcortex.erl
47 lines (44 loc) · 1.66 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
47
-module(cortex).
-compile(export_all).
-include("records.hrl").
-record(state,{id,exoself_pid,spids,npids,apids,cycle_acc=0,fitness_acc=0,endflag=0,status}).
gen(ExoSelf_PId,Node)->
spawn(Node,?MODULE,prep,[ExoSelf_PId]).
prep(ExoSelf_PId) ->
{V1,V2,V3} = now(),
random:seed(V1,V2,V3),
receive
{ExoSelf_PId,Id,SPIds,NPIds,APIds} ->
put(start_time,now()),
[SPId ! {self(),sync} || SPId <- SPIds],
loop(Id,ExoSelf_PId,SPIds,{APIds,APIds},NPIds,1,0,0,active)
end.
loop(Id,ExoSelf_PId,SPIds,{[APId|APIds],MAPIds},NPIds,CycleAcc,FitnessAcc,EFAcc,active) ->
receive
{APId,sync,Fitness,EndFlag} ->
loop(Id,ExoSelf_PId,SPIds,{APIds,MAPIds},NPIds,CycleAcc,FitnessAcc+Fitness,EFAcc+EndFlag,active);
terminate ->
io:format("Cortex:~p is terminating.~n",[Id]),
[PId ! {self(),terminate} || PId <- SPIds],
[PId ! {self(),terminate} || PId <- MAPIds],
[PId ! {self(),termiante} || PId <- NPIds]
end;
loop(Id,ExoSelf_PId,SPIds,{[],MAPIds},NPIds,CycleAcc,FitnessAcc,EFAcc,active)->
case EFAcc > 0 of
true ->
TimeDif=timer:now_diff(now(),get(start_time)),
ExoSelf_PId ! {self(),evaluation_completed,FitnessAcc,CycleAcc,TimeDif},
loop(Id,ExoSelf_PId,SPIds,{MAPIds,MAPIds},NPIds,CycleAcc,FitnessAcc,EFAcc,inactive);
false ->
[PId ! {self(),sync} || PId <- SPIds],
loop(Id,ExoSelf_PId,SPIds,{MAPIds,MAPIds},NPIds,CycleAcc+1,FitnessAcc,EFAcc,active)
end;
loop(Id,ExoSelf_PId,SPIds,{MAPIds,MAPIds},NPIds,_CycleAcc,_FitnessAcc,_EFAcc,inactive)->
receive
{ExoSelf_PId,reactivate}->
put(start_time,now()),
[SPId ! {self(),sync} || SPId <- SPIds],
loop(Id,ExoSelf_PId,SPIds,{MAPIds,MAPIds},NPIds,1,0,0,active);
{ExoSelf_PId,terminate}->
ok
end.