From d7e05028d4b3d145992a141b4b91d58be32dc9a1 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 20 Apr 2026 12:04:47 +0200 Subject: [PATCH] csys: create parent neuron (as sensor) with synapse --- lib/core/actor.ex | 26 +++++++++++++++----------- lib/csys/csys.ex | 26 ++++++++++++++++++++++++-- test/core_test.exs | 3 +-- test/csys_test.exs | 17 ++++++++++++----- test/demo_test.exs | 1 - 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/lib/core/actor.ex b/lib/core/actor.ex index 7232be0..ad38331 100644 --- a/lib/core/actor.ex +++ b/lib/core/actor.ex @@ -1,19 +1,23 @@ defmodule Scopes.Core.Actor do - defp loop(bhv) do - receive do msg -> - #IO.puts("receive: #{inspect msg}") - case msg do - {:message, msg} -> - bhv.(msg) - loop(bhv) - {:become, bhv_n} -> loop(bhv_n) - {:quit} -> nil - end + receive do + msg -> + # IO.puts("receive: #{inspect msg}") + case msg do + {:message, msg} -> + bhv.(msg) + loop(bhv) + + {:become, bhv_n} -> + loop(bhv_n) + + {:quit} -> + nil + end end end - def create(bhv) do + def create(bhv) do spawn_link(fn -> loop(bhv) end) end diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index 6149237..94250b8 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -1,8 +1,30 @@ defmodule Scopes.CSys do - #alias Scopes.Core.Actor + alias Scopes.Core.Actor def neuron(proc, scope) do - #{state, syns, env} = scope fn msg -> proc.(msg, scope) end end + + def synapse(rcvr, op) do + fn msg -> Actor.send(rcvr, op.(msg)) end + end + + # predefined neuron processors + + def echo(msg, {_state, _syns, env}) do + send(env, msg) + end + + def std_proc(msg, {state, syns, env}) do + case msg do + {:parent} -> + syn = synapse(self(), fn x -> x end) + new = Actor.create(neuron(&std_proc/2, {nil, [syn], env})) + # Actor.become(&std_proc/2, {state, syns, env}) + send(env, {:created, new}) + + msg -> + echo(msg, {state, syns, env}) + end + end end diff --git a/test/core_test.exs b/test/core_test.exs index 499dd00..cf7f11f 100644 --- a/test/core_test.exs +++ b/test/core_test.exs @@ -12,8 +12,7 @@ defmodule Scopes.CoreTest do Actor.send(ac, "Hello Actor!") Actor.stop(ac) assert_receive "Goodbye" - refute_received msg, "unhandled message(s): #{inspect msg}" + refute_received msg, "unhandled message(s): #{inspect(msg)}" end end end - diff --git a/test/csys_test.exs b/test/csys_test.exs index 32b9d9f..7c81032 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -1,17 +1,24 @@ defmodule Scopes.CSysTest do use ExUnit.Case, async: true + @moduletag timeout: 5000 alias Scopes.Core.Actor alias Scopes.CSys describe "basic:" do test "minimal-neural-net" do - this = self() - zero = Actor.create(CSys.neuron( - fn msg, _scope -> send(this, msg) end, {nil, [], this})) + zero = Actor.create(CSys.neuron(&CSys.std_proc/2, {nil, [], self()})) Actor.send(zero, "Hello Zero!") - Actor.stop(zero) assert_receive "Hello Zero!" - refute_received msg, "unhandled message(s): #{inspect msg}" + Actor.send(zero, {:parent}) + + receive do + {:created, new} -> Actor.send(new, "Hello New!") + end + + assert_receive "Hello New!" + :timer.sleep(50) + # Actor.stop(zero) + refute_received msg, "unhandled message(s): #{inspect(msg)}" end end end diff --git a/test/demo_test.exs b/test/demo_test.exs index 120d813..9245b20 100644 --- a/test/demo_test.exs +++ b/test/demo_test.exs @@ -9,4 +9,3 @@ defmodule Scopes.DemoTest do end end end -