1use crate::prelude_dev::*;
2
3pub fn change_contig_f<'a, R, T, B, D>(
9 tensor: TensorAny<R, T, B, D>,
10 order: FlagOrder,
11) -> Result<TensorCow<'a, T, B, D>>
12where
13 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
14 D: DimAPI,
15 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
16{
17 let shape = tensor.shape();
18 let layout_new = match order {
19 RowMajor => shape.new_c_contig(None),
20 ColMajor => shape.new_f_contig(None),
21 };
22 change_layout_f(tensor, layout_new)
23}
24
25pub fn to_contig<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'_, T, B, D>
82where
83 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
84 D: DimAPI,
85 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
86{
87 to_contig_f(tensor, order).rstsr_unwrap()
88}
89
90pub fn to_contig_f<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
94where
95 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
96 D: DimAPI,
97 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
98{
99 change_contig_f(tensor.view(), order)
100}
101
102pub fn into_contig_f<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Result<Tensor<T, B, D>>
106where
107 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
108 D: DimAPI,
109 T: Clone,
110 B: DeviceAPI<T>
111 + DeviceRawAPI<MaybeUninit<T>>
112 + DeviceCreationAnyAPI<T>
113 + OpAssignArbitaryAPI<T, D, D>
114 + OpAssignAPI<T, D>,
115 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
116{
117 change_contig_f(tensor, order).map(|v| v.into_owned())
118}
119
120pub fn change_contig<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'a, T, B, D>
124where
125 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
126 D: DimAPI,
127 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
128{
129 change_contig_f(tensor, order).rstsr_unwrap()
130}
131
132pub fn into_contig<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Tensor<T, B, D>
136where
137 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
138 D: DimAPI,
139 T: Clone,
140 B: DeviceAPI<T>
141 + DeviceRawAPI<MaybeUninit<T>>
142 + DeviceCreationAnyAPI<T>
143 + OpAssignArbitaryAPI<T, D, D>
144 + OpAssignAPI<T, D>,
145 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
146{
147 into_contig_f(tensor, order).rstsr_unwrap()
148}
149
150impl<'a, R, T, B, D> TensorAny<R, T, B, D>
151where
152 R: DataAPI<Data = B::Raw> + DataIntoCowAPI<'a>,
153 D: DimAPI,
154 T: Clone,
155 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
156{
157 pub fn to_contig(&self, order: FlagOrder) -> TensorCow<'_, T, B, D>
161 where
162 B: OpAssignArbitaryAPI<T, D, D>,
163 {
164 to_contig(self, order)
165 }
166
167 pub fn to_contig_f(&self, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
171 where
172 B: OpAssignArbitaryAPI<T, D, D>,
173 {
174 to_contig_f(self, order)
175 }
176
177 pub fn into_contig_f(self, order: FlagOrder) -> Result<Tensor<T, B, D>>
181 where
182 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
183 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
184 {
185 into_contig_f(self, order)
186 }
187
188 pub fn into_contig(self, order: FlagOrder) -> Tensor<T, B, D>
194 where
195 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
196 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
197 {
198 into_contig(self, order)
199 }
200
201 pub fn change_contig_f(self, order: FlagOrder) -> Result<TensorCow<'a, T, B, D>>
205 where
206 B: OpAssignArbitaryAPI<T, D, D>,
207 {
208 change_contig_f(self, order)
209 }
210
211 pub fn change_contig(self, order: FlagOrder) -> TensorCow<'a, T, B, D>
215 where
216 B: OpAssignArbitaryAPI<T, D, D>,
217 {
218 change_contig(self, order)
219 }
220}
221
222pub fn change_prefer_f<'a, R, T, B, D>(
230 tensor: TensorAny<R, T, B, D>,
231 order: FlagOrder,
232) -> Result<TensorCow<'a, T, B, D>>
233where
234 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
235 D: DimAPI,
236 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
237{
238 if (order == RowMajor && tensor.c_prefer()) || (order == ColMajor && tensor.f_prefer()) {
239 Ok(tensor.into_cow())
240 } else {
241 change_contig_f(tensor, order)
242 }
243}
244
245pub fn to_prefer<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'_, T, B, D>
300where
301 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
302 D: DimAPI,
303 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
304{
305 to_prefer_f(tensor, order).rstsr_unwrap()
306}
307
308pub fn to_prefer_f<R, T, B, D>(tensor: &TensorAny<R, T, B, D>, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
312where
313 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
314 D: DimAPI,
315 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
316{
317 change_prefer_f(tensor.view(), order)
318}
319
320pub fn into_prefer_f<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Result<Tensor<T, B, D>>
324where
325 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
326 D: DimAPI,
327 T: Clone,
328 B: DeviceAPI<T>
329 + DeviceRawAPI<MaybeUninit<T>>
330 + DeviceCreationAnyAPI<T>
331 + OpAssignArbitaryAPI<T, D, D>
332 + OpAssignAPI<T, D>,
333 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
334{
335 change_prefer_f(tensor, order).map(|v| v.into_owned())
336}
337
338pub fn change_prefer<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> TensorCow<'a, T, B, D>
342where
343 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
344 D: DimAPI,
345 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D, D>,
346{
347 change_prefer_f(tensor, order).rstsr_unwrap()
348}
349
350pub fn into_prefer<'a, R, T, B, D>(tensor: TensorAny<R, T, B, D>, order: FlagOrder) -> Tensor<T, B, D>
354where
355 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
356 D: DimAPI,
357 T: Clone,
358 B: DeviceAPI<T>
359 + DeviceRawAPI<MaybeUninit<T>>
360 + DeviceCreationAnyAPI<T>
361 + OpAssignArbitaryAPI<T, D, D>
362 + OpAssignAPI<T, D>,
363 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
364{
365 into_prefer_f(tensor, order).rstsr_unwrap()
366}
367
368impl<'a, R, T, B, D> TensorAny<R, T, B, D>
369where
370 R: DataAPI<Data = B::Raw> + DataIntoCowAPI<'a>,
371 D: DimAPI,
372 T: Clone,
373 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
374{
375 pub fn to_prefer(&self, order: FlagOrder) -> TensorCow<'_, T, B, D>
379 where
380 B: OpAssignArbitaryAPI<T, D, D>,
381 {
382 to_prefer(self, order)
383 }
384
385 pub fn to_prefer_f(&self, order: FlagOrder) -> Result<TensorCow<'_, T, B, D>>
389 where
390 B: OpAssignArbitaryAPI<T, D, D>,
391 {
392 to_prefer_f(self, order)
393 }
394
395 pub fn into_prefer_f(self, order: FlagOrder) -> Result<Tensor<T, B, D>>
399 where
400 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
401 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
402 {
403 into_prefer_f(self, order)
404 }
405
406 pub fn into_prefer(self, order: FlagOrder) -> Tensor<T, B, D>
410 where
411 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D, D> + OpAssignAPI<T, D>,
412 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
413 {
414 into_prefer(self, order)
415 }
416
417 pub fn change_prefer_f(self, order: FlagOrder) -> Result<TensorCow<'a, T, B, D>>
421 where
422 B: OpAssignArbitaryAPI<T, D, D>,
423 {
424 change_prefer_f(self, order)
425 }
426
427 pub fn change_prefer(self, order: FlagOrder) -> TensorCow<'a, T, B, D>
431 where
432 B: OpAssignArbitaryAPI<T, D, D>,
433 {
434 change_prefer(self, order)
435 }
436}
437
438