29extern int paulis_getPauliAt(
PauliStr str,
int ind);
30extern int paulis_getIndOfLefmostNonIdentityPauli(
PauliStr str);
31extern int paulis_getIndOfLefmostNonIdentityPauli(
PauliStrSum sum);
40void setQuregToReference(
Qureg qureg, qvector vector) {
41 DEMAND( !qureg.isDensityMatrix );
42 DEMAND( qureg.numAmps == (qindex) vector.size() );
48void setQuregToReference(
Qureg qureg, qmatrix matrix) {
49 DEMAND( qureg.isDensityMatrix );
50 DEMAND( getPow2(qureg.numQubits) == (qindex) matrix.size() );
53 qindex numCols = getPow2(qureg.numQubits);
55 for (
size_t r=0; r<matrix.size(); r++) {
56 qcomp* arr[] = {matrix[r].data()};
68qvector getVector(
Qureg qureg) {
69 DEMAND( !qureg.isDensityMatrix );
71 qvector out = getZeroVector(qureg.numAmps);
77qmatrix getMatrix(
Qureg qureg) {
78 DEMAND( qureg.isDensityMatrix );
81 qindex numCols = getPow2(qureg.numQubits);
84 for (
size_t r=0; r<out.size(); r++) {
85 qcomp* arr[] = {out[r].data()};
101qcomp getElem(T m,
size_t r,
size_t c) {
103 if constexpr (is_same_v<T, CompMatr> || is_same_v<T, SuperOp>)
104 return m.cpuElems[r][c];
106 if constexpr (is_same_v<T, CompMatr1> || is_same_v<T, CompMatr2>)
107 return m.elems[r][c];
109 if constexpr (is_same_v<T, DiagMatr>)
110 return (r==c)? m.cpuElems[r] : 0;
112 if constexpr (is_same_v<T, DiagMatr1> || is_same_v<T, DiagMatr2>)
113 return (r==c)? m.elems[r] : 0;
118qmatrix getMatrixInner(T m) {
120 qindex dim = (is_same_v<T, SuperOp>)?
121 getPow2(2*m.numQubits):
122 getPow2( m.numQubits);
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);
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); }
149qmatrix getMatrix(
PauliStr str, vector<int> targs) {
150 DEMAND( targs.size() >= 1 );
154 for (
auto t : targs) {
155 int ind = paulis_getPauliAt(str, t);
156 qmatrix matr = getPauliMatrix(ind);
164qmatrix getMatrix(
PauliStr str,
int numQubits) {
165 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(str) );
167 return getMatrix(str, getRange(numQubits));
172 DEMAND( sum.numTerms > 0 );
173 DEMAND( numQubits >= paulis_getIndOfLefmostNonIdentityPauli(sum) );
177 for (qindex i=0; i<sum.numTerms; i++)
178 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)