From 6318b8019666e351fa5d519f7a61068262fd3172 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 22 Apr 2026 22:13:41 +0200 Subject: [PATCH] move basic (standard) program and neuron processors to CSys.Programs --- lib/csys/csys.ex | 22 ---------------------- lib/csys/environ.ex | 19 ++++++++++++------- lib/csys/programs.ex | 33 +++++++++++++++++++++++++++++++++ test/csys_test.exs | 8 +++----- 4 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 lib/csys/programs.ex diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 4012ed1..80cc8ba 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -1,6 +1,5 @@ defmodule Scopes.CSys do alias Scopes.Core.Actor - alias Scopes.CSys.Environ def neuron(scope) do Actor.create(fn msg -> process(msg, scope) end) @@ -10,31 +9,10 @@ defmodule Scopes.CSys do fn msg -> Actor.send(rcvr, op.(msg)) end end - # predefined neuron processors - def process(msg, scope) do proc(scope).(msg, scope) end - def notify(msg, scope) do - Environ.notify(env(scope), msg) - end - - def forward(msg, scope) do - Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end) - end - - def std_proc({:parent}, scope) do - env = env(scope) - syn = synapse(self(), &Function.identity/1) - new = neuron({[], Environ.get_prog(env, :basic), [syn], env}) - notify({:created, new}, scope) - end - - def std_proc(msg, scope) do - unless forward(msg, scope), do: notify(msg, scope) - end - # helper functions def proc(scope), do: hd(code(scope)) diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 5d726d4..67ecd55 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -1,22 +1,27 @@ defmodule Scopes.CSys.Environ do use Agent - def create(parent, progs) do - {:ok, env} = Agent.start_link( - fn -> %{parent: parent, programs: progs} end, - name: __MODULE__) + def create(parent, progs \\ %{}) do + {:ok, env} = Agent.start_link( fn -> {parent, progs} end, name: __MODULE__) env end def get_prog(env, name) do - Agent.get(env, fn state -> - state.programs[name] + Agent.get(env, fn {_parent, progs} -> + progs[name] + end) + end + + def put_prog(env, name, prog) do + Agent.update(env, fn {parent, progs} -> + {parent, Map.put(progs, name, prog)} end) end def notify(env, msg) do Agent.cast(env, fn state -> - send(state.parent, msg) + {parent, _progs} = state + send(parent, msg) state end) end diff --git a/lib/csys/programs.ex b/lib/csys/programs.ex new file mode 100644 index 0000000..736c0c1 --- /dev/null +++ b/lib/csys/programs.ex @@ -0,0 +1,33 @@ +defmodule Scopes.CSys.Programs do + import Scopes.CSys + + alias Scopes.CSys.Environ + + # programs + + def basic_prog() do + [&std_proc/2] + end + + # processors + + def notify(msg, scope) do + Environ.notify(env(scope), msg) + end + + def forward(msg, scope) do + Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end) + end + + def std_proc({:parent}, scope) do + env = env(scope) + syn = synapse(self(), &Function.identity/1) + new = neuron({[], Environ.get_prog(env, :basic), [syn], env}) + notify({:created, new}, scope) + end + + def std_proc(msg, scope) do + unless forward(msg, scope), do: notify(msg, scope) + end + +end diff --git a/test/csys_test.exs b/test/csys_test.exs index 38b7d2a..3477d11 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -5,14 +5,12 @@ defmodule Scopes.CSysTest do alias Scopes.Core.Actor alias Scopes.CSys alias Scopes.CSys.Environ - - def basic_prog() do - %{basic: [&CSys.std_proc/2]} - end + alias Scopes.CSys.Programs describe "basic:" do test "minimal-neural-net" do - env = Environ.create(self(), basic_prog()) # or: Programs.basic() + env = Environ.create(self()) + Environ.put_prog(env, :basic, Programs.basic_prog()) std_program = Environ.get_prog(env, :basic) zero = CSys.neuron({[], std_program, [], env}) Actor.send(zero, "Hello Zero!")