use libnum;
use imp_prelude::*;
use dimension;
use linspace;
use error::{self, ShapeError};
impl<S> ArrayBase<S, Ix>
where S: DataOwned
{
pub fn from_vec(v: Vec<S::Elem>) -> ArrayBase<S, Ix> {
unsafe { Self::from_vec_dim_unchecked(v.len() as Ix, v) }
}
pub fn from_iter<I>(iterable: I) -> ArrayBase<S, Ix>
where I: IntoIterator<Item=S::Elem>
{
Self::from_vec(iterable.into_iter().collect())
}
pub fn linspace<F>(start: F, end: F, n: usize) -> ArrayBase<S, Ix>
where S: Data<Elem=F>,
F: libnum::Float,
{
Self::from_iter(linspace::linspace(start, end, n))
}
pub fn range<F>(start: F, end: F, step: F) -> ArrayBase<S, Ix>
where S: Data<Elem=F>,
F: libnum::Float,
{
Self::from_iter(linspace::range(start, end, step))
}
}
impl<S, A> ArrayBase<S, (Ix, Ix)>
where S: DataOwned<Elem=A>,
{
pub fn eye(n: Ix) -> ArrayBase<S, (Ix, Ix)>
where S: DataMut,
A: Clone + libnum::Zero + libnum::One,
{
let mut eye = Self::zeros((n, n));
for a_ii in eye.diag_mut() {
*a_ii = A::one();
}
eye
}
}
impl<S, A, D> ArrayBase<S, D>
where S: DataOwned<Elem=A>,
D: Dimension,
{
pub fn from_elem(dim: D, elem: A) -> ArrayBase<S, D>
where A: Clone
{
let size = dim.size_checked().expect("Shape too large: overflow in size");
let v = vec![elem; size];
unsafe { Self::from_vec_dim_unchecked(dim, v) }
}
pub fn from_elem_f(dim: D, elem: A) -> ArrayBase<S, D>
where A: Clone
{
let size = dim.size_checked().expect("Shape too large: overflow in size");
let v = vec![elem; size];
unsafe { Self::from_vec_dim_unchecked_f(dim, v) }
}
pub fn zeros(dim: D) -> ArrayBase<S, D>
where A: Clone + libnum::Zero
{
Self::from_elem(dim, libnum::zero())
}
pub fn zeros_f(dim: D) -> ArrayBase<S, D>
where A: Clone + libnum::Zero
{
Self::from_elem_f(dim, libnum::zero())
}
pub fn default(dim: D) -> ArrayBase<S, D>
where A: Default
{
let v = (0..dim.size()).map(|_| A::default()).collect();
unsafe { Self::from_vec_dim_unchecked(dim, v) }
}
pub fn from_vec_dim(dim: D, v: Vec<A>) -> Result<ArrayBase<S, D>, ShapeError> {
if dim.size_checked() != Some(v.len()) {
return Err(error::incompatible_shapes(&v.len(), &dim));
}
unsafe { Ok(Self::from_vec_dim_unchecked(dim, v)) }
}
pub unsafe fn from_vec_dim_unchecked(dim: D, mut v: Vec<A>) -> ArrayBase<S, D> {
debug_assert!(dim.size_checked() == Some(v.len()));
ArrayBase {
ptr: v.as_mut_ptr(),
data: DataOwned::new(v),
strides: dim.default_strides(),
dim: dim,
}
}
pub unsafe fn from_vec_dim_unchecked_f(dim: D, mut v: Vec<A>) -> ArrayBase<S, D> {
debug_assert!(dim.size_checked() == Some(v.len()));
ArrayBase {
ptr: v.as_mut_ptr(),
data: DataOwned::new(v),
strides: dim.fortran_strides(),
dim: dim,
}
}
pub fn from_vec_dim_stride(dim: D, strides: D, v: Vec<A>)
-> Result<ArrayBase<S, D>, ShapeError>
{
dimension::can_index_slice(&v, &dim, &strides).map(|_| {
unsafe {
Self::from_vec_dim_stride_unchecked(dim, strides, v)
}
})
}
pub unsafe fn from_vec_dim_stride_unchecked(dim: D, strides: D, mut v: Vec<A>)
-> ArrayBase<S, D>
{
debug_assert!(dimension::can_index_slice(&v, &dim, &strides).is_ok());
ArrayBase {
ptr: v.as_mut_ptr(),
data: DataOwned::new(v),
strides: strides,
dim: dim
}
}
}