in gad/src/array.rs [331:351]
fn dot(&mut self, v1: &Value<D>, v2: &Value<D>) -> Result<Value<T>> {
let result = self.eval().dot(v1.data(), v2.data())?;
let value = self.make_node(result, vec![v1.input(), v2.input()], {
let v1 = v1.clone();
let v2 = v2.clone();
move |graph, store, gradient| {
if let Some(id) = v1.id() {
let c2 = graph.link(&v2);
let grad = graph.scale(&gradient, c2);
store.add_gradient::<D, _>(graph, id, &grad)?;
}
if let Some(id) = v2.id() {
let c1 = graph.link(&v1);
let grad = graph.scale(&gradient, c1);
store.add_gradient::<D, _>(graph, id, &grad)?;
}
Ok(())
}
});
Ok(value)
}