-
Notifications
You must be signed in to change notification settings - Fork 166
/
Copy pathsparse_contract_test.cc
101 lines (94 loc) · 2.82 KB
/
sparse_contract_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "test.h"
#include "itensor/tensor/contract.h"
#include "itensor/util/iterate.h"
using namespace itensor;
TEST_CASE("Non-Contracting Product Test")
{
SECTION("Rank 2")
{
Tensor A(2,2),
B(2,2),
C(2,2,2);
randomize(A);
randomize(B);
SECTION("Case 1")
{
ncprod(A,{0,1},B,{2,1},C,{0,1,2});
for(auto i0 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i2 : range(B.extent(0)))
{
CHECK_CLOSE(C(i0,i1,i2), A(i0,i1)*B(i2,i1));
}
}
SECTION("Case 2")
{
ncprod(A,{0,1},B,{1,2},C,{0,1,2});
for(auto i0 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i2 : range(B.extent(0)))
{
CHECK_CLOSE(C(i0,i1,i2), A(i0,i1)*B(i1,i2));
}
}
SECTION("Case 3")
{
ncprod(A,{1,0},B,{1,2},C,{0,1,2});
for(auto i0 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i2 : range(B.extent(0)))
{
CHECK_CLOSE(C(i0,i1,i2), A(i1,i0)*B(i1,i2));
}
}
SECTION("Case 4")
{
ncprod(A,{1,0},B,{1,2},C,{2,1,0});
for(auto i0 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i2 : range(B.extent(0)))
{
CHECK_CLOSE(C(i2,i1,i0), A(i1,i0)*B(i1,i2));
}
}
}
SECTION("Ranks 3*2=4")
{
auto m0 = 2,
m1 = 3,
m2 = 4,
m3 = 5;
SECTION("Case 1")
{
Tensor A(m0,m1,m2),
B(m3,m1),
C(m0,m1,m2,m3);
randomize(A);
randomize(B);
ncprod(A,{0,1,2},B,{3,1},C,{0,1,2,3});
for(auto i0 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i2 : range(A.extent(2)))
for(auto i3 : range(B.extent(0)))
{
CHECK_CLOSE(C(i0,i1,i2,i3), A(i0,i1,i2)*B(i3,i1));
}
}
SECTION("Case 2")
{
Tensor A(m2,m1,m0),
B(m3,m1),
C(m0,m1,m2,m3);
randomize(A);
randomize(B);
ncprod(A,{2,1,0},B,{3,1},C,{0,1,2,3});
for(auto i2 : range(A.extent(0)))
for(auto i1 : range(A.extent(1)))
for(auto i0 : range(A.extent(2)))
for(auto i3 : range(B.extent(0)))
{
CHECK_CLOSE(C(i0,i1,i2,i3), A(i2,i1,i0)*B(i3,i1));
}
}
}
}