105 lines
3.2 KiB
Markdown
105 lines
3.2 KiB
Markdown
# distimate
|
|
|
|
`distimate` is a Rust crate that provides probability distributions specifically
|
|
designed for estimation and risk analysis scenarios. It offers implementations
|
|
of various distributions that are commonly used in project management, cost
|
|
estimation, and other fields where uncertainty needs to be modeled.
|
|
|
|
## Features
|
|
|
|
- Implementations of PERT, Triangular, and Normal distributions tailored for
|
|
estimation purposes
|
|
- Consistent API across all distributions
|
|
- Support for common statistical operations (mean, variance, skewness, etc.)
|
|
- Sampling capabilities for Monte Carlo simulations
|
|
- Range-respecting implementations that work with min, likely (mode), and max estimates
|
|
|
|
## Installation
|
|
|
|
Add this to your `Cargo.toml`:
|
|
|
|
```toml
|
|
[dependencies]
|
|
distimate = "<desired version>"
|
|
```
|
|
|
|
## Usage
|
|
|
|
Here's a quick example of how to use the PERT distribution:
|
|
|
|
```rust
|
|
use distimate::prelude::*;
|
|
use distimate::Pert;
|
|
|
|
fn main() {
|
|
// Create a PERT distribution for a task estimated to take
|
|
// between 1 and 3 days, most likely 2 days
|
|
let task_duration = Pert::new(1.0, 2.0, 3.0).unwrap();
|
|
|
|
println!("Expected duration: {:.2} days", task_duration.expected_value());
|
|
println!("Optimistic estimate (P5): {:.2} days", task_duration.optimistic_estimate());
|
|
println!("Pessimistic estimate (P95): {:.2} days", task_duration.pessimistic_estimate());
|
|
println!("Probability of completing within 2.5 days: {:.2}%",
|
|
task_duration.probability_of_completion(2.5) * 100.0);
|
|
println!("Risk of exceeding 2.5 days: {:.2}%",
|
|
task_duration.risk_of_overrun(2.5) * 100.0);
|
|
|
|
let (lower, upper) = task_duration.confidence_interval(0.9);
|
|
println!("90% Confidence Interval: {:.2} to {:.2} days", lower, upper);
|
|
}
|
|
```
|
|
|
|
## Distributions
|
|
|
|
### PERT Distribution
|
|
|
|
The PERT (Program Evaluation and Review Technique) distribution is commonly used
|
|
in project management and risk analysis. It's defined by minimum, most likely
|
|
(mode), and maximum values.
|
|
|
|
```rust
|
|
let pert = Pert::new(1.0, 2.0, 3.0).unwrap();
|
|
```
|
|
|
|
### Triangular Distribution
|
|
|
|
The Triangular distribution is often used when limited sample data is available.
|
|
It's also defined by minimum, most likely (mode), and maximum values.
|
|
|
|
```rust
|
|
let triangular = Triangular::new(1.0, 2.0, 3.0).unwrap();
|
|
```
|
|
|
|
### Normal Distribution
|
|
|
|
The Normal (Gaussian) distribution is implemented with modifications to respect
|
|
a given range. It's suitable for natural phenomena and when values are expected
|
|
to be symmetrically distributed around a mean.
|
|
|
|
```rust
|
|
let normal = Normal::new(1.0, 2.0, 3.0).unwrap();
|
|
```
|
|
|
|
## Common Operations
|
|
|
|
All distributions implement common traits for statistical operations:
|
|
|
|
- `Distribution`: Provides `mean()`, `variance()`, `skewness()`, and `entropy()`
|
|
- `Median`: Provides `median()`
|
|
- `Mode`: Provides `mode()`
|
|
- `Continuous`: Provides `pdf()` and `ln_pdf()`
|
|
- `ContinuousCDF`: Provides `cdf()` and `inverse_cdf()`
|
|
- `Min` and `Max`: Provide `min()` and `max()`
|
|
|
|
Additionally, all distributions can be sampled using the `sample()` method,
|
|
which is useful for Monte Carlo simulations.
|
|
|
|
## Contributing
|
|
|
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
|
## License
|
|
|
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
for details.
|