# Example systems

## Continuous

### Mediated link

`CausalityTools.ExampleSystems.mediated_link`

— Method```
mediated_link(;u₀ = rand(9), ωx = 1, ωy = 1.015, ωz = 0.985,
k = 0.15, l = 0.2, m = 10.0,
c = 0.06) → ContinuousDynamicalSystem
```

Initialise a three-subsystem dynamical system where `X`

and `Y`

are driven by `Z`

. At the default value of the coupling constant `c = 0.06`

, the responses `X`

and `Y`

are already synchronized to the driver `Z`

.

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} dx_1 &= -\omega_x x_2 - x_3 + c*(z_1 - x_1) \\ dx_2 &= \omega_x x_1 + k*x_2 \\ dx_3 &= l + x_3(x_1 - m) \\ dy_1 &= -\omega_y y_2 - y_3 + c*(z_1 - y_1) \\ dy_2 &= \omega_y y_1 + k*y_2 \\ dy_3 &= l + y_3(y_1 - m) \\ dz_1 &= -\omega_z z_2 - z_3 \\ dz_2 &= \omega_z z_1 + k*z_2 \\ dz_3 &= l + z_3(z_1 - m) \end{aligned}\]

**References**

- Krakovská, Anna, et al. "Comparison of six methods for the detection of causality in a bivariate time series." Physical Review E 97.4 (2018): 042207

### Two bidirectionally coupled 3D Lorenz systems

`CausalityTools.ExampleSystems.lorenz_lorenz_bidir`

— Function```
lorenz_lorenz_bidir(; u0 = rand(6),
c_xy = 0.2, c_yx = 0.2,
a₁ = 10, a₂ = 28, a₃ = 8/3,
b₁ = 10, b₂ = 28, b₃ = 9/3) → ContinuousDynamicalSystem
```

Initialise a bidirectionally coupled Lorenz-Lorenz system, where each subsystem is a 3D Lorenz system [1]. Default values for the parameters `a₁`

, `a₂`

, `a₃`

, `b₁`

, `b₂`

, `b₃`

are as in [1].

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x_1} &= -a_1 (x_1 - x_2) + c_{yx}(y_1 - x_1) \\ \dot{x_2} &= -x_1 x_3 + a_2 x_1 - x_2 \\ \dot{x_3} &= x_1 x_2 - a_3 x_3 \\ \dot{y_1} &= -b_1 (y_1 - y_2) + c_{xy} (x_1 - y_1) \\ \dot{y_2} &= -y_1 y_3 + b_2 y_1 - y_2 \\ \dot{y_3} &= y_1 y_2 - b_3 y_3 \end{aligned}\]

**References**

- Amigó, José M., and Yoshito Hirata. "Detecting directional couplings from multivariate flows by the joint distance distribution." Chaos: An Interdisciplinary Journal of Nonlinear Science 28.7 (2018): 075302.

### Two bidirectionally coupled 3D Lorenz systems forced by another 3D Lorenz system

`CausalityTools.ExampleSystems.lorenz_lorenz_lorenz_bidir_forced`

— Function```
lorenz_lorenz_lorenz_bidir_forced(; u0 = rand(9),
c_xy = 0.1, c_yx = 0.1,
c_zx = 0.05, c_zy = 0.05,
a₁ = 10, a₂ = 28, a₃ = 8/3,
b₁ = 10, b₂ = 28, b₃ = 8/3,
c₁ = 10, c₂ = 28, c₃ = 8/3)
```

Initialise a system consisting of two bidirectionally coupled 3D Lorenz systems forced by an external 3D Lorenz system, giving a 9D system.

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x_1} &= - a_1 (x_1 - x_2) + c_{yx}(y_1 - x_1) + c_{zx}(z_1 - x_1) \\ \dot{x_2} &= - x_1 x_3 + a_2 x_1 - x_2 \\ \dot{x_3} &= x_1 x_2 - a_3 x_3 \\ \dot{y_1} &= -b_1 (y_1 - y_2) + c_{xy} (x_1 - y_1) + c_{zy}(z_1 - y_1) \\ \dot{y_2} &= - y_1 y_3 + b_2 y_1 - y_2 \\ \dot{y_3} &= y_1 y_2 - b_3 y_3 \\ \dot{z_1} &= - c_1 (z_1 - z_2) \\ \dot{z_2} &= - z_1 z_3 + c_2 z_1 - z_2 \\ \dot{z_3} &= z_1 z_2 - c_3 z_3 \end{aligned}\]

**References**

- Amigó, José M., and Yoshito Hirata. "Detecting directional couplings from multivariate flows by the joint distance distribution." Chaos: An Interdisciplinary Journal of Nonlinear Science 28.7 (2018): 075302.

### Three transitively connected 3D Lorenz systems

`CausalityTools.ExampleSystems.lorenz_lorenz_lorenz_transitive`

— Function```
lorenz_lorenz_lorenz_transitive(;u₀=rand(9),
σ₁ = 10.0, σ₂ = 10.0, σ₃ = 10.0,
ρ₁ = 28.0, ρ₂ = 28.0, ρ₃ = 28.0,
β₁ = 8/3, β₂ = 8/3, β₃ = 8.3,
c₁₂ = 1.0, c₂₃ = 1.0) → ContinuousDynamicalSystem
```

Initalise a dynamical system consisting of three coupled Lorenz attractors with a transitive causality chain where X₁ → X₂ and X₂ → X₃. In total, the three 3D-subsystems create a 9-dimensional dynamical system.

The strength of the forcing X₁ → X₂ is controlled by the parameter `c₁`

, and the forcing from X₂ → X₃ by `c₂`

. The remaining parameters are the usual parameters for the Lorenz system, where the subscript `i`

refers to the subsystem Xᵢ.

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x_1} &= \sigma_1(y_1 - x_1) \\ \dot{y_1} &= \rho_1 x_1 - y_1 - x_1 z_1 \\ \dot{z_1} &= x_1 y_1 - \beta_1 z_1 \\ \dot{x_2} &= \sigma_2 (y_2 - x_2) + c_{12}(x_1 - x_2) \\ \dot{y_2} &= \rho_2 x_2 - y_2 - x_2 z_2 \\ \dot{z_2} &= x_2 y_2 - \beta_2 z_2 \\ \dot{x_3} &= \sigma_3 (y_3 - x_3) + c_{23} (x_2 - x_3) \\ \dot{y_3} &= \rho_3 x_3 - y_3 - x_3 z_3 \\ \dot{z_3} &= x_3 y_3 - \beta_3 z_3 \end{aligned}\]

**Usage in literature**

This system was studied by Papana et al. (2013) for coupling strengths $c_{12} = 0, 1, 3, 5$ and $c_{23} = 0, 1, 3, 5$.

**References**

- Papana et al., Simulation Study of Direct Causality Measures in Multivariate Time Series. Entropy 2013, 15(7), 2635-2661; doi:10.3390/e15072635

### Two bidirectionally coupled 3D Rössler systems

`CausalityTools.ExampleSystems.rossler_rossler_bidir`

— Function```
rossler_rossler_bidir(; u0 = rand(6),
ω₁ = 1.015, ω₂ = 0.985,
c_xy = 0.1, c_yx = 0.1,
a₁ = 0.15, a₂ = 0.2, a₃ = 10,
b₁ = 0.15, b₂ = 0.2, b₃ = 10)
```

Initialise a system of two bidirectionally coupled 3D Rössler systems. This system has been modified from [1] to allow other parameterisations, but default parameters are as in [1].

The $X$ and $Y$ subsystems are mostly synchronized for `c_xy > 0.1`

or `c_yx > 0.1`

.

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x_1} &= -\omega_1(x_2 + x_3) + c_{yx}(y_1 - x_1) \\ \dot{x_2} &= \omega_1 x_1 + a_1 x_2 \\ \dot{x_3} &= a_2 + x_3 (x_1 - a_3) \\ \dot{y_1} &= -\omega_2 (y_2 + y_3) + c_{xy}(x_1 - y_1) \\ \dot{y_2} &= \omega_2 y_1 + b_1 y_2 \\ \dot{y_3} &= b_2 + y_3 (y_1 - b_3) \end{aligned}\]

**References**

- Amigó, José M., and Yoshito Hirata. "Detecting directional couplings from multivariate flows by the joint distance distribution." Chaos: An Interdisciplinary Journal of Nonlinear Science 28.7 (2018): 075302.

### Two bidirectionally coupled 3D Rössler systems forced by another 3D Rössler system

`CausalityTools.ExampleSystems.rossler_rossler_rossler_bidir_forced`

— Function```
rossler_rossler_rossler_bidir_forced(; u0 = rand(9),
ω₁ = 1.015, ω₂ = 0.985, ω₃ = 0.95,
c_xy = 0.1, c_yx = 0.1,
c_zx = 0.05, c_zy = 0.05,
a₁ = 0.15, a₂ = 0.2, a₃ = 10,
b₁ = 0.15, b₂ = 0.2, b₃ = 10,
c₁ = 0.15, c₂ = 0.2, c₃ = 10)
```

Equations of motion for a system consisting of three coupled 3D Rössler systems ($X$, $Y$, $Z$), giving a 9D system [1]. The external system $Z$ influences both $X$ and $Y$ (controlled by `c_zx`

and `c_zy`

). Simultaneously, the subsystems $X$ and $Y$ bidirectionally influences each other (controlled by `c_xy`

and `c_yx`

).

The $X$ and $Y$ subsystems are mostly synchronized for `c_xy > 0.1`

or `c_yx > 0.1`

.

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x_1} &= -\omega_1 (x_2 + x_3) + c_{yx}(y_1 - x_1) + c_{zx}(z_1 - x_1) \\ \dot{x_2} &= \omega_1 x_1 + a_1 x_2 \\ \dot{x_3} &= a_2 + x_3 (x_1 - a_3) \\ \dot{y_1} &= -\omega_1 (y_2 + y_3) + c_{xy}(x_1 - y_1) + c_{zy}(z_1 - y_1) \\ \dot{x_2} &= \omega_2 y_1 + b_1 y_2 \\ \dot{x_3} &= b_2 + x_3 (y_1 - b_3) \\ \dot{y_1} &= -\omega_2 (z_2 + z_3) \\ \dot{x_2} &= \omega_2 z_1 + c_1 z_2 \\ \dot{x_3} &= c_2 + z_3 (z_1 - c_3) \end{aligned}\]

**References**

### Unidirectonal forcing from a 3D Rössler system to a 3D Lorenz system

`CausalityTools.ExampleSystems.rossler_lorenz`

— Function```
rossler_lorenz(;u₀ = rand(6), a₁ = -6, a₂ = 6, a₃ = 2.0,
b₁ = 10, b₂ = 28, b₃ = 8/3, c_xy = 1) → ContinuousDynamicalSystem
```

Initialise a Rössler-Lorenz system consisting of two independent 3D subsystems: one Rössler system and one Lorenz system. They are coupled such that the second component (`x₂`

) of the Rössler system unidirectionally forces the second component (`y₂`

) of the Lorenz system.

The parameter `c_xy`

controls the coupling strength. The implementation here also allows for tuning the parameters of each subsystem by introducing the constants `a₁`

, `a₂`

, `a₃`

, `b₁`

, `b₂`

, `b₃`

. Default values for these parameters are as in [1].

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot x_1 &= a_1(x_2 + x_3) \\ \dot x_2 &= a_2(x_1 + 0.2x_2) \\ \dot x_3 &= a_2(0.2 + x_3(x_1 - a_3)) \\ \dot y_1 &= b_1(y_2 - y_1) \\ \dot y_2 &= y_1(b_2 - y_3) - y_2 +c_{xy}(x_2)^2 \\ \dot y_3 &= y_1 y_2 - b_3y_3 \end{aligned}\]

with the coupling constant $c_{xy} \geq 0$.

**References**

- Krakovská, Anna, et al. "Comparison of six methods for the detection of causality in a bivariate time series." Physical Review E 97.4 (2018):042207. https://journals.aps.org/pre/abstract/10.1103/PhysRevE.97.042207

### N-scroll Chua attractors

`CausalityTools.ExampleSystems.chuacircuit_nscroll_sine`

— Function```
chuacircuit_nscroll_sine(;u₀ = [0.0, 0.0, 0.28695],
α = 10.814, β = 14, γ = 0, a = 1.3, b = 0.11, c = 2,
σx = 0.0, σy = 0.0, σz = 0.0)
```

Initialise an adjusted Chua system giving rise to n-scroll attractors [1].

**Equations of motion**

The dynamics is generated by the following vector field

\[\begin{aligned} \dot{x} = \alpha (y - fx) + \eta x \\ \dot{y} = x - y + z + \eta y \\ \dot{z} = -\beta y - \gamma z + \eta z \end{aligned}\]

where $\eta x$, $\eta z$, and $\eta z$ are drawn independently from normal distributions with zero mean and standard deviations `σx`

, `σy`

and `σz`

at each iteration.

$fx$ is given by the following conditions:

```
n::Int = c + 1
if x >= 2*a*c
fx = (b*pi/2*a)*(x - 2*a*c)
elseif -2*a*c < x < 2*a*c
d = ifelse(isodd(n), pi, 0)
fx = -b*sin((pi*x/2*a) + d)
elseif x <= -2*a*c
fx = (b*pi/2*a)*(x + 2*a*c)
end
```

**References**

- Tang, Wallace KS, et al. "Generation of n-scroll attractors via sine function." IEEE Transactions on Circuits and Systems I: Fundamental Theory and Applications 48.11 (2001): 1369-1372.

### Repressilator

`CausalityTools.ExampleSystems.repressilator`

— Function```
repressilator(;u₀ = rand(6), α = 10.0, α₀ = 0.0, β = 100.0,
n = 2) → ContinuousDynamicalSystem
```

A six-dimensional repressilator (or repression-driven oscillator) from Elowitz & Leibler (2000)^{[Elowitz2000]}. The equations are scaled to be non-dimensional.

Used in Sun & Bollt (2014) to study the performance of the causation entropy algorithm.

## Discrete

### Ulam map

`CausalityTools.ExampleSystems.ulam`

— Function`ulam(D::Int = 10; u₀ = rand(D), ε::Real = 0.10) → DiscreteDynamicalSystem`

A lattice of `D`

unidirectionally coupled ulam maps^{[Schreiber2000]} defined as

\[x^{m}_{t+1} = f(\epsilon x^{m-1}_{t} + (1 - \epsilon) x_{t}^{m}),\]

where $m = 1, 2, \ldots, D$ and $f(x) = 2 - x^2$. In this system, information transfer happens only in the direction of increasing $m$.

### Autoregressive order one 2D system

`CausalityTools.ExampleSystems.ar1_unidir`

— Function```
ar1_unidir(u₀, a₁ = 0.90693, b₁ = 0.40693, c_xy = 0.5,
σ = 0.40662) → DiscreteDynamicalSystem
```

A bivariate, order one autoregressive model, where $x \to y$ [1].

**Equations of motion**

\[\begin{aligned} x(t+1) &= a_1 x(t) + \xi_{1} \\ y(t+1) &= b_1 y(t) - c_{xy} x + \xi_{2}, \end{aligned}\]

where $\xi_{1}$ and $\xi_{2}$ are drawn from normal distributions with zero mean and standard deviation `σ`

at each iteration.

**References**

- Paluš, M., Krakovská, A., Jakubík, J., & Chvosteková, M. (2018). Causality, dynamical systems and the arrow of time. Chaos: An Interdisciplinary Journal of Nonlinear Science, 28(7), 075307. http://doi.org/10.1063/1.5019944

### Nonlinear 3D system with nonlinear coupling

`CausalityTools.ExampleSystems.nonlinear3d`

— Function```
nonlinear3d(;u₀ = rand(3),
σ₁ = 1.0, σ₂ = 1.0, σ₃ = 1.0,
a₁ = 3.4, a₂ = 3.4, a₃ = 3.4,
b₁ = 0.4, b₂ = 0.4, b₃ = 0.4,
c₁₂ = 0.5, c₂₃ = 0.3, c₁₃ = 0.5) → DiscreteDynamicalSystem
```

A 3d nonlinear system with nonlinear couplings $x_1 \to x_2$, $x_2 \to x_3$ and $x_1 \to x_3$. Modified from [1].

**Equations of motion**

The equations of motion are

\[\begin{aligned} x_1(t+1) &= a_1 x_1 (1-x_1(t))^2 e^{-x_2(t)^2} + 0.4 \xi_{1}(t) \\ x_2(t+1) &= a_1 x_2 (1-x_2(t))^2 e^{-x_2(t)^2} + 0.4 \xi_{2}(t) + b x_1 x_2 \\ x_3(t+1) &= a_3 x_3 (1-x_3(t))^2 e^{-x_3(t)^2} + 0.4 \xi_{3}(t) + c x_{2}(t) + d x_{1}(t)^2. \end{aligned}\]

**References**

- Gourévitch, B., Le Bouquin-Jeannès, R., & Faucon, G. (2006). Linear and nonlinear causality between signals: methods, examples and neurophysiological applications. Biological Cybernetics, 95(4), 349–369.

### Unidirectionally coupled 2D logistic maps

`CausalityTools.ExampleSystems.logistic2_unidir`

— Function```
logistic2(;u₀ = rand(2), c_xy = 0.1, σ = 0.05,
r₁ = 3.78, r₂ = 3.66) → DiscreteDynamicalSystem
```

Initialise a system consisting of two coupled logistic maps where X unidirectionally influences Y. By default, the parameters `r₁`

and `r₂`

are set to values yielding chaotic behaviour.

**Equations of motion**

The equations of motion are

\[\begin{aligned} x(t+1) &= r_1 x(t)(1 - x(t)) \\ y(t+1) &= r_2 f(x,y)(1 - f(x,y)), \end{aligned}\]

with

\[\begin{aligned} f(x,y) = \dfrac{y + \frac{c_{xy}(x \xi )}{2}}{1 + \frac{c_{xy}}{2}(1+ \sigma )} \end{aligned}\]

The parameter `c_xy`

controls how strong the dynamical forcing is. If `σ > 0`

, dynamical noise masking the influence of `x`

on `y`

equivalent to $\sigma \cdot \xi$ is added at each iteration. Here,$\xi$ is a draw from a flat distribution on $[0, 1]$. Thus, setting `σ = 0.05`

is equivalent to add dynamical noise corresponding to a maximum of $5 \%$ of the possible range of values of the logistic map.

**References**

- Diego, David, Kristian Agasøster Haaga, and Bjarte Hannisdal. "Transfer entropy computation using the Perron-Frobenius operator." Physical Review E 99.4 (2019): 042212.

### Bidirectionally coupled 2D logistic maps

`CausalityTools.ExampleSystems.logistic2_bidir`

— Function```
logistic2_bidir(;u₀ = rand(2), c_xy = 0.1, c_yx = 0.1,
r₁ = 3.78, r₂ = 3.66, σ_xy = 0.05, σ_yx = 0.05)
```

A bidirectional logistic model for the chaotic population dynamics of two interacting species [1].

**Equations of motion**

The equations of motion are

\[\begin{align} x(t+1) &= r_1 f_{yx}^{t}(1 - f_{yx}^{t}) \\ y(t+1) &= r_2 f_{xy}^{t}(1 - f_{xy}^{t}) \\ f_{xy}^t &= \dfrac{y(t) + c_{xy}(x(t) + \sigma_{xy} \xi_{xy}^t )}{1 + c_{xy} (1 + \sigma_{xy} )} \\ f_{yx}^t &= \dfrac{x(t) + c_{yx}(y(t) + \sigma_{yx} \xi_{yx}^t )}{1 + c_{yx} (1 + \sigma_{yx} )}, \end{align}\]

where the coupling strength $c_{xy}$ controls how strongly species $x$ influences species $y$, and vice versa for $c_{yx}$. To simulate time-varying influence of unobserved processes, we use the dynamical noise terms $\xi_{xy}^t$ and $\xi_{yx}^t$, drawn from a uniform distribution with support on $[0, 1]$. If $\sigma_{xy} > 0$, then the influence of $x$ on $y$ is masked by dynamical noise equivalent to $\sigma_{xy} \xi_{xy}^{t}$ at the $t$-th iteration of the map, and vice versa for $\sigma_{yx}$.

**References**

- Diego, David, Kristian Agasøster Haaga, and Bjarte Hannisdal. "Transfer entropy computation using the Perron-Frobenius operator." Physical Review E 99.4 (2019): 042212.

### Forcing of two independent logistic maps from common logistic map driver

`CausalityTools.ExampleSystems.logistic3`

— Function```
logistic3(;u₀ = rand(3), r = 4,
σx = 0.05, σy = 0.05, σz = 0.05) → DiscreteDynamicalSystem
```

Initialise a dynamical system consisting of three coupled logistic map representing the response of two independent dynamical variables to the forcing from a common driver. The dynamical influence goes in the directions $Z \to X$ and $Z \to Y$.

**Equations of motion**

The equations of motion are

\[\begin{aligned} x(t+1) = (x(t)(r - r_1 x(t) - z(t) + σ_x η_x)) \mod 1 \\ y(t+1) = (y(t)(r - r_2 y(t) - z(t) + σ_y η_y)) \mod 1 \\ z(t+1) = (z(t)(r - r_3 z(t) + σ_z η_z)) \mod 1 \end{aligned}\]

Dynamical noise may be added to each of the dynamical variables by tuning the parameters `σz`

, `σx`

and `σz`

. Default values for the parameters `r₁`

, `r₂`

and `r₃`

are set such that the system exhibits chaotic behaviour, with `r₁ = r₂ = r₃ = 4`

.

**References**

- Runge, Jakob. Causal network reconstruction from time series: From theoretical assumptions to practical estimation, Chaos 28, 075310 (2018); doi: 10.1063/1.5025050

### Unidirectional, transitive chain of logistic maps

`CausalityTools.ExampleSystems.logistic4`

— Function```
logistic4(;u₀ = rand(4), r₁ = 3.9, r₂ = 3.6, r₃ = 3.6, r₄ = 3.8,
c₁₂ = 0.4, c₂₃ = 0.4, c₃₄ = 0.35) → DiscreteDynamicalSystem
```

Initialise a system of a transitive chain of four unidirectionally coupled logistic maps, where $y_1 \to y_2 \to y_3 \to y_4$ [1]. Default parameters are as in [1].

*Note: With the default parameters which are as in [1], for some initial conditions, this system wanders off to $\pm \infty$ for some of the variables. Make sure that you have a good realisation before using the orbit for anything.*

**Equations of motion**

\[\begin{aligned} y_1(t+1) &= y_1(t)(r_1 - r_1 y_1) \\ y_2(t+1) &= y_2(t)(r_2 - c_{12} y_1 - r_2 y_2) \\ y_3(t+1) &= y_3(t)(r_3 - c_{23} y_2 - r_3 y_3) \\ y_4(t+1) &= y_4(t)(r_4 - c_{34} y_3 - r_4 y_4) \end{aligned}\]

**References**

- Ye, Hao, et al. "Distinguishing time-delayed causal interactions using convergent cross mapping." Scientific reports 5 (2015): 14750

### Two unidirectionally coupled Henon maps

`CausalityTools.ExampleSystems.henon2`

— Function`henon2(;u₀ = rand(4), c_xy = 2.0) → DiscreteDynamicalSystem`

Initialize a 2D Henon system consisting of two identical Henon maps with unidirectional forcing $X \to Y$ [1].

**Equations of motion**

The equations of motion are

\[\begin{aligned} x_1(t+1) &= 1.4 - x_1^2(t) + 0.3x_2(t) \\ x_2(t+1) &= x_1(t) \\ y_1(t+1) &= 1.4 - [c_{xy} x_1(t) y_1(t) + (1-c_{xy}) y_1^2(t)] + 0.3 y_2(t) \\ y_2(t+1) &= y_1(t) \end{aligned}\]

**References**

- Krakovská, A., Jakubík, J., Chvosteková, M., Coufal, D., Jajcay, N., & Paluš, M. (2018). Comparison of six methods for the detection of causality in a bivariate time series. Physical Review E, 97(4), 042207.

### Strange, nonchaotic attractors

`CausalityTools.ExampleSystems.anishchenko1`

— Function`anishchenko1(;u₀ = rand(2), α =3.277, s=0.1, ω=0.5*(sqrt(5)-1)) → DiscreteDynamicalSystem`

Initialise the system defined by eq. 13 in [1], which can give strange, nonchaotic attractors.

**Equations of motion**

The equations of motion are

\[\begin{aligned} dx &= \alpha (1-s \cos (2 \pi \phi )) \cdot x(1-x) \\ dϕ &= (\phi + \omega ) \mod{1} \end{aligned}\]

**References**

- Anishchenko, Vadim S., and Galina I. Strelkova. "Irregular attractors." Discrete dynamics in Nature and Society 2.1 (1998): 53-72.

### Bidirectional Ikeda map

`CausalityTools.ExampleSystems.ikeda`

— Function```
ikeda(; u₀ = rand(2), c_xy = 1.0, c_yx = 1.0, a = 0.8, b = 12, c = 0.9,
r₁ = rand(Uniform(0.01, 0.3)), r₂ = rand(Uniform(0.01, 0.3)), σ = 0.05)
```

Initialise a discrete two-dimensional Ikeda map system, adapted from [1] by adding a noise term and allowing the influences from $x \to y$ ($c_{xy}$) and from $y \to x$ ($c_{yx}$) to be adjusted.

As a rule-of-thumb, if parameters `a`

, `b`

, and `c`

are drawn from uniform distributions on `[0.8, 1.5]`

, `[10, 14]`

and `[0.1, 0.9]`

.

The difference equations are

\[\begin{aligned} x(t+1) = 1 + \mu(x \cos{(\theta)} - c_{yx} y \sin{(\theta)}) - min(\dfrac{\sigma \xi_{t}^{(1)})}{(1-x)}, \xi_{t}^{(2)} \\ y(t+1) = \mu(y \cos{(\theta)} - c_{xy} x \sin{(\theta)}) - min(\dfrac{\sigma \zeta_{t}^{(1)})}{(1-y)}, \zeta_{t}^{(2)} \end{aligned}\]

**References**

- Cao, Liangyue, Alistair Mees, and Kevin Judd. "Modeling and predicting non-stationary time series." International Journal of Bifurcation and Chaos 7.08 (1997): 1823-1831.

### Noise

`CausalityTools.ExampleSystems.noise_uu`

— Function`noise_uu(n::Int, lo = - 1, hi = 1)`

Generate a signal consisting of `n`

steps of uncorrelated uniform noise from a uniform distribution on `[lo, hi]`

.

`CausalityTools.ExampleSystems.noise_ug`

— Function`noise_ug(n::Int; μ = 0, σ = 1)`

Generate a signal consisting of `n`

steps of uncorrelated Gaussian noise from a normal distribution with mean `μ`

and standard deviation `σ`

.

`CausalityTools.ExampleSystems.noise_brownian`

— Function```
noise_brownian(n::Int; lo = - 1, hi = 1)
noise_brownian(d::Distribution, n::Int)
```

Generate a signal consisting of `n`

steps of Brownian noise, generated as the zero-mean and unit standard deviation normalised cumulative sum of noise generated from a uniform distribution on `[lo, hi]`

. Optionally, a distribution `d`

from which to sample can be provided.

**Examples**

```
# Based on uncorrelated uniform noise
noise_brownian(100)
noise_brownian(100, lo = -2, hi = 2)
noise_brownian(Uniform(-3, 3), 100)
# Based on uncorrelated Gaussian noise
μ, σ = 0, 2
noise_brownian(Normal(μ, σ), 100)
```

- Elowitz2000Elowitz, M. B., & Leibler, S. (2000). A synthetic oscillatory network of transcriptional regulators. Nature, 403(6767), 335-338.
- Sun2014Sun, J., Cafaro, C., & Bollt, E. M. (2014). Identifying the coupling structure in complex systems through the optimal causation entropy principle. Entropy, 16(6), 3416-3433.
- Schreiber2000Schreiber, Thomas. "Measuring information transfer." Physical review letters 85.2 (2000): 461.