1use crate::prelude_dev::*;
4use core::mem::ManuallyDrop;
5use num::complex::{Complex32, Complex64};
6
7pub trait AsArrayAPI<Inp> {
12 type Out;
13
14 fn asarray_f(self) -> Result<Self::Out>;
15
16 fn asarray(self) -> Self::Out
17 where
18 Self: Sized,
19 {
20 Self::asarray_f(self).rstsr_unwrap()
21 }
22}
23
24pub fn asarray<Args, Inp>(param: Args) -> Args::Out
301where
302 Args: AsArrayAPI<Inp>,
303{
304 return AsArrayAPI::asarray(param);
305}
306
307pub fn asarray_f<Args, Inp>(param: Args) -> Result<Args::Out>
313where
314 Args: AsArrayAPI<Inp>,
315{
316 return AsArrayAPI::asarray_f(param);
317}
318
319impl<R, T, B, D> AsArrayAPI<()> for (&TensorAny<R, T, B, D>, TensorIterOrder)
322where
323 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
324 T: Clone,
325 D: DimAPI,
326 B: DeviceAPI<T> + DeviceRawAPI<MaybeUninit<T>> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
327{
328 type Out = Tensor<T, B, D>;
329
330 fn asarray_f(self) -> Result<Self::Out> {
331 let (input, order) = self;
332 let device = input.device();
333 let layout_a = input.layout();
334 let layout_c = layout_for_array_copy(layout_a, order)?;
335 let mut storage_c = device.uninit_impl(layout_c.size())?;
336 device.assign_uninit(storage_c.raw_mut(), &layout_c, input.raw(), layout_a)?;
337 let storage_c = unsafe { B::assume_init_impl(storage_c) }?;
338 let tensor = Tensor::new_f(storage_c, layout_c)?;
339 return Ok(tensor);
340 }
341}
342
343impl<R, T, B, D> AsArrayAPI<()> for &TensorAny<R, T, B, D>
344where
345 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
346 T: Clone,
347 D: DimAPI,
348 B: DeviceAPI<T> + DeviceRawAPI<MaybeUninit<T>> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
349{
350 type Out = Tensor<T, B, D>;
351
352 fn asarray_f(self) -> Result<Self::Out> {
353 asarray_f((self, TensorIterOrder::default()))
354 }
355}
356
357impl<T, B, D> AsArrayAPI<()> for (Tensor<T, B, D>, TensorIterOrder)
358where
359 T: Clone,
360 D: DimAPI,
361 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
362{
363 type Out = Tensor<T, B, D>;
364
365 fn asarray_f(self) -> Result<Self::Out> {
366 let (input, order) = self;
367 let storage_a = input.storage();
368 let layout_a = input.layout();
369 let device = storage_a.device();
370 let layout_c = layout_for_array_copy(layout_a, order)?;
371 if layout_c == *layout_a {
372 return Ok(input);
373 } else {
374 let mut storage_c = device.uninit_impl(layout_c.size())?;
375 device.assign_uninit(storage_c.raw_mut(), &layout_c, storage_a.raw(), layout_a)?;
376 let storage_c = unsafe { B::assume_init_impl(storage_c) }?;
377 let tensor = Tensor::new_f(storage_c, layout_c)?;
378 return Ok(tensor);
379 }
380 }
381}
382
383impl<T, B, D> AsArrayAPI<()> for Tensor<T, B, D>
384where
385 T: Clone,
386 D: DimAPI,
387 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
388{
389 type Out = Tensor<T, B, D>;
390
391 fn asarray_f(self) -> Result<Self::Out> {
392 asarray_f((self, TensorIterOrder::default()))
393 }
394}
395
396impl<T, B, D> AsArrayAPI<()> for (TensorView<'_, T, B, D>, TensorIterOrder)
397where
398 T: Clone,
399 D: DimAPI,
400 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
401{
402 type Out = Tensor<T, B, D>;
403
404 fn asarray_f(self) -> Result<Self::Out> {
405 let (input, order) = self;
406 asarray_f((&input, order))
407 }
408}
409
410impl<T, B, D> AsArrayAPI<()> for TensorView<'_, T, B, D>
411where
412 T: Clone,
413 D: DimAPI,
414 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignAPI<T, D>,
415{
416 type Out = Tensor<T, B, D>;
417
418 fn asarray_f(self) -> Result<Self::Out> {
419 asarray_f((self, TensorIterOrder::default()))
420 }
421}
422
423impl<T, B> AsArrayAPI<()> for (Vec<T>, &B)
428where
429 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
430{
431 type Out = Tensor<T, B, IxD>;
432
433 fn asarray_f(self) -> Result<Self::Out> {
434 let (input, device) = self;
435 let layout = vec![input.len()].c();
436 let storage = device.outof_cpu_vec(input)?;
437 let tensor = Tensor::new_f(storage, layout)?;
438 return Ok(tensor);
439 }
440}
441
442impl<T, B, D> AsArrayAPI<D> for (Vec<T>, Layout<D>, &B)
443where
444 D: DimAPI,
445 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
446{
447 type Out = Tensor<T, B, IxD>;
448
449 fn asarray_f(self) -> Result<Self::Out> {
450 let (input, layout, device) = self;
451 let storage = device.outof_cpu_vec(input)?;
452 let tensor = Tensor::new_f(storage, layout.into_dim()?)?;
453 return Ok(tensor);
454 }
455}
456
457impl<T, B, D> AsArrayAPI<D> for (Vec<T>, D, &B)
458where
459 D: DimAPI,
460 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
461{
462 type Out = Tensor<T, B, IxD>;
463
464 fn asarray_f(self) -> Result<Self::Out> {
465 let (input, shape, device) = self;
466 let default_order = device.default_order();
467 let layout = match default_order {
468 RowMajor => shape.c(),
469 ColMajor => shape.f(),
470 };
471 asarray_f((input, layout, device))
472 }
473}
474
475impl<T> AsArrayAPI<()> for Vec<T>
476where
477 T: Clone,
478{
479 type Out = Tensor<T, DeviceCpu, IxD>;
480
481 fn asarray_f(self) -> Result<Self::Out> {
482 asarray_f((self, &DeviceCpu::default()))
483 }
484}
485
486#[duplicate_item(L; [D]; [Layout<D>])]
487impl<T, D> AsArrayAPI<D> for (Vec<T>, L)
488where
489 T: Clone,
490 D: DimAPI,
491{
492 type Out = Tensor<T, DeviceCpu, IxD>;
493
494 fn asarray_f(self) -> Result<Self::Out> {
495 let (input, layout) = self;
496 asarray_f((input, layout, &DeviceCpu::default()))
497 }
498}
499
500impl<T> From<Vec<T>> for Tensor<T, DeviceCpu, IxD>
501where
502 T: Clone,
503{
504 fn from(input: Vec<T>) -> Self {
505 asarray_f(input).rstsr_unwrap()
506 }
507}
508
509impl<'a, T, B, D> AsArrayAPI<D> for (&'a [T], Layout<D>, &B)
514where
515 T: Clone,
516 B: DeviceAPI<T, Raw = Vec<T>>,
517 D: DimAPI,
518{
519 type Out = TensorView<'a, T, B, IxD>;
520
521 fn asarray_f(self) -> Result<Self::Out> {
522 let (input, layout, device) = self;
523 let ptr = input.as_ptr();
524 let len = input.len();
525 let raw = unsafe {
526 let ptr = ptr as *mut T;
527 Vec::from_raw_parts(ptr, len, len)
528 };
529 let device = device.clone();
530 let data = DataRef::from_manually_drop(ManuallyDrop::new(raw));
531 let storage = Storage::new(data, device);
532 let tensor = TensorView::new_f(storage, layout.into_dim()?)?;
533 return Ok(tensor);
534 }
535}
536
537impl<'a, T, B, D> AsArrayAPI<D> for (&'a [T], D, &B)
538where
539 T: Clone,
540 B: DeviceAPI<T, Raw = Vec<T>>,
541 D: DimAPI,
542{
543 type Out = TensorView<'a, T, B, IxD>;
544
545 fn asarray_f(self) -> Result<Self::Out> {
546 let (input, shape, device) = self;
547 let default_order = device.default_order();
548 let layout = match default_order {
549 RowMajor => shape.c(),
550 ColMajor => shape.f(),
551 };
552 asarray_f((input, layout, device))
553 }
554}
555
556impl<'a, T, B> AsArrayAPI<()> for (&'a [T], &B)
557where
558 T: Clone,
559 B: DeviceAPI<T, Raw = Vec<T>>,
560{
561 type Out = TensorView<'a, T, B, IxD>;
562
563 fn asarray_f(self) -> Result<Self::Out> {
564 let (input, device) = self;
565 let layout = vec![input.len()].c();
566 let device = device.clone();
567
568 let ptr = input.as_ptr();
569 let len = input.len();
570 let raw = unsafe {
571 let ptr = ptr as *mut T;
572 Vec::from_raw_parts(ptr, len, len)
573 };
574 let data = DataRef::from_manually_drop(ManuallyDrop::new(raw));
575 let storage = Storage::new(data, device);
576 let tensor = TensorView::new_f(storage, layout)?;
577 return Ok(tensor);
578 }
579}
580
581#[duplicate_item(L; [D]; [Layout<D>])]
582impl<'a, T, D> AsArrayAPI<D> for (&'a [T], L)
583where
584 T: Clone,
585 D: DimAPI,
586{
587 type Out = TensorView<'a, T, DeviceCpu, IxD>;
588
589 fn asarray_f(self) -> Result<Self::Out> {
590 let (input, layout) = self;
591 asarray_f((input, layout, &DeviceCpu::default()))
592 }
593}
594
595impl<'a, T> AsArrayAPI<()> for &'a [T]
596where
597 T: Clone,
598{
599 type Out = TensorView<'a, T, DeviceCpu, IxD>;
600
601 fn asarray_f(self) -> Result<Self::Out> {
602 asarray_f((self, &DeviceCpu::default()))
603 }
604}
605
606#[duplicate_item(L; [D]; [Layout<D>])]
607impl<'a, T, B, D> AsArrayAPI<D> for (&'a Vec<T>, L, &B)
608where
609 T: Clone,
610 B: DeviceAPI<T, Raw = Vec<T>> + 'a,
611 D: DimAPI,
612{
613 type Out = TensorView<'a, T, B, IxD>;
614
615 fn asarray_f(self) -> Result<Self::Out> {
616 let (input, layout, device) = self;
617 asarray_f((input.as_slice(), layout, device))
618 }
619}
620
621impl<'a, T, B> AsArrayAPI<()> for (&'a Vec<T>, &B)
622where
623 T: Clone,
624 B: DeviceAPI<T, Raw = Vec<T>>,
625{
626 type Out = TensorView<'a, T, B, IxD>;
627
628 fn asarray_f(self) -> Result<Self::Out> {
629 let (input, device) = self;
630 asarray_f((input.as_slice(), device))
631 }
632}
633
634#[duplicate_item(L; [D]; [Layout<D>])]
635impl<'a, T, D> AsArrayAPI<D> for (&'a Vec<T>, L)
636where
637 T: Clone,
638 D: DimAPI,
639{
640 type Out = TensorView<'a, T, DeviceCpu, IxD>;
641
642 fn asarray_f(self) -> Result<Self::Out> {
643 let (input, layout) = self;
644 asarray_f((input.as_slice(), layout, &DeviceCpu::default()))
645 }
646}
647
648impl<'a, T> AsArrayAPI<()> for &'a Vec<T>
649where
650 T: Clone,
651{
652 type Out = TensorView<'a, T, DeviceCpu, IxD>;
653
654 fn asarray_f(self) -> Result<Self::Out> {
655 asarray_f((self.as_slice(), &DeviceCpu::default()))
656 }
657}
658
659impl<'a, T> From<&'a [T]> for TensorView<'a, T, DeviceCpu, IxD>
660where
661 T: Clone,
662{
663 fn from(input: &'a [T]) -> Self {
664 asarray(input)
665 }
666}
667
668impl<'a, T> From<&'a Vec<T>> for TensorView<'a, T, DeviceCpu, IxD>
669where
670 T: Clone,
671{
672 fn from(input: &'a Vec<T>) -> Self {
673 asarray(input)
674 }
675}
676
677impl<'a, T, B, D> AsArrayAPI<D> for (&'a mut [T], Layout<D>, &B)
682where
683 T: Clone,
684 B: DeviceAPI<T, Raw = Vec<T>>,
685 D: DimAPI,
686{
687 type Out = TensorMut<'a, T, B, IxD>;
688
689 fn asarray_f(self) -> Result<Self::Out> {
690 let (input, layout, device) = self;
691 let ptr = input.as_ptr();
692 let len = input.len();
693 let raw = unsafe {
694 let ptr = ptr as *mut T;
695 Vec::from_raw_parts(ptr, len, len)
696 };
697 let device = device.clone();
698 let data = DataMut::from_manually_drop(ManuallyDrop::new(raw));
699 let storage = Storage::new(data, device);
700 let tensor = TensorMut::new_f(storage, layout.into_dim()?)?;
701 return Ok(tensor);
702 }
703}
704
705impl<'a, T, B, D> AsArrayAPI<D> for (&'a mut [T], D, &B)
706where
707 T: Clone,
708 B: DeviceAPI<T, Raw = Vec<T>>,
709 D: DimAPI,
710{
711 type Out = TensorMut<'a, T, B, IxD>;
712
713 fn asarray_f(self) -> Result<Self::Out> {
714 let (input, shape, device) = self;
715 let default_order = device.default_order();
716 let layout = match default_order {
717 RowMajor => shape.c(),
718 ColMajor => shape.f(),
719 };
720 asarray_f((input, layout, device))
721 }
722}
723
724impl<'a, T, B> AsArrayAPI<()> for (&'a mut [T], &B)
725where
726 T: Clone,
727 B: DeviceAPI<T, Raw = Vec<T>>,
728{
729 type Out = TensorMut<'a, T, B, IxD>;
730
731 fn asarray_f(self) -> Result<Self::Out> {
732 let (input, device) = self;
733 let layout = [input.len()].c();
734 let device = device.clone();
735
736 let ptr = input.as_ptr();
737 let len = input.len();
738 let raw = unsafe {
739 let ptr = ptr as *mut T;
740 Vec::from_raw_parts(ptr, len, len)
741 };
742 let data = DataMut::from_manually_drop(ManuallyDrop::new(raw));
743 let storage = Storage::new(data, device);
744 let tensor = TensorMut::new_f(storage, layout.into_dim()?)?;
745 return Ok(tensor);
746 }
747}
748
749#[duplicate_item(L; [D]; [Layout<D>])]
750impl<'a, T, D> AsArrayAPI<D> for (&'a mut [T], L)
751where
752 T: Clone,
753 D: DimAPI,
754{
755 type Out = TensorMut<'a, T, DeviceCpu, IxD>;
756
757 fn asarray_f(self) -> Result<Self::Out> {
758 let (input, layout) = self;
759 asarray_f((input, layout, &DeviceCpu::default()))
760 }
761}
762
763impl<'a, T> AsArrayAPI<()> for &'a mut [T]
764where
765 T: Clone,
766{
767 type Out = TensorMut<'a, T, DeviceCpu, IxD>;
768
769 fn asarray_f(self) -> Result<Self::Out> {
770 asarray_f((self, &DeviceCpu::default()))
771 }
772}
773
774#[duplicate_item(L; [D]; [Layout<D>])]
775impl<'a, T, B, D> AsArrayAPI<D> for (&'a mut Vec<T>, L, &B)
776where
777 T: Clone,
778 B: DeviceAPI<T, Raw = Vec<T>>,
779 D: DimAPI,
780{
781 type Out = TensorMut<'a, T, B, IxD>;
782
783 fn asarray_f(self) -> Result<Self::Out> {
784 let (input, layout, device) = self;
785 asarray_f((input.as_mut_slice(), layout, device))
786 }
787}
788
789impl<'a, T, B> AsArrayAPI<()> for (&'a mut Vec<T>, &B)
790where
791 T: Clone,
792 B: DeviceAPI<T, Raw = Vec<T>>,
793{
794 type Out = TensorMut<'a, T, B, IxD>;
795
796 fn asarray_f(self) -> Result<Self::Out> {
797 let (input, device) = self;
798 asarray_f((input.as_mut_slice(), device))
799 }
800}
801
802#[duplicate_item(L; [D]; [Layout<D>])]
803impl<'a, T, D> AsArrayAPI<D> for (&'a mut Vec<T>, L)
804where
805 T: Clone,
806 D: DimAPI,
807{
808 type Out = TensorMut<'a, T, DeviceCpu, IxD>;
809
810 fn asarray_f(self) -> Result<Self::Out> {
811 let (input, layout) = self;
812 asarray_f((input.as_mut_slice(), layout, &DeviceCpu::default()))
813 }
814}
815
816impl<'a, T> AsArrayAPI<()> for &'a mut Vec<T>
817where
818 T: Clone,
819{
820 type Out = TensorMut<'a, T, DeviceCpu, IxD>;
821
822 fn asarray_f(self) -> Result<Self::Out> {
823 asarray_f((self.as_mut_slice(), &DeviceCpu::default()))
824 }
825}
826
827impl<'a, T> From<&'a mut [T]> for TensorMut<'a, T, DeviceCpu, IxD>
828where
829 T: Clone,
830{
831 fn from(input: &'a mut [T]) -> Self {
832 asarray(input)
833 }
834}
835
836impl<'a, T> From<&'a mut Vec<T>> for TensorMut<'a, T, DeviceCpu, IxD>
837where
838 T: Clone,
839{
840 fn from(input: &'a mut Vec<T>) -> Self {
841 asarray(input)
842 }
843}
844
845macro_rules! impl_asarray_scalar {
850 ($($t:ty),*) => {
851 $(
852 impl<B> AsArrayAPI<()> for ($t, &B)
853 where
854 B: DeviceAPI<$t> + DeviceCreationAnyAPI<$t>,
855 {
856 type Out = Tensor<$t, B, IxD>;
857
858 fn asarray_f(self) -> Result<Self::Out> {
859 let (input, device) = self;
860 let layout = Layout::new(vec![], vec![], 0)?;
861 let storage = device.outof_cpu_vec(vec![input])?;
862 let tensor = unsafe { Tensor::new_unchecked(storage, layout) };
863 return Ok(tensor);
864 }
865 }
866
867 impl AsArrayAPI<()> for $t {
868 type Out = Tensor<$t, DeviceCpu, IxD>;
869
870 fn asarray_f(self) -> Result<Self::Out> {
871 asarray_f((self, &DeviceCpu::default()))
872 }
873 }
874 )*
875 };
876}
877
878impl_asarray_scalar!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64, Complex32, Complex64);
879
880#[cfg(test)]
883mod tests {
884 use super::*;
885
886 #[test]
887 fn test_asarray() {
888 let input = vec![1, 2, 3];
889 let tensor = asarray_f(input).unwrap();
890 println!("{tensor:?}");
891 let input = [1, 2, 3];
892 let tensor = asarray_f(input.as_ref()).unwrap();
893 println!("{tensor:?}");
894
895 let input = vec![1, 2, 3];
896 let tensor = asarray_f(&input).unwrap();
897 println!("{:?}", tensor.raw().as_ptr());
898 println!("{tensor:?}");
899
900 let tensor = asarray_f((&tensor, TensorIterOrder::K)).unwrap();
901 println!("{tensor:?}");
902
903 let tensor = asarray_f((tensor, TensorIterOrder::K)).unwrap();
904 println!("{tensor:?}");
905 }
906
907 #[test]
908 fn test_asarray_scalar() {
909 let tensor = asarray_f(1).unwrap();
910 println!("{tensor:?}");
911 let tensor = asarray_f((Complex64::new(0., 1.), &DeviceCpuSerial::default())).unwrap();
912 println!("{tensor:?}");
913 }
914
915 #[test]
916 fn doc_asarray() {
917 use rstsr::prelude::*;
918 let mut device = DeviceCpu::default();
919 device.set_default_order(RowMajor);
920
921 let input = vec![1, 2, 3, 4, 5, 6];
923 let a = rt::asarray((input, [2, 3], &device));
924 println!("{a:?}");
925 let expected = rt::tensor_from_nested!([[1, 2, 3], [4, 5, 6]], &device);
929 assert!(rt::allclose(&a, &expected, None));
930
931 let input = vec![1, 2, 3, 4, 5, 6];
933 let a = rt::asarray((input, [2, 3].f(), &device));
934 println!("{a:?}");
935 let expected = rt::tensor_from_nested!([[1, 3, 5], [2, 4, 6]], &device);
939 assert!(rt::allclose(&a, &expected, None));
940
941 device.set_default_order(ColMajor);
943 let input = vec![1, 2, 3, 4, 5, 6];
944 let a = rt::asarray((input, [2, 3], &device));
945 println!("{a:?}");
946 let expected = rt::tensor_from_nested!([[1, 3, 5], [2, 4, 6]], &device);
950 assert!(rt::allclose(&a, &expected, None));
951
952 let input = vec![1, 2, 3, 4, 5, 6];
954 let a = rt::asarray(input);
955 println!("{a:?}");
956 let expected = rt::tensor_from_nested!([1, 2, 3, 4, 5, 6]);
959 assert!(rt::allclose(&a, &expected, None));
960
961 device.set_default_order(RowMajor);
963 let input = &[1, 2, 3, 4, 5, 6];
964 let a = rt::asarray((input.as_ref(), [2, 3].c(), &device));
965 println!("{a:?}");
966 let expected = rt::tensor_from_nested!([[1, 2, 3], [4, 5, 6]], &device);
969 assert!(rt::allclose(&a, &expected, None));
970
971 let mut input = vec![1, 2, 3, 4, 5, 6];
973 let mut a = rt::asarray((&mut input, [2, 3].c(), &device));
974 a[[0, 0]] = 10;
976 println!("{a:2?}");
977 let expected = rt::tensor_from_nested!([[10, 2, 3], [4, 5, 6]], &device);
980 assert!(rt::allclose(&a, &expected, None));
981 println!("{input:?}");
982 assert_eq!(input, vec![10, 2, 3, 4, 5, 6]);
984
985 let input = (0..30).collect::<Vec<i32>>();
987 let layout = Layout::new([3, 2], [2, 7], 5).unwrap();
988 let a = rt::asarray((&input, layout, &device));
989 println!("{a:2?}");
990 let expected = rt::tensor_from_nested!([[5, 12], [7, 14], [9, 16]], &device);
994 assert!(rt::allclose(&a, &expected, None));
995
996 let a = rt::asarray((42, &device));
998 println!("{a:?}");
999 }
1002
1003 #[test]
1004 fn doc_asarray_from_tensor() {
1005 use rstsr::prelude::*;
1006 let mut device = DeviceCpu::default();
1007 device.set_default_order(RowMajor);
1008
1009 let a_raw = rt::arange((96, &device)).into_shape([4, 6, 4]);
1011 let a = a_raw.i((..2, slice!(2, 6, 2), 2..)).into_transpose([1, 0, 2]);
1012 println!("{a:2?}");
1013 let expected = rt::tensor_from_nested!([[[10, 11], [34, 35]], [[18, 19], [42, 43]]], &device);
1016 assert!(rt::allclose(&a, &expected, None));
1017 let b = rt::asarray((&a, TensorIterOrder::K));
1018 println!("{b:2?}");
1019 assert!(rt::allclose(&b, &expected, None));
1021 assert_eq!(b.stride(), &[2, 4, 1]);
1022 let b = rt::asarray((&a, TensorIterOrder::C));
1023 println!("{b:2?}");
1024 assert!(rt::allclose(&b, &expected, None));
1026 assert_eq!(b.stride(), &[4, 2, 1]);
1027 let b = rt::asarray((&a, TensorIterOrder::F));
1028 println!("{b:2?}");
1029 assert!(rt::allclose(&b, &expected, None));
1031 assert_eq!(b.stride(), &[1, 2, 4]);
1032 }
1033}