Caffe2 - C++ API
A deep learning, cross platform ML framework
atest.cpp
1 #include <gtest/gtest.h>
2 
3 #include <ATen/ATen.h>
4 
5 #include<iostream>
6 using namespace std;
7 using namespace at;
8 
9 void trace() {
10  Tensor foo = rand({12, 12});
11 
12  // ASSERT foo is 2-dimensional and holds floats.
13  auto foo_a = foo.accessor<float, 2>();
14  float trace = 0;
15 
16  for (int i = 0; i < foo_a.size(0); i++) {
17  trace += foo_a[i][i];
18  }
19 
20  ASSERT_FLOAT_EQ(foo.trace().item<float>(), trace);
21 }
22 
23 // TEST_CASE( "atest", "[]" ) {
24 TEST(atest, atest) {
25  manual_seed(123);
26 
27  auto foo = rand({12, 6});
28 
29  ASSERT_EQ(foo.size(0), 12);
30  ASSERT_EQ(foo.size(1), 6);
31 
32  foo = foo + foo * 3;
33  foo -= 4;
34 
35  Scalar a = 4;
36  float b = a.to<float>();
37  ASSERT_EQ(b, 4);
38 
39  foo = (foo * foo) == (foo.pow(3));
40  foo = 2 + (foo + 1);
41  // foo = foo[3];
42  auto foo_v = foo.accessor<uint8_t, 2>();
43 
44  for (int i = 0; i < foo_v.size(0); i++) {
45  for (int j = 0; j < foo_v.size(1); j++) {
46  foo_v[i][j]++;
47  }
48  }
49 
50  ASSERT_TRUE(foo.equal(4 * ones({12, 6}, kByte)));
51 
52  trace();
53 
54  float data[] = {1, 2, 3, 4, 5, 6};
55 
56  auto f = CPU(kFloat).tensorFromBlob(data, {1, 2, 3});
57  auto f_a = f.accessor<float, 3>();
58 
59  ASSERT_EQ(f_a[0][0][0], 1.0);
60  ASSERT_EQ(f_a[0][1][1], 5.0);
61 
62  ASSERT_EQ(f.strides()[0], 6);
63  ASSERT_EQ(f.strides()[1], 3);
64  ASSERT_EQ(f.strides()[2], 1);
65  ASSERT_EQ(f.sizes()[0], 1);
66  ASSERT_EQ(f.sizes()[1], 2);
67  ASSERT_EQ(f.sizes()[2], 3);
68 
69  // TODO(ezyang): maybe do a more precise exception type.
70  ASSERT_THROW(f.resize_({3, 4, 5}), std::exception);
71  {
72  int isgone = 0;
73  {
74  auto f2 =
75  CPU(kFloat).tensorFromBlob(data, {1, 2, 3}, [&](void*) { isgone++; });
76  }
77  ASSERT_EQ(isgone, 1);
78  }
79  {
80  int isgone = 0;
81  Tensor a_view;
82  {
83  auto f2 =
84  CPU(kFloat).tensorFromBlob(data, {1, 2, 3}, [&](void*) { isgone++; });
85  a_view = f2.view({3, 2, 1});
86  }
87  ASSERT_EQ(isgone, 0);
88  a_view.reset();
89  ASSERT_EQ(isgone, 1);
90  }
91 
92  if (at::hasCUDA()) {
93  int isgone = 0;
94  {
95  auto base = at::empty({1,2,3}, TensorOptions(kCUDA));
96  auto f2 = CUDA(kFloat).tensorFromBlob(
97  base.data_ptr(), {1, 2, 3}, [&](void*) { isgone++; });
98  }
99  ASSERT_EQ(isgone, 1);
100  }
101 }
Scalar represents a 0-dimensional tensor which contains a single element.
Definition: Scalar.h:22
Flush-To-Zero and Denormals-Are-Zero mode.