#![allow(unused)]
use std::borrow::Borrow;
use crate::backend::Cpu;
use crate::backends::cpu::utils::binary::binary_normal::binary_fn_with_out_simd;
use crate::ops::TensorCmp;
use crate::{tensor::Tensor, tensor_base::_Tensor, BoolVector};
use hpt_allocator::traits::{Allocator, AllocatorOutputRetrive};
use hpt_common::error::base::TensorError;
use hpt_traits::tensor::CommonBounds;
use hpt_types::{
dtype::TypeCommon,
into_vec::IntoVec,
type_promote::{Cmp, SimdCmp},
};
impl<T, C, const DEVICE: usize, A> TensorCmp<T, C> for _Tensor<T, Cpu, DEVICE, A>
where
T: CommonBounds + Cmp<C, Output = bool>,
C: CommonBounds,
T::Vec: SimdCmp<C::Vec>,
<T::Vec as SimdCmp<C::Vec>>::Output: IntoVec<BoolVector>,
A: Allocator,
A::Output: AllocatorOutputRetrive,
{
type RHS = _Tensor<C, Cpu, DEVICE, A>;
type Output = _Tensor<bool, Cpu, DEVICE, A>;
fn tensor_neq<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._ne(y),
|x, y| x._ne(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
fn tensor_eq<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._eq(y),
|x, y| x._eq(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
fn tensor_lt<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._lt(y),
|x, y| x._lt(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
fn tensor_gt<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._gt(y),
|x, y| x._gt(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
fn tensor_le<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._le(y),
|x, y| x._le(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
fn tensor_ge<D>(&self, rhs: D) -> Result<Self::Output, TensorError>
where
D: Borrow<Self::RHS>,
{
let res = binary_fn_with_out_simd(
self,
rhs.borrow(),
|x, y| x._ge(y),
|x, y| x._ge(y).into_vec(),
None::<Self::Output>,
)?;
Ok(res)
}
}