// 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)
}