From 7f6e374f1eb118bcf43ba140c1915f2770b75ba4 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 18 May 2026 15:45:37 +0200 Subject: [PATCH] csys: move create() and connect() steps to CSys, fix Environ.setup(): create zero neuron --- lib/csys/csys.ex | 17 +++++++++++++++-- lib/csys/environ.ex | 8 +++++--- lib/csys/program.ex | 42 +++++++++++------------------------------- test/csys_test.exs | 3 ++- 4 files changed, 33 insertions(+), 37 deletions(-) diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 969844a..92f842e 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -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 diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 66e02fb..b8192f1 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -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 diff --git a/lib/csys/program.ex b/lib/csys/program.ex index 42682e7..18c4aca 100644 --- a/lib/csys/program.ex +++ b/lib/csys/program.ex @@ -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 diff --git a/test/csys_test.exs b/test/csys_test.exs index 18a56d1..ef80b44 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -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()})