hpt 0.1.3

High Performance Tensor (HPT) - A fast, efficient, and user-friendly tensor computation library for Rust
Documentation
/// argmax kernel
macro_rules! argmax_kernel {
    (
        $_:expr,
        $iterator:ident,
        $loop_size:ident,
        $loop_size2:ident,
        $result_ptr:ident,
        $a_ptr:ident,
        $a_last_stride:ident,
        $shape_len:ident
    ) => {
        let mut max_val = T::NEG_INF;
        let mut max_index = 0;
        for i in 0..$loop_size {
            let a_val = $a_ptr[i * $a_last_stride];
            if a_val._gt(max_val) {
                max_val = a_val;
                max_index = i;
            }
        }
        for j in (0..$shape_len - 1).rev() {
            if $iterator.prg[j as usize] < $iterator.a_shape[j as usize] {
                $iterator.prg[j as usize] += 1;
                $a_ptr.offset($iterator.strides[j as usize]);
                break;
            } else {
                $iterator.prg[j as usize] = 0;
                $a_ptr.offset(-$iterator.strides[j as usize] * $iterator.a_shape[j as usize]);
            }
        }
        unsafe { $result_ptr.ptr.write(max_index.cast()) };
        $result_ptr.add(1);
    };
}

/// argmin kernel
macro_rules! argmin_kernel {
    (
        $_:expr,
        $iterator:ident,
        $loop_size:ident,
        $loop_size2:ident,
        $result_ptr:ident,
        $a_ptr:ident,
        $a_last_stride:ident,
        $shape_len:ident
    ) => {
        let mut max_val = T::INF;
        let mut max_index = 0;
        for i in 0..$loop_size {
            let a_val = $a_ptr[i * $a_last_stride];
            if a_val._lt(max_val) {
                max_val = a_val;
                max_index = i;
            }
        }
        for j in (0..$shape_len - 1).rev() {
            if $iterator.prg[j as usize] < $iterator.a_shape[j as usize] {
                $iterator.prg[j as usize] += 1;
                $a_ptr.offset($iterator.strides[j as usize]);
                break;
            } else {
                $iterator.prg[j as usize] = 0;
                $a_ptr.offset(-$iterator.strides[j as usize] * $iterator.a_shape[j as usize]);
            }
        }
        unsafe { $result_ptr.ptr.write(max_index.cast()) };
        $result_ptr.add(1);
    };
}

pub(crate) use argmax_kernel;
pub(crate) use argmin_kernel;