defmodule MontyExperiments.First .NilMotor do
use GenServer
# require Logger
@default_state % {
percepts: % { } ,
goals: % { } ,
state: % { } ,
}
def start_link( id, opts \\ [ ] ) do
GenServer.start_link ( __MODULE__, Map.put ( @default_state, : id, id) , opts)
end
def goal_state( motor, id, goal_state) do
GenServer.cast ( motor, { : cortical, self( ) , id, goal_state} )
end
def subcortical( motor, id, percept) do
GenServer.cast ( motor, { : subcortical, self( ) , id, percept} )
end
def init( data) do
{ : ok, data}
end
def handle_call( msg, _from, data) do
{ : reply, { : error, { : unsupported, msg} } , data}
end
def handle_cast( { : cortical, _pid, id, goal_state} , data) do
_
= IO.
puts ( "cortial -> id: #{id}, goal_state: #{goal_state}" ) { : noreply, put_in( data, [ : goals, id] , goal_state) }
end
def handle_cast( { : subcortical, _pid, id, percept} , data) do
_
= IO.
puts ( "subcortial -> id: #{id}, percept: #{percept}" ) { : noreply, put_in( data, [ : percepts, id] , percept) }
end
def handle_cast( msg, data) do
{ : noreply, data}
end
def handle_info( msg, data) do
{ : noreply, data}
end
end
defmodule MontyExperiments.First .NilLearning do
use GenServer
# require Logger
alias MontyExperiments.First .NilMotor
@default_state % {
subscribers: % {
output: % { } ,
vote: % { } ,
bias: % { } ,
motor: % { } ,
} ,
votes: % { } ,
bias: % { } ,
goals: % { } ,
state: % { } ,
current_guess: nil,
current_goal: nil,
}
def start_link( id, opts \\ [ ] ) do
GenServer.start_link ( __MODULE__, Map.put ( @default_state, : id, id) , opts)
end
def get_hypothesis( lm, timeout \\ : infinity) do
GenServer.call ( lm, : get_hypothesis, timeout)
end
def subscribe( lm, type, id, subscriber) do
GenServer.cast ( lm, { : subscribe, type, id, subscriber} )
end
def unsubscribe( lm, type, id) do
GenServer.cast ( lm, { : unsubscribe, type, id} )
end
def learn( lm, id, input) do
GenServer.cast ( lm, { : learn, self( ) , id, input} )
end
def vote( lm, id, vote) do
GenServer.cast ( lm, { : vote, self( ) , id, vote} )
end
def bias( lm, id, bias, goal) do
GenServer.cast ( lm, { : bias, self( ) , id, bias, goal} )
end
def init( data) do
{ : ok, data}
end
def handle_call( : get_hypothesis, _from, data) do
{ : reply, { : ok, data.current_guess } , data}
end
def handle_call( msg, _from, data) do
{ : reply, { : error, { : unsupported, msg} } , data}
end
def handle_cast( { : subscribe, type, id, subscriber} , data) do
{ : noreply, put_in( data, [ : subscribers, type, id] , subscriber) }
end
def handle_cast( { : unsubscribe, type, id} , data) do
{ : noreply, update_in( data, [ : subscribers, type] , & Map.delete ( & 1 , id) ) }
end
def handle_cast( { : bias, _pid, id, cmp, gs} , data) do
data = data |> put_in( [ : bias, id] , cmp) |> put_in( [ : goals, id] , gs)
{ : noreply, data}
end
def handle_cast( { : vote, _pid, id, vote} , data) do
{ : noreply, put_in( data, [ : votes, id] , vote) }
end
def handle_cast( { : learn, pid, id, cmp} , data) do
# _ = Logger.debug(fn -> %{msg: :learning, pid: pid, id: id, cmp: cmp, data: data} end)
# guess
{ : hypothesis, guess, state} = handle_learning( cmp, data.bias , data.state )
# publish guess to "voting block" LMs
: ok = Enum.each ( data.subscribers .vote , fn { _, lm} -> vote( lm, data.id , guess) end)
# generate goal
{ : goal, goal, state} = handle_goal_generation( guess, data.goals , state)
# apply vote
guess = apply_votes( guess, data.votes )
# publish goal to Motor Systems
: ok = Enum.each ( data.subscribers .motor , fn { _, ms} -> NilMotor.goal_state ( ms, data.id , goal) end)
# publish bias to lower-level LMs
: ok = Enum.each ( data.subscribers .bias , fn { _, lm} -> bias( lm, data.id , guess, goal) end)
# publish guess to higher-level LMs
: ok = Enum.each ( data.subscribers .output , fn { _, lm} -> learn( lm, data.id , guess) end)
{ : noreply, % { data | state: state, current_guess: guess, current_goal: goal} }
end
def handle_cast( msg, data) do
{ : noreply, data}
end
def handle_info( msg, data) do
{ : noreply, data}
end
def handle_learning( cmp, biases, state) do
{ : hypothesis, average( cmp, biases) , state}
end
def handle_goal_generation( guess, goals, state) do
goals = Enum.map ( goals, & elem( & 1 , 1 ) )
{ : goal, Enum.random ( [ guess | goals] ) , state}
end
defp apply_votes( guess, votes) , do : average( guess, votes)
defp average( guess, other_guesses) do
( Enum.sum ( Enum.map ( other_guesses, & elem( & 1 , 1 ) ) ) + guess) / ( Enum.count ( other_guesses) + 1 )
end
end
defmodule MontyExperiments.First .JitterSensor do
use GenServer
# require Logger
alias MontyExperiments.First .NilMotor
alias MontyExperiments.First .NilLearning
@default_state % {
subscribers: % {
learn: % { } ,
motor: % { } ,
} ,
delay_ms: 100 ,
count: 0 ,
status: : off
}
def start_link( id, opts \\ [ ] ) do
GenServer.start_link ( __MODULE__, Map.put ( @default_state, : id, id) , opts)
end
def subscribe( sensor, type, id, subscriber) do
GenServer.cast ( sensor, { : subscribe, type, id, subscriber} )
end
def unsubscribe( sensor, type, id) do
GenServer.cast ( sensor, { : unsubscribe, type, id} )
end
def on( sensor) , do : GenServer.cast ( sensor, : on)
def off( sensor) , do : GenServer.cast ( sensor, : off)
def init( data) do
_ = schedule_tick( data)
{ : ok, data}
end
def handle_call( msg, _from, data) do
{ : reply, { : error, { : unsupported, msg} } , data}
end
def handle_cast( : on, % { status: : off} = data) do
_ = schedule_tick( data)
{ : noreply, % { data | status: : on} }
end
def handle_cast( : on, data) do
{ : noreply, data}
end
def handle_cast( : off, data) do
{ : noreply, % { data | status: : off} }
end
def handle_cast( { : subscribe, type, id, subscriber} , data) do
{ : noreply, put_in( data, [ : subscribers, type, id] , subscriber) }
end
def handle_cast( { : unsubscribe, type, id} , data) do
{ : noreply, update_in( data, [ : subscribers, type] , & Map.delete ( & 1 , id) ) }
end
def handle_cast( msg, data) do
{ : noreply, data}
end
def handle_info( : tick, % { status: : off} = data) do
{ : noreply, data}
end
def handle_info( : tick, % { status: : on} = data) do
data = tick( data)
_ = schedule_tick( data)
{ : noreply, data}
end
def handle_info( msg, data) do
{ : noreply, data}
end
defp tick( % { count: count} = data) do
: ok = Enum.each ( data.subscribers .learn , fn { _, pid} -> NilLearning.learn ( pid, data.id , data.count ) end)
: ok = Enum.each ( data.subscribers .motor , fn { _, pid} -> NilMotor.subcortical ( pid, data.id , data.count ) end)
% { data | count: count + 1 }
end
defp schedule_tick( data) do
Process.send_after ( self( ) , : tick, calculate_next_tick( data) )
end
defp calculate_next_tick( % { delay_ms: delay_ms} ) do
round
( delay_ms
+ 0.5 * : rand .
uniform ( delay_ms
) ) end
end
defmodule MontyExperiments.First .Experiment do
alias MontyExperiments.First .{ NilMotor, NilLearning, JitterSensor}
# NOTE: use :digraph to describe this instead
def config_attempt1 do
% {
delays: 1 ..5 ,
base_delay: 100 ,
sensors: [ : s01, : s02, : s03] ,
motors: [ : m01, : m02] ,
learning: [ : l01, : l02, : l03, : l11, : l12, : l13, : l21, : l22, : l23] ,
sensor_conns: [
{ : s01, : learn, : l01} ,
{ : s02, : learn, : l02} ,
{ : s03, : learn, : l03} ,
{ : s01, : motor, : m01} ,
{ : s03, : motor, : m02} ,
] ,
learning_conns: [
{ : l01, : output, : l11} ,
{ : l01, : vote, : l02} ,
{ : l01, : vote, : l03} ,
{ : l01, : motor, : m01} ,
{ : l02, : output, : l12} ,
{ : l02, : vote, : l01} ,
{ : l02, : vote, : l03} ,
{ : l02, : motor, : m02} ,
{ : l03, : output, : l13} ,
{ : l03, : vote, : l01} ,
{ : l03, : vote, : l02} ,
{ : l03, : motor, : m02} ,
{ : l11, : output, : l21} ,
{ : l11, : bias, : l01} ,
{ : l11, : vote, : l12} ,
{ : l11, : vote, : l13} ,
{ : l11, : motor, : m01} ,
{ : l12, : output, : l22} ,
{ : l12, : bias, : l02} ,
{ : l12, : vote, : l11} ,
{ : l12, : vote, : l13} ,
{ : l12, : motor, : m02} ,
{ : l13, : output, : l23} ,
{ : l13, : bias, : l03} ,
{ : l13, : vote, : l11} ,
{ : l13, : vote, : l12} ,
{ : l13, : motor, : m02} ,
{ : l21, : bias, : l11} ,
{ : l21, : vote, : l22} ,
{ : l21, : vote, : l23} ,
{ : l21, : motor, : m01} ,
{ : l22, : bias, : l12} ,
{ : l22, : vote, : l21} ,
{ : l22, : vote, : l23} ,
{ : l22, : motor, : m02} ,
{ : l23, : bias, : l13} ,
{ : l23, : vote, : l21} ,
{ : l23, : vote, : l22} ,
{ : l23, : motor, : m02} ,
] ,
}
end
def setup( config) do
sensors = config.sensors |> Enum.map ( & { & 1 , JitterSensor.start_link ( & 1 ) } ) |> Enum.map ( fn { id, { : ok, pid} } -> { id, pid} end) |> Enum.into ( % { } )
motors = config.motors |> Enum.map ( & { & 1 , NilMotor.start_link ( & 1 ) } ) |> Enum.map ( fn { id, { : ok, pid} } -> { id, pid} end) |> Enum.into ( % { } )
learning = config.learning |> Enum.map ( & { & 1 , NilLearning.start_link ( & 1 ) } ) |> Enum.map ( fn { id, { : ok, pid} } -> { id, pid} end) |> Enum.into ( % { } )
: ok = Enum.each ( config.sensor_conns , fn
{ sid, : learn, id} -> JitterSensor.subscribe ( sensors[ sid] , : learn, id, learning[ id] )
{ sid, : motor, id} -> JitterSensor.subscribe ( sensors[ sid] , : motor, id, motors[ id] )
end)
: ok = Enum.each ( config.learning_conns , fn
{ lid, : motor, id} -> NilLearning.subscribe ( learning[ lid] , : motor, id, motors[ id] )
{ lid, type, id} -> NilLearning.subscribe ( learning[ lid] , type, id, learning[ id] )
end)
% { config |
sensors: sensors,
motors: motors,
learning: learning,
}
end
def teardown( _config) do
end
def run( config) do
_ = start_all( config)
config.delays
|> Enum.each ( fn d ->
delay = d * config.base_delay
_
= IO.
puts ( "sleeping for #{delay}ms..." ) : ok = Process.sleep ( delay)
IO.inspect ( get_hypotheses( config) )
end)
_ = stop_all( config)
config
end
def start_all( config) do
Enum.each ( config.sensors , fn { _, pid} -> JitterSensor.on ( pid) end)
end
def get_hypotheses( config) do
config.learning
|> Enum.map ( fn { id, pid} ->
{ : ok, hypothesis} = NilLearning.get_hypothesis ( pid)
{ id, hypothesis}
end)
|> Enum.into ( % { } )
end
def stop_all( config) do
Enum.each ( config.sensors , fn { _, pid} -> JitterSensor.off ( pid) end)
end
end
alias MontyExperiments.First .Experiment
Experiment.config_attempt1 ( )
|> Experiment.setup ( )
|> Experiment.run ( )
ZGVmbW9kdWxlIE1vbnR5RXhwZXJpbWVudHMuRmlyc3QuTmlsTW90b3IgZG8KICB1c2UgR2VuU2VydmVyCiAgIyByZXF1aXJlIExvZ2dlcgoKICBAZGVmYXVsdF9zdGF0ZSAlewogICAgcGVyY2VwdHM6ICV7fSwKICAgIGdvYWxzOiAle30sCiAgICBzdGF0ZTogJXt9LAogIH0KCiAgZGVmIHN0YXJ0X2xpbmsoaWQsIG9wdHMgXFwgW10pIGRvCiAgICBHZW5TZXJ2ZXIuc3RhcnRfbGluayhfX01PRFVMRV9fLCBNYXAucHV0KEBkZWZhdWx0X3N0YXRlLCA6aWQsIGlkKSwgb3B0cykKICBlbmQKCiAgZGVmIGdvYWxfc3RhdGUobW90b3IsIGlkLCBnb2FsX3N0YXRlKSBkbwogICAgR2VuU2VydmVyLmNhc3QobW90b3IsIHs6Y29ydGljYWwsIHNlbGYoKSwgaWQsIGdvYWxfc3RhdGV9KQogIGVuZAoKICBkZWYgc3ViY29ydGljYWwobW90b3IsIGlkLCBwZXJjZXB0KSBkbwogICAgR2VuU2VydmVyLmNhc3QobW90b3IsIHs6c3ViY29ydGljYWwsIHNlbGYoKSwgaWQsIHBlcmNlcHR9KQogIGVuZAoKICBkZWYgaW5pdChkYXRhKSBkbwogICAgezpvaywgZGF0YX0KICBlbmQKCiAgZGVmIGhhbmRsZV9jYWxsKG1zZywgX2Zyb20sIGRhdGEpIGRvCiAgICB7OnJlcGx5LCB7OmVycm9yLCB7OnVuc3VwcG9ydGVkLCBtc2d9fSwgZGF0YX0KICBlbmQKCiAgZGVmIGhhbmRsZV9jYXN0KHs6Y29ydGljYWwsIF9waWQsIGlkLCBnb2FsX3N0YXRlfSwgZGF0YSkgZG8KICAgIF8gPSBJTy5wdXRzKCJjb3J0aWFsIC0+IGlkOiAje2lkfSwgZ29hbF9zdGF0ZTogI3tnb2FsX3N0YXRlfSIpCiAgICB7Om5vcmVwbHksIHB1dF9pbihkYXRhLCBbOmdvYWxzLCBpZF0sIGdvYWxfc3RhdGUpfQogIGVuZAogIGRlZiBoYW5kbGVfY2FzdCh7OnN1YmNvcnRpY2FsLCBfcGlkLCBpZCwgcGVyY2VwdH0sIGRhdGEpIGRvCiAgICBfID0gSU8ucHV0cygic3ViY29ydGlhbCAtPiBpZDogI3tpZH0sIHBlcmNlcHQ6ICN7cGVyY2VwdH0iKQogICAgezpub3JlcGx5LCBwdXRfaW4oZGF0YSwgWzpwZXJjZXB0cywgaWRdLCBwZXJjZXB0KX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QobXNnLCBkYXRhKSBkbwogICAgezpub3JlcGx5LCBkYXRhfQogIGVuZAoKICBkZWYgaGFuZGxlX2luZm8obXNnLCBkYXRhKSBkbwogICAgezpub3JlcGx5LCBkYXRhfQogIGVuZAplbmQKCmRlZm1vZHVsZSBNb250eUV4cGVyaW1lbnRzLkZpcnN0Lk5pbExlYXJuaW5nIGRvCiAgdXNlIEdlblNlcnZlcgogICMgcmVxdWlyZSBMb2dnZXIKICBhbGlhcyBNb250eUV4cGVyaW1lbnRzLkZpcnN0Lk5pbE1vdG9yCgogIEBkZWZhdWx0X3N0YXRlICV7CiAgICBzdWJzY3JpYmVyczogJXsKICAgICAgb3V0cHV0OiAle30sCiAgICAgIHZvdGU6ICV7fSwKICAgICAgYmlhczogJXt9LAogICAgICBtb3RvcjogJXt9LAogICAgfSwKICAgIHZvdGVzOiAle30sCiAgICBiaWFzOiAle30sCiAgICBnb2FsczogJXt9LAogICAgc3RhdGU6ICV7fSwKICAgIGN1cnJlbnRfZ3Vlc3M6IG5pbCwKICAgIGN1cnJlbnRfZ29hbDogbmlsLAogIH0KCiAgZGVmIHN0YXJ0X2xpbmsoaWQsIG9wdHMgXFwgW10pIGRvCiAgICBHZW5TZXJ2ZXIuc3RhcnRfbGluayhfX01PRFVMRV9fLCBNYXAucHV0KEBkZWZhdWx0X3N0YXRlLCA6aWQsIGlkKSwgb3B0cykKICBlbmQKCiAgZGVmIGdldF9oeXBvdGhlc2lzKGxtLCB0aW1lb3V0IFxcIDppbmZpbml0eSkgZG8KICAgIEdlblNlcnZlci5jYWxsKGxtLCA6Z2V0X2h5cG90aGVzaXMsIHRpbWVvdXQpCiAgZW5kCgogIGRlZiBzdWJzY3JpYmUobG0sIHR5cGUsIGlkLCBzdWJzY3JpYmVyKSBkbwogICAgR2VuU2VydmVyLmNhc3QobG0sIHs6c3Vic2NyaWJlLCB0eXBlLCBpZCwgc3Vic2NyaWJlcn0pCiAgZW5kCgogIGRlZiB1bnN1YnNjcmliZShsbSwgdHlwZSwgaWQpIGRvCiAgICBHZW5TZXJ2ZXIuY2FzdChsbSwgezp1bnN1YnNjcmliZSwgdHlwZSwgaWR9KQogIGVuZAoKICBkZWYgbGVhcm4obG0sIGlkLCBpbnB1dCkgZG8KICAgIEdlblNlcnZlci5jYXN0KGxtLCB7OmxlYXJuLCBzZWxmKCksIGlkLCBpbnB1dH0pCiAgZW5kCgogIGRlZiB2b3RlKGxtLCBpZCwgdm90ZSkgZG8KICAgIEdlblNlcnZlci5jYXN0KGxtLCB7OnZvdGUsIHNlbGYoKSwgaWQsIHZvdGV9KQogIGVuZAoKICBkZWYgYmlhcyhsbSwgaWQsIGJpYXMsIGdvYWwpIGRvCiAgICBHZW5TZXJ2ZXIuY2FzdChsbSwgezpiaWFzLCBzZWxmKCksIGlkLCBiaWFzLCBnb2FsfSkKICBlbmQKCiAgZGVmIGluaXQoZGF0YSkgZG8KICAgIHs6b2ssIGRhdGF9CiAgZW5kCgogIGRlZiBoYW5kbGVfY2FsbCg6Z2V0X2h5cG90aGVzaXMsIF9mcm9tLCBkYXRhKSBkbwogICAgezpyZXBseSwgezpvaywgZGF0YS5jdXJyZW50X2d1ZXNzfSwgZGF0YX0KICBlbmQKICBkZWYgaGFuZGxlX2NhbGwobXNnLCBfZnJvbSwgZGF0YSkgZG8KICAgIHs6cmVwbHksIHs6ZXJyb3IsIHs6dW5zdXBwb3J0ZWQsIG1zZ319LCBkYXRhfQogIGVuZAoKICBkZWYgaGFuZGxlX2Nhc3QoezpzdWJzY3JpYmUsIHR5cGUsIGlkLCBzdWJzY3JpYmVyfSwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgcHV0X2luKGRhdGEsIFs6c3Vic2NyaWJlcnMsIHR5cGUsIGlkXSwgc3Vic2NyaWJlcil9CiAgZW5kCiAgZGVmIGhhbmRsZV9jYXN0KHs6dW5zdWJzY3JpYmUsIHR5cGUsIGlkfSwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgdXBkYXRlX2luKGRhdGEsIFs6c3Vic2NyaWJlcnMsIHR5cGVdLCAmTWFwLmRlbGV0ZSgmMSwgaWQpKX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QoezpiaWFzLCBfcGlkLCBpZCwgY21wLCBnc30sIGRhdGEpIGRvCiAgICBkYXRhID0gZGF0YSB8PiBwdXRfaW4oWzpiaWFzLCBpZF0sIGNtcCkgfD4gcHV0X2luKFs6Z29hbHMsIGlkXSwgZ3MpCiAgICB7Om5vcmVwbHksIGRhdGF9CiAgZW5kCiAgZGVmIGhhbmRsZV9jYXN0KHs6dm90ZSwgX3BpZCwgaWQsIHZvdGV9LCBkYXRhKSBkbwogICAgezpub3JlcGx5LCBwdXRfaW4oZGF0YSwgWzp2b3RlcywgaWRdLCB2b3RlKX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QoezpsZWFybiwgcGlkLCBpZCwgY21wfSwgZGF0YSkgZG8KICAgICMgXyA9IExvZ2dlci5kZWJ1ZyhmbiAtPiAle21zZzogOmxlYXJuaW5nLCBwaWQ6IHBpZCwgaWQ6IGlkLCBjbXA6IGNtcCwgZGF0YTogZGF0YX0gZW5kKQogICAgIyBndWVzcwogICAgezpoeXBvdGhlc2lzLCBndWVzcywgc3RhdGV9ID0gaGFuZGxlX2xlYXJuaW5nKGNtcCwgZGF0YS5iaWFzLCBkYXRhLnN0YXRlKQoKICAgICMgcHVibGlzaCBndWVzcyB0byAidm90aW5nIGJsb2NrIiBMTXMKICAgIDpvayA9IEVudW0uZWFjaChkYXRhLnN1YnNjcmliZXJzLnZvdGUsIGZuIHtfLCBsbX0gLT4gdm90ZShsbSwgZGF0YS5pZCwgZ3Vlc3MpIGVuZCkKCiAgICAjIGdlbmVyYXRlIGdvYWwKICAgIHs6Z29hbCwgZ29hbCwgc3RhdGV9ID0gaGFuZGxlX2dvYWxfZ2VuZXJhdGlvbihndWVzcywgZGF0YS5nb2Fscywgc3RhdGUpCgogICAgIyBhcHBseSB2b3RlCiAgICBndWVzcyA9IGFwcGx5X3ZvdGVzKGd1ZXNzLCBkYXRhLnZvdGVzKQoKICAgICMgcHVibGlzaCBnb2FsIHRvIE1vdG9yIFN5c3RlbXMKICAgIDpvayA9IEVudW0uZWFjaChkYXRhLnN1YnNjcmliZXJzLm1vdG9yLCBmbiB7XywgbXN9IC0+IE5pbE1vdG9yLmdvYWxfc3RhdGUobXMsIGRhdGEuaWQsIGdvYWwpIGVuZCkKICAgICMgcHVibGlzaCBiaWFzIHRvIGxvd2VyLWxldmVsIExNcwogICAgOm9rID0gRW51bS5lYWNoKGRhdGEuc3Vic2NyaWJlcnMuYmlhcywgZm4ge18sIGxtfSAtPiBiaWFzKGxtLCBkYXRhLmlkLCBndWVzcywgZ29hbCkgZW5kKQogICAgIyBwdWJsaXNoIGd1ZXNzIHRvIGhpZ2hlci1sZXZlbCBMTXMKICAgIDpvayA9IEVudW0uZWFjaChkYXRhLnN1YnNjcmliZXJzLm91dHB1dCwgZm4ge18sIGxtfSAtPiBsZWFybihsbSwgZGF0YS5pZCwgZ3Vlc3MpIGVuZCkKCiAgICB7Om5vcmVwbHksICV7ZGF0YSB8IHN0YXRlOiBzdGF0ZSwgY3VycmVudF9ndWVzczogZ3Vlc3MsIGN1cnJlbnRfZ29hbDogZ29hbH19CiAgZW5kCiAgZGVmIGhhbmRsZV9jYXN0KG1zZywgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgZGF0YX0KICBlbmQKCiAgZGVmIGhhbmRsZV9pbmZvKG1zZywgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgZGF0YX0KICBlbmQKCiAgZGVmIGhhbmRsZV9sZWFybmluZyhjbXAsIGJpYXNlcywgc3RhdGUpIGRvCiAgICB7Omh5cG90aGVzaXMsIGF2ZXJhZ2UoY21wLCBiaWFzZXMpLCBzdGF0ZX0KICBlbmQKCiAgZGVmIGhhbmRsZV9nb2FsX2dlbmVyYXRpb24oZ3Vlc3MsIGdvYWxzLCBzdGF0ZSkgZG8KICAgIGdvYWxzID0gRW51bS5tYXAoZ29hbHMsICZlbGVtKCYxLCAxKSkKICAgIHs6Z29hbCwgRW51bS5yYW5kb20oW2d1ZXNzIHwgZ29hbHNdKSwgc3RhdGV9CiAgZW5kCgogIGRlZnAgYXBwbHlfdm90ZXMoZ3Vlc3MsIHZvdGVzKSwgZG86IGF2ZXJhZ2UoZ3Vlc3MsIHZvdGVzKQoKICBkZWZwIGF2ZXJhZ2UoZ3Vlc3MsIG90aGVyX2d1ZXNzZXMpIGRvCiAgICAoRW51bS5zdW0oRW51bS5tYXAob3RoZXJfZ3Vlc3NlcywgJmVsZW0oJjEsIDEpKSkgKyBndWVzcykgLyAoRW51bS5jb3VudChvdGhlcl9ndWVzc2VzKSArIDEpCiAgZW5kCmVuZAoKZGVmbW9kdWxlIE1vbnR5RXhwZXJpbWVudHMuRmlyc3QuSml0dGVyU2Vuc29yIGRvCiAgdXNlIEdlblNlcnZlcgogICMgcmVxdWlyZSBMb2dnZXIKICBhbGlhcyBNb250eUV4cGVyaW1lbnRzLkZpcnN0Lk5pbE1vdG9yCiAgYWxpYXMgTW9udHlFeHBlcmltZW50cy5GaXJzdC5OaWxMZWFybmluZwoKICBAZGVmYXVsdF9zdGF0ZSAlewogICAgc3Vic2NyaWJlcnM6ICV7CiAgICAgIGxlYXJuOiAle30sCiAgICAgIG1vdG9yOiAle30sCiAgICB9LAogICAgZGVsYXlfbXM6IDEwMCwKICAgIGNvdW50OiAwLAogICAgc3RhdHVzOiA6b2ZmCiAgfQoKICBkZWYgc3RhcnRfbGluayhpZCwgb3B0cyBcXCBbXSkgZG8KICAgIEdlblNlcnZlci5zdGFydF9saW5rKF9fTU9EVUxFX18sIE1hcC5wdXQoQGRlZmF1bHRfc3RhdGUsIDppZCwgaWQpLCBvcHRzKQogIGVuZAoKICBkZWYgc3Vic2NyaWJlKHNlbnNvciwgdHlwZSwgaWQsIHN1YnNjcmliZXIpIGRvCiAgICBHZW5TZXJ2ZXIuY2FzdChzZW5zb3IsIHs6c3Vic2NyaWJlLCB0eXBlLCBpZCwgc3Vic2NyaWJlcn0pCiAgZW5kCgogIGRlZiB1bnN1YnNjcmliZShzZW5zb3IsIHR5cGUsIGlkKSBkbwogICAgR2VuU2VydmVyLmNhc3Qoc2Vuc29yLCB7OnVuc3Vic2NyaWJlLCB0eXBlLCBpZH0pCiAgZW5kCgogIGRlZiBvbihzZW5zb3IpLCBkbzogR2VuU2VydmVyLmNhc3Qoc2Vuc29yLCA6b24pCiAgZGVmIG9mZihzZW5zb3IpLCBkbzogR2VuU2VydmVyLmNhc3Qoc2Vuc29yLCA6b2ZmKQoKICBkZWYgaW5pdChkYXRhKSBkbwogICAgXyA9IHNjaGVkdWxlX3RpY2soZGF0YSkKICAgIHs6b2ssIGRhdGF9CiAgZW5kCgogIGRlZiBoYW5kbGVfY2FsbChtc2csIF9mcm9tLCBkYXRhKSBkbwogICAgezpyZXBseSwgezplcnJvciwgezp1bnN1cHBvcnRlZCwgbXNnfX0sIGRhdGF9CiAgZW5kCgogIGRlZiBoYW5kbGVfY2FzdCg6b24sICV7c3RhdHVzOiA6b2ZmfSA9IGRhdGEpIGRvCiAgICBfID0gc2NoZWR1bGVfdGljayhkYXRhKQogICAgezpub3JlcGx5LCAle2RhdGEgfCBzdGF0dXM6IDpvbn19CiAgZW5kCiAgZGVmIGhhbmRsZV9jYXN0KDpvbiwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgZGF0YX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QoOm9mZiwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgJXtkYXRhIHwgc3RhdHVzOiA6b2ZmfX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QoezpzdWJzY3JpYmUsIHR5cGUsIGlkLCBzdWJzY3JpYmVyfSwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgcHV0X2luKGRhdGEsIFs6c3Vic2NyaWJlcnMsIHR5cGUsIGlkXSwgc3Vic2NyaWJlcil9CiAgZW5kCiAgZGVmIGhhbmRsZV9jYXN0KHs6dW5zdWJzY3JpYmUsIHR5cGUsIGlkfSwgZGF0YSkgZG8KICAgIHs6bm9yZXBseSwgdXBkYXRlX2luKGRhdGEsIFs6c3Vic2NyaWJlcnMsIHR5cGVdLCAmTWFwLmRlbGV0ZSgmMSwgaWQpKX0KICBlbmQKICBkZWYgaGFuZGxlX2Nhc3QobXNnLCBkYXRhKSBkbwogICAgezpub3JlcGx5LCBkYXRhfQogIGVuZAoKICBkZWYgaGFuZGxlX2luZm8oOnRpY2ssICV7c3RhdHVzOiA6b2ZmfSA9IGRhdGEpIGRvCiAgICB7Om5vcmVwbHksIGRhdGF9CiAgZW5kCiAgZGVmIGhhbmRsZV9pbmZvKDp0aWNrLCAle3N0YXR1czogOm9ufSA9IGRhdGEpIGRvCiAgICBkYXRhID0gdGljayhkYXRhKQogICAgXyA9IHNjaGVkdWxlX3RpY2soZGF0YSkKICAgIHs6bm9yZXBseSwgZGF0YX0KICBlbmQKICBkZWYgaGFuZGxlX2luZm8obXNnLCBkYXRhKSBkbwogICAgezpub3JlcGx5LCBkYXRhfQogIGVuZAoKICBkZWZwIHRpY2soJXtjb3VudDogY291bnR9ID0gZGF0YSkgZG8KICAgIDpvayA9IEVudW0uZWFjaChkYXRhLnN1YnNjcmliZXJzLmxlYXJuLCBmbiB7XywgcGlkfSAtPiBOaWxMZWFybmluZy5sZWFybihwaWQsIGRhdGEuaWQsIGRhdGEuY291bnQpIGVuZCkKICAgIDpvayA9IEVudW0uZWFjaChkYXRhLnN1YnNjcmliZXJzLm1vdG9yLCBmbiB7XywgcGlkfSAtPiBOaWxNb3Rvci5zdWJjb3J0aWNhbChwaWQsIGRhdGEuaWQsIGRhdGEuY291bnQpIGVuZCkKICAgICV7ZGF0YSB8IGNvdW50OiBjb3VudCArIDF9CiAgZW5kCgogIGRlZnAgc2NoZWR1bGVfdGljayhkYXRhKSBkbwogICAgUHJvY2Vzcy5zZW5kX2FmdGVyKHNlbGYoKSwgOnRpY2ssIGNhbGN1bGF0ZV9uZXh0X3RpY2soZGF0YSkpCiAgZW5kCgogIGRlZnAgY2FsY3VsYXRlX25leHRfdGljaygle2RlbGF5X21zOiBkZWxheV9tc30pIGRvCiAgICByb3VuZChkZWxheV9tcyArIDAuNSAqIDpyYW5kLnVuaWZvcm0oZGVsYXlfbXMpKQogIGVuZAplbmQKCmRlZm1vZHVsZSBNb250eUV4cGVyaW1lbnRzLkZpcnN0LkV4cGVyaW1lbnQgZG8KICBhbGlhcyBNb250eUV4cGVyaW1lbnRzLkZpcnN0LntOaWxNb3RvciwgTmlsTGVhcm5pbmcsIEppdHRlclNlbnNvcn0KCiAgIyBOT1RFOiB1c2UgOmRpZ3JhcGggdG8gZGVzY3JpYmUgdGhpcyBpbnN0ZWFkCiAgZGVmIGNvbmZpZ19hdHRlbXB0MSBkbwogICAgJXsKICAgICAgZGVsYXlzOiAxLi41LAogICAgICBiYXNlX2RlbGF5OiAxMDAsCiAgICAgIHNlbnNvcnM6IFs6czAxLCA6czAyLCA6czAzXSwKICAgICAgbW90b3JzOiBbOm0wMSwgOm0wMl0sCiAgICAgIGxlYXJuaW5nOiBbOmwwMSwgOmwwMiwgOmwwMywgOmwxMSwgOmwxMiwgOmwxMywgOmwyMSwgOmwyMiwgOmwyM10sCiAgICAgIHNlbnNvcl9jb25uczogWwogICAgICAgIHs6czAxLCA6bGVhcm4sIDpsMDF9LAogICAgICAgIHs6czAyLCA6bGVhcm4sIDpsMDJ9LAogICAgICAgIHs6czAzLCA6bGVhcm4sIDpsMDN9LAogICAgICAgIHs6czAxLCA6bW90b3IsIDptMDF9LAogICAgICAgIHs6czAzLCA6bW90b3IsIDptMDJ9LAogICAgICBdLAogICAgICBsZWFybmluZ19jb25uczogWwogICAgICAgIHs6bDAxLCA6b3V0cHV0LCA6bDExfSwKICAgICAgICB7OmwwMSwgOnZvdGUsIDpsMDJ9LAogICAgICAgIHs6bDAxLCA6dm90ZSwgOmwwM30sCiAgICAgICAgezpsMDEsIDptb3RvciwgOm0wMX0sCgogICAgICAgIHs6bDAyLCA6b3V0cHV0LCA6bDEyfSwKICAgICAgICB7OmwwMiwgOnZvdGUsIDpsMDF9LAogICAgICAgIHs6bDAyLCA6dm90ZSwgOmwwM30sCiAgICAgICAgezpsMDIsIDptb3RvciwgOm0wMn0sCgogICAgICAgIHs6bDAzLCA6b3V0cHV0LCA6bDEzfSwKICAgICAgICB7OmwwMywgOnZvdGUsIDpsMDF9LAogICAgICAgIHs6bDAzLCA6dm90ZSwgOmwwMn0sCiAgICAgICAgezpsMDMsIDptb3RvciwgOm0wMn0sCgogICAgICAgIHs6bDExLCA6b3V0cHV0LCA6bDIxfSwKICAgICAgICB7OmwxMSwgOmJpYXMsIDpsMDF9LAogICAgICAgIHs6bDExLCA6dm90ZSwgOmwxMn0sCiAgICAgICAgezpsMTEsIDp2b3RlLCA6bDEzfSwKICAgICAgICB7OmwxMSwgOm1vdG9yLCA6bTAxfSwKCiAgICAgICAgezpsMTIsIDpvdXRwdXQsIDpsMjJ9LAogICAgICAgIHs6bDEyLCA6YmlhcywgOmwwMn0sCiAgICAgICAgezpsMTIsIDp2b3RlLCA6bDExfSwKICAgICAgICB7OmwxMiwgOnZvdGUsIDpsMTN9LAogICAgICAgIHs6bDEyLCA6bW90b3IsIDptMDJ9LAoKICAgICAgICB7OmwxMywgOm91dHB1dCwgOmwyM30sCiAgICAgICAgezpsMTMsIDpiaWFzLCA6bDAzfSwKICAgICAgICB7OmwxMywgOnZvdGUsIDpsMTF9LAogICAgICAgIHs6bDEzLCA6dm90ZSwgOmwxMn0sCiAgICAgICAgezpsMTMsIDptb3RvciwgOm0wMn0sCgogICAgICAgIHs6bDIxLCA6YmlhcywgOmwxMX0sCiAgICAgICAgezpsMjEsIDp2b3RlLCA6bDIyfSwKICAgICAgICB7OmwyMSwgOnZvdGUsIDpsMjN9LAogICAgICAgIHs6bDIxLCA6bW90b3IsIDptMDF9LAoKICAgICAgICB7OmwyMiwgOmJpYXMsIDpsMTJ9LAogICAgICAgIHs6bDIyLCA6dm90ZSwgOmwyMX0sCiAgICAgICAgezpsMjIsIDp2b3RlLCA6bDIzfSwKICAgICAgICB7OmwyMiwgOm1vdG9yLCA6bTAyfSwKCiAgICAgICAgezpsMjMsIDpiaWFzLCA6bDEzfSwKICAgICAgICB7OmwyMywgOnZvdGUsIDpsMjF9LAogICAgICAgIHs6bDIzLCA6dm90ZSwgOmwyMn0sCiAgICAgICAgezpsMjMsIDptb3RvciwgOm0wMn0sCiAgICAgIF0sCiAgICB9CiAgZW5kCgogIGRlZiBzZXR1cChjb25maWcpIGRvCiAgICBzZW5zb3JzID0gY29uZmlnLnNlbnNvcnMgfD4gRW51bS5tYXAoJnsmMSwgSml0dGVyU2Vuc29yLnN0YXJ0X2xpbmsoJjEpfSkgfD4gRW51bS5tYXAoZm4ge2lkLCB7Om9rLCBwaWR9fSAtPiB7aWQsIHBpZH0gZW5kKSB8PiBFbnVtLmludG8oJXt9KQogICAgbW90b3JzID0gY29uZmlnLm1vdG9ycyB8PiBFbnVtLm1hcCgmeyYxLCBOaWxNb3Rvci5zdGFydF9saW5rKCYxKX0pIHw+IEVudW0ubWFwKGZuIHtpZCwgezpvaywgcGlkfX0gLT4ge2lkLCBwaWR9IGVuZCkgfD4gRW51bS5pbnRvKCV7fSkKICAgIGxlYXJuaW5nID0gY29uZmlnLmxlYXJuaW5nIHw+IEVudW0ubWFwKCZ7JjEsIE5pbExlYXJuaW5nLnN0YXJ0X2xpbmsoJjEpfSkgfD4gRW51bS5tYXAoZm4ge2lkLCB7Om9rLCBwaWR9fSAtPiB7aWQsIHBpZH0gZW5kKSB8PiBFbnVtLmludG8oJXt9KQoKICAgIDpvayA9IEVudW0uZWFjaChjb25maWcuc2Vuc29yX2Nvbm5zLCBmbgogICAgICB7c2lkLCA6bGVhcm4sIGlkfSAtPiBKaXR0ZXJTZW5zb3Iuc3Vic2NyaWJlKHNlbnNvcnNbc2lkXSwgOmxlYXJuLCBpZCwgbGVhcm5pbmdbaWRdKQogICAgICB7c2lkLCA6bW90b3IsIGlkfSAtPiBKaXR0ZXJTZW5zb3Iuc3Vic2NyaWJlKHNlbnNvcnNbc2lkXSwgOm1vdG9yLCBpZCwgbW90b3JzW2lkXSkKICAgIGVuZCkKICAgIDpvayA9IEVudW0uZWFjaChjb25maWcubGVhcm5pbmdfY29ubnMsIGZuCiAgICAgIHtsaWQsIDptb3RvciwgaWR9IC0+IE5pbExlYXJuaW5nLnN1YnNjcmliZShsZWFybmluZ1tsaWRdLCA6bW90b3IsIGlkLCBtb3RvcnNbaWRdKQogICAgICB7bGlkLCB0eXBlLCBpZH0gLT4gTmlsTGVhcm5pbmcuc3Vic2NyaWJlKGxlYXJuaW5nW2xpZF0sIHR5cGUsIGlkLCBsZWFybmluZ1tpZF0pCiAgICBlbmQpCgogICAgJXtjb25maWcgfAogICAgICBzZW5zb3JzOiBzZW5zb3JzLAogICAgICBtb3RvcnM6IG1vdG9ycywKICAgICAgbGVhcm5pbmc6IGxlYXJuaW5nLAogICAgfQogIGVuZAoKICBkZWYgdGVhcmRvd24oX2NvbmZpZykgZG8KICBlbmQKCiAgZGVmIHJ1bihjb25maWcpIGRvCiAgICBfID0gc3RhcnRfYWxsKGNvbmZpZykKCiAgICBjb25maWcuZGVsYXlzCiAgICB8PiBFbnVtLmVhY2goZm4gZCAtPgogICAgICBkZWxheSA9IGQgKiBjb25maWcuYmFzZV9kZWxheQogICAgICBfID0gSU8ucHV0cygic2xlZXBpbmcgZm9yICN7ZGVsYXl9bXMuLi4iKQogICAgICA6b2sgPSBQcm9jZXNzLnNsZWVwKGRlbGF5KQogICAgICBJTy5pbnNwZWN0KGdldF9oeXBvdGhlc2VzKGNvbmZpZykpCiAgICBlbmQpCgogICAgXyA9IHN0b3BfYWxsKGNvbmZpZykKICAgIGNvbmZpZwogIGVuZAoKICBkZWYgc3RhcnRfYWxsKGNvbmZpZykgZG8KICAgIEVudW0uZWFjaChjb25maWcuc2Vuc29ycywgZm4ge18sIHBpZH0gLT4gSml0dGVyU2Vuc29yLm9uKHBpZCkgZW5kKQogIGVuZAoKICBkZWYgZ2V0X2h5cG90aGVzZXMoY29uZmlnKSBkbwogICAgY29uZmlnLmxlYXJuaW5nCiAgICB8PiBFbnVtLm1hcChmbiB7aWQsIHBpZH0gLT4KICAgICAgezpvaywgaHlwb3RoZXNpc30gPSBOaWxMZWFybmluZy5nZXRfaHlwb3RoZXNpcyhwaWQpCiAgICAgIHtpZCwgaHlwb3RoZXNpc30KICAgIGVuZCkKICAgIHw+IEVudW0uaW50bygle30pCiAgZW5kCgogIGRlZiBzdG9wX2FsbChjb25maWcpIGRvCiAgICBFbnVtLmVhY2goY29uZmlnLnNlbnNvcnMsIGZuIHtfLCBwaWR9IC0+IEppdHRlclNlbnNvci5vZmYocGlkKSBlbmQpCiAgZW5kCmVuZAoKYWxpYXMgTW9udHlFeHBlcmltZW50cy5GaXJzdC5FeHBlcmltZW50CgpFeHBlcmltZW50LmNvbmZpZ19hdHRlbXB0MSgpCnw+IEV4cGVyaW1lbnQuc2V0dXAoKQp8PiBFeHBlcmltZW50LnJ1bigpCg==
stdout
sleeping for 100ms...
%{
l01: nil,
l02: nil,
l03: nil,
l11: nil,
l12: nil,
l13: nil,
l21: nil,
l22: nil,
l23: nil
}
sleeping for 200ms...
subcortial -> id: s01, percept: 0
subcortial -> id: s01, percept: 1
subcortial -> id: s03, percept: 0
cortial -> id: l01, goal_state: 0.0
cortial -> id: l03, goal_state: 0.0
cortial -> id: l01, goal_state: 1.0
cortial -> id: l13, goal_state: 0.0
cortial -> id: l11, goal_state: 0.0
cortial -> id: l23, goal_state: 0.0
cortial -> id: l11, goal_state: 1.0
cortial -> id: l21, goal_state: 0.0
cortial -> id: l21, goal_state: 1.0
subcortial -> id: s03, percept: 1
cortial -> id: l03, goal_state: 0.5
cortial -> id: l13, goal_state: 0.0
cortial -> id: l23, goal_state: 0.6875
cortial -> id: l02, goal_state: 0.0
cortial -> id: l12, goal_state: 0.5
cortial -> id: l22, goal_state: 0.625
cortial -> id: l02, goal_state: 0.8125
cortial -> id: l12, goal_state: 0.7708333333333334
cortial -> id: l22, goal_state: 0.7152777777777778
subcortial -> id: s01, percept: 2
cortial -> id: l01, goal_state: 1.0
cortial -> id: l11, goal_state: 0.96875
cortial -> id: l21, goal_state: 0.7048611111111112
subcortial -> id: s03, percept: 2
cortial -> id: l03, goal_state: 1.34375
cortial -> id: l13, goal_state: 0.6875
cortial -> id: l23, goal_state: 0.9236111111111112
subcortial -> id: s01, percept: 3
cortial -> id: l01, goal_state: 0.96875
cortial -> id: l11, goal_state: 0.7048611111111112
cortial -> id: l21, goal_state: 0.9404899691358025
subcortial -> id: s03, percept: 3
cortial -> id: l03, goal_state: 0.6875
cortial -> id: l13, goal_state: 1.1617476851851851
cortial -> id: l23, goal_state: 0.9839891975308642
cortial -> id: l02, goal_state: 0.7708333333333334
cortial -> id: l12, goal_state: 1.2624421296296295
cortial -> id: l22, goal_state: 1.147858796296296
cortial -> id: l02, goal_state: 1.2624421296296295
cortial -> id: l12, goal_state: 1.147858796296296
cortial -> id: l22, goal_state: 1.2248505015432098
%{
l01: 1.3362268518518519,
l02: 1.9627218364197532,
l03: 1.5422453703703702,
l11: 0.9404899691358025,
l12: 1.2248505015432098,
l13: 0.9839891975308642,
l21: 0.8597929526748972,
l22: 1.0497765560699588,
l23: 0.8799189814814815
}
sleeping for 300ms...
subcortial -> id: s03, percept: 4
cortial -> id: l03, goal_state: 1.1617476851851851
cortial -> id: l13, goal_state: 1.5096852494855966
cortial -> id: l23, goal_state: 1.340829689643347
subcortial -> id: s01, percept: 4
cortial -> id: l01, goal_state: 0.7048611111111112
cortial -> id: l11, goal_state: 0.9404899691358025
cortial -> id: l21, goal_state: 1.5352312671467765
subcortial -> id: s01, percept: 5
cortial -> id: l01, goal_state: 3.267615633573388
cortial -> id: l11, goal_state: 1.5352312671467765
cortial -> id: l21, goal_state: 1.6640592254420057
subcortial -> id: s03, percept: 5
cortial -> id: l03, goal_state: 3.1704148448216736
cortial -> id: l13, goal_state: 2.003021672810928
cortial -> id: l23, goal_state: 1.8285046998837828
cortial -> id: l02, goal_state: 2.612425250771605
cortial -> id: l12, goal_state: 1.2248505015432098
cortial -> id: l22, goal_state: 2.0084648068368005
cortial -> id: l02, goal_state: 1.2248505015432098
cortial -> id: l12, goal_state: 2.5738819356626754
cortial -> id: l22, goal_state: 2.1886595966478843
subcortial -> id: s03, percept: 6
cortial -> id: l03, goal_state: 3.9142523499418913
cortial -> id: l13, goal_state: 1.8285046998837828
cortial -> id: l23, goal_state: 2.3767365286999462
subcortial -> id: s01, percept: 6
cortial -> id: l01, goal_state: 3.8320296127210027
cortial -> id: l11, goal_state: 2.5800422971183092
cortial -> id: l21, goal_state: 2.5737255672493657
subcortial -> id: s03, percept: 7
cortial -> id: l03, goal_state: 1.8285046998837828
cortial -> id: l13, goal_state: 3.0423476052132017
cortial -> id: l23, goal_state: 2.7320906126647286
subcortial -> id: s01, percept: 7
cortial -> id: l01, goal_state: 2.5800422971183092
cortial -> id: l11, goal_state: 3.3530975239983754
cortial -> id: l21, goal_state: 2.989775688291418
cortial -> id: l02, goal_state: 2.5738819356626754
cortial -> id: l12, goal_state: 3.208464061378712
cortial -> id: l22, goal_state: 3.2013030635300965
cortial -> id: l02, goal_state: 5.100651531765048
cortial -> id: l12, goal_state: 3.9165086573709917
cortial -> id: l22, goal_state: 3.4373179288608564
subcortial -> id: s03, percept: 8
cortial -> id: l03, goal_state: 3.0423476052132017
cortial -> id: l13, goal_state: 2.7320906126647286
cortial -> id: l23, goal_state: 3.686981804805571
subcortial -> id: s01, percept: 8
cortial -> id: l01, goal_state: 5.494887844145709
cortial -> id: l11, goal_state: 3.9786850966411924
cortial -> id: l21, goal_state: 3.8955109956865095
%{
l01: 4.326487817131019,
l02: 4.858627526579902,
l03: 5.0845198739073645,
l11: 3.8955109956865095,
l12: 3.4373179288608564,
l13: 3.686981804805571,
l21: 3.6732702431176456,
l22: 3.053061409939001,
l23: 3.3713584739859486
}
sleeping for 400ms...
subcortial -> id: s01, percept: 9
cortial -> id: l01, goal_state: 6.4477554978432545
cortial -> id: l11, goal_state: 4.655710510882267
cortial -> id: l21, goal_state: 4.1211861337668685
subcortial -> id: s03, percept: 9
cortial -> id: l03, goal_state: 2.7320906126647286
cortial -> id: l13, goal_state: 4.667662225661489
cortial -> id: l23, goal_state: 4.4132937979715825
cortial -> id: l02, goal_state: 3.9165086573709917
cortial -> id: l12, goal_state: 4.611514932415579
cortial -> id: l22, goal_state: 4.644962556319778
cortial -> id: l02, goal_state: 6.82248127815989
cortial -> id: l12, goal_state: 4.644962556319778
cortial -> id: l22, goal_state: 4.929633699207039
subcortial -> id: s03, percept: 10
cortial -> id: l03, goal_state: 4.667662225661489
cortial -> id: l13, goal_state: 4.4132937979715825
cortial -> id: l23, goal_state: 5.176450820408111
subcortial -> id: s01, percept: 10
cortial -> id: l01, goal_state: 4.655710510882267
cortial -> id: l11, goal_state: 4.1211861337668685
cortial -> id: l21, goal_state: 5.420947711861934
subcortial -> id: s01, percept: 11
cortial -> id: l01, goal_state: 8.210473855930967
cortial -> id: l11, goal_state: 6.2944390440922895
cortial -> id: l21, goal_state: 5.722693664811452
subcortial -> id: s03, percept: 11
cortial -> id: l03, goal_state: 4.4132937979715825
cortial -> id: l13, goal_state: 5.176450820408111
cortial -> id: l23, goal_state: 5.994903090483046
cortial -> id: l02, goal_state: 4.644962556319778
cortial -> id: l12, goal_state: 4.929633699207039
cortial -> id: l22, goal_state: 6.241261956050816
cortial -> id: l02, goal_state: 8.620630978025408
cortial -> id: l12, goal_state: 6.241261956050816
cortial -> id: l22, goal_state: 6.555181912096468
subcortial -> id: s03, percept: 12
cortial -> id: l03, goal_state: 5.176450820408111
cortial -> id: l13, goal_state: 5.994903090483046
cortial -> id: l23, goal_state: 6.840033891875495
subcortial -> id: s01, percept: 12
cortial -> id: l01, goal_state: 8.861346832405726
cortial -> id: l11, goal_state: 5.722693664811452
cortial -> id: l21, goal_state: 7.09234351829469
subcortial -> id: s01, percept: 13
cortial -> id: l01, goal_state: 5.722693664811452
cortial -> id: l11, goal_state: 7.09234351829469
cortial -> id: l21, goal_state: 7.416988299660339
subcortial -> id: s03, percept: 13
cortial -> id: l03, goal_state: 5.994903090483046
cortial -> id: l13, goal_state: 7.950788191982319
cortial -> id: l23, goal_state: 7.707485095115589
cortial -> id: l02, goal_state: 6.241261956050816
cortial -> id: l12, goal_state: 6.555181912096468
cortial -> id: l22, goal_state: 7.965172282505509
cortial -> id: l02, goal_state: 10.482586141252755
cortial -> id: l12, goal_state: 8.923070087269881
cortial -> id: l22, goal_state: 8.299720182233008
subcortial -> id: s01, percept: 14
cortial -> id: l01, goal_state: 10.70849414983017
cortial -> id: l11, goal_state: 7.416988299660339
cortial -> id: l21, goal_state: 8.509247278675899
subcortial -> id: s01, percept: 15
cortial -> id: l01, goal_state: 11.75462363933795
cortial -> id: l11, goal_state: 8.509247278675899
cortial -> id: l21, goal_state: 8.77315716433701
subcortial -> id: s03, percept: 14
cortial -> id: l03, goal_state: 7.950788191982319
cortial -> id: l13, goal_state: 7.707485095115589
cortial -> id: l23, goal_state: 9.165705968955175
%{
l01: 10.719075575509484,
l02: 10.14959161544595,
l03: 11.030317442716166,
l11: 8.77315716433701,
l12: 8.299720182233008,
l13: 9.165705968955175,
l21: 8.2601208138952,
l22: 7.8080645256696455,
l23: 8.746194438508397
}
sleeping for 500ms...
cortial -> id: l02, goal_state: 8.923070087269881
cortial -> id: l12, goal_state: 8.299720182233008
cortial -> id: l22, goal_state: 9.36815037625528
subcortial -> id: s03, percept: 15
cortial -> id: l03, goal_state: 7.707485095115589
cortial -> id: l13, goal_state: 10.204320005076205
cortial -> id: l23, goal_state: 9.72677884266841
subcortial -> id: s01, percept: 16
cortial -> id: l01, goal_state: 8.509247278675899
cortial -> id: l11, goal_state: 10.066609016574699
cortial -> id: l21, goal_state: 9.933777443607033
subcortial -> id: s01, percept: 17
cortial -> id: l01, goal_state: 13.466888721803517
cortial -> id: l11, goal_state: 10.954718076654721
cortial -> id: l21, goal_state: 10.229813796967042
cortial -> id: l02, goal_state: 8.299720182233008
cortial -> id: l12, goal_state: 9.36815037625528
cortial -> id: l22, goal_state: 10.666392160796766
subcortial -> id: s03, percept: 16
cortial -> id: l03, goal_state: 10.204320005076205
cortial -> id: l13, goal_state: 9.72677884266841
cortial -> id: l23, goal_state: 10.952865476578367
cortial -> id: l02, goal_state: 13.333196080398384
cortial -> id: l12, goal_state: 11.714409837328054
cortial -> id: l22, goal_state: 11.244289288801262
subcortial -> id: s03, percept: 17
cortial -> id: l03, goal_state: 9.72677884266841
cortial -> id: l13, goal_state: 12.104264829138877
cortial -> id: l23, goal_state: 11.591130914373885
subcortial -> id: s01, percept: 18
cortial -> id: l01, goal_state: 14.114906898483522
cortial -> id: l11, goal_state: 10.229813796967042
cortial -> id: l21, goal_state: 11.870073707325744
subcortial -> id: s03, percept: 18
cortial -> id: l03, goal_state: 12.104264829138877
cortial -> id: l13, goal_state: 12.551483739368507
cortial -> id: l23, goal_state: 12.019146677402288
cortial -> id: l02, goal_state: 14.122144644400631
cortial -> id: l12, goal_state: 12.576597593736295
cortial -> id: l22, goal_state: 12.306542596205034
subcortial -> id: s01, percept: 19
cortial -> id: l01, goal_state: 15.435036853662872
cortial -> id: l11, goal_state: 13.176373477625223
cortial -> id: l21, goal_state: 12.768151603576674
cortial -> id: l02, goal_state: 15.153271298102517
cortial -> id: l12, goal_state: 13.596606098314233
cortial -> id: l22, goal_state: 13.108154438435989
subcortial -> id: s03, percept: 19
cortial -> id: l03, goal_state: 15.509573338701145
cortial -> id: l13, goal_state: 13.538565193999304
cortial -> id: l23, goal_state: 13.437181589979588
cortial -> id: l02, goal_state: 13.596606098314233
cortial -> id: l12, goal_state: 13.108154438435989
cortial -> id: l22, goal_state: 13.621320675596897
subcortial -> id: s03, percept: 20
cortial -> id: l03, goal_state: 16.718590794989794
cortial -> id: l13, goal_state: 14.586865416643818
cortial -> id: l23, goal_state: 13.970754083145067
subcortial -> id: s01, percept: 20
cortial -> id: l01, goal_state: 13.176373477625223
cortial -> id: l11, goal_state: 12.768151603576674
cortial -> id: l21, goal_state: 14.370328740224442
subcortial -> id: s01, percept: 21
cortial -> id: l01, goal_state: 12.768151603576674
cortial -> id: l11, goal_state: 14.370328740224442
cortial -> id: l21, goal_state: 14.713087139674792
subcortial -> id: s03, percept: 21
cortial -> id: l03, goal_state: 14.586865416643818
cortial -> id: l13, goal_state: 15.264140832203566
cortial -> id: l23, goal_state: 14.938845611528043
cortial -> id: l02, goal_state: 13.108154438435989
cortial -> id: l12, goal_state: 15.301309269772727
cortial -> id: l22, goal_state: 15.322940916396897
cortial -> id: l02, goal_state: 15.301309269772727
cortial -> id: l12, goal_state: 15.322940916396897
cortial -> id: l22, goal_state: 15.683998134110597
subcortial -> id: s03, percept: 22
cortial -> id: l03, goal_state: 18.469422805764022
cortial -> id: l13, goal_state: 14.938845611528043
cortial -> id: l23, goal_state: 16.017579582313545
subcortial -> id: s01, percept: 22
cortial -> id: l01, goal_state: 18.356543569837395
cortial -> id: l11, goal_state: 16.215433122036103
cortial -> id: l21, goal_state: 16.28826640725411
subcortial -> id: s01, percept: 23
cortial -> id: l01, goal_state: 16.215433122036103
cortial -> id: l11, goal_state: 16.28826640725411
cortial -> id: l21, goal_state: 16.675614843868065
subcortial -> id: s03, percept: 23
cortial -> id: l03, goal_state: 14.938845611528043
cortial -> id: l13, goal_state: 17.288176384846867
cortial -> id: l23, goal_state: 17.016711913212884
%{
l01: 18.758342155863176,
l02: 17.777337289961068,
l03: 19.104797817660756,
l11: 16.675614843868065,
l12: 15.683998134110597,
l13: 17.016711913212884,
l21: 16.125730853430735,
l22: 15.111976961771143,
l23: 16.458774963730516
}
stderr
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:39
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:43
warning: variable "id" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:120
warning: variable "pid" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:120
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:143
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:147
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:223
warning: variable "msg" is unused (if the variable is not meant to be used, prefix it with an underscore)
prog.ex:235