static void test_tensor_maps() {
  int inputs[2 * 3 * 5 * 7];
  TensorMap<Tensor<int, 4, DataLayout> > tensor_map(inputs, 2, 3, 5, 7);
  TensorMap<Tensor<const int, 4, DataLayout> > tensor_map_const(inputs, 2, 3, 5,
                                                                7);
  const TensorMap<Tensor<const int, 4, DataLayout> > tensor_map_const_const(
      inputs, 2, 3, 5, 7);

  tensor_map.setRandom();
  array<ptrdiff_t, 2> reduction_axis;
  reduction_axis[0] = 1;
  reduction_axis[1] = 3;

  Tensor<int, 2, DataLayout> result = tensor_map.sum(reduction_axis);
  Tensor<int, 2, DataLayout> result2 = tensor_map_const.sum(reduction_axis);
  Tensor<int, 2, DataLayout> result3 =
      tensor_map_const_const.sum(reduction_axis);

  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 5; ++j) {
      int sum = 0;
      for (int k = 0; k < 3; ++k) {
        for (int l = 0; l < 7; ++l) {
          sum += tensor_map(i, k, j, l);
        }
      }
      VERIFY_IS_EQUAL(result(i, j), sum);
      VERIFY_IS_EQUAL(result2(i, j), sum);
      VERIFY_IS_EQUAL(result3(i, j), sum);
    }
  }
}
static void test_assign_of_const_tensor()
{
  Tensor<int, 3> random(2,3,7);
  random.setRandom();

  TensorMap<Tensor<const int, 3> > constant1(random.data(), 2, 3, 7);
  TensorMap<const Tensor<int, 3> > constant2(random.data(), 2, 3, 7);
  const TensorMap<Tensor<int, 3> > constant3(random.data(), 2, 3, 7);

  Tensor<int, 2> result1 = constant1.chip(0, 2);
  Tensor<int, 2> result2 = constant2.chip(0, 2);
  Tensor<int, 2> result3 = constant3.chip(0, 2);

  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
      VERIFY_IS_EQUAL((result1(i,j)), random(i,j,0));
      VERIFY_IS_EQUAL((result2(i,j)), random(i,j,0));
      VERIFY_IS_EQUAL((result3(i,j)), random(i,j,0));
    }
  }
}
static int f(const TensorMap<Tensor<int, 3> >& tensor) {
  Tensor<int, 1> result = tensor.sum();
  return result(0);
}