diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 0f7cc6d..65e10bd 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -23,9 +23,12 @@ defmodule Scopes.CSys do proc(scope).(msg, scope) end + def send_message(rcvr, head, data) do + Actor.send(rcvr, Shape.create(head, data: data)) + end + def send_value(rcvr, val) do - msg = Shape.create([:csys, :data], data: %{value: val}) - Actor.send(rcvr, msg) + send_message(rcvr, [:csys, :data], %{value: val}) end def state(scope), do: elem(scope, 0) diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 8f4b5f0..1157bd3 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -1,11 +1,10 @@ defmodule Scopes.CSys.Environ do - use Agent alias Scopes.CSys - def setup(proc) do + def setup({state, proc}) do env = CSys.neuron({[], &proc_env/2, [], self()}) - CSys.neuron({[], proc, [], env}) + CSys.neuron({state, proc, [], env}) end def proc_env(msg, scope) do diff --git a/lib/csys/program.ex b/lib/csys/program.ex index 428c1c9..8433187 100644 --- a/lib/csys/program.ex +++ b/lib/csys/program.ex @@ -3,10 +3,17 @@ defmodule Scopes.CSys.Program do neuron: 1, update_neuron: 1, synapse: 3, syns: 1, env: 1 ] - alias Scopes.Core.Actor - # programs + defmodule State do + defstruct [:value, :stage, :prog] + end + + def prepare(prog) do + {%State{value: 0, stage: :initial, prog: prog}, elem(prog, 0)[:initial]} + end + + # basic program def basic_prog() do default = &basic_active/2 @@ -24,26 +31,32 @@ defmodule Scopes.CSys.Program do {stages, transitions} end + def prepare_basic() do + prepare(basic_prog()) + end + # basic processors def basic_initial(msg, scope) do - basic(msg, scope, {:initial, basic_prog()}) + basic(msg, scope) end def basic_active(msg, scope) do - basic(msg, scope, {:active, basic_prog()}) + basic(msg, scope) end - def basic(msg = {head, _info}, scope, _meta) do + def basic(msg = {head, _info}, scope) do case head do [:csys, :create, :pred | _rest] -> create_pred(scope) [:csys, :create, :succ | _rest] -> create_succ(scope) #[:csys, :next | _rest] -> next(scope, meta) + #[:csys, :data | rest] -> process_data(rest, Shape.data(msg), scope) + #[:csys, action | rest] -> transition(action, scope) _ -> forward(msg, scope) || notify(msg, scope) end end - def basic(msg, scope, _meta) do + def basic(msg, scope) do forward(msg, scope) || notify(msg, scope) end diff --git a/test/csys_test.exs b/test/csys_test.exs index 527e994..70f2858 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -19,8 +19,7 @@ defmodule Scopes.CSysTest do describe "basic:" do test "minimal-neural-net" do - {stages, _trans} = Program.basic_prog() - zero = Environ.setup(stages[:initial]) + zero = Environ.setup(Program.prepare_basic()) #Actor.send(zero, "Hello Zero!") CSys.send_value(zero, "Hello Zero!") assert "Hello Zero!" = receive_data().value