Compare commits

..

2 commits

4 changed files with 41 additions and 28 deletions

View file

@ -4,6 +4,7 @@ import Config
config :logger, :default_formatter, config :logger, :default_formatter,
format: "$date $time [$level] $metadata $message\n", format: "$date $time [$level] $metadata $message\n",
colors: [enabled: false],
metadata: [:mfa] metadata: [:mfa]
import_config "#{config_env()}.exs" import_config "#{config_env()}.exs"

View file

@ -4,7 +4,7 @@ defmodule Scopes.CSys.Environ do
alias Scopes.Shape alias Scopes.Shape
defmodule State do defmodule State do
defstruct [neurons: [], names: %{}, init_seq: []] defstruct [neurons: [], cells: %{}, init_seq: []]
end end
def setup({state, proc}, seq \\ []) do def setup({state, proc}, seq \\ []) do
@ -25,14 +25,21 @@ defmodule Scopes.CSys.Environ do
def process_creation(msg, {state, proc, syns, env}) do def process_creation(msg, {state, proc, syns, env}) do
data = Shape.data(msg) data = Shape.data(msg)
new = data.new new = data.new
addr = data[:addr]
cells = if addr do
[dom, cat, item] = addr
Map.update(state.cells, {dom, cat}, %{item => new},
fn x -> Map.put(x, item, new) end)
else
state.cells
end
neurons = [new | state.neurons] neurons = [new | state.neurons]
names = data[:name] && Map.put(state.names, data.name, new) || state.names
{step, seq} = List.pop_at(state.init_seq, 0) {step, seq} = List.pop_at(state.init_seq, 0)
state1 = %State{neurons: neurons, names: names, init_seq: seq} state1 = %State{neurons: neurons, cells: cells, init_seq: seq}
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.(neurons) step.(env, state1)
end end
end end
end end

View file

@ -1,6 +1,8 @@
defmodule Scopes.CSys.Program do defmodule Scopes.CSys.Program do
require Logger require Logger
alias Scopes.CSys alias Scopes.CSys
alias Scopes.CSys.Environ
alias Scopes.Shape alias Scopes.Shape
defmodule State do defmodule State do
@ -78,7 +80,7 @@ alias Scopes.CSys
data = Shape.data(msg) data = Shape.data(msg)
state = CSys.state(scope) state = CSys.state(scope)
value_n = state.value + data.value value_n = state.value + data.value
Logger.info([data: data.value, state: state.value, threshold: state.threshold]) Logger.info data: data.value, state: state.value, threshold: state.threshold
if value_n >= state.threshold do if value_n >= state.threshold do
msg = Shape.create(Shape.head(msg), data: %{data | value: value_n}) msg = Shape.create(Shape.head(msg), data: %{data | value: value_n})
CSys.forward(msg, scope) || CSys.notify(msg, scope) CSys.forward(msg, scope) || CSys.notify(msg, scope)
@ -133,15 +135,28 @@ alias Scopes.CSys
# demo init sequences # demo init sequences
def init_seq_b1() do [ def init_seq_b1() do [
fn [zero | _ns] -> CSys.send_message(zero, ~w(csys create pred)a, fn _env, %Environ.State{neurons: [zero]} ->
%{op: [CSys.data_only(), negate()]}) end, CSys.send_message(zero, ~w(csys create pred)a,
fn [one | _ns] -> CSys.send_message(one, ~w(csys create succ)a, %{op: [CSys.data_only(), negate()]})
%{op: CSys.data_only()}) end, end,
fn [two | _ns] -> CSys.send_message(two, ~w(csys create pred)a) end, fn _env, %Environ.State{neurons: [one | _ns]} ->
fn [three | others] -> CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()})
end,
fn _env, %Environ.State{neurons: [two | _ns]} ->
CSys.send_message(two, ~w(csys create pred)a)
end,
fn _env, %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
] ]
end end
def init_recursive_1() do [
fn _env, %Environ.State{neurons: [zero]} ->
CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()})
CSys.send_message(zero, ~w(csys create succ)a, %{name: ~w(csys e01 001)a})
end
]
end
end end

View file

@ -16,8 +16,8 @@ defmodule Scopes.CSysTest do
Shape.data(receive_select(head)) Shape.data(receive_select(head))
end end
describe "basic:" do describe "basic-program:" do
test "minimal-neural-net" do test "minimal-b1" do
_env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) _env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1())
zero = receive_data(~w(csys created)a).new zero = receive_data(~w(csys created)a).new
CSys.send_value(zero, 0) CSys.send_value(zero, 0)
@ -25,7 +25,7 @@ defmodule Scopes.CSysTest do
one = receive_data(~w(csys created)a).new one = receive_data(~w(csys created)a).new
_two = receive_data(~w(csys created)a).new _two = receive_data(~w(csys created)a).new
three = receive_data(~w(csys created)a).new three = receive_data(~w(csys created)a).new
Process.sleep(50) Process.sleep(10)
CSys.send_value(one, 1) CSys.send_value(one, 1)
assert receive_data().value == 1 assert receive_data().value == 1
#assert receive_data().value in [-1, 1] #assert receive_data().value in [-1, 1]
@ -34,22 +34,12 @@ defmodule Scopes.CSysTest do
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
refute_received msg, "unhandled message(s): #{inspect(msg)}" refute_received msg, "unhandled message(s): #{inspect(msg)}"
end end
end
def init_recursive_1() do [ test "recursive-1" do
fn [zero] -> _env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1())
CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: Program.negate()})
CSys.send_message(zero, ~w(csys create succ)a)
end
]
end
describe "recursive:" do
test "zero + effector" do
_env = Environ.setup(Program.prepare_basic(), 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(50) Process.sleep(10)
CSys.send_value(zero, 42) CSys.send_value(zero, 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)}"