in gad/src/arith.rs [208:228]
fn mul(&mut self, v0: &Value<D>, v1: &Value<D>) -> Result<Value<D>> {
let result = self.eval().mul(v0.data(), v1.data())?;
let value = self.make_node(result, vec![v0.input(), v1.input()], {
let v0 = v0.clone();
let v1 = v1.clone();
move |graph, store, gradient| {
if let Some(id) = v0.id() {
let c1 = graph.link(&v1);
let grad = graph.mul(&gradient, c1)?;
store.add_gradient(graph, id, &grad)?;
}
if let Some(id) = v1.id() {
let c0 = graph.link(&v0);
let grad = graph.mul(c0, &gradient)?;
store.add_gradient(graph, id, &grad)?;
}
Ok(())
}
});
Ok(value)
}