// shape_ops.mbt
///|
/// Reshape a Tensor to a new shape. The total size must remain the same.
pub fn Tensor::reshape(self : Tensor, new_shape : Array[Int]) -> Tensor {
let old_size = checked_shape_size(self.shape)
let new_size = checked_shape_size(new_shape)
if old_size != new_size {
panic()
}
let self_strides = shape_to_strides(self.shape)
let data = Array::make(old_size, 0.0)
for i in 0.. Tensor {
let len = self.shape.length()
if dim < 0 || dim >= len {
panic()
}
let dim_size = self.shape[dim]
if start < 0 || start > end_idx || end_idx > dim_size {
panic()
}
let new_shape = self.shape.copy()
new_shape[dim] = end_idx - start
let out_strides = shape_to_strides(new_shape)
let mut out_size = 1
for d in new_shape {
out_size = out_size * d
}
if new_shape.length() == 0 {
out_size = 1
}
let data = Array::make(out_size, 0.0)
for i in 0.. Tensor {
let len = self.shape.length()
if ranges.length() != len {
panic()
}
let new_shape = Array::make(len, 0)
for k in 0.. e || e > self.shape[k] {
panic()
}
new_shape[k] = e - s
}
let out_strides = shape_to_strides(new_shape)
let mut out_size = 1
for d in new_shape {
out_size = out_size * d
}
if new_shape.length() == 0 {
out_size = 1
}
let data = Array::make(out_size, 0.0)
for i in 0.. Tensor {
let len = self.shape.length()
if dim0 >= len || dim1 >= len || dim0 < 0 || dim1 < 0 {
panic()
}
let new_shape = Array::make(len, 0)
for i in 0.. Tensor {
if self.shape.length() != 2 {
panic()
}
self.transpose(0, 1)
}