15#include "quest/include/quest.h"
30void setQuregToReference(
Qureg qureg, qvector vector) {
31 DEMAND( !qureg.isDensityMatrix );
32 DEMAND( qureg.numAmps == (qindex) vector.size() );
38void setQuregToReference(
Qureg qureg, qmatrix matrix) {
39 DEMAND( qureg.isDensityMatrix );
40 DEMAND( getPow2(qureg.numQubits) == (qindex) matrix.size() );
43 qindex numCols = getPow2(qureg.numQubits);
45 for (
size_t r=0; r<matrix.size(); r++) {
46 qcomp* arr[] = {matrix[r].data()};
58qvector getVector(
Qureg qureg) {
59 DEMAND( !qureg.isDensityMatrix );
61 qvector out = getZeroVector(qureg.numAmps);
67qmatrix getMatrix(
Qureg qureg) {
68 DEMAND( qureg.isDensityMatrix );
71 qindex numCols = getPow2(qureg.numQubits);
74 for (
size_t r=0; r<out.size(); r++) {
75 qcomp* arr[] = {out[r].data()};
91qcomp getElem(T m,
size_t r,
size_t c) {
93 if constexpr (is_same_v<T, CompMatr> || is_same_v<T, SuperOp>)
94 return m.cpuElems[r][c];
96 if constexpr (is_same_v<T, CompMatr1> || is_same_v<T, CompMatr2>)
99 if constexpr (is_same_v<T, DiagMatr>)
100 return (r==c)? m.cpuElems[r] : 0;
102 if constexpr (is_same_v<T, DiagMatr1> || is_same_v<T, DiagMatr2>)
103 return (r==c)? m.elems[r] : 0;
108qmatrix getMatrixInner(T m) {
110 qindex dim = (is_same_v<T, SuperOp>)?
111 getPow2(2*m.numQubits):
112 getPow2( m.numQubits);
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);
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); }
139extern int paulis_getPauliAt(
PauliStr str,
int ind);
140extern int paulis_getIndOfLefmostNonIdentityPauli(
PauliStr str);
141extern int paulis_getIndOfLefmostNonIdentityPauli(
PauliStrSum sum);
144qmatrix getMatrix(
PauliStr str, vector<int> targs) {
145 DEMAND( targs.size() >= 1 );
149 for (
auto t : targs) {
150 int ind = paulis_getPauliAt(str, t);
151 qmatrix matr = getPauliMatrix(ind);
159qmatrix getMatrix(
PauliStr str,
int numQubits) {
160 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(str) );
162 return getMatrix(str, getRange(numQubits));
167 DEMAND( sum.numTerms > 0 );
168 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(sum) );
172 for (qindex i=0; i<sum.numTerms; i++)
173 out += sum.coeffs[i] * getMatrix(sum.strings[i], numQubits);
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)
void getQuregAmps(qcomp *outAmps, Qureg qureg, qindex startInd, qindex numAmps)
qmatrix getKroneckerProduct(qmatrix a, qmatrix b)
qmatrix getIdentityMatrix(size_t dim)
qmatrix getZeroMatrix(size_t dim)