The Quantum Exact Simulation Toolkit v4.0.0
Loading...
Searching...
No Matches
convert.cpp
1/** @file
2 * Testing utilities for converting QuEST API structures
3 * (like Qureg, CompMatr, PauliStr) to/from testing types
4 * (like qvector and qmatrix).
5 *
6 * @author Tyson Jones
7 */
8
9#include "qvector.hpp"
10#include "qmatrix.hpp"
11#include "linalg.hpp"
12#include "macros.hpp"
13#include "lists.hpp"
14
15#include "quest/include/quest.h"
16
17#include <type_traits>
18using std::is_same_v;
19
20#include <vector>
21using std::vector;
22
23
24
25/*
26 * TO QUREG
27 */
28
29
30void setQuregToReference(Qureg qureg, qvector vector) {
31 DEMAND( !qureg.isDensityMatrix );
32 DEMAND( qureg.numAmps == (qindex) vector.size() );
33
34 setQuregAmps(qureg, 0, vector.data(), vector.size());
35}
36
37
38void setQuregToReference(Qureg qureg, qmatrix matrix) {
39 DEMAND( qureg.isDensityMatrix );
40 DEMAND( getPow2(qureg.numQubits) == (qindex) matrix.size() );
41
42 qindex numRows = 1;
43 qindex numCols = getPow2(qureg.numQubits);
44
45 for (size_t r=0; r<matrix.size(); r++) {
46 qcomp* arr[] = {matrix[r].data()};
47 setDensityQuregAmps(qureg, r, 0, arr, numRows, numCols);
48 }
49}
50
51
52
53/*
54 * FROM QUREG
55 */
56
57
58qvector getVector(Qureg qureg) {
59 DEMAND( !qureg.isDensityMatrix );
60
61 qvector out = getZeroVector(qureg.numAmps);
62 getQuregAmps(out.data(), qureg, 0, qureg.numAmps);
63 return out;
64}
65
66
67qmatrix getMatrix(Qureg qureg) {
68 DEMAND( qureg.isDensityMatrix );
69
70 qindex numRows = 1;
71 qindex numCols = getPow2(qureg.numQubits);
72 qmatrix out = getZeroMatrix(numCols);
73
74 for (size_t r=0; r<out.size(); r++) {
75 qcomp* arr[] = {out[r].data()};
76 getDensityQuregAmps(arr, qureg, r, 0, numRows, numCols);
77
78 }
79
80 return out;
81}
82
83
84
85/*
86 * FROM API MATRIX
87 */
88
89
90template <typename T>
91qcomp getElem(T m, size_t r, size_t c) {
92
93 if constexpr (is_same_v<T, CompMatr> || is_same_v<T, SuperOp>)
94 return m.cpuElems[r][c];
95
96 if constexpr (is_same_v<T, CompMatr1> || is_same_v<T, CompMatr2>)
97 return m.elems[r][c];
98
99 if constexpr (is_same_v<T, DiagMatr>)
100 return (r==c)? m.cpuElems[r] : 0;
101
102 if constexpr (is_same_v<T, DiagMatr1> || is_same_v<T, DiagMatr2>)
103 return (r==c)? m.elems[r] : 0;
104}
105
106
107template <typename T>
108qmatrix getMatrixInner(T m) {
109
110 qindex dim = (is_same_v<T, SuperOp>)?
111 getPow2(2*m.numQubits):
112 getPow2( m.numQubits);
113
114 qmatrix out = getZeroMatrix(dim);
115
116 for (size_t r=0; r<out.size(); r++)
117 for (size_t c=0; c<out.size(); c++)
118 out[r][c] = getElem<T>(m, r, c);
119
120 return out;
121}
122
123
124qmatrix getMatrix(CompMatr1 m) { return getMatrixInner(m); }
125qmatrix getMatrix(CompMatr2 m) { return getMatrixInner(m); }
126qmatrix getMatrix(CompMatr m) { return getMatrixInner(m); }
127qmatrix getMatrix(DiagMatr1 m) { return getMatrixInner(m); }
128qmatrix getMatrix(DiagMatr2 m) { return getMatrixInner(m); }
129qmatrix getMatrix(DiagMatr m) { return getMatrixInner(m); }
130qmatrix getMatrix(SuperOp m) { return getMatrixInner(m); }
131
132
133
134/*
135 * FROM PAULI STRING
136 */
137
138
139extern int paulis_getPauliAt(PauliStr str, int ind);
140extern int paulis_getIndOfLefmostNonIdentityPauli(PauliStr str);
141extern int paulis_getIndOfLefmostNonIdentityPauli(PauliStrSum sum);
142
143
144qmatrix getMatrix(PauliStr str, vector<int> targs) {
145 DEMAND( targs.size() >= 1 );
146
147 qmatrix out = getIdentityMatrix(1);
148
149 for (auto t : targs) {
150 int ind = paulis_getPauliAt(str, t);
151 qmatrix matr = getPauliMatrix(ind);
152 out = getKroneckerProduct(matr, out);
153 }
154
155 return out;
156}
157
158
159qmatrix getMatrix(PauliStr str, int numQubits) {
160 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(str) );
161
162 return getMatrix(str, getRange(numQubits));
163}
164
165
166qmatrix getMatrix(PauliStrSum sum, int numQubits) {
167 DEMAND( sum.numTerms > 0 );
168 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(sum) );
169
170 qmatrix out = getZeroMatrix(getPow2(numQubits));
171
172 for (qindex i=0; i<sum.numTerms; i++)
173 out += sum.coeffs[i] * getMatrix(sum.strings[i], numQubits);
174
175 return out;
176}
void setQuregAmps(Qureg qureg, qindex startInd, qcomp *amps, qindex numAmps)
void setDensityQuregAmps(Qureg qureg, qindex startRow, qindex startCol, qcomp **amps, qindex numRows, qindex numCols)
void getDensityQuregAmps(qcomp **outAmps, Qureg qureg, qindex startRow, qindex startCol, qindex numRows, qindex numCols)
Definition qureg.cpp:457
void getQuregAmps(qcomp *outAmps, Qureg qureg, qindex startInd, qindex numAmps)
Definition qureg.cpp:448
qmatrix getKroneckerProduct(qmatrix a, qmatrix b)
Definition linalg.cpp:523
qmatrix getIdentityMatrix(size_t dim)
Definition qmatrix.cpp:30
qmatrix getZeroMatrix(size_t dim)
Definition qmatrix.cpp:18
Definition qureg.h:49