use {super::variable::Variable, std::cell::RefCell};
#[derive(Clone, Copy, Debug)]
pub struct Node {
pub partials: [f64; 2],
pub parents: [usize; 2],
}
#[derive(Debug)]
pub struct Tape {
pub nodes: RefCell<Vec<Node>>,
}
impl Default for Tape {
fn default() -> Self {
Tape {
nodes: RefCell::new(Vec::new()),
}
}
}
impl Tape {
pub fn new() -> Self {
Tape {
nodes: RefCell::new(Vec::new()),
}
}
#[inline]
pub fn var(&self, value: f64) -> Variable {
Variable {
tape: self,
value,
index: self.push0(),
}
}
#[inline]
pub fn vars<'v>(&'v self, values: &[f64]) -> Vec<Variable<'v>> {
values.iter().map(|&val| self.var(val)).collect()
}
pub fn len(&self) -> usize {
self.nodes.borrow().len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
#[inline]
pub fn push0(&self) -> usize {
let mut nodes = self.nodes.borrow_mut();
let len = nodes.len();
nodes.push(Node {
partials: [0.0, 0.0],
parents: [len, len],
});
len
}
#[inline]
pub fn push1(&self, parent0: usize, partial0: f64) -> usize {
let mut nodes = self.nodes.borrow_mut();
let len = nodes.len();
nodes.push(Node {
partials: [partial0, 0.0],
parents: [parent0, len],
});
len
}
#[inline]
pub fn push2(&self, parent0: usize, partial0: f64, parent1: usize, partial1: f64) -> usize {
let mut nodes = self.nodes.borrow_mut();
let len = nodes.len();
nodes.push(Node {
partials: [partial0, partial1],
parents: [parent0, parent1],
});
len
}
}