This is a suite for simulating an Agent Based Model that captures the evolutionary dynamics of a population in a multidimensional space.

ABMEv.jl is a package aimed at simulating the eco-evolutionary dynamics of a population in a multidimensional space, at the individual level.

Individuals are characterised by a set of traits in some combination of evolutionary spaces. An evolutionary space can represent for example a geographical landscape, a trait space, or genetic structure. Individuals experience three elementary events : **birth, death, mutation (or migration)**.

The user can provide **any birth and death functions**, which should depend on the system state and the individuals' trait. Together with the mutation process, this defines the dynamics of the system.

ABMEv.jl provides a **numerical laboratory** for eco-evolutionary dynamics, supplying

- flexible types for **individuals**, which can

- evolve over any combination of space,

- store ancestors trait,

- flexible types for **evolutionary spaces**, that can consist of multidimensional **discrete or continuous domains**, as well as **graphs**,

- the possibility to use **callback functions** to save the state of the system at any time step

- several **algorithms** for the simulations (Gillepsie, CFM),

-**utility functions** to analyse simulation results.

## Installation

Open Julia in your favorite REPL and type the following

This will download latest version from git repo and download all dependencies.

To check out from an other branch than master, one has to do the trick

```julia

usingPkg;

Pkg.add("ABMEv#no_C_matrix")

```

## Getting started

Check out the great documentation if you want to use the advance features of ABMEv.jl. Otherwise, you can content yourself with the simple tutorial prodived below

## A first tutorial

We provide here a tutorial a simple scenario, where the population is structured over the vertices of a graph, where each vertex selects for an optimal trait value $`\theta_i \in \{-1,1\}`$.

Let's import ABMEv.jl, and LightGraphs.jl

```julia

usingABMEv

usingLightGraphs.jl

```

Now define the trait space, and the graph (i.e. the abstraction of the landscape). We choose a star graph with 7 vertices.

```julia

nodes=7

g=star_graph(nodes)

landscape=GraphSpace(g)

θ=[rand([-1,1])foriin1:nodes]

traitspace=RealSpace(1)

evolspace=(landscape,traitspace)

```

Now let's define the birth and death functions. Individuals are characterised by their position on the graph and the adaptive trait.

```julia

K=1000

b(X,t)=1-0.5*(θ[X[1]]-X[1])^2

d(X,Y,t)=(X[1]≈Y[1])/K

```

Define the mutation processes. Assuming a random walk of length 1, you should specify `nothing`.