julia_model
adapters.julia_model
Prepared codegen context for the Julia model templates.
The Julia backends (DifferentialEquations.jl, NetworkDynamics.jl, ModelingToolkit.jl) share the same metadata → Julia translation logic: which state variables/parameters become symbols, which optional packages are needed, how conditional derived variables fold into ifelse, and how multi-mode models lay their state out along a mode axis.
This module owns that logic so the Mako templates stay slim — they only emit syntax from the dict returned by :func:build_model_context (and the small helpers here). Mirrors the “resolve in Python, not Mako” convention used by the other adapters.
Attributes
| Name | Description |
|---|---|
| JULIA_SOLVER_PACKAGES | |
| JULIA_SPECIAL_FUNCTIONS |
Functions
| Name | Description |
|---|---|
| build_model_context | Build the full DifferentialEquations.jl model-function context. |
| equation_rhs_text | Concatenated text of every SV / derived-variable / derived-parameter equation. |
| julia_ode_package | OrdinaryDiffEq sub-package providing solver_method (default: umbrella). |
| make_renderer | Return a renderer bound to this model’s symbol table. |
| needs_nanmath | True if any equation contains a Piecewise. |
| needs_special_functions | True if any equation calls a SpecialFunctions.jl function (erf, gamma, …). |
| parse_namespace | How this model’s equations parse, as keyword arguments for parse_eq. |
| symbol_names | Return (sv, params, coupling, derived_vars, derived_params) name lists. |
build_model_context
adapters.julia_model.build_model_context(model, network=None, constraints=None)Build the full DifferentialEquations.jl model-function context.
Everything the tvbo-julia-model.jl.mako / tvbo-julia-ODEProblem.jl.mako templates need is pre-rendered here so those templates only emit syntax.
Multi-mode models (number_of_modes > 1) lay each state variable out as a contiguous length-n_modes block, so the dfun operates on per-mode vectors and writes vector slices (dx[lo:hi] .= …); scalar models keep the flat layout.
When network is supplied (a multi-node Network), the model is emitted as a coupled network: the state is laid out as n_nodes blocks per state variable, each long-range coupling term becomes a connectivity matvec (c = W · s_coupling) evaluated once per step, and the per-node scalar RHS runs inside a for i in 1:N loop — reusing the single-node equation emission verbatim (no vectorised broadcasting). This is the vector field a whole-brain equilibrium/periodic-orbit continuation (e.g. Deco 2014 Fig 2c) continues in G.
equation_rhs_text
adapters.julia_model.equation_rhs_text(model)Concatenated text of every SV / derived-variable / derived-parameter equation.
Used to sniff which optional Julia packages the emitted model needs. Resolved through the parser rather than read off .rhs, because an equation stated purely as conditional branches has no rhs to read: the sniff would see "None", miss the Piecewise it contains, and emit a model that uses NaNMath without importing it.
julia_ode_package
adapters.julia_model.julia_ode_package(solver_method)OrdinaryDiffEq sub-package providing solver_method (default: umbrella).
make_renderer
adapters.julia_model.make_renderer(model, fmt='julia')Return a renderer bound to this model’s symbol table.
Takes an Equation as readily as an expression or a string, resolving it through the one parser, so a caller never has to know whether the equation states itself as a right-hand side or as conditional branches. Reaching for .rhs at the call site works only for the first kind and yields None for the second.
needs_nanmath
adapters.julia_model.needs_nanmath(model)True if any equation contains a Piecewise.
The Julia printer routes domain-restricted powers inside Piecewise branches through NaNMath (NaN instead of DomainError, matching numpy/JAX), so those models must import NaNMath.
needs_special_functions
adapters.julia_model.needs_special_functions(model)True if any equation calls a SpecialFunctions.jl function (erf, gamma, …).
parse_namespace
adapters.julia_model.parse_namespace(model)How this model’s equations parse, as keyword arguments for parse_eq.
Both flavours of model reach this adapter, the runtime Dynamics in tvbo.classes and the generated one a heterogeneous node’s inline dynamics is, and both carry the symbolic layer, so each is parsed against the table its own equations were.
symbol_names
adapters.julia_model.symbol_names(model)Return (sv, params, coupling, derived_vars, derived_params) name lists.
These are exactly the names the Julia expression printer must treat as bare symbols rather than trying to resolve.