csys: set proc depending on current stage, restart scopes upon neuron creation
This commit is contained in:
parent
36dae3885c
commit
31f35aa2f8
2 changed files with 27 additions and 11 deletions
|
|
@ -9,10 +9,20 @@ defmodule Scopes.CSys.Program do
|
||||||
defstruct [:value, :stage, :prog]
|
defstruct [:value, :stage, :prog]
|
||||||
end
|
end
|
||||||
|
|
||||||
def prepare(prog) do
|
def prepare(prog, value \\ []) do
|
||||||
{%State{value: 0, stage: :initial, prog: prog}, elem(prog, 0)[:initial]}
|
state = %State{value: value, stage: :initial, prog: prog}
|
||||||
|
{state, get_proc(state)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_proc(stages, stage) do
|
||||||
|
stages[stage] || stages[:default]
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_proc(state) do
|
||||||
|
get_proc(elem(state.prog, 0), state.stage)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
# basic program
|
# basic program
|
||||||
|
|
||||||
def basic_prog() do
|
def basic_prog() do
|
||||||
|
|
@ -31,8 +41,8 @@ defmodule Scopes.CSys.Program do
|
||||||
{stages, transitions}
|
{stages, transitions}
|
||||||
end
|
end
|
||||||
|
|
||||||
def prepare_basic() do
|
def prepare_basic(value \\ []) do
|
||||||
prepare(basic_prog())
|
prepare(basic_prog(), value)
|
||||||
end
|
end
|
||||||
|
|
||||||
# basic processors
|
# basic processors
|
||||||
|
|
@ -60,7 +70,7 @@ defmodule Scopes.CSys.Program do
|
||||||
forward(msg, scope) || notify(msg, scope)
|
forward(msg, scope) || notify(msg, scope)
|
||||||
end
|
end
|
||||||
|
|
||||||
# processor steps
|
# processor steps, helper functions
|
||||||
|
|
||||||
def notify(msg, scope) do
|
def notify(msg, scope) do
|
||||||
Actor.send(env(scope), msg)
|
Actor.send(env(scope), msg)
|
||||||
|
|
@ -70,22 +80,28 @@ defmodule Scopes.CSys.Program do
|
||||||
Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end)
|
Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def restart({state, _proc, syns, env}) do
|
||||||
|
nstate = %{state | stage: :initial}
|
||||||
|
{nstate, get_proc(nstate), syns, env}
|
||||||
|
end
|
||||||
|
|
||||||
# step functions
|
# step functions
|
||||||
|
|
||||||
# create_... steps
|
# create_... steps
|
||||||
# todo: provide parameters for initial state, proc / stage, op,
|
# todo: provide parameters for initial state, proc / stage, op,
|
||||||
# depending on state and stage (proc) of self, as well as message, env, ...
|
# depending on state and stage (proc) of self, as well as message, env, ...
|
||||||
|
|
||||||
def create_pred(scope = {_state, proc, _syns, env}) do
|
def create_pred(scope = {state, proc, _syns, env}) do
|
||||||
syn = synapse(self(), &Function.identity/1, 0)
|
syn = synapse(self(), &Function.identity/1, 0)
|
||||||
new = neuron({[], proc, [syn], env})
|
new = neuron(restart({state, proc, [syn], env}))
|
||||||
notify({:created, new}, scope)
|
notify({:created, new}, scope)
|
||||||
|
update_neuron(restart(scope))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_succ (scope = {state, proc, syns, env}) do
|
def create_succ (scope = {state, proc, syns, env}) do
|
||||||
new = neuron({[], proc, [], env})
|
new = neuron(restart({state, proc, [], env}))
|
||||||
syn = synapse(new, &Function.identity/1, 0)
|
|
||||||
update_neuron({state, proc, [syn | syns], env})
|
|
||||||
notify({:created, new}, scope)
|
notify({:created, new}, scope)
|
||||||
|
syn = synapse(new, &Function.identity/1, 0)
|
||||||
|
update_neuron(restart({state, proc, [syn | syns], env}))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ defmodule Scopes.CSysTest do
|
||||||
CSys.send_value(zero, "Hello Zero!")
|
CSys.send_value(zero, "Hello Zero!")
|
||||||
assert "Hello Zero!" = receive_data().value
|
assert "Hello Zero!" = receive_data().value
|
||||||
Actor.send(zero, {[:csys, :create, :pred], nil})
|
Actor.send(zero, {[:csys, :create, :pred], nil})
|
||||||
#Actor.send(zero, {[:csys, :create, :pred], data: %{op: &neg_only})
|
#Actor.send(zero, {[:csys, :create, :pred], data: %{op: &neg_only/1})
|
||||||
assert_receive {:created, new1}
|
assert_receive {:created, new1}
|
||||||
Actor.send(new1, {[:csys, :create, :succ], nil})
|
Actor.send(new1, {[:csys, :create, :succ], nil})
|
||||||
assert_receive {:created, _new2}
|
assert_receive {:created, _new2}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue