#include "catch.hpp" #include "QuEST.h" #include "utilities.hpp" /* allows concise use of Contains in catch's REQUIRE_THROWS_WITH */ using Catch::Matchers::Contains; /** @sa cloneQureg * @ingroup unittest * @author Tyson Jones */ TEST_CASE( "cloneQureg", "[state_initialisations]" ) { Qureg vec1 = createQureg(NUM_QUBITS, QUEST_ENV); Qureg mat1 = createDensityQureg(NUM_QUBITS, QUEST_ENV); SECTION( "correctness" ) { SECTION( "state-vector" ) { Qureg vec2 = createQureg(NUM_QUBITS, QUEST_ENV); // make sure states start differently initDebugState(vec1); initBlankState(vec2); REQUIRE( !areEqual(vec1, vec2) ); // make sure vec2 is changed QVector copy1 = toQVector(vec1); cloneQureg(vec2, vec1); REQUIRE( areEqual(vec1, vec2) ); // make sure vec1 unaffected REQUIRE( areEqual(vec1, copy1) ); destroyQureg(vec2, QUEST_ENV); } SECTION( "density-matrix" ) { Qureg mat2 = createDensityQureg(NUM_QUBITS, QUEST_ENV); // make sure states start differently initDebugState(mat1); initBlankState(mat2); REQUIRE( !areEqual(mat1, mat2) ); // make sure vec2 is changed QMatrix copy1 = toQMatrix(mat1); cloneQureg(mat2, mat1); REQUIRE( areEqual(mat1, mat2) ); // make sure vec1 unaffected REQUIRE( areEqual(mat1, copy1) ); destroyQureg(mat2, QUEST_ENV); } } SECTION( "input validation" ) { SECTION( "qureg type" ) { REQUIRE_THROWS_WITH( cloneQureg(mat1, vec1), Contains("both be state-vectors") && Contains("density matrices") ); REQUIRE_THROWS_WITH( cloneQureg(vec1, mat1), Contains("both be state-vectors") && Contains("density matrices") ); } SECTION( "qureg dimensions" ) { Qureg vec3 = createQureg(vec1.numQubitsRepresented + 1, QUEST_ENV); Qureg mat3 = createDensityQureg(mat1.numQubitsRepresented + 1, QUEST_ENV); REQUIRE_THROWS_WITH( cloneQureg(vec1, vec3), Contains("Dimensions") && Contains("don't match") ); REQUIRE_THROWS_WITH( cloneQureg(mat1, mat3), Contains("Dimensions") && Contains("don't match") ); destroyQureg(vec3, QUEST_ENV); destroyQureg(mat3, QUEST_ENV); } } destroyQureg(vec1, QUEST_ENV); destroyQureg(mat1, QUEST_ENV); } /** @sa initBlankState * @ingroup unittest * @author Tyson Jones */ TEST_CASE( "initBlankState", "[state_initialisations]" ) { Qureg vec = createQureg(NUM_QUBITS, QUEST_ENV); Qureg mat = createDensityQureg(NUM_QUBITS, QUEST_ENV); SECTION( "correctness" ) { SECTION( "state-vector" ) { initBlankState(vec); REQUIRE( areEqual(vec, QVector(1< = 1/sqrt(N^2) sum_i |i> // = 1/sqrt(N^2) {1, ..., 1} initPlusState(vec); QVector vecRef = QVector(1<<+| = 1/sqrt(N^2) sum_i |i> 1/sqrt(N^2) sum_j = sum_i a_i |i> QVector copy1 = toQVector(vec1); // make sure mat1 is modified correctly initBlankState(mat1); initPureState(mat1, vec1); // mat1 = |vec1>