ad_trait 0.3.1

Easy to use, efficient, and highly flexible automatic differentiation in Rust
Documentation
# Getting Started

Adding `ad_trait` to your project is straightforward.

## Installation

Add the following to your `Cargo.toml`:

```toml
[dependencies]
ad_trait = "0.2.0"
```

## Basic Usage

The core workflow of `ad_trait` involves three steps:

1. **Implement `DifferentiableFunctionTrait`**: Define your function.
2. **Implement `Reparameterize`**: Allow your function to work with different AD types.
3. **Use `FunctionEngine`**: Wrap your function with a differentiation method.

### A Simple Example

Here's how to compute the derivative of $f(x) = x^2$:

```rust
use ad_trait::{AD, DifferentiableFunctionTrait, Reparameterize, FunctionEngine, ForwardAD};

#[derive(Clone)]
struct Square;

impl<T: AD> DifferentiableFunctionTrait<T> for Square {
    const NAME: &'static str = "Square";
    fn call(&self, inputs: &[T], _freeze: bool) -> Vec<T> {
        vec![inputs[0] * inputs[0]]
    }
    fn num_inputs(&self) -> usize { 1 }
    fn num_outputs(&self) -> usize { 1 }
}

impl Reparameterize for Square {
    type SelfType<T2: AD> = Square;
}

fn main() {
    let func = Square;
    let engine = FunctionEngine::new(func.clone(), func, ForwardAD::new());
    
    let x = 3.0;
    let (val, grad) = engine.derivative(&[x]);
    
    println!("f(3) = {}", val[0]); // Output: 9
    println!("f'(3) = {}", grad[(0, 0)]); // Output: 6
}
```