// Individual node implementations
// Module declarations (unfortunately must be manual due to Rust's module system)

// Prelude module with common imports for node implementations
pub(crate) mod prelude;

// Test helpers for node code generation tests
#[cfg(test)]
pub(crate) mod test_helpers;

pub(crate) mod abs;
pub(crate) mod add;
pub(crate) mod argmax;
pub(crate) mod argmin;
pub(crate) mod attention;
pub(crate) mod avg_pool1d;
pub(crate) mod avg_pool2d;
pub(crate) mod batch_norm;
pub(crate) mod bernoulli;
pub(crate) mod bitshift;
pub(crate) mod bitwiseand;
pub(crate) mod bitwisenot;
pub(crate) mod bitwiseor;
pub(crate) mod bitwisexor;
pub(crate) mod bool_and;
pub(crate) mod bool_or;
pub(crate) mod bool_xor;
pub(crate) mod cast;
pub(crate) mod ceil;
pub(crate) mod clip;
pub(crate) mod concat;
pub(crate) mod constant;
pub(crate) mod constant_of_shape;
pub(crate) mod conv1d;
pub(crate) mod conv2d;
pub(crate) mod conv3d;
pub(crate) mod conv_transpose_1d;
pub(crate) mod conv_transpose_2d;
pub(crate) mod conv_transpose_3d;
pub(crate) mod cos;
pub(crate) mod cosh;
pub(crate) mod depth_to_space;
pub(crate) mod div;
pub(crate) mod dropout;
pub(crate) mod equal;
pub(crate) mod erf;
pub(crate) mod exp;
pub(crate) mod expand;
pub(crate) mod eye_like;
pub(crate) mod flatten;
pub(crate) mod floor;
pub(crate) mod gather;
pub(crate) mod gather_elements;
pub(crate) mod gelu;
pub(crate) mod gemm;
pub(crate) mod global_avg_pool;
pub(crate) mod greater;
pub(crate) mod greater_equal;
pub(crate) mod grid_sample;
pub(crate) mod group_norm;
pub(crate) mod hard_sigmoid;
pub(crate) mod identity;
pub(crate) mod if_node;
pub(crate) mod instance_norm;
pub(crate) mod is_inf;
pub(crate) mod is_nan;
pub(crate) mod layer_norm;
pub(crate) mod leaky_relu;
pub(crate) mod linear;
pub(crate) mod log;
pub(crate) mod log_softmax;
pub(crate) mod loop_node;
pub(crate) mod lower;
pub(crate) mod lower_equal;
pub(crate) mod matmul;
pub(crate) mod matmul_integer;
pub(crate) mod max;
pub(crate) mod max_pool1d;
pub(crate) mod max_pool2d;
pub(crate) mod mean;
pub(crate) mod min;
pub(crate) mod modulo;
pub(crate) mod mul;
pub(crate) mod neg;
pub(crate) mod nonzero;
pub(crate) mod not;
pub(crate) mod one_hot;
pub(crate) mod pad;
pub(crate) mod pow;
pub(crate) mod prelu;
pub(crate) mod random_normal;
pub(crate) mod random_normal_like;
pub(crate) mod random_uniform;
pub(crate) mod random_uniform_like;
pub(crate) mod range;
pub(crate) mod reciprocal;
pub(crate) mod reduce;
pub(crate) mod relu;
pub(crate) mod reshape;
pub(crate) mod resize;
pub(crate) mod round;
pub(crate) mod scan_node;
pub(crate) mod shape;
pub(crate) mod sigmoid;
pub(crate) mod sign;
pub(crate) mod sin;
pub(crate) mod sinh;
pub(crate) mod size;
pub(crate) mod slice;
pub(crate) mod softmax;
pub(crate) mod space_to_depth;
pub(crate) mod split;
pub(crate) mod sqrt;
pub(crate) mod squeeze;
pub(crate) mod sub;
pub(crate) mod sum;
pub(crate) mod tan;
pub(crate) mod tanh;
pub(crate) mod tile;
pub(crate) mod top_k;
pub(crate) mod transpose;
pub(crate) mod trilu;
pub(crate) mod unsqueeze;
pub(crate) mod where_op;

// Node codegen traits and utilities are in parent module
// Re-export them here for convenience
pub(crate) use super::node_traits::{
    NodeCodegen, SerializationBackend, arg_to_ident, extract_node_data,
};
