csys: move create() and connect() steps to CSys, fix Environ.setup(): create zero neuron

This commit is contained in:
Helmut Merz 2026-05-18 15:45:37 +02:00
parent 63df25d65f
commit 7f6e374f1e
4 changed files with 33 additions and 37 deletions

View file

@ -9,7 +9,7 @@ defmodule Scopes.CSys do
Actor.create(fn msg -> process(msg, scope) end) Actor.create(fn msg -> process(msg, scope) end)
end end
def update_neuron(scope) do def update(scope) do
Actor.become(self(), fn msg -> process(msg, scope) end) Actor.become(self(), fn msg -> process(msg, scope) end)
end end
@ -31,7 +31,20 @@ defmodule Scopes.CSys do
Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end) Enum.reduce(syns(scope), false, fn s, _acc -> s.(msg); true end)
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 def noop(), do: fn msg -> msg end

View file

@ -4,8 +4,10 @@ defmodule Scopes.CSys.Environ do
alias Scopes.Shape alias Scopes.Shape
def setup({state, proc}) do def setup({state, proc}) do
env = CSys.neuron({[], &proc_env/2, [], self()}) scope = {[], &proc_env/2, [], self()}
CSys.neuron({state, proc, [], env}) env = CSys.neuron(scope)
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
env
end end
def proc_env(msg, scope) do def proc_env(msg, scope) do
@ -18,6 +20,6 @@ defmodule Scopes.CSys.Environ do
def register_creation(msg, {state, proc, syns, env}) do def register_creation(msg, {state, proc, syns, env}) do
new = Shape.data(msg).new new = Shape.data(msg).new
CSys.update_neuron({[new | state], proc, syns, env}) CSys.update({[new | state], proc, syns, env})
end end
end end

View file

@ -1,7 +1,4 @@
defmodule Scopes.CSys.Program do defmodule Scopes.CSys.Program do
import Scopes.CSys, only: [
neuron: 1, update_neuron: 1, synapse: 3
]
alias Scopes.CSys alias Scopes.CSys
alias Scopes.Shape alias Scopes.Shape
@ -56,7 +53,7 @@ defmodule Scopes.CSys.Program do
def basic(msg, scope) do def basic(msg, scope) do
case Shape.head(msg) 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, :succ | _rest] -> create_succ(msg, scope)
[:csys, :create, :pred | _rest] -> create_pred(msg, scope) [:csys, :create, :pred | _rest] -> create_pred(msg, scope)
#[:csys, :next | _rest] -> next(scope, meta) #[:csys, :next | _rest] -> next(scope, meta)
@ -66,41 +63,24 @@ defmodule Scopes.CSys.Program do
end end
end end
# helper functions # message handlers // proc steps
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
def create_succ(msg, scope) do def create_succ(msg, scope) do
new = create(msg, scope) new = CSys.create(msg, restart(scope))
data = Shape.data(msg) data = Shape.data(msg)
CSys.send_message(self(), [:csys, :connect], Map.put(data, :target, new)) CSys.send_message(self(), [:csys, :connect], Map.put(data, :target, new))
end end
def create_pred(msg, scope) do def create_pred(msg, scope) do
new = create(msg, scope) new = CSys.create(msg, restart(scope))
data = Shape.data(msg) data = Shape.data(msg)
CSys.send_message(new, [:csys, :connect], Map.put(data, :target, self())) CSys.send_message(new, [:csys, :connect], Map.put(data, :target, self()))
end 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 end

View file

@ -22,7 +22,8 @@ defmodule Scopes.CSysTest do
describe "basic:" do describe "basic:" do
test "minimal-neural-net" 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!") CSys.send_value(zero, "Hello Zero!")
assert "Hello Zero!" = receive_data().value assert "Hello Zero!" = receive_data().value
CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()}) CSys.send_message(zero, [:csys, :create, :pred], %{op: neg_only()})