rustygrad 0.1.1

A tiny autograd engine inspired by micrograd
Documentation
use crate::{Layer, Value};

#[derive(Debug)]
pub struct MLP {
    layers: Vec<Layer>,
}

impl MLP {
    pub fn new(nin: i32, mut nouts: Vec<i32>) -> MLP {
        nouts.insert(0, nin);
        let mut layers: Vec<Layer> = vec![];
        let n = nouts.len() - 1;

        for i in 0..n {
            layers.push(Layer::new(nouts[i], nouts[i + 1], i != n - 1));
        }
        MLP { layers }
    }

    pub fn forward(&self, x: Vec<Value>) -> Vec<Value> {
        self.layers.iter().fold(x, |x, layer| layer.forward(&x))
    }

    pub fn parameters(&self) -> Vec<Value> {
        self.layers.iter().flat_map(|l| l.parameters()).collect()
    }

    pub fn zero_grad(&self) {
        for p in self.parameters() {
            p.borrow_mut().grad = 0.0;
        }
    }
}