use super::tape::Tape;
#[derive(Clone, Copy, Debug)]
pub struct Variable<'v> {
pub tape: &'v Tape,
pub index: usize,
pub value: f64,
}
impl<'v> Variable<'v> {
pub fn value(&self) -> f64 {
self.value
}
#[inline]
pub fn accumulate(&self) -> Vec<f64> {
let length = self.tape.len();
let nodes = self.tape.nodes.borrow();
let mut adjoints = vec![0.0; length];
adjoints[self.index] = 1.0;
for (index, node) in nodes.iter().enumerate().rev() {
let deriv = adjoints[index];
adjoints[node.parents[0]] += node.partials[0] * deriv;
adjoints[node.parents[1]] += node.partials[1] * deriv;
}
adjoints
}
}