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