csys: move create() and connect() steps to CSys, fix Environ.setup(): create zero neuron
This commit is contained in:
parent
63df25d65f
commit
7f6e374f1e
4 changed files with 33 additions and 37 deletions
|
|
@ -9,7 +9,7 @@ defmodule Scopes.CSys do
|
|||
Actor.create(fn msg -> process(msg, scope) end)
|
||||
end
|
||||
|
||||
def update_neuron(scope) do
|
||||
def update(scope) do
|
||||
Actor.become(self(), fn msg -> process(msg, scope) end)
|
||||
end
|
||||
|
||||
|
|
@ -31,7 +31,20 @@ defmodule Scopes.CSys do
|
|||
Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end)
|
||||
end
|
||||
|
||||
# synapse operations
|
||||
def create(_msg, scope = {state, proc, _syns, env}) do
|
||||
new = neuron({state, proc, [], env})
|
||||
notify_created(new, scope)
|
||||
new
|
||||
end
|
||||
|
||||
def connect(msg, {state, proc, syns, env}) do
|
||||
data = Shape.data(msg)
|
||||
op = data[:op] || noop()
|
||||
syn = synapse(data[:target], op, 0)
|
||||
update({state, proc, [syn | syns], env})
|
||||
end
|
||||
|
||||
# synapse operations
|
||||
|
||||
def noop(), do: fn msg -> msg end
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,10 @@ defmodule Scopes.CSys.Environ do
|
|||
alias Scopes.Shape
|
||||
|
||||
def setup({state, proc}) do
|
||||
env = CSys.neuron({[], &proc_env/2, [], self()})
|
||||
CSys.neuron({state, proc, [], env})
|
||||
scope = {[], &proc_env/2, [], self()}
|
||||
env = CSys.neuron(scope)
|
||||
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
|
||||
env
|
||||
end
|
||||
|
||||
def proc_env(msg, scope) do
|
||||
|
|
@ -18,6 +20,6 @@ defmodule Scopes.CSys.Environ do
|
|||
|
||||
def register_creation(msg, {state, proc, syns, env}) do
|
||||
new = Shape.data(msg).new
|
||||
CSys.update_neuron({[new | state], proc, syns, env})
|
||||
CSys.update({[new | state], proc, syns, env})
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,4 @@
|
|||
defmodule Scopes.CSys.Program do
|
||||
import Scopes.CSys, only: [
|
||||
neuron: 1, update_neuron: 1, synapse: 3
|
||||
]
|
||||
alias Scopes.CSys
|
||||
alias Scopes.Shape
|
||||
|
||||
|
|
@ -56,7 +53,7 @@ defmodule Scopes.CSys.Program do
|
|||
|
||||
def basic(msg, scope) do
|
||||
case Shape.head(msg) do
|
||||
[:csys, :connect | _rest] -> connect(msg, scope)
|
||||
[:csys, :connect | _rest] -> CSys.connect(msg, scope)
|
||||
[:csys, :create, :succ | _rest] -> create_succ(msg, scope)
|
||||
[:csys, :create, :pred | _rest] -> create_pred(msg, scope)
|
||||
#[:csys, :next | _rest] -> next(scope, meta)
|
||||
|
|
@ -66,41 +63,24 @@ defmodule Scopes.CSys.Program do
|
|||
end
|
||||
end
|
||||
|
||||
# helper functions
|
||||
|
||||
def restart({state, _proc, syns, env}) do
|
||||
nstate = %{state | stage: :initial}
|
||||
{nstate, get_proc(nstate), syns, env}
|
||||
end
|
||||
|
||||
# step functions
|
||||
|
||||
# connect, create_... steps
|
||||
# todo: provide parameters for initial state, proc / stage, op,
|
||||
# depending on state and stage (proc) of self, as well as message, env, ...
|
||||
|
||||
def connect(msg, {state, proc, syns, env}) do
|
||||
data = Shape.data(msg)
|
||||
op = data[:op] || CSys.noop()
|
||||
syn = synapse(data[:target], op, 0)
|
||||
update_neuron({state, proc, [syn | syns], env})
|
||||
end
|
||||
|
||||
def create(_msg, scope = {state, proc, _syns, env}) do
|
||||
new = neuron(restart({state, proc, [], env}))
|
||||
CSys.notify_created(new, scope)
|
||||
new
|
||||
end
|
||||
# message handlers // proc steps
|
||||
|
||||
def create_succ(msg, scope) do
|
||||
new = create(msg, scope)
|
||||
new = CSys.create(msg, restart(scope))
|
||||
data = Shape.data(msg)
|
||||
CSys.send_message(self(), [:csys, :connect], Map.put(data, :target, new))
|
||||
end
|
||||
|
||||
def create_pred(msg, scope) do
|
||||
new = create(msg, scope)
|
||||
new = CSys.create(msg, restart(scope))
|
||||
data = Shape.data(msg)
|
||||
CSys.send_message(new, [:csys, :connect], Map.put(data, :target, self()))
|
||||
end
|
||||
|
||||
# helper functions
|
||||
|
||||
def restart({state, _proc, syns, env}) do
|
||||
state_n = %{state | stage: :initial}
|
||||
{state_n, get_proc(state_n), syns, env}
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ defmodule Scopes.CSysTest do
|
|||
|
||||
describe "basic:" do
|
||||
test "minimal-neural-net" do
|
||||
zero = Environ.setup(Program.prepare_basic())
|
||||
_env = Environ.setup(Program.prepare_basic())
|
||||
zero = receive_data([:csys, :created]).new
|
||||
CSys.send_value(zero, "Hello Zero!")
|
||||
assert "Hello Zero!" = receive_data().value
|
||||
CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()})
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue