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)
|
Actor.create(fn msg -> process(msg, scope) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_neuron(scope) do
|
def update(scope) do
|
||||||
Actor.become(self(), fn msg -> process(msg, scope) end)
|
Actor.become(self(), fn msg -> process(msg, scope) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -31,6 +31,19 @@ defmodule Scopes.CSys 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 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
|
# synapse operations
|
||||||
|
|
||||||
def noop(), do: fn msg -> msg end
|
def noop(), do: fn msg -> msg end
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,10 @@ defmodule Scopes.CSys.Environ do
|
||||||
alias Scopes.Shape
|
alias Scopes.Shape
|
||||||
|
|
||||||
def setup({state, proc}) do
|
def setup({state, proc}) do
|
||||||
env = CSys.neuron({[], &proc_env/2, [], self()})
|
scope = {[], &proc_env/2, [], self()}
|
||||||
CSys.neuron({state, proc, [], env})
|
env = CSys.neuron(scope)
|
||||||
|
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
|
||||||
|
env
|
||||||
end
|
end
|
||||||
|
|
||||||
def proc_env(msg, scope) do
|
def proc_env(msg, scope) do
|
||||||
|
|
@ -18,6 +20,6 @@ defmodule Scopes.CSys.Environ do
|
||||||
|
|
||||||
def register_creation(msg, {state, proc, syns, env}) do
|
def register_creation(msg, {state, proc, syns, env}) do
|
||||||
new = Shape.data(msg).new
|
new = Shape.data(msg).new
|
||||||
CSys.update_neuron({[new | state], proc, syns, env})
|
CSys.update({[new | state], proc, syns, env})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
defmodule Scopes.CSys.Program do
|
defmodule Scopes.CSys.Program do
|
||||||
import Scopes.CSys, only: [
|
|
||||||
neuron: 1, update_neuron: 1, synapse: 3
|
|
||||||
]
|
|
||||||
alias Scopes.CSys
|
alias Scopes.CSys
|
||||||
alias Scopes.Shape
|
alias Scopes.Shape
|
||||||
|
|
||||||
|
|
@ -56,7 +53,7 @@ defmodule Scopes.CSys.Program do
|
||||||
|
|
||||||
def basic(msg, scope) do
|
def basic(msg, scope) do
|
||||||
case Shape.head(msg) 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, :succ | _rest] -> create_succ(msg, scope)
|
||||||
[:csys, :create, :pred | _rest] -> create_pred(msg, scope)
|
[:csys, :create, :pred | _rest] -> create_pred(msg, scope)
|
||||||
#[:csys, :next | _rest] -> next(scope, meta)
|
#[:csys, :next | _rest] -> next(scope, meta)
|
||||||
|
|
@ -66,41 +63,24 @@ defmodule Scopes.CSys.Program do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# helper functions
|
# message handlers // proc steps
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def create_succ(msg, scope) do
|
def create_succ(msg, scope) do
|
||||||
new = create(msg, scope)
|
new = CSys.create(msg, restart(scope))
|
||||||
data = Shape.data(msg)
|
data = Shape.data(msg)
|
||||||
CSys.send_message(self(), [:csys, :connect], Map.put(data, :target, new))
|
CSys.send_message(self(), [:csys, :connect], Map.put(data, :target, new))
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_pred(msg, scope) do
|
def create_pred(msg, scope) do
|
||||||
new = create(msg, scope)
|
new = CSys.create(msg, restart(scope))
|
||||||
data = Shape.data(msg)
|
data = Shape.data(msg)
|
||||||
CSys.send_message(new, [:csys, :connect], Map.put(data, :target, self()))
|
CSys.send_message(new, [:csys, :connect], Map.put(data, :target, self()))
|
||||||
end
|
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
|
end
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ defmodule Scopes.CSysTest do
|
||||||
|
|
||||||
describe "basic:" do
|
describe "basic:" do
|
||||||
test "minimal-neural-net" 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!")
|
CSys.send_value(zero, "Hello Zero!")
|
||||||
assert "Hello Zero!" = receive_data().value
|
assert "Hello Zero!" = receive_data().value
|
||||||
CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()})
|
CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()})
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue