rstsr_core/tensor/manuplication/
to_contig.rs

1use crate::prelude_dev::*;
2
3/* #region to_contig */
4
5pub fn change_contig_f<'a, R, T, B, D>(
6    tensor: TensorAny<R, T, B, D>,
7    order: FlagOrder,
8) -> Result<TensorCow<'a, T, B, D>>
9where
10    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
11    D: DimAPI,
12    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
13{
14    let shape = tensor.shape();
15    let layout_new = match order {
16        RowMajor => shape.new_c_contig(None),
17        ColMajor => shape.new_f_contig(None),
18    };
19    change_layout_f(tensor, layout_new)
20}
21
22pub fn to_contig_f<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
23where
24    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
25    D: DimAPI,
26    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
27{
28    change_contig_f(tensor.view(), order)
29}
30
31pub fn into_contig_f<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Result<Tensor<T, B, D>>
32where
33    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
34    D: DimAPI,
35    T: Clone,
36    B: DeviceAPI<T>
37        + DeviceRawAPI<MaybeUninit<T>>
38        + DeviceCreationAnyAPI<T>
39        + OpAssignArbitaryAPI<T, D, D>
40        + OpAssignAPI<T, D>,
41    <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
42{
43    change_contig_f(tensor, order).map(|v| v.into_owned())
44}
45
46pub fn change_contig<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'a, T, B, D>
47where
48    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
49    D: DimAPI,
50    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
51{
52    change_contig_f(tensor, order).rstsr_unwrap()
53}
54
55pub fn to_contig<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'_, T, B, D>
56where
57    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
58    D: DimAPI,
59    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
60{
61    to_contig_f(tensor, order).rstsr_unwrap()
62}
63
64pub fn into_contig<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Tensor<T, B, D>
65where
66    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
67    D: DimAPI,
68    T: Clone,
69    B: DeviceAPI<T>
70        + DeviceRawAPI<MaybeUninit<T>>
71        + DeviceCreationAnyAPI<T>
72        + OpAssignArbitaryAPI<T, D, D>
73        + OpAssignAPI<T, D>,
74    <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
75{
76    into_contig_f(tensor, order).rstsr_unwrap()
77}
78
79impl<'a, R, T, B, D> TensorAny<R, T, B, D>
80where
81    R: DataAPI<Data = B::Raw> + DataIntoCowAPI<'a>,
82    D: DimAPI,
83    T: Clone,
84    B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
85{
86    /// Convert tensor to contiguous, with specified layout.
87    pub fn to_contig(&self, order: FlagOrder) -> TensorCow<'_, T, B, D>
88    where
89        B: OpAssignArbitaryAPI<T, D, D>,
90    {
91        to_contig(self, order)
92    }
93
94    pub fn to_contig_f(&self, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
95    where
96        B: OpAssignArbitaryAPI<T, D, D>,
97    {
98        to_contig_f(self, order)
99    }
100
101    pub fn into_contig_f(self, order: FlagOrder) -> Result<Tensor<T, B, D>>
102    where
103        B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
104        <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
105    {
106        into_contig_f(self, order)
107    }
108
109    pub fn into_contig(self, order: FlagOrder) -> Tensor<T, B, D>
110    where
111        B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
112        <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
113    {
114        into_contig(self, order)
115    }
116
117    pub fn change_contig_f(self, order: FlagOrder) -> Result<TensorCow<'a, T, B, D>>
118    where
119        B: OpAssignArbitaryAPI<T, D, D>,
120    {
121        change_contig_f(self, order)
122    }
123
124    pub fn change_contig(self, order: FlagOrder) -> TensorCow<'a, T, B, D>
125    where
126        B: OpAssignArbitaryAPI<T, D, D>,
127    {
128        change_contig(self, order)
129    }
130}
131
132/* #endregion */
133
134/* #region to_prefer */
135
136pub fn change_prefer_f<'a, R, T, B, D>(
137    tensor: TensorAny<R, T, B, D>,
138    order: FlagOrder,
139) -> Result<TensorCow<'a, T, B, D>>
140where
141    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
142    D: DimAPI,
143    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
144{
145    if (order == FlagOrder::C && tensor.c_prefer()) || (order == FlagOrder::F && tensor.f_prefer()) {
146        Ok(tensor.into_cow())
147    } else {
148        change_contig_f(tensor, order)
149    }
150}
151
152pub fn to_prefer_f<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
153where
154    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
155    D: DimAPI,
156    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
157{
158    change_prefer_f(tensor.view(), order)
159}
160
161pub fn into_prefer_f<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Result<Tensor<T, B, D>>
162where
163    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
164    D: DimAPI,
165    T: Clone,
166    B: DeviceAPI<T>
167        + DeviceRawAPI<MaybeUninit<T>>
168        + DeviceCreationAnyAPI<T>
169        + OpAssignArbitaryAPI<T, D, D>
170        + OpAssignAPI<T, D>,
171    <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
172{
173    change_prefer_f(tensor, order).map(|v| v.into_owned())
174}
175
176pub fn change_prefer<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'a, T, B, D>
177where
178    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
179    D: DimAPI,
180    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
181{
182    change_prefer_f(tensor, order).rstsr_unwrap()
183}
184
185pub fn to_prefer<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'_, T, B, D>
186where
187    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
188    D: DimAPI,
189    B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
190{
191    to_prefer_f(tensor, order).rstsr_unwrap()
192}
193
194pub fn into_prefer<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Tensor<T, B, D>
195where
196    R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
197    D: DimAPI,
198    T: Clone,
199    B: DeviceAPI<T>
200        + DeviceRawAPI<MaybeUninit<T>>
201        + DeviceCreationAnyAPI<T>
202        + OpAssignArbitaryAPI<T, D, D>
203        + OpAssignAPI<T, D>,
204    <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
205{
206    into_prefer_f(tensor, order).rstsr_unwrap()
207}
208
209impl<'a, R, T, B, D> TensorAny<R, T, B, D>
210where
211    R: DataAPI<Data = B::Raw> + DataIntoCowAPI<'a>,
212    D: DimAPI,
213    T: Clone,
214    B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
215{
216    /// Convert tensor to contiguous, with specified layout.
217    pub fn to_prefer(&self, order: FlagOrder) -> TensorCow<'_, T, B, D>
218    where
219        B: OpAssignArbitaryAPI<T, D, D>,
220    {
221        to_prefer(self, order)
222    }
223
224    pub fn to_prefer_f(&self, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
225    where
226        B: OpAssignArbitaryAPI<T, D, D>,
227    {
228        to_prefer_f(self, order)
229    }
230
231    pub fn into_prefer_f(self, order: FlagOrder) -> Result<Tensor<T, B, D>>
232    where
233        B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
234        <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
235    {
236        into_prefer_f(self, order)
237    }
238
239    pub fn into_prefer(self, order: FlagOrder) -> Tensor<T, B, D>
240    where
241        B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
242        <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
243    {
244        into_prefer(self, order)
245    }
246
247    pub fn change_prefer_f(self, order: FlagOrder) -> Result<TensorCow<'a, T, B, D>>
248    where
249        B: OpAssignArbitaryAPI<T, D, D>,
250    {
251        change_prefer_f(self, order)
252    }
253
254    pub fn change_prefer(self, order: FlagOrder) -> TensorCow<'a, T, B, D>
255    where
256        B: OpAssignArbitaryAPI<T, D, D>,
257    {
258        change_prefer(self, order)
259    }
260}
261
262/* #endregion */