csys: basically working: delegating tasks from app to env, getting neurons via address

This commit is contained in:
Helmut Merz 2026-05-24 19:56:08 +02:00
parent 417bdf201a
commit dad38ad2c6
3 changed files with 38 additions and 13 deletions

View file

@ -15,12 +15,18 @@ defmodule Scopes.CSys.Environ do
env env
end end
def proc_env(msg, scope) do def proc_env(msg, scope = {state, _proc, _syns, env}) do
case Shape.head(msg) do case Shape.head(msg) do
[:csys, :created | _rest] -> process_creation(msg, scope) {:exec, func} -> func.(state)
_ -> nil [:csys, :created | _rest] ->
process_creation(msg, scope)
send(env, msg)
[dom, :for, cat, item] ->
#IO.inspect(CSys.state(scope).cells)
cell = get_in(state.cells, [{dom, cat}, item])
CSys.send_message(cell, [dom, :data], Shape.data(msg))
_ -> send(env, msg) # forward message to application
end end
send(CSys.env(scope), msg)
end end
def process_creation(msg, {state, proc, syns, env}) do def process_creation(msg, {state, proc, syns, env}) do
@ -40,7 +46,23 @@ defmodule Scopes.CSys.Environ do
CSys.update({state1, proc, syns, env}) CSys.update({state1, proc, syns, env})
if step do if step do
Process.sleep(1) Process.sleep(1)
step.(env, state1) step.(state1)
end end
end end
def send_message(state, [dom, cat, item], head, data) do
cell = get_in(state.cells, [{dom, cat}, item])
CSys.send_message(cell, head, data)
end
# delegating tasks to env
def delegate(env, func) do
CSys.send_message(env, {:exec, func})
end
def forward_value(env, addr, value) do
delegate(env, &send_message(&1, addr, ~w(csys data)a, %{value: value}))
#CSys.send_message(env, [dom, :for, cat, item], %{value: value})
end
end end

View file

@ -135,17 +135,17 @@ defmodule Scopes.CSys.Program do
# demo init sequences # demo init sequences
def init_seq_b1() do [ def init_seq_b1() do [
fn _env, %Environ.State{neurons: [zero]} -> fn %Environ.State{neurons: [zero]} ->
CSys.send_message(zero, ~w(csys create pred)a, CSys.send_message(zero, ~w(csys create pred)a,
%{op: [CSys.data_only(), negate()]}) %{op: [CSys.data_only(), negate()]})
end, end,
fn _env, %Environ.State{neurons: [one | _ns]} -> fn %Environ.State{neurons: [one | _ns]} ->
CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()}) CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()})
end, end,
fn _env, %Environ.State{neurons: [two | _ns]} -> fn %Environ.State{neurons: [two | _ns]} ->
CSys.send_message(two, ~w(csys create pred)a) CSys.send_message(two, ~w(csys create pred)a)
end, end,
fn _env, %Environ.State{neurons: [three | others]} -> fn %Environ.State{neurons: [three | others]} ->
zero = List.last(others) zero = List.last(others)
CSys.send_message(three, ~w(csys connect)a, %{target: zero}) CSys.send_message(three, ~w(csys connect)a, %{target: zero})
end end
@ -153,8 +153,10 @@ defmodule Scopes.CSys.Program do
end end
def init_recursive_1() do [ def init_recursive_1() do [
fn _env, %Environ.State{neurons: [zero]} -> fn %Environ.State{neurons: [zero]} ->
#zero = [:csys, :c00, {0, 0}]
CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()}) CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()})
#Environ.send_message(state, zero, ~w(csys connect)a, %{target: zero, op: negate()})
CSys.send_message(zero, ~w(csys create succ)a, %{addr: [:csys, :e01, {1, 1}]}) CSys.send_message(zero, ~w(csys create succ)a, %{addr: [:csys, :e01, {1, 1}]})
end end
] ]

View file

@ -36,11 +36,12 @@ defmodule Scopes.CSysTest do
end end
test "recursive-1" do test "recursive-1" do
_env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1())
zero = receive_data(~w(csys created)a).new _zero = receive_data(~w(csys created)a).new
_eff = receive_data(~w(csys created)a).new _eff = receive_data(~w(csys created)a).new
Process.sleep(10) Process.sleep(10)
CSys.send_value(zero, 42) #CSys.send_value(zero, 42)
Environ.forward_value(env, [:csys, :c00, {0, 0}], 42)
assert receive_data().value == 42 assert receive_data().value == 42
refute_received msg, "unhandled message(s): #{inspect(msg)}" refute_received msg, "unhandled message(s): #{inspect(msg)}"
end end