-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTwoSiteGate.h
More file actions
147 lines (130 loc) · 3.94 KB
/
TwoSiteGate.h
File metadata and controls
147 lines (130 loc) · 3.94 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef TWO_SITE_GATE_H_
#define TWO_SITE_GATE_H_
#include "tensors/Qbasis.h"
template<typename Symmetry, typename Scalar>
class TwoSiteGate
{
public:
TwoSiteGate() {};
TwoSiteGate(const vector<vector<vector<vector<vector<Scalar> > > > > &data_in) : data(data_in){};
TwoSiteGate(const Qbasis<Symmetry> &s1, const Qbasis<Symmetry> &s2);
void print() const;
//
// s1p s2p
// | |
// swap= ****** = delta(s1,s2p)*delta(s2,s1p)
// | |
// s1 s2
//
void setSwapGate(bool FERMIONIC=false);
void setIdentity();
Qbasis<Symmetry> midBasis() const {return Bmid;}
Qbasis<Symmetry> leftBasis() const {return B1;}
Qbasis<Symmetry> rightBasis() const {return B2;}
//private:
//data[s1][s2][s1_p][s2_p][k]:
//
// s1p s2p s1p s2p
// | | \ /
// ^ ^ \ /
// | | ^
// ****** |
// *gate* CGC: k
// ****** ^
// | | |
// ^ ^ / \
// | | / \
// s1 s2 s1 s2
//
vector<vector<vector<vector<vector<Scalar> > > > > data;
Qbasis<Symmetry> B1, B2, Bmid;
vector<qarray<Symmetry::Nq> > qloc1, qloc2, qmid;
void resize();
};
template<typename Symmetry, typename Scalar>
TwoSiteGate<Symmetry,Scalar>::
TwoSiteGate (const Qbasis<Symmetry> &s1, const Qbasis<Symmetry> &s2)
: B1(s1),B2(s2)
{
//Bmid is the combined basis from B1 and B2.
Bmid = B1.combine(B2);
qloc1 = B1.qloc();
qloc2 = B2.qloc();
qmid = Bmid.qs();
resize();
}
template<typename Symmetry, typename Scalar>
void TwoSiteGate<Symmetry,Scalar>::
resize()
{
data.resize(qloc1.size());
for (size_t s1=0; s1< qloc1.size(); s1++)
{
data[s1].resize(qloc2.size());
for (size_t s2=0; s2<qloc2.size(); s2++)
{
data[s1][s2].resize(qloc1.size());
for (size_t s1p=0; s1p<qloc1.size(); s1p++)
{
data[s1][s2][s1p].resize(qloc2.size());
for (size_t s2p=0; s2p<qloc2.size(); s2p++)
{
data[s1][s2][s1p][s2p].resize(qmid.size());
}
}
}
}
}
template<typename Symmetry, typename Scalar>
void TwoSiteGate<Symmetry,Scalar>::
setSwapGate(bool FERMIONIC)
{
assert(!FERMIONIC and "Fermionic swap gates are not yet implemented.");
for (size_t s1=0; s1<qloc1.size(); s1++)
for (size_t s2=0; s2<qloc2.size(); s2++)
for (size_t s1p=0; s1p<qloc1.size(); s1p++)
for (size_t s2p=0; s2p<qloc2.size(); s2p++)
for (size_t k=0; k<qmid.size(); k++)
{
if (!Symmetry::triangle({qloc1[s1],qloc2[s2],qmid[k]})) {continue;}
if (!Symmetry::triangle({qloc1[s1p],qloc2[s2p],qmid[k]})) {continue;}
if (s1 == s2p and s2 == s1p)
{
// cout << "s1=" << s1 << "," << qloc1[s1] << ", s2p=" << s2p << "," << qloc2[s2p] << ", s2=" << s2 << "," << qloc2[s2] << ", s1p=" << s1p << "," << qloc1[s1p] << ", k=" << k << "," << qmid[k] << endl;
// cout << "CGC phase=" << Symmetry::coeff_swapPhase(qloc1[s1],qloc2[s2],qmid[k]) << endl;
data[s1][s2][s1p][s2p][k] = Symmetry::coeff_swapPhase(qloc1[s1],qloc2[s2],qmid[k])*Scalar(1.);
}
else {data[s1][s2][s1p][s2p][k] = Scalar(0.);}
}
}
template<typename Symmetry, typename Scalar>
void TwoSiteGate<Symmetry,Scalar>::
setIdentity()
{
for (size_t s1=0; s1<qloc1.size(); s1++)
for (size_t s2=0; s2<qloc2.size(); s2++)
for (size_t s1p=0; s1p<qloc1.size(); s1p++)
for (size_t s2p=0; s2p<qloc2.size(); s2p++)
for (size_t k=0; k<qmid.size(); k++)
{
if (s1 == s1p and s2 == s2p)
{
data[s1][s2][s1p][s2p][k] = Scalar(1.);
}
else {data[s1][s2][s1p][s2p][k] = Scalar(0.);}
}
}
template<typename Symmetry, typename Scalar>
void TwoSiteGate<Symmetry,Scalar>::
print() const
{
for (size_t s1=0; s1<qloc1.size(); s1++)
for (size_t s2=0; s2<qloc2.size(); s2++)
for (size_t s1p=0; s1p<qloc1.size(); s1p++)
for (size_t s2p=0; s2p<qloc2.size(); s2p++)
for (size_t k=0; k<qmid.size(); k++)
{
cout << "data[" << s1 << "][" << s2 << "][" << s1p << "][" << s2p << "][" << k << "]=" << data[s1][s2][s1p][s2p][k] << endl;
}
}
#endif