use crate::{Matrix, Result};
use crate::ml::autograd::{
node::{GradNode, operation::GradNodeOperation},
tape::record_node,
};
use crate::ml::autograd::node::operation::{
GradNodeElu, GradNodeGelu, GradNodeLeakyRelu, GradNodeMish, GradNodeRelu, GradNodeSigmoid,
GradNodeSilu, GradNodeSoftplus, GradNodeTanh,
};
pub(in crate::ml) fn record_gelu(input: &Matrix, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Gelu(GradNodeGelu {
input: input.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_silu(input: &Matrix, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Silu(GradNodeSilu {
input: input.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_relu(input: &Matrix, output: &Matrix, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Relu(GradNodeRelu {
input: input.clone(),
output: output.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_tanh(input: &Matrix, output: &Matrix, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Tanh(GradNodeTanh {
input: input.clone(),
output: output.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_sigmoid(
input: &Matrix,
output: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Sigmoid(
GradNodeSigmoid {
input: input.clone(),
output: output.clone(),
output_id: result.value_id(),
},
)))
}
pub(in crate::ml) fn record_leaky_relu(input: &Matrix, alpha: f32, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::LeakyRelu(
GradNodeLeakyRelu {
input: input.clone(),
alpha,
output_id: result.value_id(),
},
)))
}
pub(in crate::ml) fn record_elu(
input: &Matrix,
output: &Matrix,
alpha: f32,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Elu(GradNodeElu {
input: input.clone(),
output: output.clone(),
alpha,
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_mish(input: &Matrix, result: &Matrix) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Mish(GradNodeMish {
input: input.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_softplus(
input: &Matrix,
output: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Softplus(
GradNodeSoftplus {
input: input.clone(),
output: output.clone(),
output_id: result.value_id(),
},
)))
}