10#include "quest/include/qureg.h"
11#include "quest/include/calculations.h"
12#include "quest/include/initialisations.h"
14#include "quest/src/core/validation.hpp"
15#include "quest/src/core/localiser.hpp"
16#include "quest/src/core/utilities.hpp"
17#include "quest/src/core/bitwise.hpp"
18#include "quest/src/gpu/gpu_config.hpp"
42 validate_quregFields(qureg, __func__);
46 localiser_statevec_initUniformState(qureg, amp);
51 validate_quregFields(qureg, __func__);
55 localiser_statevec_initClassicalState(qureg, ind);
60 validate_quregFields(qureg, __func__);
64 qcomp amp = 1.0 / std::sqrt(qureg.numAmps);
65 localiser_statevec_initUniformState(qureg, amp);
70 validate_quregFields(qureg, __func__);
71 validate_quregFields(pure, __func__);
72 validate_quregCanBeInitialisedToPureState(qureg, pure, __func__);
74 (qureg.isDensityMatrix)?
75 localiser_densmatr_initPureState(qureg, pure):
76 localiser_statevec_setQuregToClone(qureg, pure);
81 validate_quregFields(qureg, __func__);
82 validate_basisStateIndex(qureg, ind, __func__);
85 if (qureg.isDensityMatrix)
86 ind = util_getGlobalFlatIndex(qureg, ind, ind);
88 localiser_statevec_initClassicalState(qureg, ind);
93 validate_quregFields(qureg, __func__);
95 localiser_statevec_initDebugState(qureg);
100 validate_quregFields(qureg, __func__);
103 (qureg.isDensityMatrix)?
104 localiser_densmatr_initArbitraryPureState(qureg, amps):
105 localiser_statevec_initArbitraryPureState(qureg, amps);
109void initArbitraryMixedState(
Qureg qureg, qcomp** amps) {
110 validate_quregFields(qureg, __func__);
111 validate_quregIsDensityMatrix(qureg, __func__);
113 localiser_densmatr_initArbitraryMixedState(qureg, amps);
118 validate_quregFields(qureg, __func__);
123 if (qureg.isDensityMatrix)
124 localiser_densmatr_initUniformlyRandomPureStateAmps(qureg);
126 localiser_statevec_initUnnormalisedUniformlyRandomPureStateAmps(qureg);
133 validate_quregFields(qureg, __func__);
134 validate_quregIsDensityMatrix(qureg, __func__);
135 validate_numInitRandomPureStates(numPureStates, __func__);
137 localiser_densmatr_initMixtureOfUniformlyRandomPureStates(qureg, numPureStates);
148 validate_quregFields(qureg, __func__);
149 validate_quregIsStateVector(qureg, __func__);
150 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
152 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
157 validate_quregFields(qureg, __func__);
158 validate_quregIsDensityMatrix(qureg, __func__);
159 validate_basisStateRowCols(qureg, startRow, startCol, numRows, numCols, __func__);
161 localiser_densmatr_setAmps(amps, qureg, startRow, startCol, numRows, numCols);
166 validate_quregFields(qureg, __func__);
167 validate_quregIsDensityMatrix(qureg, __func__);
168 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
170 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
175 validate_quregFields(outQureg, __func__);
176 validate_quregFields(inQureg, __func__);
177 validate_quregsCanBeCloned(outQureg, inQureg, __func__);
182 (outQureg.isDensityMatrix)?
183 localiser_densmatr_mixQureg(0, outQureg, 1, inQureg):
184 localiser_statevec_setQuregToClone(outQureg, inQureg);
189 validate_quregFields(qureg, __func__);
192 validate_quregRenormProbIsNotZero(prob, __func__);
194 qreal norm = (qureg.isDensityMatrix)? prob : std::sqrt(prob);
195 qreal fac = 1 / norm;
196 localiser_statevec_scaleAmps(qureg, fac);
203 validate_quregFields(qureg, __func__);
204 validate_quregIsDensityMatrix(qureg, __func__);
205 validate_pauliStrSumFields(sum, __func__);
206 validate_pauliStrSumTargets(sum, qureg, __func__);
211 localiser_densmatr_setAmpsToPauliStrSum(qureg, sum);
216 validate_quregFields(in, __func__);
217 validate_quregFields(out, __func__);
218 validate_quregIsDensityMatrix(in, __func__);
219 validate_quregIsDensityMatrix(out, __func__);
220 validate_targets(in, traceOutQubits, numTraceQubits, __func__);
221 validate_quregCanBeSetToReducedDensMatr(out, in, numTraceQubits, __func__);
223 auto targets = util_getVector(traceOutQubits, numTraceQubits);
224 localiser_densmatr_partialTrace(in, out, targets);
229 validate_quregFields(in, __func__);
230 validate_quregFields(out, __func__);
231 validate_quregIsDensityMatrix(in, __func__);
232 validate_quregIsDensityMatrix(out, __func__);
233 validate_targets(in, retainQubits, numRetainQubits, __func__);
234 validate_quregCanBeSetToReducedDensMatr(out, in, in.numQubits - numRetainQubits, __func__);
236 auto traceQubits = util_getNonTargetedQubits(retainQubits, numRetainQubits, in.numQubits);
237 localiser_densmatr_partialTrace(in, out, traceQubits);
242 validate_quregFields(out, __func__);
243 validate_numQuregsInSum(numIn, __func__);
244 validate_quregsCanBeSummed(out, in, numIn, __func__);
246 auto coeffVec = util_getVector(coeffs, numIn);
247 auto inVec = util_getVector(in, numIn);
248 localiser_statevec_setQuregToWeightedSum(out, coeffVec, inVec);
253 validate_quregFields(out, __func__);
254 validate_quregIsDensityMatrix(out, __func__);
255 validate_numQuregsInSum(numIn, __func__);
256 validate_quregsCanBeMixed(out, in, numIn, __func__);
257 validate_probabilities(probs, numIn, __func__);
260 vector<qcomp> coeffVec(numIn);
261 for (
int i=0; i<numIn; i++)
262 coeffVec[i] =
getQcomp(probs[i], 0);
264 auto inVec = util_getVector(in, numIn);
265 localiser_statevec_setQuregToWeightedSum(out, coeffVec, inVec);
281 validate_matrixRowsAllSameSize(amps, __func__);
286 size_t len = amps.size();
287 auto callback = [&]() { validate_tempAllocSucceeded(
false, len,
sizeof(qcomp*), __func__); };
288 util_tryAllocVector(ptrs, len, callback);
291 for (
size_t i=0; i<len; i++)
292 ptrs[i] = amps[i].data();
299 setQuregAmps(qureg, startInd, amps.data(), amps.size());
315 validate_numQuregsMatchesCoeffs(in.size(), coeffs.size(), __func__);
321 validate_numQuregsMatchesProbs(in.size(), probs.size(), __func__);
qreal calcTotalProb(Qureg qureg)
void setDensityQuregFlatAmps(Qureg qureg, qindex startInd, qcomp *amps, qindex numAmps)
void setQuregToReducedDensityMatrix(Qureg out, Qureg in, int *retainQubits, int numRetainQubits)
void setQuregToWeightedSum(Qureg out, qcomp *coeffs, Qureg *in, int numIn)
void setQuregToPauliStrSum(Qureg qureg, PauliStrSum sum)
void setQuregToClone(Qureg outQureg, Qureg inQureg)
void setQuregToMixture(Qureg out, qreal *probs, Qureg *in, int numIn)
void setQuregAmps(Qureg qureg, qindex startInd, qcomp *amps, qindex numAmps)
void setQuregToPartialTrace(Qureg out, Qureg in, int *traceOutQubits, int numTraceQubits)
qreal setQuregToRenormalized(Qureg qureg)
void setDensityQuregAmps(Qureg qureg, qindex startRow, qindex startCol, qcomp **amps, qindex numRows, qindex numCols)
void initArbitraryPureState(Qureg qureg, qcomp *amps)
void initRandomPureState(Qureg qureg)
void initPlusState(Qureg qureg)
void initZeroState(Qureg qureg)
void initPureState(Qureg qureg, Qureg pure)
void initDebugState(Qureg qureg)
void initRandomMixedState(Qureg qureg, qindex numPureStates)
void initClassicalState(Qureg qureg, qindex ind)
void initBlankState(Qureg qureg)
static qcomp getQcomp(qreal re, qreal im)