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"
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__);
78 (qureg.isDensityMatrix)?
79 localiser_densmatr_initPureState(qureg, pure):
80 localiser_statevec_setQuregToSuperposition(0, qureg, 1, pure, 0, pure);
85 validate_quregFields(qureg, __func__);
86 validate_basisStateIndex(qureg, ind, __func__);
89 if (qureg.isDensityMatrix)
90 ind = util_getGlobalFlatIndex(qureg, ind, ind);
92 localiser_statevec_initClassicalState(qureg, ind);
97 validate_quregFields(qureg, __func__);
99 localiser_statevec_initDebugState(qureg);
104 validate_quregFields(qureg, __func__);
107 (qureg.isDensityMatrix)?
108 localiser_densmatr_initArbitraryPureState(qureg, amps):
109 localiser_statevec_initArbitraryPureState(qureg, amps);
113void initArbitraryMixedState(
Qureg qureg, qcomp** amps) {
114 validate_quregFields(qureg, __func__);
115 validate_quregIsDensityMatrix(qureg, __func__);
117 localiser_densmatr_initArbitraryMixedState(qureg, amps);
122 validate_quregFields(qureg, __func__);
127 if (qureg.isDensityMatrix)
128 localiser_densmatr_initUniformlyRandomPureStateAmps(qureg);
130 localiser_statevec_initUnnormalisedUniformlyRandomPureStateAmps(qureg);
137 validate_quregFields(qureg, __func__);
138 validate_quregIsDensityMatrix(qureg, __func__);
139 validate_numInitRandomPureStates(numPureStates, __func__);
141 localiser_densmatr_initMixtureOfUniformlyRandomPureStates(qureg, numPureStates);
152 validate_quregFields(qureg, __func__);
153 validate_quregIsStateVector(qureg, __func__);
154 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
156 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
161 validate_quregFields(qureg, __func__);
162 validate_quregIsDensityMatrix(qureg, __func__);
163 validate_basisStateRowCols(qureg, startRow, startCol, numRows, numCols, __func__);
165 localiser_densmatr_setAmps(amps, qureg, startRow, startCol, numRows, numCols);
170 validate_quregFields(qureg, __func__);
171 validate_quregIsDensityMatrix(qureg, __func__);
172 validate_basisStateIndices(qureg, startInd, numAmps, __func__);
174 localiser_statevec_setAmps(amps, qureg, startInd, numAmps);
179 validate_quregFields(targetQureg, __func__);
180 validate_quregFields(copyQureg, __func__);
181 validate_quregsCanBeCloned(targetQureg, copyQureg, __func__);
186 (targetQureg.isDensityMatrix)?
187 localiser_densmatr_mixQureg(0, targetQureg, 1, copyQureg):
188 localiser_statevec_setQuregToSuperposition(0, targetQureg, 1, copyQureg, 0, copyQureg);
193 validate_quregFields(out, __func__);
194 validate_quregFields(qureg1, __func__);
195 validate_quregFields(qureg2, __func__);
196 validate_quregsCanBeSuperposed(out, qureg1, qureg2, __func__);
198 localiser_statevec_setQuregToSuperposition(facOut, out, fac1, qureg1, fac2, qureg2);
203 validate_quregFields(qureg, __func__);
206 validate_quregRenormProbIsNotZero(prob, __func__);
208 qreal norm = (qureg.isDensityMatrix)? prob : std::sqrt(prob);
209 qreal fac = 1 / norm;
210 localiser_statevec_setQuregToSuperposition(fac, qureg, 0, qureg, 0, qureg);
217 validate_quregFields(qureg, __func__);
218 validate_quregIsDensityMatrix(qureg, __func__);
219 validate_pauliStrSumFields(sum, __func__);
220 validate_pauliStrSumTargets(sum, qureg, __func__);
225 localiser_densmatr_setAmpsToPauliStrSum(qureg, sum);
230 validate_quregFields(in, __func__);
231 validate_quregFields(out, __func__);
232 validate_quregIsDensityMatrix(in, __func__);
233 validate_quregIsDensityMatrix(out, __func__);
234 validate_targets(in, traceOutQubits, numTraceQubits, __func__);
235 validate_quregCanBeSetToReducedDensMatr(out, in, numTraceQubits, __func__);
237 auto targets = util_getVector(traceOutQubits, numTraceQubits);
238 localiser_densmatr_partialTrace(in, out, targets);
243 validate_quregFields(in, __func__);
244 validate_quregFields(out, __func__);
245 validate_quregIsDensityMatrix(in, __func__);
246 validate_quregIsDensityMatrix(out, __func__);
247 validate_targets(in, retainQubits, numRetainQubits, __func__);
248 validate_quregCanBeSetToReducedDensMatr(out, in, in.numQubits - numRetainQubits, __func__);
250 auto traceQubits = util_getNonTargetedQubits(retainQubits, numRetainQubits, in.numQubits);
251 localiser_densmatr_partialTrace(in, out, traceQubits);
267 validate_matrixRowsAllSameSize(amps, __func__);
272 size_t len = amps.size();
273 auto callback = [&]() { validate_tempAllocSucceeded(
false, len,
sizeof(qcomp*), __func__); };
274 util_tryAllocVector(ptrs, len, callback);
277 for (
size_t i=0; i<len; i++)
278 ptrs[i] = amps[i].data();
285 setQuregAmps(qureg, startInd, amps.data(), amps.size());
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 setQuregToPauliStrSum(Qureg qureg, PauliStrSum sum)
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 setQuregToClone(Qureg targetQureg, Qureg copyQureg)
void setDensityQuregAmps(Qureg qureg, qindex startRow, qindex startCol, qcomp **amps, qindex numRows, qindex numCols)
void setQuregToSuperposition(qcomp facOut, Qureg out, qcomp fac1, Qureg qureg1, qcomp fac2, Qureg qureg2)
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)