From 8919d99cbc753a1b995e7e9997e92a1516e5c2a4 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 21 Jun 2026 14:27:26 +0200 Subject: [PATCH] use Environ cell registry for accessing all neurons --- lib/core/core.ex | 7 +++++++ lib/core/environ.ex | 23 +++++++++++++++++------ lib/core/program.ex | 32 ++++++++++++++++---------------- test/core/core_test.exs | 10 +++++----- 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/lib/core/core.ex b/lib/core/core.ex index 3b80acf..b16a0b2 100644 --- a/lib/core/core.ex +++ b/lib/core/core.ex @@ -56,6 +56,13 @@ defmodule Scopes.Core do fn msg -> if List.starts_with?(Shape.head(msg), pat), do: msg end end + def filter_address(pat) do + fn msg -> + [dom, _act | rest] = Shape.head(msg) + if List.starts_with?([dom | rest], pat), do: msg + end + end + def data_only(), do: filter_head([:csys, :data]) # send shortcuts diff --git a/lib/core/environ.ex b/lib/core/environ.ex index d0f48e1..838be12 100644 --- a/lib/core/environ.ex +++ b/lib/core/environ.ex @@ -23,7 +23,7 @@ defmodule Scopes.Core.Environ do env_scope = {%State{init_seq: init_seq}, proc_env, [], self()} env = Core.neuron(env_scope) Actor.register(env, cells(), {:env, :c00}) - msg = Shape.create([:csys, :zero], data: %{addr: [:csys, :c00, "0-0"]}) + msg = Shape.create([:csys, :zero], data: %{addr: {:csys, :c00, "0-0"}}) scope = {state, proc, [], env} Core.create(msg, scope) #{:ok, env} @@ -43,8 +43,8 @@ defmodule Scopes.Core.Environ do new = data.new addr = data[:addr] cells = if addr do - [dom, cat, item] = addr - # update (or create and register) proxy cell + Actor.register(new, cells(), addr) + {dom, cat, item} = addr Map.update(state.cells, {dom, cat}, %{item => new}, fn x -> Map.put(x, item, new) end) else @@ -55,7 +55,8 @@ defmodule Scopes.Core.Environ do Core.update({state1, proc, syns, env}) if step do Process.sleep(1) - step.(state1) + #step.(state1) + step.() end end @@ -72,9 +73,19 @@ defmodule Scopes.Core.Environ do end end + def send_message(addr, head, data) do + rcvr = get_cell(addr) + Core.send_message(rcvr, head, data) + end + + def connect(addr = {dom, _cat, _item}, target, op \\ []) do + send_message(addr, [dom, :connect], + %{target: get_cell(target), op: op}) + end + # accessing cell registry via state.cells - def get_cell(state, [dom, cat, item]) do + def get_cell(state, {dom, cat, item}) do get_in(state.cells, [{dom, cat}, item]) end @@ -83,7 +94,7 @@ defmodule Scopes.Core.Environ do Core.send_message(cell, head, data) end - def connect(state, addr, target, op \\ []) do + def connect_state(state, addr, target, op \\ []) do send_message(state, addr, ~w(csys connect)a, %{target: get_cell(state, target), op: op}) end diff --git a/lib/core/program.ex b/lib/core/program.ex index b77b28b..8f1e68c 100644 --- a/lib/core/program.ex +++ b/lib/core/program.ex @@ -121,28 +121,28 @@ defmodule Scopes.Core.Program do # demo init sequences def init_seq_b1() do - zero = [:csys, :c00, "0-0"] - one = [:csys, :s01, "1-0"] - two = [:csys, :c00, "1-1"] - three = [:csys, :s01, "1-1"] + zero = {:csys, :c00, "0-0"} + one = {:csys, :s01, "1-0"} + two = {:csys, :c00, "1-1"} + three = {:csys, :s01, "1-1"} [ - &Environ.send_message(&1, zero, ~w(csys create)a, - %{op: [Core.data_only(), negate()], addr: one, dir: :pred}), - &Environ.send_message(&1, one, ~w(csys create)a, - %{op: Core.data_only(), addr: two, dir: :succ}), - &Environ.send_message(&1, two, ~w(csys create)a, - %{addr: three, dir: :pred}), - &Environ.connect(&1, three, zero) + fn -> Environ.send_message(zero, ~w(csys create)a, + %{op: [Core.data_only(), negate()], addr: one, dir: :pred}) end, + fn -> Environ.send_message(one, ~w(csys create)a, + %{op: Core.data_only(), addr: two, dir: :succ}) end, + fn -> Environ.send_message(two, ~w(csys create)a, + %{addr: three, dir: :pred}) end, + fn -> Environ.connect(three, zero) end ] end def init_recursive_1() do - zero = [:csys, :c00, "0-0"] + zero = {:csys, :c00, "0-0"} [ - &Environ.send_message(&1, zero, ~w(csys create)a, %{dir: :succ}), - &Environ.send_message(&1, zero, ~w(csys create)a, - %{addr: [:csys, :s01, "1-1"], dir: :pred}), - &Environ.connect(&1, zero, zero, negate()) + fn -> Environ.send_message(zero, ~w(csys create)a, %{dir: :succ}) end, + fn -> Environ.send_message(zero, ~w(csys create)a, + %{addr: {:csys, :s01, "1-1"}, dir: :pred}) end, + fn -> Environ.connect(zero, zero, negate()) end ] end end diff --git a/test/core/core_test.exs b/test/core/core_test.exs index 80a2ab7..f61ec0f 100644 --- a/test/core/core_test.exs +++ b/test/core/core_test.exs @@ -20,12 +20,12 @@ defmodule Scopes.CoreTest do Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) Process.sleep(5) env = Environ.get_cell({:env, :c00}) - Environ.forward_value(env, [:csys, :c00, "0-0"], 0) + Environ.forward_value(env, {:csys, :c00, "0-0"}, 0) assert 0 = receive_data().value - Environ.forward_value(env, [:csys, :s01, "1-0"], 1) + Environ.forward_value(env, {:csys, :s01, "1-0"}, 1) assert receive_data().value == 1 #assert receive_data().value in [-1, 1] - Environ.forward_value(env, [:csys, :s01, "1-1"], 3) + Environ.forward_value(env, {:csys, :s01, "1-1"}, 3) assert receive_data().value in [2, 3] assert receive_data().value in [2, 3] refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}" @@ -35,9 +35,9 @@ defmodule Scopes.CoreTest do Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) Process.sleep(5) env = Environ.get_cell({:env, :c00}) - Environ.forward_value(env, [:csys, :s01, "1-1"], 42) + Environ.forward_value(env, {:csys, :s01, "1-1"}, 42) assert receive_data().value == 42 - Environ.forward_value(env, [:csys, :s01, "1-1"], 47) + Environ.forward_value(env, {:csys, :s01, "1-1"}, 47) assert receive_data().value == 5 refute_receive msg, 5, "unhandled message(s): #{inspect(msg)}" end