QuEST_cpu_internal.h
Go to the documentation of this file.
1 // Distributed under MIT licence. See https://github.com/QuEST-Kit/QuEST/blob/master/LICENCE.txt for details
2 
13 # ifndef QUEST_CPU_INTERNAL_H
14 # define QUEST_CPU_INTERNAL_H
15 
16 # include "QuEST_precision.h"
17 
18 
19 /*
20 * Bit twiddling functions are defined seperately here in the CPU backend,
21 * since the GPU backend needs a device-specific redefinition to be callable
22 * from GPU kernels. These are called in both QuEST_cpu and QuEST_cpu_distributed
23 * and defined in here since public inline methods in C must go in the header
24 */
25 
26 static inline int extractBit (const int locationOfBitFromRight, const long long int theEncodedNumber) {
27  return (theEncodedNumber & ( 1LL << locationOfBitFromRight )) >> locationOfBitFromRight;
28 }
29 
30 static inline long long int flipBit(long long int number, int bitInd) {
31  return (number ^ (1LL << bitInd));
32 }
33 
34 static inline int maskContainsBit(long long int mask, int bitInd) {
35  return mask & (1LL << bitInd);
36 }
37 
38 static inline int isOddParity(long long int number, int qb1, int qb2) {
39  return extractBit(qb1, number) != extractBit(qb2, number);
40 }
41 
42 static inline long long int insertZeroBit(long long int number, int index) {
43  long long int left, right;
44  left = (number >> index) << index;
45  right = number - left;
46  return (left << 1) ^ right;
47 }
48 
49 static inline long long int insertTwoZeroBits(long long int number, int bit1, int bit2) {
50  int small = (bit1 < bit2)? bit1 : bit2;
51  int big = (bit1 < bit2)? bit2 : bit1;
52  return insertZeroBit(insertZeroBit(number, small), big);
53 }
54 
55 
56 /*
57  * density matrix operations
58  */
59 
61 
62 void densmatr_initPureStateLocal(Qureg targetQureg, Qureg copyQureg);
63 
65 
67 
69 
70 qreal densmatr_findProbabilityOfZeroLocal(Qureg qureg, const int measureQubit);
71 
72 void densmatr_mixDepolarisingLocal(Qureg qureg, const int targetQubit, qreal depolLevel);
73 
74 void densmatr_mixDepolarisingDistributed(Qureg qureg, const int targetQubit, qreal depolLevel);
75 
76 void densmatr_mixDampingLocal(Qureg qureg, const int targetQubit, qreal damping);
77 
78 void densmatr_mixDampingDistributed(Qureg qureg, const int targetQubit, qreal damping);
79 
80 void densmatr_mixTwoQubitDepolarisingLocal(Qureg qureg, int qubit1, int qubit2, qreal delta, qreal gamma);
81 
82 void densmatr_mixTwoQubitDepolarisingLocalPart1(Qureg qureg, int qubit1, int qubit2, qreal delta);
83 
84 void densmatr_mixTwoQubitDepolarisingDistributed(Qureg qureg, const int targetQubit,
85  const int qubit2, qreal delta, qreal gamma);
86 
88  const int qubit2, qreal delta, qreal gamma);
89 
90 
91 /*
92  * state vector operations
93  */
94 
96 
97 void statevec_compactUnitaryLocal (Qureg qureg, const int targetQubit, Complex alpha, Complex beta);
98 
100  Complex rot1, Complex rot2,
101  ComplexArray stateVecUp,
102  ComplexArray stateVecLo,
103  ComplexArray stateVecOut);
104 
105 void statevec_unitaryLocal(Qureg qureg, const int targetQubit, ComplexMatrix2 u);
106 
108  Complex rot1, Complex rot2,
109  ComplexArray stateVecUp,
110  ComplexArray stateVecLo,
111  ComplexArray stateVecOut);
112 
113 void statevec_controlledCompactUnitaryLocal (Qureg qureg, const int controlQubit, const int targetQubit,
114  Complex alpha, Complex beta);
115 
116 void statevec_controlledCompactUnitaryDistributed (Qureg qureg, const int controlQubit,
117  Complex rot1, Complex rot2,
118  ComplexArray stateVecUp,
119  ComplexArray stateVecLo,
120  ComplexArray stateVecOut);
121 
122 void statevec_controlledUnitaryLocal(Qureg qureg, const int controlQubit, const int targetQubit, ComplexMatrix2 u);
123 
124 void statevec_controlledUnitaryDistributed (Qureg qureg, const int controlQubit,
125  Complex rot1, Complex rot2,
126  ComplexArray stateVecUp,
127  ComplexArray stateVecLo,
128  ComplexArray stateVecOut);
129 
130 void statevec_multiControlledUnitaryLocal(Qureg qureg, const int targetQubit,
131  long long int ctrlQubitsMask, long long int ctrlFlipMask, ComplexMatrix2 u);
132 
134  const int targetQubit,
135  long long int ctrlQubitsMask, long long int ctrlFlipMask,
136  Complex rot1, Complex rot2,
137  ComplexArray stateVecUp,
138  ComplexArray stateVecLo,
139  ComplexArray stateVecOut);
140 
141 void statevec_pauliXLocal(Qureg qureg, const int targetQubit);
142 
144  ComplexArray stateVecIn,
145  ComplexArray stateVecOut);
146 
147 void statevec_pauliYLocal(Qureg qureg, const int targetQubit, const int conjFac);
148 
150  ComplexArray stateVecIn,
151  ComplexArray stateVecOut,
152  int updateUpper, const int conjFac);
153 
154 void statevec_controlledPauliYLocal(Qureg qureg, const int controlQubit, const int targetQubit, const int conjFactor);
155 
156 void statevec_controlledPauliYDistributed(Qureg qureg, const int controlQubit,
157  ComplexArray stateVecIn,
158  ComplexArray stateVecOut, const int conjFactor);
159 
160 void statevec_hadamardLocal (Qureg qureg, const int targetQubit);
161 
163  ComplexArray stateVecUp,
164  ComplexArray stateVecLo,
165  ComplexArray stateVecOut, int updateUpper);
166 
167 void statevec_controlledNotLocal(Qureg qureg, const int controlQubit, const int targetQubit);
168 
169 void statevec_controlledNotDistributed (Qureg qureg, const int controlQubit,
170  ComplexArray stateVecIn,
171  ComplexArray stateVecOut);
172 
173 qreal statevec_findProbabilityOfZeroLocal (Qureg qureg, const int measureQubit);
174 
176 
177 void statevec_collapseToKnownProbOutcomeLocal(Qureg qureg, int measureQubit, int outcome, qreal totalProbability);
178 
179 void statevec_collapseToKnownProbOutcomeDistributedRenorm (Qureg qureg, const int measureQubit, const qreal totalProbability);
180 
182 
183 void statevec_swapQubitAmpsLocal(Qureg qureg, int qb1, int qb2);
184 
185 void statevec_swapQubitAmpsDistributed(Qureg qureg, int pairRank, int qb1, int qb2);
186 
187 void statevec_multiControlledTwoQubitUnitaryLocal(Qureg qureg, long long int ctrlMask, const int q1, const int q2, ComplexMatrix4 u);
188 
189 void statevec_multiControlledMultiQubitUnitaryLocal(Qureg qureg, long long int ctrlMask, int* targs, const int numTargs, ComplexMatrixN u);
190 
191 
192 # endif // QUEST_CPU_INTERNAL_H
qreal densmatr_calcPurityLocal(Qureg qureg)
Definition: QuEST_cpu.c:860
qreal densmatr_calcHilbertSchmidtDistanceSquaredLocal(Qureg a, Qureg b)
computes Tr((a-b) conjTrans(a-b)) = sum of abs values of (a-b)
Definition: QuEST_cpu.c:922
qreal densmatr_findProbabilityOfZeroLocal(Qureg qureg, const int measureQubit)
Definition: QuEST_cpu.c:3111
void statevec_collapseToKnownProbOutcomeLocal(Qureg qureg, int measureQubit, int outcome, qreal totalProbability)
Update the state vector to be consistent with measuring measureQubit=0 if outcome=0 and measureQubit=...
Definition: QuEST_cpu.c:3340
static long long int flipBit(long long int number, int bitInd)
static long long int insertTwoZeroBits(long long int number, int bit1, int bit2)
static int maskContainsBit(long long int mask, int bitInd)
void statevec_controlledUnitaryDistributed(Qureg qureg, const int controlQubit, Complex rot1, Complex rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)
Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha ...
Definition: QuEST_cpu.c:2347
void statevec_controlledCompactUnitaryDistributed(Qureg qureg, const int controlQubit, Complex rot1, Complex rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)
Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha ...
Definition: QuEST_cpu.c:2285
void densmatr_mixDepolarisingLocal(Qureg qureg, const int targetQubit, qreal depolLevel)
Definition: QuEST_cpu.c:125
void statevec_swapQubitAmpsDistributed(Qureg qureg, int pairRank, int qb1, int qb2)
qureg.pairStateVec contains the entire set of amplitudes of the paired node which includes the set of...
Definition: QuEST_cpu.c:3539
void statevec_multiControlledUnitaryDistributed(Qureg qureg, const int targetQubit, long long int ctrlQubitsMask, long long int ctrlFlipMask, Complex rot1, Complex rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)
Apply a unitary operation to a single qubit in the state vector of probability amplitudes,...
Definition: QuEST_cpu.c:2413
void statevec_compactUnitaryLocal(Qureg qureg, const int targetQubit, Complex alpha, Complex beta)
Definition: QuEST_cpu.c:1656
static long long int insertZeroBit(long long int number, int index)
void densmatr_mixDampingDistributed(Qureg qureg, const int targetQubit, qreal damping)
Definition: QuEST_cpu.c:299
Represents a 4x4 matrix of complex numbers.
Definition: QuEST.h:125
void densmatr_initPureStateLocal(Qureg targetQureg, Qureg copyQureg)
Definition: QuEST_cpu.c:1183
void statevec_unitaryLocal(Qureg qureg, const int targetQubit, ComplexMatrix2 u)
Definition: QuEST_cpu.c:1900
Represents a general 2^N by 2^N matrix of complex numbers.
Definition: QuEST.h:136
#define qreal
void statevec_unitaryDistributed(Qureg qureg, Complex rot1, Complex rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)
Apply a unitary operation to a single qubit given a subset of the state vector with upper and lower b...
Definition: QuEST_cpu.c:2024
void statevec_controlledNotDistributed(Qureg qureg, const int controlQubit, ComplexArray stateVecIn, ComplexArray stateVecOut)
Rotate a single qubit by {{0,1},{1,0}.
Definition: QuEST_cpu.c:2612
static int extractBit(const int locationOfBitFromRight, const long long int theEncodedNumber)
Complex statevec_calcInnerProductLocal(Qureg bra, Qureg ket)
Definition: QuEST_cpu.c:1070
void statevec_hadamardDistributed(Qureg qureg, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut, int updateUpper)
Rotate a single qubit by {{1,1},{1,-1}}/sqrt2.
Definition: QuEST_cpu.c:2894
qreal statevec_findProbabilityOfZeroDistributed(Qureg qureg)
Measure the probability of a specified qubit being in the zero state across all amplitudes held in th...
Definition: QuEST_cpu.c:3222
void statevec_pauliYDistributed(Qureg qureg, ComplexArray stateVecIn, ComplexArray stateVecOut, int updateUpper, const int conjFac)
Rotate a single qubit by +-{{0,-i},{i,0}.
Definition: QuEST_cpu.c:2704
void statevec_collapseToOutcomeDistributedSetZero(Qureg qureg)
Set all amplitudes in one chunk to 0.
Definition: QuEST_cpu.c:3461
qreal densmatr_calcFidelityLocal(Qureg qureg, Qureg pureState)
computes a few dens-columns-worth of (vec^*T) dens * vec
Definition: QuEST_cpu.c:989
void densmatr_mixDampingLocal(Qureg qureg, const int targetQubit, qreal damping)
Definition: QuEST_cpu.c:174
void statevec_controlledCompactUnitaryLocal(Qureg qureg, const int controlQubit, const int targetQubit, Complex alpha, Complex beta)
Definition: QuEST_cpu.c:2069
void statevec_multiControlledMultiQubitUnitaryLocal(Qureg qureg, long long int ctrlMask, int *targs, const int numTargs, ComplexMatrixN u)
Definition: QuEST_cpu.c:1814
void densmatr_mixTwoQubitDepolarisingLocal(Qureg qureg, int qubit1, int qubit2, qreal delta, qreal gamma)
Definition: QuEST_cpu.c:385
void densmatr_mixDepolarisingDistributed(Qureg qureg, const int targetQubit, qreal depolLevel)
Definition: QuEST_cpu.c:224
qreal statevec_findProbabilityOfZeroLocal(Qureg qureg, const int measureQubit)
Measure the total probability of a specified qubit being in the zero state across all amplitudes in t...
Definition: QuEST_cpu.c:3166
qreal densmatr_calcInnerProductLocal(Qureg a, Qureg b)
computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij)
Definition: QuEST_cpu.c:957
Represents a system of qubits.
Definition: QuEST.h:160
void statevec_pauliXLocal(Qureg qureg, const int targetQubit)
Definition: QuEST_cpu.c:2464
void statevec_multiControlledTwoQubitUnitaryLocal(Qureg qureg, long long int ctrlMask, const int q1, const int q2, ComplexMatrix4 u)
Definition: QuEST_cpu.c:1715
void statevec_multiControlledUnitaryLocal(Qureg qureg, const int targetQubit, long long int ctrlQubitsMask, long long int ctrlFlipMask, ComplexMatrix2 u)
Definition: QuEST_cpu.c:2140
void statevec_controlledUnitaryLocal(Qureg qureg, const int controlQubit, const int targetQubit, ComplexMatrix2 u)
Definition: QuEST_cpu.c:2207
void statevec_hadamardLocal(Qureg qureg, const int targetQubit)
Definition: QuEST_cpu.c:2834
void statevec_pauliYLocal(Qureg qureg, const int targetQubit, const int conjFac)
Definition: QuEST_cpu.c:2647
void statevec_swapQubitAmpsLocal(Qureg qureg, int qb1, int qb2)
It is ensured that all amplitudes needing to be swapped are on this node.
Definition: QuEST_cpu.c:3496
static int isOddParity(long long int number, int qb1, int qb2)
void statevec_controlledNotLocal(Qureg qureg, const int controlQubit, const int targetQubit)
Definition: QuEST_cpu.c:2550
void statevec_collapseToKnownProbOutcomeDistributedRenorm(Qureg qureg, const int measureQubit, const qreal totalProbability)
Renormalise parts of the state vector where measureQubit=0 or 1, based on the total probability of th...
Definition: QuEST_cpu.c:3422
void densmatr_mixTwoQubitDepolarisingLocalPart1(Qureg qureg, int qubit1, int qubit2, qreal delta)
Definition: QuEST_cpu.c:487
void densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3(Qureg qureg, const int targetQubit, const int qubit2, qreal delta, qreal gamma)
Definition: QuEST_cpu.c:631
Represents one complex number.
Definition: QuEST.h:103
void statevec_controlledPauliYDistributed(Qureg qureg, const int controlQubit, ComplexArray stateVecIn, ComplexArray stateVecOut, const int conjFactor)
Definition: QuEST_cpu.c:2793
void statevec_pauliXDistributed(Qureg qureg, ComplexArray stateVecIn, ComplexArray stateVecOut)
Rotate a single qubit by {{0,1},{1,0}.
Definition: QuEST_cpu.c:2522
void densmatr_mixTwoQubitDepolarisingDistributed(Qureg qureg, const int targetQubit, const int qubit2, qreal delta, qreal gamma)
Definition: QuEST_cpu.c:540
void statevec_compactUnitaryDistributed(Qureg qureg, Complex rot1, Complex rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)
Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha ...
Definition: QuEST_cpu.c:1969
void statevec_controlledPauliYLocal(Qureg qureg, const int controlQubit, const int targetQubit, const int conjFactor)
Definition: QuEST_cpu.c:2740
Represents a 2x2 matrix of complex numbers.
Definition: QuEST.h:114