References
EvolutionaryModelingTools.Reaction — TypeReaction{C,U}Contain a "calculate" function and an "update" function. The "calculate" function calculates the a "rate" of reaction with the system state, which determines the probability weight of the reaction be selected, and the "update" function updates the system state, when this reaction were selected randomly.
EvolutionaryModelingTools.gillespie! — Methodgillespie!(hook!, rng::AbstractRNG, c::ContinuousClock, ps::NamedTuple, rs::Tuple)Simulate the system using the Gillespie algorithm with the given parameters, and return a tuple of end time and the terminate state :finnish, :zero or any other state returns by the hook!. The terminate state :finnish means that simulation reach to the end time, and :zero means the simulation break because the total "reaction rate" is zero, besides, hook! should return a symbol terminate state like :break. if the return value of hook! is not :finnish, the simulation will be terminated. The clock c and parameters ps will be updated during the simulation.
Arguments
hook!: a function with similar arguments to "update" functions, and it's recommended to createhook!with@ufuncmacro; unlike "update" functions,hookwill be called after each reaction and should return a terminate state used to terminate the simulation if it is not:finnish.rng: a random number generator for generate random numbers;c: a clock recording time, which must be the reference clock of recorded variables inps;ps: a NamedTuple contains state, parameters even args used byhook!of the system;rs: a tuple contains reactions, all parameters required by reactions must be inpswith same name.
EvolutionaryModelingTools.gillespie — Methodgillespie([hook!, rng::AbstractRNG,] c, ps::NamedTuple, rs::Tuple)Simulate the system using the Gillespie algorithm with the given parameters, and return a tuple of updated ps, end time and terminate state. More about terminate state, see gillespie!.
Arguments
hook!: a function with similar arguments to "update" functions and recommended to created with@ufuncmacro; unlike "update" functions,hookwill be called after each reaction and should return a terminate state used to terminate the simulation if it is not:finnish.rng: a random number generator for generate random numbers;c: aContinuousClock, a end time or a tuple of a begin and a end time;ps: a NamedTuple contains state, parameters even args used byhook!of the system;rs: a tuple contains reactions, all parameters required by reactions must be inpswith same name.
In order to update single value state, it must be converted to a ScalarType with scalar.
EvolutionaryModelingTools.sample — Functionsample(A::AbstractArray{<:Real,N}, rn::Real) -> CartesianIndex{N}Select a cartesian index of given weight array A and random number rn, where A should be an AbstractArray with element type of Real.
Example
julia> A = reshape(1:4, 2, 2)
2×2 reshape(::UnitRange{Int64}, 2, 2) with eltype Int64:
1 3
2 4
julia> EvolutionaryModelingTools.sample(A, 1)
CartesianIndex(1, 1)
julia> EvolutionaryModelingTools.sample(A, 2)
CartesianIndex(2, 1)
julia> EvolutionaryModelingTools.sample(A, 4)
CartesianIndex(1, 2)
julia> EvolutionaryModelingTools.sample(A, 7)
CartesianIndex(2, 2)EvolutionaryModelingTools.@cfunc — Macro@cfunc exDefine a "calculation" function with an "adapter" methods used to parse args from model. "calculate" functions take arguments from system state and calculate "rate"s determining the probability weight of the reaction be selected.
Example
For function definition:
@cfunc @inline growth_c(r, x::Vector) = r * x # function to calculate "growth rate"This macro creates two methods, an "adapter" method
growth_c(args::NamedTuple) = growth_c(args.r, args.x)and the origin method
@inline growth_c(r, x::Vector) = r * xFor function definition with other macros, put those macros after this macro.
The argument name t is reserved for time. Don't use those variable names for other usage
EvolutionaryModelingTools.@quickloop — Macro@quickloop ex opts...
Generate a function to calculate given expression with nested loops.
Example
@quickloop x[i] * m[i, j] * y[j]will generate a function
(m, y, x)->begin
ret = Array{...}(undef, size(m, 1), size(m, 2)) # expression for type inference is omitted
@fastmath @inbounds for j = axes(m, 2), i = axes(m, 1)
ret[i, j] = x[i] * m[i, j] * y[j]
end
return ret
endwhere the size of return array is determined automatically. The size can be specified by
@quickloop z[j, i] := x[i] * m[i, j] * y[j]which will generate a function
(m, y, x)->begin
z = Array{...}(undef, size(m, 2), size(m, 1)) # expression for type inference is omitted
@fastmath @inbounds for i = axes(m, 1), j = axes(m, 2)
z[j, i] = x[i] * m[i, j] * y[j]
end
return z
endwhere the return value is named by z and the size of return array is (size(m, 2), size(m, 1)) instead of (size(m, 1), size(m, 2)).
Options
Options should be specified like @quickloop ex opt=true/false or @quickloop ex opt, if the value of option is omitted, it will be treated as true.
avxorturbo: useLoopVectorizationto accelerate the loop, default isfalse, unlessLoopVectorizationhave be loaded.inbounds: use@inboundsto accelerate the loop, default istrue, this option is ignored ifavxorturbois enabled.fastmath: use@fastmathto accelerate the loop, default istrue, this option is ignored ifavxorturbois enabled.offset: iftrue, input arrays will be treat as offset arrays, default isfalse.
The order of function arguments generated by this macro is undetermined. Thus, it's recommender use this macro inside of @reaction, which detect the order of function arguments automatically.
EvolutionaryModelingTools.@reaction — Macro@reaction name exDefine a Reaction with the given name and ex.
@reaction growth begin
r * x # "calculate" expression
begin
i = ind[1]
x[i] += 1 # "update" expression
end
endwill create a Reaction with a "calculation" function:
@cfunc Base.@propagate_inbounds growth_c(r, x) = r * xand an "update" function:
@ufunc Base.@propagate_inbounds growth_u!(ind, x) = begin
i = ind[1]
x[i] += 1
endwhere arguments of functions were collected from given expression automatically.
If there are global variables, this macro may can not collect arguments correctly. Especially, for functions which accept function and types as arguments, those functions and types may also be collect as an arguments. Thus, these variables must be marked as global variables by global before use them, even functions and types. Besides, type annotation expressions like x::Vector{Int}, types Vector and Int will not be collected. Avoid to defined your reaction with a type arguments for type annotation.
The expression follow the same name preserve rule as @cfunc and @ufunc, don't use those variable names for other usage.
This macro cannot parse macro expression. Thus in some cases, arguments of expression with macro may not be collected correctly. To avoid this, define reaction with anonymous functions may helpfully:
@reaction reaction begin
(A, B) -> @einsum C[i, k] := A[i, j] * B[j, k] # where C, i, j, k should not be collected
begin
# do something
end
endin this case, only arguments of anonymous function (A and B) will be collected.
Besides, there are another macro @quickloop, which is similar to @einsum, but it don't follow the einstein convenience which just generate nest loops out of the expression. Because the @quickloop generate a function and arguments are provided, indexing variables and return variable will not be collected.
EvolutionaryModelingTools.@reaction_eq — Macro@reaction_eq name param eq [opts...]Generate a reaction with the given name, parameters and equation.
Example
@reaction growth r X[i] --> 2X[i]is equivalent to
@reaction growth begin
r * X
begin
i = ind[1]
X[i] += 1
end
endEvolutionaryModelingTools.@ufunc — Macro@ufunc exDefine a "update" function with an "adapter" methods used to parse args from model. "update" functions take arguments from system state and update system state.
Example
For function definition:
@ufunc Base.@propagate_inbounds growth_u!(ind::CartesianIndex{1}, x) = x[ind] += 1This macro creates two methods, an "adapter" method
growth_u!(ind, args::NamedTuple) = growth_u(ind, args.x)and the origin method
Base.@propagate_inbounds growth_u!(ind::CartesianIndex{1}, x) = x[ind] += 1For function definition with other macros, put those macros after this macro.
The argument name t is reserved for time, arguments name rng is reserved for random number generator, and the argument name ind is preserved for index of "reaction". Don't use those variable names for other usage
EvolutionaryModelingTools.Scalar.ScalarType — TypeScalarType{T}ScalarType is a type of number used to represent a scalar value in a model. Its value is accessible via getindex and can be updated via setindex!.
EvolutionaryModelingTools.Scalar.scalar — Functionscalar(x)Convert x to a ScalarType.