# julia { #tvbo.run.julia }

`run.julia`

Low-level Julia execution utilities for running generated Julia code.

This module provides functions for executing Julia code generated by TVBO templates (DifferentialEquations.jl, BifurcationKit.jl, NetworkDynamics.jl) and extracting results back into Python/NumPy.

Uses juliacall (``tvbo.adapters.julia``) for the Python↔Julia bridge, keeping full Julia objects available for interactive inspection.

## Functions

| Name | Description |
| --- | --- |
| [ensure_packages](#tvbo.run.julia.ensure_packages) | Ensure Julia packages are installed, installing if missing. |
| [extract_bifurcation_result](#tvbo.run.julia.extract_bifurcation_result) | Extract a bifurcation result from Julia Main. |
| [extract_ode_solution](#tvbo.run.julia.extract_ode_solution) | Extract time and state arrays from a Julia ODE/SDE solution. |
| [run_julia_code](#tvbo.run.julia.run_julia_code) | Execute a block of Julia code in the Main module. |
| [solution_to_dataarray](#tvbo.run.julia.solution_to_dataarray) | Build an ``xr.DataArray`` from a flat Julia ODE solution. |

### ensure_packages { #tvbo.run.julia.ensure_packages }

```python
run.julia.ensure_packages(*packages)
```

Ensure Julia packages are installed, installing if missing.



#### Parameters {.doc-section .doc-section-parameters}

packages : str
    Package names to ensure are available.

### extract_bifurcation_result { #tvbo.run.julia.extract_bifurcation_result }

```python
run.julia.extract_bifurcation_result()
```

Extract a bifurcation result from Julia Main.

Assumes ``bifurcation_result`` exists after running a BifurcationKit.jl script.



#### Returns: {.doc-section .doc-section-returns}

object
    The Julia BifurcationResult proxy.

### extract_ode_solution { #tvbo.run.julia.extract_ode_solution }

```python
run.julia.extract_ode_solution()
```

Extract time and state arrays from a Julia ODE/SDE solution.

Assumes a variable ``sol`` exists in Julia Main after running a DifferentialEquations.jl / NetworkDynamics.jl solve.



#### Returns: {.doc-section .doc-section-returns}

t : np.ndarray
    Time points, shape ``(n_t,)``.
u : np.ndarray
    State array, shape ``(n_states, n_t)``.
sol : object
    The raw Julia solution proxy for interactive use.

### run_julia_code { #tvbo.run.julia.run_julia_code }

```python
run.julia.run_julia_code(code, compiled_modules=True)
```

Execute a block of Julia code in the Main module.



#### Parameters {.doc-section .doc-section-parameters}

code : str
    Julia source code to evaluate.
compiled_modules : bool
    Passed to ``get_julia()``. Default True to use precompiled packages.



#### Returns: {.doc-section .doc-section-returns}

object
    The return value of the last Julia expression.

### solution_to_dataarray { #tvbo.run.julia.solution_to_dataarray }

```python
run.julia.solution_to_dataarray(t, u, sv_names, n_nodes, n_modes=1)
```

Build an ``xr.DataArray`` from a flat Julia ODE solution.

Reshapes ``u`` from flat ``(n_states, n_t)`` into dims ``(time, variable, node)`` — plus a trailing ``mode`` axis when ``n_modes > 1`` — with named coordinates.



#### Parameters {.doc-section .doc-section-parameters}

t : np.ndarray
    Time array, shape ``(n_t,)``.
u : np.ndarray
    Raw solution, shape ``(n_nodes * n_sv * n_modes, n_t)``. Multi-mode state
    variables are laid out as contiguous length-``n_modes`` blocks (see the
    Julia model template), so the flat index is ``sv * n_modes + mode``.
sv_names : list[str]
    State variable names (length determines n_sv).
n_nodes : int
    Number of nodes.
n_modes : int
    Number of modes (mode axis). ``1`` collapses to the plain 3-D container.



#### Returns: {.doc-section .doc-section-returns}

xr.DataArray
    Dims ``(time, variable, node[, mode])`` with coords.