1use crate::prelude_dev::*;
2
3pub fn change_layout_f<'a, R, T, B, D, D2>(
9 tensor: TensorAny<R, T, B, D>,
10 layout: Layout<D2>,
11) -> Result<TensorCow<'a, T, B, D2>>
12where
13 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
14 D: DimAPI,
15 D2: DimAPI,
16 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D2, D>,
17{
18 let shape = layout.shape();
19 rstsr_assert_eq!(tensor.size(), shape.shape_size(), InvalidLayout)?;
20 let same_layout = tensor.layout().to_dim::<IxD>()? == layout.to_dim::<IxD>()?;
21 if same_layout {
22 let (storage, _) = tensor.into_raw_parts();
24 let tensor = unsafe { TensorBase::new_unchecked(storage, layout) };
25 return Ok(tensor.into_cow());
26 } else {
27 let (storage_old, layout_old) = tensor.into_raw_parts();
30 let device = storage_old.device();
31 let (_, idx_max) = layout.bounds_index()?;
32 let mut storage_new = device.uninit_impl(idx_max)?;
33 device.assign_arbitary_uninit(storage_new.raw_mut(), &layout, storage_old.raw(), &layout_old)?;
34 let storage_new = unsafe { B::assume_init_impl(storage_new)? };
35 let tensor = unsafe { TensorBase::new_unchecked(storage_new, layout) };
36 return Ok(tensor.into_cow());
37 }
38}
39
40pub fn to_layout<R, T, D, B, D2>(tensor: &TensorAny<R, T, B, D>, layout: Layout<D2>) -> TensorCow<'_, T, B, D2>
124where
125 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
126 D: DimAPI,
127 D2: DimAPI,
128 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D2, D>,
129{
130 change_layout_f(tensor.view(), layout).rstsr_unwrap()
131}
132
133pub fn to_layout_f<R, T, D, B, D2>(
137 tensor: &TensorAny<R, T, B, D>,
138 layout: Layout<D2>,
139) -> Result<TensorCow<'_, T, B, D2>>
140where
141 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw>,
142 D: DimAPI,
143 D2: DimAPI,
144 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D2, D>,
145{
146 change_layout_f(tensor.view(), layout)
147}
148
149pub fn into_layout_f<'a, R, T, B, D, D2>(tensor: TensorAny<R, T, B, D>, layout: Layout<D2>) -> Result<Tensor<T, B, D2>>
153where
154 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
155 D: DimAPI,
156 D2: DimAPI,
157 T: Clone,
158 B: DeviceAPI<T>
159 + DeviceRawAPI<MaybeUninit<T>>
160 + DeviceCreationAnyAPI<T>
161 + OpAssignArbitaryAPI<T, D2, D>
162 + OpAssignAPI<T, D2>,
163 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
164{
165 change_layout_f(tensor, layout).map(|v| v.into_owned())
166}
167
168pub fn into_layout<'a, R, T, B, D, D2>(tensor: TensorAny<R, T, B, D>, layout: Layout<D2>) -> Tensor<T, B, D2>
172where
173 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
174 D: DimAPI,
175 D2: DimAPI,
176 T: Clone,
177 B: DeviceAPI<T>
178 + DeviceRawAPI<MaybeUninit<T>>
179 + DeviceCreationAnyAPI<T>
180 + OpAssignArbitaryAPI<T, D2, D>
181 + OpAssignAPI<T, D2>,
182 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
183{
184 into_layout_f(tensor, layout).rstsr_unwrap()
185}
186
187pub fn change_layout<'a, R, T, B, D, D2>(tensor: TensorAny<R, T, B, D>, layout: Layout<D2>) -> TensorCow<'a, T, B, D2>
191where
192 R: DataAPI<Data = <B as DeviceRawAPI<T>>::Raw> + DataIntoCowAPI<'a>,
193 D: DimAPI,
194 D2: DimAPI,
195 B: DeviceAPI<T> + DeviceCreationAnyAPI<T> + OpAssignArbitaryAPI<T, D2, D>,
196{
197 change_layout_f(tensor, layout).rstsr_unwrap()
198}
199
200impl<'a, R, T, B, D> TensorAny<R, T, B, D>
201where
202 R: DataAPI<Data = B::Raw> + DataIntoCowAPI<'a>,
203 D: DimAPI,
204 T: Clone,
205 B: DeviceAPI<T> + DeviceCreationAnyAPI<T>,
206{
207 pub fn to_layout<D2>(&self, layout: Layout<D2>) -> TensorCow<'_, T, B, D2>
211 where
212 D2: DimAPI,
213 B: OpAssignArbitaryAPI<T, D2, D>,
214 {
215 to_layout(self, layout)
216 }
217
218 pub fn to_layout_f<D2>(&self, layout: Layout<D2>) -> Result<TensorCow<'_, T, B, D2>>
222 where
223 D2: DimAPI,
224 B: OpAssignArbitaryAPI<T, D2, D>,
225 {
226 to_layout_f(self, layout)
227 }
228
229 pub fn into_layout_f<D2>(self, layout: Layout<D2>) -> Result<Tensor<T, B, D2>>
233 where
234 D2: DimAPI,
235 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D2, D> + OpAssignAPI<T, D2>,
236 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
237 {
238 into_layout_f(self, layout)
239 }
240
241 pub fn into_layout<D2>(self, layout: Layout<D2>) -> Tensor<T, B, D2>
245 where
246 D2: DimAPI,
247 B: DeviceRawAPI<MaybeUninit<T>> + OpAssignArbitaryAPI<T, D2, D> + OpAssignAPI<T, D2>,
248 <B as DeviceRawAPI<T>>::Raw: Clone + 'a,
249 {
250 into_layout(self, layout)
251 }
252
253 pub fn change_layout_f<D2>(self, layout: Layout<D2>) -> Result<TensorCow<'a, T, B, D2>>
257 where
258 D2: DimAPI,
259 B: OpAssignArbitaryAPI<T, D2, D>,
260 {
261 change_layout_f(self, layout)
262 }
263
264 pub fn change_layout<D2>(self, layout: Layout<D2>) -> TensorCow<'a, T, B, D2>
268 where
269 D2: DimAPI,
270 B: OpAssignArbitaryAPI<T, D2, D>,
271 {
272 change_layout(self, layout)
273 }
274}
275
276