Skip to content

Commit ab8b560

Browse files
committed
removed setQuregToSuperposition()
since superseded by setQuregToWeightedSum(). Additionally defined internal convenience functions... - localiser_statevec_scaleAmps - localiser_statevec_setQuregToClone which merely call localiser_statevec_setQuregToWeightedSum, for code clarity
1 parent d4a5714 commit ab8b560

20 files changed

+51
-195
lines changed

quest/include/deprecated.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -865,16 +865,23 @@ static inline void _applyGateSubDiagonalOp(Qureg qureg, int* targets, int numTar
865865
_WARN_FUNC_RENAMED("cloneQureg()", "setQuregToClone()") \
866866
setQuregToClone(__VA_ARGS__)
867867

868+
869+
870+
static inline void _setWeightedQureg(qcomp f1, Qureg q1, qcomp f2, Qureg q2, qcomp fOut, Qureg qOut) {
871+
qcomp coeffs[] = {fOut, f1, f2};
872+
Qureg quregs[] = {qOut, q1, q2};
873+
setQuregToWeightedSum(qOut, coeffs, quregs, 3);
874+
}
875+
868876
#define setWeightedQureg(f1, q1, f2, q2, fOut, qOut) \
869877
_WARN_GENERAL_MSG( \
870878
"The QuEST function 'setWeightedQureg(f1,q1, f2,q2, fOut,qOut)' is deprecated, and replaced with " \
871-
"'setQuregToSuperposition(fOut,qOut, f1,q1, f2,q2)' which has been automatically invoked. The new " \
872-
"fucntion however accepts only statevectors, not density matrices, so may error at runtime. Beware " \
873-
"that the order of the arguments has changed, so that the first supplied Qureg is modified." ) \
874-
setQuregToSuperposition( \
875-
getQcomp(fOut.real, fOut.imag), qOut, \
876-
getQcomp(f1.real, f1.imag), q1, \
877-
getQcomp(f2.real, f2.imag), q2)
879+
"'setQuregToWeightedSum(qOut, {f1,f2,...}, {q1,q2,..}, len)' which has been automatically invoked. " \
880+
"Beware that the order of the arguments has changed, so that the first supplied Qureg is modified." ) \
881+
_setWeightedQureg( \
882+
_GET_QCOMP_FROM_COMPLEX_STRUCT(f1) ,q1, \
883+
_GET_QCOMP_FROM_COMPLEX_STRUCT(f2) ,q2, \
884+
_GET_QCOMP_FROM_COMPLEX_STRUCT(fOut), qOut)
878885

879886

880887

quest/include/initialisations.h

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,6 @@ void setQuregToWeightedSum(Qureg out, qcomp* coeffs, Qureg* in, int numIn);
126126
void setQuregToMixture(Qureg out, qreal* probs, Qureg* in, int numIn);
127127

128128

129-
/** @notyetdoced
130-
* @notyettested
131-
*
132-
* @formulae
133-
*
134-
* Let @f$ f_{\text{out}} = @f$ @p facOut, @f$ f_1 = @f$ @p fac1 and @f$ f_2 = @f$ @p fac2.
135-
* Similarly, let @f$ \psi_{\text{out}} = @f$ @p out, @f$ \psi_{1} = @f$ @p qureg1 and @f$ \psi_{2} = @f$ @p qureg2.
136-
*
137-
* This function modifies only @p facOut to become
138-
* @f[
139-
|\psi_{\text{out}}\rangle \; \rightarrow \;
140-
f_{\text{out}} |\psi_{\text{out}}\rangle \, + \,
141-
f_1 |\psi_1\rangle \, + \,
142-
f_2 |\psi_2\rangle.
143-
* @f]
144-
*
145-
* All factors are unconstrained and are permitted to be zero, and the same @p Qureg can be duplicated among
146-
* all arguments.
147-
*/
148-
void setQuregToSuperposition(qcomp facOut, Qureg out, qcomp fac1, Qureg qureg1, qcomp fac2, Qureg qureg2);
149-
150-
151129
/// @notyetdoced
152130
/// @notyetvalidated
153131
qreal setQuregToRenormalized(Qureg qureg);

quest/include/operations.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,14 +1670,16 @@ extern "C" {
16701670
- \iu \sin\left( \frac{\theta}{2} \right) \, \hat{\sigma},
16711671
* @f]
16721672
* this function is equivalent to (but much faster than) effecting @f$ \hat{\sigma} @f$
1673-
* upon a clone which is subsequently superposed.
1673+
* upon a clone which is subsequently combined.
16741674
* ```
16751675
// prepare |temp> = str |qureg>
16761676
Qureg temp = createCloneQureg(qureg);
16771677
applyPauliStr(temp, str);
16781678
16791679
// set |qureg> = cos(theta/2) |qureg> - i sin(theta/2) str |qureg>
1680-
setQuregToSuperposition(cos(theta/2), qureg, - 1.0i * sin(theta/2), temp, 0, temp);
1680+
qcomp coeffs[] = {cos(theta/2), -1i * sin(theta/2)};
1681+
Qureg quregs[] = {qureg, temp};
1682+
setQuregToWeightedSum(qureg, coeffs, quregs, 2);
16811683
* ```
16821684
* - When @p str contains only @f$ \hat{Z} @f$ or @f$ \id @f$ Paulis, this function will
16831685
* automatically invoke applyPhaseGadget() which leverages an optimised implementation.
@@ -1686,7 +1688,7 @@ extern "C" {
16861688
* unchanged.
16871689
* ```
16881690
qcomp factor = cexp(- theta / 2 * 1.i);
1689-
setQuregToSuperposition(factor, qureg, 0,qureg,0,qureg);
1691+
setQuregToWeightedSum(qureg, &factor, &qureg, 1);
16901692
* ```
16911693
* - Passing @p angle=0 is equivalent to effecting the identity, leaving the state unchanged.
16921694
*

quest/src/api/initialisations.cpp

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ using std::vector;
3333
extern "C" {
3434

3535

36-
3736
/*
3837
* INIT
3938
*/
@@ -72,12 +71,9 @@ void initPureState(Qureg qureg, Qureg pure) {
7271
validate_quregFields(pure, __func__);
7372
validate_quregCanBeInitialisedToPureState(qureg, pure, __func__);
7473

75-
// when qureg=statevec, we lazily invoke setQuregToSuperposition which
76-
// invokes superfluous floating-point operations which will be happily
77-
// occluded by the memory movement costs
7874
(qureg.isDensityMatrix)?
7975
localiser_densmatr_initPureState(qureg, pure):
80-
localiser_statevec_setQuregToSuperposition(0, qureg, 1, pure, 0, pure);
76+
localiser_statevec_setQuregToClone(qureg, pure);
8177
}
8278

8379

@@ -185,17 +181,7 @@ void setQuregToClone(Qureg targetQureg, Qureg copyQureg) {
185181
// appreciable slowdown since simulation is memory-bound
186182
(targetQureg.isDensityMatrix)?
187183
localiser_densmatr_mixQureg(0, targetQureg, 1, copyQureg):
188-
localiser_statevec_setQuregToSuperposition(0, targetQureg, 1, copyQureg, 0, copyQureg);
189-
}
190-
191-
192-
void setQuregToSuperposition(qcomp facOut, Qureg out, qcomp fac1, Qureg qureg1, qcomp fac2, Qureg qureg2) {
193-
validate_quregFields(out, __func__);
194-
validate_quregFields(qureg1, __func__);
195-
validate_quregFields(qureg2, __func__);
196-
validate_quregsCanBeSuperposed(out, qureg1, qureg2, __func__); // asserts statevectors
197-
198-
localiser_statevec_setQuregToSuperposition(facOut, out, fac1, qureg1, fac2, qureg2);
184+
localiser_statevec_setQuregToClone(targetQureg, copyQureg);
199185
}
200186

201187

@@ -207,7 +193,7 @@ qreal setQuregToRenormalized(Qureg qureg) {
207193

208194
qreal norm = (qureg.isDensityMatrix)? prob : std::sqrt(prob);
209195
qreal fac = 1 / norm;
210-
localiser_statevec_setQuregToSuperposition(fac, qureg, 0, qureg, 0, qureg);
196+
localiser_statevec_scaleAmps(qureg, fac);
211197

212198
return fac;
213199
}

quest/src/api/multiplication.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -644,13 +644,13 @@ void leftapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace) {
644644
validate_pauliStrSumTargets(sum, qureg, __func__);
645645

646646
// clone qureg to workspace, set qureg to blank
647-
localiser_statevec_setQuregToSuperposition(0, workspace, 1, qureg, 0, qureg);
647+
localiser_statevec_setQuregToClone(workspace, qureg);
648648
localiser_statevec_initUniformState(qureg, 0);
649649

650650
// left-multiply each term in-turn, mixing into output qureg, then undo using idempotency
651651
for (qindex i=0; i<sum.numTerms; i++) {
652652
localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
653-
localiser_statevec_setQuregToSuperposition(1, qureg, sum.coeffs[i], workspace, 0, workspace);
653+
localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
654654
localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
655655
}
656656

@@ -666,7 +666,7 @@ void rightapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace) {
666666
validate_pauliStrSumTargets(sum, qureg, __func__);
667667

668668
// clone qureg to workspace, set qureg to blank
669-
localiser_statevec_setQuregToSuperposition(0, workspace, 1, qureg, 0, qureg);
669+
localiser_statevec_setQuregToClone(workspace, qureg);
670670
localiser_statevec_initUniformState(qureg, 0);
671671

672672
// post-multiply each term in-turn, mixing into output qureg, then undo using idempotency
@@ -675,7 +675,7 @@ void rightapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace) {
675675
qcomp factor = paulis_getSignOfPauliStrConj(str); // undoes transpose
676676

677677
localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
678-
localiser_statevec_setQuregToSuperposition(1, qureg, sum.coeffs[i], workspace, 0, workspace);
678+
localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
679679
localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
680680
}
681681

quest/src/core/accelerator.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -556,15 +556,6 @@ void accel_statevec_setQuregToWeightedSum_sub(Qureg outQureg, vector<qcomp> coef
556556
}
557557

558558

559-
void accel_statevec_setQuregToSuperposition_sub(qcomp facOut, Qureg outQureg, qcomp fac1, Qureg inQureg1, qcomp fac2, Qureg inQureg2) {
560-
561-
// consult outQureg's deployment (other quregs should match, though we dangerously do not assert this post-validation)
562-
(outQureg.isGpuAccelerated)?
563-
gpu_statevec_setQuregToSuperposition_sub(facOut, outQureg, fac1, inQureg1, fac2, inQureg2):
564-
cpu_statevec_setQuregToSuperposition_sub(facOut, outQureg, fac1, inQureg1, fac2, inQureg2);
565-
}
566-
567-
568559
void accel_densmatr_mixQureg_subA(qreal outProb, Qureg out, qreal inProb, Qureg in) {
569560

570561
// quregs are equally-sized density matrices and are equally-distributed...

quest/src/core/accelerator.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,6 @@ void accel_statevector_anyCtrlPauliTensorOrGadget_subB(Qureg qureg, vector<int>
234234

235235
void accel_statevec_setQuregToWeightedSum_sub(Qureg outQureg, vector<qcomp> coeffs, vector<Qureg> inQuregs);
236236

237-
void accel_statevec_setQuregToSuperposition_sub(qcomp facOut, Qureg outQureg, qcomp fac1, Qureg inQureg1, qcomp fac2, Qureg inQureg2);
238-
239237
void accel_densmatr_mixQureg_subA(qreal outProb, Qureg out, qreal inProb, Qureg in);
240238
void accel_densmatr_mixQureg_subB(qreal outProb, Qureg out, qreal inProb, Qureg in);
241239
void accel_densmatr_mixQureg_subC(qreal outProb, Qureg out, qreal inProb);

quest/src/core/errors.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -563,17 +563,6 @@ void assert_quregDistribAndFullStateDiagMatrLocal(Qureg qureg, FullStateDiagMatr
563563
raiseInternalError("The FullStateDiagMatr was unexpectedly distributed.");
564564
}
565565

566-
void assert_superposedQuregDimsAndDeploysMatch(Qureg facOut, Qureg in1, Qureg in2) {
567-
568-
if (
569-
facOut.isDistributed != in1.isDistributed || in1.isDistributed != in2.isDistributed ||
570-
facOut.isDensityMatrix != in1.isDensityMatrix || in1.isDensityMatrix != in2.isDensityMatrix ||
571-
facOut.isGpuAccelerated != in1.isGpuAccelerated || in1.isGpuAccelerated != in2.isGpuAccelerated ||
572-
facOut.numQubits != in1.numQubits || in1.numQubits != in2.numQubits
573-
)
574-
raiseInternalError("An internal function *_setQuregToSuperposition() received Quregs of mismatching dimensions and/or deployments.");
575-
}
576-
577566

578567

579568
/*

quest/src/core/errors.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,6 @@ void assert_quregAndFullStateDiagMatrHaveSameDistrib(Qureg qureg, FullStateDiagM
204204

205205
void assert_quregDistribAndFullStateDiagMatrLocal(Qureg qureg, FullStateDiagMatr matr);
206206

207-
void assert_superposedQuregDimsAndDeploysMatch(Qureg facOut, Qureg in1, Qureg in2);
208-
209-
210207

211208
/*
212209
* CPU ERRORS

quest/src/core/localiser.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,11 @@ void localiser_fullstatediagmatr_setElemsToPauliStrSum(FullStateDiagMatr out, Pa
676676
accel_fullstatediagmatr_setElemsToPauliStrSum(out, in);
677677
}
678678

679+
void localiser_statevec_scaleAmps(Qureg qureg, qcomp factor) {
680+
681+
localiser_statevec_setQuregToWeightedSum(qureg, {factor}, {qureg});
682+
}
683+
679684

680685

681686
/*
@@ -1384,17 +1389,15 @@ void localiser_statevec_setQuregToWeightedSum(Qureg outQureg, vector<qcomp> coef
13841389
}
13851390

13861391

1387-
void localiser_statevec_setQuregToSuperposition(qcomp facOut, Qureg outQureg, qcomp fac1, Qureg inQureg1, qcomp fac2, Qureg inQureg2) {
1392+
void localiser_statevec_setQuregToClone(Qureg out, Qureg in) {
13881393

13891394
/// @todo
1390-
/// this function requires (as validated) distributions are identical.
1391-
/// It would be trivial to generalise this so that Qureg distributions
1392-
/// can differ (we merely spoof local Quregs, offsetting their memory).
1393-
/// They must still however be identically GPU-accelerated; this is a
1394-
/// low priority because this situation is non-sensical
1395+
/// we lazily re-use setQuregToWeightedSum(), inducing a gratuitous
1396+
/// x1 multiplication per element which we expected is completely
1397+
/// occluded by memory movement costs. We should check this and
1398+
/// potentially replace this function with (NUMA-aware?) memory copying!
13951399

1396-
// given Qureg dimensions must match, this is always embarrassingly parallel
1397-
accel_statevec_setQuregToSuperposition_sub(facOut, outQureg, fac1, inQureg1, fac2, inQureg2);
1400+
localiser_statevec_setQuregToWeightedSum(out, {1}, {in});
13981401
}
13991402

14001403

@@ -2327,7 +2330,7 @@ void localiser_statevec_multiQubitProjector(Qureg qureg, vector<int> qubits, vec
23272330
// all other nodes has some or all states consistent with suffix outcomes
23282331
removePrefixQubitsAndStates(qureg, qubits, outcomes);
23292332
(qubits.empty())?
2330-
accel_statevec_setQuregToSuperposition_sub(1/std::sqrt(prob), qureg,0,qureg, 0,qureg): // scale by norm
2333+
localiser_statevec_scaleAmps(qureg, 1/std::sqrt(prob)):
23312334
accel_statevec_multiQubitProjector_sub(qureg, qubits, outcomes, prob);
23322335
}
23332336

0 commit comments

Comments
 (0)