1use crate::prelude_dev::*;
2
3pub 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 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
132pub 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 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