#[allow(unused_imports)]
use crate::backends::VectorBackend;
use crate::dispatch_unary_op;
use crate::{Result, Vector};
impl Vector<f32> {
pub fn sqrt(&self) -> Result<Vector<f32>> {
let mut result_data = vec![0.0; self.len()];
if !self.as_slice().is_empty() {
#[cfg(feature = "parallel")]
{
const PARALLEL_THRESHOLD: usize = 100_000;
const CHUNK_SIZE: usize = 65536;
if self.len() >= PARALLEL_THRESHOLD {
use rayon::prelude::*;
self.as_slice()
.par_chunks(CHUNK_SIZE)
.zip(result_data.par_chunks_mut(CHUNK_SIZE))
.for_each(|(chunk_in, chunk_out)| {
dispatch_unary_op!(self.backend(), sqrt, chunk_in, chunk_out);
});
return Ok(Vector::from_slice_with_backend(&result_data, self.backend()));
}
}
dispatch_unary_op!(self.backend(), sqrt, self.as_slice(), &mut result_data);
}
Ok(Vector::from_slice_with_backend(&result_data, self.backend()))
}
pub fn recip(&self) -> Result<Vector<f32>> {
let mut result_data = vec![0.0; self.len()];
if !self.as_slice().is_empty() {
dispatch_unary_op!(self.backend(), recip, self.as_slice(), &mut result_data);
}
Ok(Vector::from_slice_with_backend(&result_data, self.backend()))
}
pub fn pow(&self, n: f32) -> Result<Vector<f32>> {
let pow_data: Vec<f32> = self.as_slice().iter().map(|x| x.powf(n)).collect();
Ok(Vector::from_vec(pow_data))
}
}