#include "catch.hpp"
#include "QuEST.h"
#include "utilities.hpp"
using Catch::Matchers::Contains;
TEST_CASE( "fromComplex", "[data_structures]" ) {
Complex a = {.real=.5, .imag=-.2};
qcomp b = fromComplex(a);
REQUIRE( a.real == real(b) );
REQUIRE( a.imag == imag(b) );
}
TEST_CASE( "getStaticComplexMatrixN", "[data_structures]" ) {
SUCCEED( );
}
TEST_CASE( "toComplex", "[data_structures]" ) {
qcomp a = .5 - .2i;
Complex b = toComplex(a);
REQUIRE( real(a) == b.real );
REQUIRE( imag(a) == b.imag );
}
TEST_CASE( "createCloneQureg", "[data_structures]" ) {
SECTION( "state-vector" ) {
Qureg a = createQureg(NUM_QUBITS, QUEST_ENV);
Qureg b = createCloneQureg(a, QUEST_ENV);
REQUIRE( b.isDensityMatrix == a.isDensityMatrix );
REQUIRE( b.numQubitsRepresented == a.numQubitsRepresented );
REQUIRE( b.numQubitsInStateVec == a.numQubitsInStateVec );
REQUIRE( b.numAmpsPerChunk == a.numAmpsPerChunk );
REQUIRE( b.numAmpsTotal == a.numAmpsTotal );
REQUIRE( areEqual(a, b) );
destroyQureg(a, QUEST_ENV);
destroyQureg(b, QUEST_ENV);
}
SECTION( "density-matrix" ) {
Qureg a = createDensityQureg(NUM_QUBITS, QUEST_ENV);
Qureg b = createCloneQureg(a, QUEST_ENV);
REQUIRE( b.isDensityMatrix == a.isDensityMatrix );
REQUIRE( b.numQubitsRepresented == a.numQubitsRepresented );
REQUIRE( b.numQubitsInStateVec == a.numQubitsInStateVec );
REQUIRE( b.numAmpsPerChunk == a.numAmpsPerChunk );
REQUIRE( b.numAmpsTotal == a.numAmpsTotal );
REQUIRE( areEqual(a, b) );
destroyQureg(a, QUEST_ENV);
destroyQureg(b, QUEST_ENV);
}
}
TEST_CASE( "createComplexMatrixN", "[data_structures]" ) {
SECTION( "correctness" ) {
int numQb = GENERATE( range(1,10+1) );
ComplexMatrixN m = createComplexMatrixN(numQb);
REQUIRE( areEqual(toQMatrix(m), getZeroMatrix(1<<numQb)) );
destroyComplexMatrixN(m);
}
SECTION( "input validation" ) {
SECTION( "number of qubits" ) {
int numQb = GENERATE( -1, 0 );
REQUIRE_THROWS_WITH( createComplexMatrixN(numQb), Contains("Invalid number of qubits") );
}
}
}
TEST_CASE( "createDensityQureg", "[data_structures]" ) {
int minNumQb = calcLog2(QUEST_ENV.numRanks) - 1; if (minNumQb <= 0)
minNumQb = 1;
SECTION( "correctness" ) {
int numQb = GENERATE_COPY( range(minNumQb, minNumQb+10) );
Qureg reg = createDensityQureg(numQb, QUEST_ENV);
QMatrix ref = getZeroMatrix(1<<numQb);
ref[0][0] = 1; REQUIRE( areEqual(reg, ref) );
destroyQureg(reg, QUEST_ENV);
}
SECTION( "input validation") {
SECTION( "number of qubits" ) {
int numQb = GENERATE( -1, 0 );
REQUIRE_THROWS_WITH( createDensityQureg(numQb, QUEST_ENV), Contains("Invalid number of qubits") );
}
SECTION( "number of amplitudes" ) {
QuESTEnv env = QUEST_ENV;
int maxQb = (int) calcLog2(SIZE_MAX) - 1;
REQUIRE_THROWS_WITH( createDensityQureg(maxQb+1, env), Contains("Too many qubits") && Contains("size_t type") );
int minQb = GENERATE( range(3,10) );
env.numRanks = (int) pow(2, 2*minQb);
int numQb = GENERATE_COPY( range(1,minQb) );
REQUIRE_THROWS_WITH( createDensityQureg(numQb, env), Contains("Too few qubits") );
}
SECTION( "available memory" ) {
SUCCEED( );
}
}
}
TEST_CASE( "createQuESTEnv", "[data_structures]" ) {
SUCCEED( );
}
TEST_CASE( "createQureg", "[data_structures]" ) {
int minNumQb = calcLog2(QUEST_ENV.numRanks);
if (minNumQb == 0)
minNumQb = 1;
SECTION( "correctness" ) {
int numQb = GENERATE_COPY( range(minNumQb, minNumQb+10) );
Qureg reg = createQureg(numQb, QUEST_ENV);
QVector ref = QVector(1<<numQb);
ref[0] = 1; REQUIRE( areEqual(reg, ref) );
destroyQureg(reg, QUEST_ENV);
}
SECTION( "input validation") {
SECTION( "number of qubits" ) {
int numQb = GENERATE( -1, 0 );
REQUIRE_THROWS_WITH( createQureg(numQb, QUEST_ENV), Contains("Invalid number of qubits") );
}
SECTION( "number of amplitudes" ) {
QuESTEnv env = QUEST_ENV;
int maxQb = (int) calcLog2(SIZE_MAX);
REQUIRE_THROWS_WITH( createQureg(maxQb+1, env), Contains("Too many qubits") && Contains("size_t type") );
int minQb = GENERATE( range(2,10) );
env.numRanks = (int) pow(2, minQb);
int numQb = GENERATE_COPY( range(1,minQb) );
REQUIRE_THROWS_WITH( createQureg(numQb, env), Contains("Too few qubits") );
}
SECTION( "available memory" ) {
SUCCEED( );
}
}
}
TEST_CASE( "destroyComplexMatrixN", "[data_structures]" ) {
SECTION( "correctness" ) {
SUCCEED( );
}
SECTION( "input validation" ) {
SECTION( "matrix not created" ) {
ComplexMatrixN m;
m.real = NULL;
REQUIRE_THROWS_WITH( destroyComplexMatrixN(m), Contains("The ComplexMatrixN was not successfully created") );
}
}
}
TEST_CASE( "destroyQuESTEnv", "[data_structures]" ) {
SUCCEED( );
}
TEST_CASE( "destroyQureg", "[data_structures]" ) {
SUCCEED( );
}
TEST_CASE( "initComplexMatrixN", "[data_structures]" ) {
SUCCEED( );
}