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/lists.hpp"
17#include "quest/src/core/utilities.hpp"
18#include "quest/src/core/bitwise.hpp"
19#include "quest/src/gpu/gpu_config.hpp"
43 validate_quregFields(qureg, __func__);
47 localiser_statevec_initUniformState(qureg, amp);
52 validate_quregFields(qureg, __func__);
56 localiser_statevec_initClassicalState(qureg, ind);
61 validate_quregFields(qureg, __func__);
65 qcomp amp = 1.0 / std::sqrt(qureg.numAmps);
66 localiser_statevec_initUniformState(qureg, amp);
71 validate_quregFields(qureg, __func__);
72 validate_quregFields(pure, __func__);
73 validate_quregCanBeInitialisedToPureState(qureg, pure, __func__);
75 (qureg.isDensityMatrix)?
76 localiser_densmatr_initPureState(qureg, pure):
77 localiser_statevec_setQuregToClone(qureg, pure);
82 validate_quregFields(qureg, __func__);
83 validate_basisStateIndex(qureg, ind, __func__);
86 if (qureg.isDensityMatrix)
87 ind = util_getGlobalFlatIndex(qureg, ind, ind);
89 localiser_statevec_initClassicalState(qureg, ind);
94 validate_quregFields(qureg, __func__);
96 localiser_statevec_initDebugState(qureg);
101 validate_quregFields(qureg, __func__);
104 (qureg.isDensityMatrix)?
105 localiser_densmatr_initArbitraryPureState(qureg, amps):
106 localiser_statevec_initArbitraryPureState(qureg, amps);
110void initArbitraryMixedState(
Qureg qureg, qcomp** amps) {
111 validate_quregFields(qureg, __func__);
112 validate_quregIsDensityMatrix(qureg, __func__);
114 localiser_densmatr_initArbitraryMixedState(qureg, amps);
119 validate_quregFields(qureg, __func__);
124 if (qureg.isDensityMatrix)
125 localiser_densmatr_initUniformlyRandomPureStateAmps(qureg);
127 localiser_statevec_initUnnormalisedUniformlyRandomPureStateAmps(qureg);
134 validate_quregFields(qureg, __func__);
135 validate_quregIsDensityMatrix(qureg, __func__);
136 validate_numInitRandomPureStates(numPureStates, __func__);
138 localiser_densmatr_initMixtureOfUniformlyRandomPureStates(qureg, numPureStates);
149 validate_quregFields(qureg, __func__);
150 validate_quregIsStateVector(qureg, __func__);
151 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
153 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
158 validate_quregFields(qureg, __func__);
159 validate_quregIsDensityMatrix(qureg, __func__);
160 validate_basisStateRowCols(qureg, startRow, startCol, numRows, numCols, __func__);
162 localiser_densmatr_setAmps(amps, qureg, startRow, startCol, numRows, numCols);
167 validate_quregFields(qureg, __func__);
168 validate_quregIsDensityMatrix(qureg, __func__);
169 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
171 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
176 validate_quregFields(outQureg, __func__);
177 validate_quregFields(inQureg, __func__);
178 validate_quregsCanBeCloned(outQureg, inQureg, __func__);
183 (outQureg.isDensityMatrix)?
184 localiser_densmatr_mixQureg(0, outQureg, 1, inQureg):
185 localiser_statevec_setQuregToClone(outQureg, inQureg);
190 validate_quregFields(qureg, __func__);
193 validate_quregRenormProbIsNotZero(prob, __func__);
195 qreal norm = (qureg.isDensityMatrix)? prob : std::sqrt(prob);
196 qreal fac = 1 / norm;
197 localiser_statevec_scaleAmps(qureg, fac);
204 validate_quregFields(qureg, __func__);
205 validate_quregIsDensityMatrix(qureg, __func__);
206 validate_pauliStrSumFields(sum, __func__);
207 validate_pauliStrSumTargets(sum, qureg, __func__);
212 localiser_densmatr_setAmpsToPauliStrSum(qureg, sum);
217 validate_quregFields(in, __func__);
218 validate_quregFields(out, __func__);
219 validate_quregIsDensityMatrix(in, __func__);
220 validate_quregIsDensityMatrix(out, __func__);
221 validate_targets(in, traceOutQubits, numTraceQubits, __func__);
222 validate_quregCanBeSetToReducedDensMatr(out, in, numTraceQubits, __func__);
224 auto targets = lists_getList64(traceOutQubits, numTraceQubits);
225 localiser_densmatr_partialTrace(in, out, targets);
230 validate_quregFields(in, __func__);
231 validate_quregFields(out, __func__);
232 validate_quregIsDensityMatrix(in, __func__);
233 validate_quregIsDensityMatrix(out, __func__);
234 validate_targets(in, retainQubits, numRetainQubits, __func__);
235 validate_quregCanBeSetToReducedDensMatr(out, in, in.numQubits - numRetainQubits, __func__);
237 auto traceQubits = util_getNonTargetedQubits(lists_getList64(retainQubits, numRetainQubits), in.numQubits);
238 localiser_densmatr_partialTrace(in, out, traceQubits);
243 validate_quregFields(out, __func__);
244 validate_numQuregsInSum(numIn, __func__);
245 validate_quregsCanBeSummed(out, in, numIn, __func__);
247 auto coeffVec = util_getVector(coeffs, numIn);
248 auto inVec = util_getVector(in, numIn);
249 localiser_statevec_setQuregToWeightedSum(out, coeffVec, inVec);
254 validate_quregFields(out, __func__);
255 validate_quregIsDensityMatrix(out, __func__);
256 validate_numQuregsInSum(numIn, __func__);
257 validate_quregsCanBeMixed(out, in, numIn, __func__);
258 validate_probabilities(probs, numIn, __func__);
261 vector<qcomp> coeffVec(numIn);
262 for (
int i=0; i<numIn; i++)
263 coeffVec[i] =
getQcomp(probs[i], 0);
265 auto inVec = util_getVector(in, numIn);
266 localiser_statevec_setQuregToWeightedSum(out, coeffVec, inVec);
282 validate_matrixRowsAllSameSize(amps, __func__);
287 size_t len = amps.size();
288 auto callback = [&]() { validate_tempListAllocSucceeded(
false, len,
sizeof(qcomp*), __func__); };
289 util_tryAllocVector(ptrs, len, callback);
292 for (
size_t i=0; i<len; i++)
293 ptrs[i] = amps[i].data();
300 setQuregAmps(qureg, startInd, amps.data(), amps.size());
316 validate_numQuregsMatchesCoeffs(in.size(), coeffs.size(), __func__);
322 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)