use crate::{Matrix, Result};
use crate::ml::autograd::{
node::{GradNode, operation::GradNodeOperation},
tape::record_node,
};
use crate::ml::autograd::node::operation::{
GradNodeBce, GradNodeCrossEntropy, GradNodeL1, GradNodeMaskedCrossEntropy, GradNodeMse,
GradNodePpoClippedPolicy, GradNodeSmoothL1,
};
pub(in crate::ml) fn record_ppo_clipped_policy(
new_log_probability: &Matrix,
old_log_probability: &Matrix,
advantage: &Matrix,
clip_epsilon: f32,
output: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::PpoClippedPolicy(
GradNodePpoClippedPolicy {
new_log_probability: new_log_probability.clone(),
old_log_probability: old_log_probability.clone(),
advantage: advantage.clone(),
clip_epsilon,
output_id: output.value_id(),
},
)))
}
pub(in crate::ml) fn record_cross_entropy(
logits: &Matrix,
targets: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::CrossEntropy(
GradNodeCrossEntropy {
logits: logits.clone(),
targets: targets.clone(),
output_id: result.value_id(),
},
)))
}
pub(in crate::ml) fn record_masked_cross_entropy(
logits: &Matrix,
targets: &Matrix,
mask: &Matrix,
valid_count: usize,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::MaskedCrossEntropy(
GradNodeMaskedCrossEntropy {
logits: logits.clone(),
targets: targets.clone(),
mask: mask.clone(),
valid_count,
output_id: result.value_id(),
},
)))
}
pub(in crate::ml) fn record_smooth_l1(
prediction: &Matrix,
target: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::SmoothL1(
GradNodeSmoothL1 {
prediction: prediction.clone(),
target: target.clone(),
output_id: result.value_id(),
},
)))
}
pub(in crate::ml) fn record_mse(
prediction: &Matrix,
target: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Mse(GradNodeMse {
prediction: prediction.clone(),
target: target.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_l1(
prediction: &Matrix,
target: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::L1(GradNodeL1 {
prediction: prediction.clone(),
target: target.clone(),
output_id: result.value_id(),
})))
}
pub(in crate::ml) fn record_bce(
prediction: &Matrix,
target: &Matrix,
result: &Matrix,
) -> Result<()> {
record_node(GradNode::Operation(GradNodeOperation::Bce(GradNodeBce {
prediction: prediction.clone(),
target: target.clone(),
output_id: result.value_id(),
})))
}