Physical State - adolgert/CTDE.jl GitHub Wiki
The physical state is composed of a set of disjoint substates. Each substate can be read and written with a key.
##Chemical Species Example
For instance, a vector of counts of chemical species can be simply chemicals=zeros(Int, 20)
. In this case, the key is the integer index of the chemical and the value is an integer species count.
##Rabbits Running Example
If there are interchangeable rabbits running on a grid, and the rabbits can get sick, one possible representation specifies a grid of rabbits and whether they are sick. The key is a tuple (i, j)
which is a location on the board if j>0
, but if j==0
, then it's the disease state of rabbit i
.
type PhysicalState
board::Array{Int, 2}
disease::Array{Int, 1}
end
function getindex(state::PhysicalState, i, j)
if j>0
return state.board[i, j]
else
return state.disease[i]
end
end
function setindex!(state::PhysicalState, v, i, j)
if j>0
state.board[i, j]=v
else
state.disease[i]=v
end
end
##Susceptible-Infected-Recovered Example Want to be fancy? The key doesn't have to be a key. It can be an object that is, itself, the state. This is trickier. When defining the transitions, the transitions remember the keys they need, so they keep a pointer to the state through the keys.
type Count
v::Int
end
type SIR
s::Count
i::Count
r::Count
end
getindex(state::SIR, key::Count)
return key.v
end
setindex!(state::SIR, v::Int, key::Count)
key.v=v
end
This might be slower, but it does away with the notion of a key.