blob: 9e9601856fb9a8409cc7bd3a3f9efae1051f9106 [file] [log] [blame] [view]
# Contribute to MXNet
MXNet has been developed and is used by a group of active community members.
Please contribute to improve the project.
After your patch has been merged, remember to add your name to [CONTRIBUTORS.md](https://github.com/dmlc/mxnet/blob/master/CONTRIBUTORS.md).
## Guidelines
* [Submitting a Pull Request](#submitting-a-pull-request)
* [Resolving a Conflict with the Master](#resolving-a-conflict-with-the-master)
* [Combining Multiple Commits](#combining-multiple-commits)
* [What Is the Consequence of Forcing a Push?](#what-is-the-consequence-of-forcing-a-push)
* [Document](#documents)
* [Test Cases](#test-cases)
* [Examples](#examples)
* [Tutorials](#tutorials)
* [Core Library](#core-library)
* [Python Package](#python-package)
* [R Package](#r-package)
### Submitting a Pull Request
* Before submitting your contribution, rebase your code on the most recent version of the master:
```bash
git remote add upstream https://github.com/dmlc/mxnet
git fetch upstream
git rebase upstream/master
```
* If you have multiple small commits,
merge them into meaningful groups (use ```git rebase``` then ```squash```).
* Send the pull request.
* Fix problems reported by automatic checks.
* If you are contributing a new module, consider adding a test case in [tests](https://github.com/dmlc/mxnet/tree/master/tests).
### Resolving a Conflict with the Master
* Rebase to the current master:
```bash
# The first two steps can be skipped after you do it once.
git remote add upstream https://github.com/dmlc/mxnet
git fetch upstream
git rebase upstream/master
```
* Git might show some conflicts that prevent merging, for example, ```conflicted.py```.
* Manually modify the file to resolve the conflict.
* After you resolve the conflict, mark it as resolved by using:
```bash
git add conflicted.py.
```
* Continue rebasing by using this command:
```bash
git rebase --continue
```
* Finally push to your fork. You might need to force the push:
```bash
git push --force
```
### Combining Multiple Commits
If you are submitting multiple commits with later commits that are just fixes to previous ones, you can combine commits into meaningful groups before creating a push request.
* Before doing so, configure Git's default editor if you haven't already done that:
```bash
git config core.editor the-editor-you-like
```
* Assuming that you want to merge last the last three commits, type the following commands:
```bash
git rebase -i HEAD~3
```
* In the text editor that appears, set the first commit as ```pick```, and change later ones to ```squash```.
* After you save the file, another text editor will appear and ask you to modify the combined commit message.
* Push the changes to your fork by forcing a push:
```bash
git push --force.
```
### What Is the Consequence of Forcing a Push?
The previous two tips require forcing a push because we altered the path of the commits.
It's fine to force a push to your own fork, as long as only your commits are changed.
## Documents
* Document are created with Sphinx and [recommonmark](http://recommonmark.readthedocs.org/en/latest/).
* You can build documents locally to proof them.
## Test Cases
* All of the test cases are in GitHub in [tests](https://github.com/dmlc/mxnet/tree/master/tests)
* We use python nose for python test cases, and gtest for c++ unit tests.
## Examples
* Use cases and examples are on GitHub in [examples](https://github.com/dmlc/mxnet/tree/master/example)
* If you have blog posts about MXNet or
tutorials that use MXNet, please tell us and we'll add
a link to them in the examples on GitHub.
## Tutorials
Want to contribute an MXNet tutorial? To get started, download the [tutorial template](https://github.com/dmlc/mxnet/tree/master/example/MXNetTutorialTemplate.ipynb).
## Core Library
- We follow the Google C++ Style Guide for C++ code.
- We use doxygen to document all of the interface code.
- To reproduce the linter checks, type ```make lint```.
## Python Package
- Always add docstring to the new functions in numpydoc format.
- You can reproduce the linter checks by typing ```make lint```.
## R Package
### Code Style
- Most of the C++ code in the R package relies heavily on [Rcpp](https://github.com/RcppCore/Rcpp).
- We follow the Google C++ Style Guide for C++ code. This allows us to maintain consistency with the rest of the project. It also allows us to check style automatically with a linter.
- To check the code style, type the following command at the root folder:
```bash
make rcpplint
```
- If necessary, you can disable the linter warning on certain lines with ```// NOLINT(*)``` comments.
### Auto-Generated API
- Many MXNet APIs are exposed dynamically from Rcpp.
- [mx_generated.R](R/mx_generated.R) is the auto-generated API and documents for these functions.
- Remake the file by typing the following command at root folder:
```bash
make rcppexport
```
- Use this command only when there is an update to dynamic functions.
### API Document
The document is generated using roxygen2. To remake the documents in the root folder, use the following command:
```bash
make roxygen.
```
### R Markdown Vignettes
R Markdown vignettes are located on GitHub in [R-package/vignettes](https://github.com/dmlc/mxnet/tree/master/R-package/vignettes).
These R Markdown files aren't compiled. We host the compiled version on [doc/R-package](R-package).
To add a new R Markdown vignettes:
* Add the original R Markdown file to ```R-package/vignettes```
* Modify ```doc/R-package/Makefile``` to add the Markdown files to be built.
* Clone the [dmlc/web-data](https://github.com/dmlc/web-data) repo to the ```doc``` folder.
* Type the following command for the ```doc/R-package``` package:
```bash
make the-markdown-to-make.md
```
* This generates the markdown, and the figures and places them into ```doc/web-data/mxnet/knitr```.
* Modify the ```doc/R-package/index.md``` to point to the generated markdown.
* Add the generated figure to the ```dmlc/web-data``` repo.
* If you have already cloned the repo to doc, use ```git add```.
* Create a pull request for both the markdown and ```dmlc/web-data```.
* You can also build the document locally with the following command: ```doc```
```bash
make html
```
This prevents radically increasing the size of the repo with generated images sizes.