Hi all! I'm trying to use Catalyst to model two interacting systems in E. coli: a nutrient sensor and a motor subsystem. The sensor measures nutrient concentrations L and outputs the target motor speed λ. The motor moves depending on λ and measures the nutrient concentration L based on the current position of the cell.
In my case λ is best described as an observable, so I tried
using Catalyst
t = default_t()
@variables L(t) λ(t)
rec = @network_component rec begin
@observables begin
$λ ~ E / (E + Ep)
end
$(ParentScope(L)), E --> Ep
1., Ep --> 0
end
mot = @network_component mot begin
@equations begin
D($(ParentScope(L))) ~ $(ParentScope(λ))
end
end
rn = complete(ReactionSystem(t; name=:rn, systems=[rec, mot]))
u0 = [ rec.E => 0, rec.Ep => 10, L => 5 ]
tmax = 100.
prob = ODEProblem(rn, u0, (0, tmax); structural_simplify=true)
This yields
ERROR: ExtraVariablesSystemException: The system is unbalanced. There are 4 highest order derivative variables and 3 equations.
More variables than equations, here are the potential extra variable(s):
rec₊E(t)
rec₊Ep(t)
L(t)
λ(t)
Note that the process of determining extra variables is a best-effort heuristic. The true extra variables are dependent on the model and may not be in this list.
This is despite the system being well-defined (it can be written as an ODE in terms of E, Ep and L only. I am not sure how to eliminate λ. I'm not quite sure why structural_simplify is needed either, I guess this has to do with dependency resolution? Doing that manually (ouch) as follows:
mot = @network_component mot begin
@equations begin
D($L) ~ $(rec.E) / ($(rec.E) + $(rec.Ep))
end
end
yields
ERROR: LoadError: MethodError: no method matching recursive_escape_functions!(::QuoteNode, ::Vector{Union{Expr, Symbol}})
The function `recursive_escape_functions!` exists, but no method is defined for this combination of argument types.
Closest candidates are:
recursive_escape_functions!(!Matched::Union{Bool, Float64, Int64, Expr, Symbol}, ::Any)
@ Catalyst ~/.julia/packages/Catalyst/8qDWw/src/dsl.jl:983
recursive_escape_functions!(!Matched::Union{Bool, Float64, Int64, Expr, Symbol})
@ Catalyst ~/.julia/packages/Catalyst/8qDWw/src/dsl.jl:983
in expression starting at /home/user/code/mcpop/models/chemotaxis/testall.jl:15
Stacktrace:
(::Catalyst.var"#recursive_escape_functions!##0#recursive_escape_functions!##1"{Expr, Vector{Union{…}}})(i::Int64) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
foreach at [abstractarray.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
recursive_escape_functions!(expr::Expr, syms_skip::Vector{Union{Expr, Symbol}}) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
(::Catalyst.var"#recursive_escape_functions!##0#recursive_escape_functions!##1"{Expr, Vector{Union{…}}})(i::Int64) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
foreach at [abstractarray.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
recursive_escape_functions!(expr::Expr, syms_skip::Vector{Union{Expr, Symbol}}) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
(::Catalyst.var"#recursive_escape_functions!##0#recursive_escape_functions!##1"{Expr, Vector{Union{…}}})(i::Int64) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
foreach at [abstractarray.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
recursive_escape_functions!(expr::Expr, syms_skip::Vector{Union{Expr, Symbol}}) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
escape_equation!(eqexpr::Expr, all_syms::Vector{Union{Expr, Symbol}}) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
#get_rxexprs##2 at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
foreach(f::Catalyst.var"#get_rxexprs##2#get_rxexprs##3"{Vector{Union{Expr, Symbol}}, Expr}, itr::Vector{Expr}) at [abstractarray.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
get_rxexprs(reactions::Vector{Catalyst.DSLReaction}, equations::Vector{Expr}, all_syms::Vector{Union{Expr, Symbol}}) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
make_reaction_system(ex::Expr, name::QuoteNode) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
make_rs_expr(name::QuoteNode, network_expr::Expr; complete::Bool) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
kwcall(::@NamedTuple{complete::Bool}, ::typeof(Catalyst.make_rs_expr), name::QuoteNode, network_expr::Expr) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
var"@network_component"(__source__::LineNumberNode, __module__::Module, name::Symbol, network_expr::Expr) at [dsl.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
eval(m::Module, e::Any) at [boot.jl](vscode-file://vscode-app/opt/vscodium-bin/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
Adding ParentScope at random (I'm not sure how this works) doesn't fix anything. Any advice would be much appreciated!
Hi all! I'm trying to use Catalyst to model two interacting systems in
E. coli: a nutrient sensor and a motor subsystem. The sensor measures nutrient concentrationsLand outputs the target motor speedλ. The motor moves depending onλand measures the nutrient concentrationLbased on the current position of the cell.In my case
λis best described as an observable, so I triedThis yields
This is despite the system being well-defined (it can be written as an ODE in terms of E, Ep and L only. I am not sure how to eliminate λ. I'm not quite sure why
structural_simplifyis needed either, I guess this has to do with dependency resolution? Doing that manually (ouch) as follows:yields
Adding
ParentScopeat random (I'm not sure how this works) doesn't fix anything. Any advice would be much appreciated!