Compare commits

..

3 commits

9 changed files with 43 additions and 45 deletions

View file

@ -1,10 +1,10 @@
defmodule Scopes.CSys do defmodule Scopes.Core do
require Logger require Logger
require Scopes.Util require Scopes.Core.Util
alias Scopes.Core.Actor alias Scopes.Core.Actor
alias Scopes.Shape alias Scopes.Core.Shape
alias Scopes.Util alias Scopes.Core.Util
def neuron(scope) do def neuron(scope) do
#Logger.info(Util.show [scope]) #Logger.info(Util.show [scope])

View file

@ -1,7 +1,7 @@
defmodule Scopes.CSys.Environ do defmodule Scopes.Core.Environ do
alias Scopes.CSys alias Scopes.Core
alias Scopes.Shape alias Scopes.Core.Shape
defmodule State do defmodule State do
defstruct [cells: %{}, init_seq: []] defstruct [cells: %{}, init_seq: []]
@ -9,10 +9,10 @@ defmodule Scopes.CSys.Environ do
def setup({state, proc}, init_seq, proc_env \\ &proc_env/2) do def setup({state, proc}, init_seq, proc_env \\ &proc_env/2) do
env_scope = {%State{init_seq: init_seq}, proc_env, [], self()} env_scope = {%State{init_seq: init_seq}, proc_env, [], self()}
env = CSys.neuron(env_scope) env = Core.neuron(env_scope)
msg = Shape.create([:csys, :zero], data: %{addr: [:csys, :c00, {0, 0}]}) msg = Shape.create([:csys, :zero], data: %{addr: [:csys, :c00, {0, 0}]})
proc = {state, proc, [], env} proc = {state, proc, [], env}
CSys.create(msg, proc) Core.create(msg, proc)
env env
end end
@ -37,9 +37,8 @@ defmodule Scopes.CSys.Environ do
end end
{step, seq} = List.pop_at(state.init_seq, 0) {step, seq} = List.pop_at(state.init_seq, 0)
state1 = %State{cells: cells, init_seq: seq} state1 = %State{cells: cells, init_seq: seq}
CSys.update({state1, proc, syns, env}) Core.update({state1, proc, syns, env})
if step do if step do
#Process.sleep(1)
step.(state1) step.(state1)
end end
end end
@ -52,7 +51,7 @@ defmodule Scopes.CSys.Environ do
def send_message(state, addr, head, data) do def send_message(state, addr, head, data) do
cell = get_cell(state, addr) cell = get_cell(state, addr)
CSys.send_message(cell, head, data) Core.send_message(cell, head, data)
end end
def connect(state, addr, target, op \\ []) do def connect(state, addr, target, op \\ []) do
@ -63,7 +62,7 @@ defmodule Scopes.CSys.Environ do
# delegating tasks to env # delegating tasks to env
def delegate(env, func) do def delegate(env, func) do
CSys.send_message(env, {:exec, func}) Core.send_message(env, {:exec, func})
end end
def forward_value(env, addr, value) do def forward_value(env, addr, value) do

View file

@ -1,11 +1,11 @@
defmodule Scopes.CSys.Program do defmodule Scopes.Core.Program do
require Logger require Logger
require Scopes.Util require Scopes.Core.Util
alias Scopes.CSys alias Scopes.Core
alias Scopes.CSys.Environ alias Scopes.Core.Environ
alias Scopes.Shape alias Scopes.Core.Shape
alias Scopes.Util alias Scopes.Core.Util
defmodule State do defmodule State do
defstruct [:value, :count, :stage, :prog] defstruct [:value, :count, :stage, :prog]
@ -59,11 +59,11 @@ defmodule Scopes.CSys.Program do
case Shape.head(msg) do case Shape.head(msg) do
[:csys, :data | _rest] -> process_basic(msg, scope, args) [:csys, :data | _rest] -> process_basic(msg, scope, args)
#[:csys, :trigger | _rest] -> process_trigger(msg, scope) #[:csys, :trigger | _rest] -> process_trigger(msg, scope)
[:csys, :connect | _rest] -> CSys.connect(msg, scope) [:csys, :connect | _rest] -> Core.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(msg, scope) #[:csys, :next | _rest] -> next(msg, scope)
_ -> CSys.forward(msg, scope) || CSys.notify(msg, scope) _ -> Core.forward(msg, scope) || Core.notify(msg, scope)
end end
end end
end end
@ -75,32 +75,32 @@ defmodule Scopes.CSys.Program do
bias = args[:bias] || 0 bias = args[:bias] || 0
limit = args[:limit] limit = args[:limit]
data = Shape.data(msg) data = Shape.data(msg)
state = CSys.state(scope) state = Core.state(scope)
Logger.debug(Util.show [data, state.value, threshold]) Logger.debug(Util.show [data, state.value, threshold])
value_n = state.value + data.value value_n = state.value + data.value
if value_n >= threshold do if value_n >= threshold do
value_out = limit && rem(value_n - 1, limit) + limit || value_n value_out = limit && rem(value_n - 1, limit) + limit || value_n
value_next = limit && max(value_n - limit, bias) || bias value_next = limit && max(value_n - limit, bias) || bias
msg = Shape.create(Shape.head(msg), data: %{data | value: value_out}) msg = Shape.create(Shape.head(msg), data: %{data | value: value_out})
CSys.forward(msg, scope) || CSys.notify(msg, scope) Core.forward(msg, scope) || Core.notify(msg, scope)
state_n = %{state | value: value_next} state_n = %{state | value: value_next}
CSys.update(put_elem(scope, 0, state_n)) Core.update(put_elem(scope, 0, state_n))
else else
state_n = %{state | value: value_n} state_n = %{state | value: value_n}
CSys.update(put_elem(scope, 0, state_n)) Core.update(put_elem(scope, 0, state_n))
end end
end end
def create_succ(msg, scope) do def create_succ(msg, scope) do
new = CSys.create(msg, restart(scope)) new = Core.create(msg, restart(scope))
data = Shape.data(msg) data = Shape.data(msg)
CSys.send_message(self(), ~w(csys connect)a, Map.put(data, :target, new)) Core.send_message(self(), ~w(csys connect)a, Map.put(data, :target, new))
end end
def create_pred(msg, scope) do def create_pred(msg, scope) do
new = CSys.create(msg, restart(scope)) new = Core.create(msg, restart(scope))
data = Shape.data(msg) data = Shape.data(msg)
CSys.send_message(new, ~w(csys connect)a, Map.put(data, :target, self())) Core.send_message(new, ~w(csys connect)a, Map.put(data, :target, self()))
end end
# synapse operations # synapse operations
@ -131,11 +131,11 @@ defmodule Scopes.CSys.Program do
[ [
fn state -> fn state ->
Environ.send_message(state, zero, ~w(csys create pred)a, Environ.send_message(state, zero, ~w(csys create pred)a,
%{op: [CSys.data_only(), negate()], addr: one}) %{op: [Core.data_only(), negate()], addr: one})
end, end,
fn state -> fn state ->
Environ.send_message(state, one, ~w(csys create succ)a, Environ.send_message(state, one, ~w(csys create succ)a,
%{op: CSys.data_only(), addr: two}) %{op: Core.data_only(), addr: two})
end, end,
fn state -> fn state ->
Environ.send_message(state, two, ~w(csys create pred)a, %{addr: three}) Environ.send_message(state, two, ~w(csys create pred)a, %{addr: three})

View file

@ -1,4 +1,4 @@
defmodule Scopes.Shape do defmodule Scopes.Core.Shape do
def create(head, info \\ []) do def create(head, info \\ []) do
{head, info} {head, info}
end end

View file

@ -1,4 +1,4 @@
defmodule Scopes.Util do defmodule Scopes.Core.Util do
defmacro show(fields) do defmacro show(fields) do
names = for f <- fields do Macro.to_string(f) end names = for f <- fields do Macro.to_string(f) end
quote bind_quoted: [names: names, fields: fields] do quote bind_quoted: [names: names, fields: fields] do

View file

@ -1,4 +1,4 @@
defmodule Scopes.CoreTest do defmodule Scopes.CoreActorTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias Scopes.Core.Actor alias Scopes.Core.Actor

View file

@ -1,11 +1,10 @@
defmodule Scopes.CSysTest do defmodule Scopes.CoreTest do
use ExUnit.Case, async: false use ExUnit.Case, async: false
@moduletag timeout: 5000 @moduletag timeout: 5000
#alias Scopes.CSys alias Scopes.Core.Environ
alias Scopes.CSys.Environ alias Scopes.Core.Program
alias Scopes.CSys.Program alias Scopes.Core.Shape
alias Scopes.Shape
def receive_select(head) do def receive_select(head) do
assert_receive {^head, info}, 100 assert_receive {^head, info}, 100
@ -16,7 +15,7 @@ defmodule Scopes.CSysTest do
Shape.data(receive_select(head)) Shape.data(receive_select(head))
end end
describe "basic-program:" do describe "core-basic:" do
test "minimal-b1" 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())
Process.sleep(50) Process.sleep(50)

View file

@ -1,7 +1,7 @@
defmodule Scopes.ShapeTest do defmodule Scopes.CoreShapeTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias Scopes.Shape alias Scopes.Core.Shape
describe "shape:" do describe "shape:" do
test "basic" do test "basic" do

View file

@ -1,8 +1,8 @@
defmodule Scopes.UtilTest do defmodule Scopes.CoreUtilTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias Scopes.Util alias Scopes.Core.Util
require Scopes.Util require Scopes.Core.Util
describe "info:" do describe "info:" do
test "fields" do test "fields" do