csys: set proc depending on current stage, restart scopes upon neuron creation

This commit is contained in:
Helmut Merz 2026-05-13 11:09:36 +02:00
parent 36dae3885c
commit 31f35aa2f8
2 changed files with 27 additions and 11 deletions

View file

@ -9,10 +9,20 @@ defmodule Scopes.CSys.Program do
defstruct [:value, :stage, :prog] defstruct [:value, :stage, :prog]
end end
def prepare(prog) do def prepare(prog, value \\ []) do
{%State{value: 0, stage: :initial, prog: prog}, elem(prog, 0)[:initial]} state = %State{value: value, stage: :initial, prog: prog}
{state, get_proc(state)}
end end
def get_proc(stages, stage) do
stages[stage] || stages[:default]
end
def get_proc(state) do
get_proc(elem(state.prog, 0), state.stage)
end
# basic program # basic program
def basic_prog() do def basic_prog() do
@ -31,8 +41,8 @@ defmodule Scopes.CSys.Program do
{stages, transitions} {stages, transitions}
end end
def prepare_basic() do def prepare_basic(value \\ []) do
prepare(basic_prog()) prepare(basic_prog(), value)
end end
# basic processors # basic processors
@ -60,7 +70,7 @@ defmodule Scopes.CSys.Program do
forward(msg, scope) || notify(msg, scope) forward(msg, scope) || notify(msg, scope)
end end
# processor steps # processor steps, helper functions
def notify(msg, scope) do def notify(msg, scope) do
Actor.send(env(scope), msg) Actor.send(env(scope), msg)
@ -70,22 +80,28 @@ defmodule Scopes.CSys.Program 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
def restart({state, _proc, syns, env}) do
nstate = %{state | stage: :initial}
{nstate, get_proc(nstate), syns, env}
end
# step functions # step functions
# create_... steps # create_... steps
# todo: provide parameters for initial state, proc / stage, op, # todo: provide parameters for initial state, proc / stage, op,
# depending on state and stage (proc) of self, as well as message, env, ... # depending on state and stage (proc) of self, as well as message, env, ...
def create_pred(scope = {_state, proc, _syns, env}) do def create_pred(scope = {state, proc, _syns, env}) do
syn = synapse(self(), &Function.identity/1, 0) syn = synapse(self(), &Function.identity/1, 0)
new = neuron({[], proc, [syn], env}) new = neuron(restart({state, proc, [syn], env}))
notify({:created, new}, scope) notify({:created, new}, scope)
update_neuron(restart(scope))
end end
def create_succ (scope = {state, proc, syns, env}) do def create_succ (scope = {state, proc, syns, env}) do
new = neuron({[], proc, [], env}) new = neuron(restart({state, proc, [], env}))
syn = synapse(new, &Function.identity/1, 0)
update_neuron({state, proc, [syn | syns], env})
notify({:created, new}, scope) notify({:created, new}, scope)
syn = synapse(new, &Function.identity/1, 0)
update_neuron(restart({state, proc, [syn | syns], env}))
end end
end end

View file

@ -24,7 +24,7 @@ defmodule Scopes.CSysTest do
CSys.send_value(zero, "Hello Zero!") CSys.send_value(zero, "Hello Zero!")
assert "Hello Zero!" = receive_data().value assert "Hello Zero!" = receive_data().value
Actor.send(zero, {[:csys, :create, :pred], nil}) Actor.send(zero, {[:csys, :create, :pred], nil})
#Actor.send(zero, {[:csys, :create, :pred], data: %{op: &neg_only}) #Actor.send(zero, {[:csys, :create, :pred], data: %{op: &neg_only/1})
assert_receive {:created, new1} assert_receive {:created, new1}
Actor.send(new1, {[:csys, :create, :succ], nil}) Actor.send(new1, {[:csys, :create, :succ], nil})
assert_receive {:created, _new2} assert_receive {:created, _new2}