roundme 0.1.0

Rounding analyzer
# roundme

`roundme` is an experimental human-assisted rounding analyzer. It aims to provide recommendations to determine if an arithmetic operation should round up or down


## Install

Install with
```bash
cargo install roundme
```

To install the latest github version
```bash
git clone git@github.com:crytic/roundme.git
cd roundme
cargo install --path .
```

## How to use

- Run `roundme init` to generate a default configuration file. 
- Run `roundme config` to generate user configuration file. 
- Run `roundme analyze` to analyze the configuration file
- Run `roundme pdf` to generate a PDF (require `latexmk`)


Running `roundme pdf` on the default configuration will generate the following:
<img src="./images/example.png" alt="Example" width="50%" />


### Configuration

`roundme` relies on a configuration file:
```yaml
formula: a * b / c 
round_up: true
less_than_one: ["a * b"] # optional
greater_than_one: ["c"] # optional
```
- `formula` contains the formula to be analyze
- `round_up` determines if the result of the formula should round up or down
- `less_than_one` is used for the `**` [rules]#rules *(raw string comparison and sensible to space)*
- `greater_than_one` is used for the `**` [rules]#rules *(raw string comparison and sensible to space)*


See the [balancer V2](./examples/balancer/README.md) example.

## Features
- Recommend what arithemic operation needs to round up or down
- Generate latex-based report in PDF


## Rules

`rounding()` is the expected rounding direction for the result (up or down)

- `A + B => rounding(A), rounding(B)` (addition does not change the rounding direction)
- `A - B => rounding(A), ! rounding(B)` (the rounding direction of the substracted element is inverse of the expected rounding)
- `A * B => rounding(A), rounding(B), rounding(*) ` (multiplication does not change the rounding direction)
- `A / B => rounding(A), ! rounding(B), rounding(/)` (the rounding direction of the denominator is the inverse of the expected rounding)
- `A ** B`
  - `If A>=1 => rounding(A), rounding(B)`
  - `If A<1 => rounding(A), ! rounding(B)` (if A is below 1, the rounding direction of the exponent is the inverse of the expected rounding)