---
title: "Contributing"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Contributing}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

Thank you for taking the time to contribute to Individual. We're grateful that you would take some time to make Individual-Based Modeling easier in R. Pull requests are very welcome.

## Issues

For major changes, please open an issue first to give other developers a heads up on what you would like to add or change. That way we can reduce any redundant efforts and give any resources if needed.

For bug reports please include:

 * R version
 * OS
 * Steps to recreate
 * Expected behaviour
 * Actual behaviour

## Git

We use Git on this project. Which means we use `master`, `dev`, `feat/*`, `bug/*`, `hotfix/*` and `release/*` branches. Please refer to [this post](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) for more information of each type of branch. NOTE: `bug/*` branches are `feat/*` branches which fix a bug.

Practically speaking, *all* new code contributions should be feature branches. You should branch off of the `dev` branch into one called `feat/[your feature name here]`. When we consider pull requests from forked repositories to the mrc-ide/individual repository, we will expect this convention.

We periodically merge `dev` into `master` for small release updates. These releases will appear on the [GitHub releases page](https://github.com/mrc-ide/individual/releases). Please use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) as it helps us version Individual properly. 

Large releases will have a `release/*` branch to manage the transition. No new features will be merged into `release/*` branches. Only documentation and bug fixes will be considered.

## Code organisation

*R/simulation.R* - Contains the main entry point and configuration for models

*R/variables.R* - Defines classes for the available variables

*R/events.R* - Defines classes for the available events

*src/* - The C++ side of the R interface and tests

*inst/include/Variable.h* - The implementations of Variables

*inst/include/Event.h* - The implementations of Events

*tests/* - are divided into unit, integration and performance tests. Integration tests are
strongly recommended for large functions and unit tests for everything else

## Pull Requests

Here's a checklist for a successful PR:

 - Read your own diff
 - Describe your PR
 - Write any particular notes of interest for the reviewer
 - Check that your code passes all CI checks
 - Check that your code is mergeable
 
 These are the things we check for:
 
 - Do I understand the code?
 - Does the code look like it would work?
 - Does it work when run locally?
 - Is it tested enough?
 - Is it documented enough?

Our review process is based off of [RESIDE's PR review process](https://reside-ic.github.io/articles/pull-requests/)

## Microbenchmarks

We have R based benchmarks in tests/performance. Please add new benchmarks for performance critical code.

Please note the google benchmarks are deprecated. The below instructions will not work since building requires including R and Rcpp.

We use [google benchmark](https://github.com/google/benchmark) for our
microbenchmarks. You can compile and run the benchmarks like this:

```
cd tests/performance
g++ *_benchmark.cpp -std=c++14 -lbenchmark -lpthread -o benchmark.out
./benchmark.out
```

## Wishlist

 * 90% test coverage
 * More Variables
 * Speed optimisations (tests TBC)
 * CRAN
 * Anything on the github issue board
