From e793e590c28c338f0a213ab4dc37a40b7f7216d0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 24 Apr 2026 12:26:57 +0200 Subject: [PATCH] CSys.Environ: identify proc via program and stage id --- config/config.exs | 7 +++---- config/dev.exs | 8 ++++++++ config/prod.exs | 9 +++++++++ config/test.exs | 3 ++- lib/csys/csys.ex | 11 ++++++----- lib/csys/environ.ex | 6 ++++++ lib/csys/programs.ex | 14 ++++++++++++-- test/csys_test.exs | 5 +++-- 8 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 config/dev.exs create mode 100644 config/prod.exs diff --git a/config/config.exs b/config/config.exs index 57b8044..eb9ad71 100644 --- a/config/config.exs +++ b/config/config.exs @@ -2,9 +2,8 @@ import Config -config :logger, :default_handler, - config: [ - file: ~c"log/scopes.log" - ] +config :logger, :default_formatter, + format: "$date $time [$level] $metadata $message\n", + metadata: [:mfa] import_config "#{config_env()}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..b833e50 --- /dev/null +++ b/config/dev.exs @@ -0,0 +1,8 @@ +# scopes: development config file + +import Config + +config :logger, :default_handler, + config: [ + file: ~c"log/scopes_dev.log" + ] diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..0cd72b6 --- /dev/null +++ b/config/prod.exs @@ -0,0 +1,9 @@ +# scopes: production config file + +import Config + +config :logger, :default_handler, + config: [ + file: ~c"log/scopes.log" + ] + diff --git a/config/test.exs b/config/test.exs index b0a2c46..6a7c3f7 100644 --- a/config/test.exs +++ b/config/test.exs @@ -2,7 +2,8 @@ import Config -config :logger, :default_handler, +config :logger, :default_handler, + level: :info, config: [ file: ~c"test/log/scopes_test.log" ] diff --git a/lib/csys/csys.ex b/lib/csys/csys.ex index f7afb24..49379ae 100644 --- a/lib/csys/csys.ex +++ b/lib/csys/csys.ex @@ -4,11 +4,14 @@ defmodule Scopes.CSys do alias Scopes.Core.Actor def neuron(scope) do - #Logger.info("create neuron, scope: #{inspect scope}") - Logger.info([info: "create neuron", scope: inspect(scope)]) + Logger.info([scope: inspect(scope)]) Actor.create(fn msg -> process(msg, scope) end) end + def update_neuron(scope) do + Actor.become(self(), fn msg -> process(msg, scope) end) + end + def synapse(rcvr, op) do fn msg -> Actor.send(rcvr, op.(msg)) end end @@ -19,10 +22,8 @@ defmodule Scopes.CSys do # helper functions - def proc(scope), do: hd(code(scope)) - def state(scope), do: elem(scope, 0) - def code(scope), do: elem(scope, 1) + def proc(scope), do: elem(scope, 1) def syns(scope), do: elem(scope, 2) def env(scope), do: elem(scope, 3) end diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 67ecd55..a09b0e7 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -12,6 +12,12 @@ defmodule Scopes.CSys.Environ do end) end + def get_stage(env, prog, stage) do + Agent.get(env, fn {_parent, progs} -> + progs[prog][stage] + end) + end + def put_prog(env, name, prog) do Agent.update(env, fn {parent, progs} -> {parent, Map.put(progs, name, prog)} diff --git a/lib/csys/programs.ex b/lib/csys/programs.ex index 3be6494..eed7c3e 100644 --- a/lib/csys/programs.ex +++ b/lib/csys/programs.ex @@ -1,12 +1,14 @@ defmodule Scopes.CSys.Programs do import Scopes.CSys + alias Scopes.CSys alias Scopes.CSys.Environ # programs def basic_prog() do - [&std_proc/2] + %{initial: &std_proc/2} + #&std_proc/2 end # processors @@ -22,10 +24,18 @@ defmodule Scopes.CSys.Programs do def std_proc({:parent}, scope) do env = env(scope) syn = synapse(self(), &Function.identity/1) - new = neuron({[], Environ.get_prog(env, :basic), [syn], env}) + new = neuron({[], Environ.get_stage(env, :basic, :initial), [syn], env}) notify({:created, new}, scope) end + #def std_proc({:activate}, {state, _proc, syns, env) do + def std_proc({:next}, {state, _proc, syns, env}) do + #proc = Environ.get_next_stage(env, :basic, :initial) + #proc = Environ.get_stage_for(env, :basic, :activate) + proc = Environ.get_stage(env, :basic, :active) + CSys.update_neuron({state, proc, syns, env}) + end + def std_proc(msg, scope) do unless forward(msg, scope), do: notify(msg, scope) end diff --git a/test/csys_test.exs b/test/csys_test.exs index 3477d11..8c92bd3 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -11,8 +11,9 @@ defmodule Scopes.CSysTest do test "minimal-neural-net" do env = Environ.create(self()) Environ.put_prog(env, :basic, Programs.basic_prog()) - std_program = Environ.get_prog(env, :basic) - zero = CSys.neuron({[], std_program, [], env}) + #proc = Environ.get_prog(env, :basic) + proc = Environ.get_stage(env, :basic, :initial) + zero = CSys.neuron({[], proc, [], env}) Actor.send(zero, "Hello Zero!") assert_receive "Hello Zero!" Actor.send(zero, {:parent})