The Quantum Exact Simulation Toolkit v4.0.0
Loading...
Searching...
No Matches
qvector.cpp
1/** @file
2 * Testing utilities which define 'qvector', used
3 * as a reference proxy to a quantum statevector.
4 *
5 * @author Tyson Jones
6 */
7
8#include "qvector.hpp"
9#include "macros.hpp"
10
11
12/*
13 * VECTOR CREATION
14 */
15
16qvector getZeroVector(size_t dim) {
17 // permit dim = 0
18
19 return qvector(dim, 0);
20}
21
22qvector getConstantVector(size_t dim, qcomp elem) {
23 DEMAND( dim >= 1 );
24
25 return qvector(dim, elem);
26}
27
28
29/*
30 * SCALAR MULTIPLICATION
31 */
32
33qvector operator * (const qcomp& a, const qvector& v) {
34 qvector out = v;
35
36 for (auto& x : out)
37 x *= a;
38
39 return out;
40}
41
42qvector operator * (const qvector& v, const qcomp& a) {
43 return a * v;
44}
45
46qvector operator *= (qvector& v, const qcomp& a) {
47 v = a * v;
48 return v;
49}
50
51qvector operator * (const qreal& a, const qvector& v) {
52 return qcomp(a,0) * v;
53}
54
55qvector operator * (const qvector& v, const qreal& a) {
56 return a * v;
57}
58
59qvector operator *= (qvector& v, const qreal& a) {
60 v = a * v;
61 return v;
62}
63
64
65/*
66 * SCALAR DIVISION
67 */
68
69qvector operator / (const qvector& v, const qcomp& a) {
70 DEMAND( std::abs(a) != 0 );
71
72 return (1/a) * v;
73}
74
75qvector operator /= (qvector& v, const qcomp& a) {
76 v = v / a;
77 return v;
78}
79
80qvector operator / (const qvector& v, const qreal& a) {
81 return v / qcomp(a,0);
82}
83
84qvector operator /= (qvector& v, const qreal& a) {
85 v = v / a;
86 return v;
87}
88
89
90/*
91 * VECTOR ADDITION
92 */
93
94qvector operator + (const qvector& v1, const qvector& v2) {
95 DEMAND( v1.size() == v2.size() );
96
97 qvector out = v1;
98
99 for (size_t i=0; i<v2.size(); i++)
100 out[i] += v2[i];
101
102 return out;
103}
104
105qvector operator += (qvector& v1, const qvector& v2) {
106 v1 = v1 + v2;
107 return v1;
108}
109
110
111/*
112 * VECTOR SUBTRACTION
113 */
114
115qvector operator - (const qvector& v1, const qvector& v2) {
116 return v1 + (-1 * v2);
117}
118
119qvector operator -= (qvector& v1, const qvector& v2) {
120 v1 = v1 - v2;
121 return v1;
122}
123
124
125/*
126 * SETTERS
127 */
128
129void setSubVector(qvector &dest, qvector sub, size_t i) {
130 DEMAND( sub.size() + i <= dest.size() );
131
132 for (size_t j=0; j<sub.size(); j++)
133 dest[j+i] = sub[j];
134}
135
136void setToDebugState(qvector &v) {
137 DEMAND( !v.empty() );
138
139 for (size_t i=0; i<v.size(); i++)
140 v[i] = qcomp(2*i/10., (2*i+1)/10.);
141}