use crate::rotta_rs_module::{ arrayy::Arrayy, BackwardLabel, NodeType, Tensor };
pub fn matmul(a: &Tensor, b: &Tensor) -> Tensor {
let tensor_a = a.node.lock().unwrap();
let tensor_b = b.node.lock().unwrap();
let output = tensor_a.value.matmul(&tensor_b.value);
let tensor = Tensor::from_arrayy(output);
tensor.update_parent(vec![a.node.clone(), b.node.clone()]);
tensor.node.lock().as_mut().unwrap().label = Some(
BackwardLabel::Matmul(a.node.clone(), b.node.clone())
);
tensor
}
pub fn d_matmul(a: &NodeType, b: &NodeType, grad: &Arrayy) {
let mut a = a.lock().unwrap();
let mut b = b.lock().unwrap();
if a.requires_grad {
let d_a = grad.matmul(&b.value.t());
a.add_grad(d_a);
}
if b.requires_grad {
let d_b = a.value.t().matmul(grad);
b.add_grad(d_b);
}
}