# MASS CUDA

MASS, short for Multi Agent Spacial Simulation, is a library for implementing agent-based simulations. It provides high level APIs for customizing behavior of agents and the environment while maintaining high performance. MASS CUDA is the CUDA implementation of MASS, which provides similar APIs as the C++ implementation but executed on Nvidia GPUs. 

In MASS, ABM simulations are modeled using two concepts: `Places` and `Agents`


## Places

`Places` represent the environment of an ABM simulation. It is a N-dimensional grid where each cell is named a `Place`. Each `Place` maintains certain data as its attributes and can access neighboring instances around it. Users can customize the behavior of all the `Place` instances of a `Places` in terms of member functions, which will be invoked on all the instances concurrently. 


## Agents

`Agents` represents a collection of autonomous entities. Each individual instance is called an `Agent`, which can reside on and interact with `Place` instances. Similar to `Place` instances, each `Agent` instance maintains it own data as attributes and can have customized behavior as member functions, which will also be invoked concurrently on all instances. However, unlike `Place` instances, `Agent` instances are not fixed during the simulation. They can move to other `Place` instances (migration), spawn children, or terminate themselves. 

In MASS, an `Agents` is strongly associated with a `Places` and each `Agent` instance must reside on a `Place` instance of the associated `Places`. It's currently not allowed for an `Agent` instance to migrate to a `Place` instance of another `Places`. However, having `Agent` instances of different `Agents` residing on the same `Place` instance is allowed. 


## Execution Model in MASS CUDA

In MASS CUDA, all the `Place` and `Agent` instances are maintained and executed on the GPU. Each instance is assigned to one CUDA thread to execute its customed member functions. 


<!-- TODO: Add more details about the concepts of MASS and MASS CUDA -->
<!--       But DO NOT add any codes here, high-level concepts only -->