---
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