///|
pub fn Tensor::assign_parameter_data(
  self : Tensor,
  data : Array[Double],
) -> Unit {
  match (self.context, self.node_ref) {
    (Some(ctx), Some(ParamRef(id))) => {
      if data.length() != shape_size(ctx.state.val.params[id].shape) {
        abort("assign_parameter_data requires the same number of elements")
      }
      if ctx.state.val.tape.length() != 0 {
        abort("assign_parameter_data requires no live autograd tape")
      }
      for i in 0.. abort("assign_parameter_data requires a parameter tensor")
  }
}