# Contributing to argminmax
Welcome! We're happy to have you here. Thank you in advance for your contribution to argminmax.
## The basics
argminmax welcomes contributions in the form of Pull Requests. For small changes (e.g., bug fixes), feel free to submit a PR. For larger changes (e.g., new functionality, major refactoring), consider submitting an [Issue](https://github.com/jvdd/argminmax/issues) outlining your proposed change.
### Prerequisites
argminmax is written in Rust. You'll need to install the [Rust toolchain](https://www.rust-lang.org/tools/install) for development.
This project uses the nightly version of Rust. You can install it with:
```bash
rustup install nightly
```
and then set it as the default toolchain with:
```bash
rustup default nightly
```
### argminmax
The structure of the argminmax project is as follows:
```bash
argminmax
├── Cargo.toml
├── README.md
├── src
│ ├── lib.rs # ArgMinMax trait implementation
│ ├── scalar # Scalar implementation
│ ├── simd # SIMD implementation
├── benches # Benchmarks
├── tests # Integration tests
├── dev-utils # Helper functions (for testing & benchmarking)
```
The Rust code is located in the `src` directory. The `lib.rs` file contains the trait implementation. The `scalar` and `simd` directories contain the scalar and SIMD implementations respectively.
The `simd` directory contains a `generic.rs` file that contains the `SIMD` trait - can be seen as an interface that all the SIMD instruction sets x data types must implement. The implementations of this `SIMD` trait are located in the `simd_xxx.rs` files (e.g., `simd_f32.rs`).
### Testing
Unit tests are located at the bottom of (almost) every Rust file. The integration tests are located in the `tests` directory.
They can be run with:
```bash
cargo test --all-features
```
### Benchmarking
The benchmarks are located in the `benches` directory - they are written using [criterion](https://docs.rs/criterion/latest/criterion).
To run the benchmarks, use the following command:
```bash
### Formatting
To format the Rust code, run the following command:
```sh
cargo fmt
```
---
## Improving the performance
When a PR is submitted that improves the performance of the library, we would highly appreciate if the PR also includes a (verifiable) benchmark that shows the improvement.