384 int maxInd = vec.numAmps;
387 SECTION(
"correctness" ) {
389 SECTION(
"state-vector" ) {
392 int startInd = GENERATE_COPY( range(0,maxInd) );
393 int numAmps = GENERATE_COPY( range(0,1+maxInd-startInd) );
400 for (
int i=0; i<numAmps; i++)
401 vecRef[startInd+i] = amps[i];
406 SECTION(
"input validation" ) {
408 SECTION(
"start index" ) {
410 int startInd = GENERATE_COPY( -1, maxInd );
412 REQUIRE_THROWS_WITH(
setQuregAmps(vec, startInd, amps.data(), numAmps), ContainsSubstring(
"starting basis state index") );
415 SECTION(
"number of amplitudes" ) {
419 int numAmps = GENERATE_COPY( -1, maxInd+1 );
420 REQUIRE_THROWS_WITH(
setQuregAmps(vec, startInd, amps.data(), numAmps), ContainsSubstring(
"number of amplitudes") );
423 startInd = maxInd - 1;
425 REQUIRE_THROWS_WITH(
setQuregAmps(vec, startInd, amps.data(), numAmps), ContainsSubstring(
"implies an end index") );
427 SECTION(
"density-matrix" ) {
430 REQUIRE_THROWS_WITH(
setQuregAmps(mat, 0, amps.data(), 0), ContainsSubstring(
"Expected a statevector Qureg but received a density matrix") );
593TEST_CASE(
"setWeightedQureg",
"[state_initialisations]" ) {
595 SECTION(
"correctness" ) {
598 GENERATE( range(0,10) );
604 SECTION(
"state-vector" ) {
610 for (
int j=0; j<vecA.numAmpsPerNode; j++) {
615 copyStateToGPU(vecA); copyStateToGPU(vecB); copyStateToGPU(vecC);
625 Complex facA; facA.real = real(numA); facA.imag = imag(numA);
626 Complex facB; facB.real = real(numB); facB.imag = imag(numB);
627 Complex facC; facC.real = real(numC); facC.imag = imag(numC);
630 setWeightedQureg(facA, vecA, facB, vecB, facC, vecC);
631 refOut = numA*refA + numB*refB + numC*refC;
640 setWeightedQureg(facB, vecB, facC, vecC, facA, vecC);
641 refOut = numB*refB + numC*refC + numA*refC;
642 REQUIRE(
areEqual(vecC, refOut, 10*REAL_EPS) );
649 setWeightedQureg(facC, vecC, facB, vecB, facA, vecC);
650 refOut = numC*refC + numB*refB + numA*refC;
651 REQUIRE(
areEqual(vecC, refOut, 10*REAL_EPS) );
658 setWeightedQureg(facA, vecC, facB, vecC, facC, vecC);
659 refOut = numA*refC + numB*refC + numC*refC;
660 REQUIRE(
areEqual(vecC, refOut, 1E3*REAL_EPS) );
734 SECTION(
"input validation" ) {
736 SECTION(
"qureg types" ) {
740 Complex f; f.real = 0; f.imag = 0;
743 REQUIRE_THROWS_WITH( setWeightedQureg(f, mat, f, vec, f, vec), ContainsSubstring(
"inconsistent attributes") );
744 REQUIRE_THROWS_WITH( setWeightedQureg(f, vec, f, mat, f, vec), ContainsSubstring(
"inconsistent attributes") );
745 REQUIRE_THROWS_WITH( setWeightedQureg(f, vec, f, vec, f, mat), ContainsSubstring(
"inconsistent attributes") );
748 REQUIRE_THROWS_WITH( setWeightedQureg(f, vec, f, mat, f, mat), ContainsSubstring(
"inconsistent attributes") );
749 REQUIRE_THROWS_WITH( setWeightedQureg(f, mat, f, vec, f, mat), ContainsSubstring(
"inconsistent attributes") );
750 REQUIRE_THROWS_WITH( setWeightedQureg(f, mat, f, mat, f, vec), ContainsSubstring(
"inconsistent attributes") );
755 SECTION(
"qureg dimensions" ) {
761 Complex f; f.real = 0; f.imag = 0;
764 REQUIRE_THROWS_WITH( setWeightedQureg(f, vecA, f, vecB, f, vecB), ContainsSubstring(
"inconsistent attributes") );
765 REQUIRE_THROWS_WITH( setWeightedQureg(f, vecB, f, vecA, f, vecB), ContainsSubstring(
"inconsistent attributes") );
766 REQUIRE_THROWS_WITH( setWeightedQureg(f, vecB, f, vecB, f, vecA), ContainsSubstring(
"inconsistent attributes") );