use crate::registry::InferenceRegistry;
mod custom_ops;
mod data_ops;
mod elementwise;
mod linalg;
mod movement;
mod norm;
mod pooling;
mod selection;
mod sequence;
pub(crate) fn norm_axis(axis: i64, rank: usize) -> usize {
let r = rank as i64;
let a = if axis < 0 { axis + r } else { axis };
a.clamp(0, r.saturating_sub(1)) as usize
}
pub(crate) fn checked_axis(axis: i64, rank: usize) -> Option<usize> {
let rank = i64::try_from(rank).ok()?;
let normalized = if axis < 0 {
axis.checked_add(rank)?
} else {
axis
};
(0..rank)
.contains(&normalized)
.then(|| usize::try_from(normalized).ok())
.flatten()
}
pub fn register_all(registry: &mut InferenceRegistry) {
custom_ops::register(registry);
elementwise::register(registry);
linalg::register(registry);
norm::register(registry);
movement::register(registry);
data_ops::register(registry);
pooling::register(registry);
selection::register(registry);
sequence::register(registry);
}