14#include <catch2/catch_test_macros.hpp>
15#include <catch2/matchers/catch_matchers_string.hpp>
16#include <catch2/generators/catch_generators_range.hpp>
18#include "tests/utils/macros.hpp"
19#include "tests/utils/config.hpp"
20#include "tests/utils/cache.hpp"
21#include "tests/utils/compare.hpp"
25using Catch::Matchers::ContainsSubstring;
33#define TEST_CATEGORY \
34 LABEL_UNIT_TAG "[experimental]"
37void TEST_ON_CACHED_QUREGS(quregCache quregs,
auto testFunc) {
39 for (
auto& [label, qureg]: quregs) {
41 DYNAMIC_SECTION( label ) {
58TEST_CASE(
"setQuESTNumGpuThreadsPerBlock", TEST_CATEGORY ) {
63 SECTION( LABEL_CORRECTNESS ) {
67 int inNumTPB = GENERATE( 64, 128, 256, 512, 1024 );
71 REQUIRE( inNumTPB == outNumTPB );
79 SECTION( LABEL_VALIDATION ) {
81 SECTION(
"Negative" ) {
83 int badNumTPB = GENERATE( 0, -1, -9999 );
87 SECTION(
"Indivisible by warp size" ) {
97 int badNumTPB = GENERATE_COPY( warpSize - 1, warpSize + 1, warpSize + warpSize/2, 3*warpSize + warpSize/2 );
102 SECTION(
"Exceeds device maximum" ) {
104 int badNumTPB = 102400;
119TEST_CASE(
"getQuESTNumGpuThreadsPerBlock", TEST_CATEGORY ) {
121 SECTION( LABEL_CORRECTNESS ) {
125 int defaultNum = getDefaultNumGpuThreadsPerBlock();
128 REQUIRE( defaultNum == reportedNum );
133 SECTION( LABEL_VALIDATION ) {
141TEST_CASE(
"saveQuregToFile", TEST_CATEGORY ) {
143 SECTION( LABEL_CORRECTNESS ) {
145 const char* outFn =
"test_checkpoint.bp";
147 auto testFunc = [&](
Qureg qureg) {
156 SECTION( LABEL_STATEVEC ) {
if (QUEST_COMPILE_ADIOS2) TEST_ON_CACHED_QUREGS(getCachedStatevecs(), testFunc); SUCCEED( ); }
157 SECTION( LABEL_DENSMATR ) {
if (QUEST_COMPILE_ADIOS2) TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); SUCCEED( ); }
164 std::filesystem::remove_all(outFn);
168 SECTION( LABEL_VALIDATION ) {
170 Qureg qureg = getArbitraryCachedStatevec();
172 SECTION(
"adios2 not compiled" ) {
174 if (!QUEST_COMPILE_ADIOS2)
175 REQUIRE_THROWS_WITH(
saveQuregToFile(qureg,
"dummy.bp"), ContainsSubstring(
"compiled with ADIOS2") );
180 SECTION(
"qureg uninitialised" ) {
182 if (QUEST_COMPILE_ADIOS2) {
184 badQureg.numQubits = -123;
185 REQUIRE_THROWS_WITH(
saveQuregToFile(badQureg,
"dummy.bp"), ContainsSubstring(
"Received an invalid Qureg") );
191 SECTION(
"bad name" ) {
193 if (QUEST_COMPILE_ADIOS2) {
195 #if defined(_MSC_VER)
196 auto badFn = GENERATE(
":",
"?",
"*" );
198 auto badFn = GENERATE(
"",
"\0" );
200 REQUIRE_THROWS_WITH(
saveQuregToFile(qureg, badFn), ContainsSubstring(
"could not be opened") );
209TEST_CASE(
"createQuregFromFile", TEST_CATEGORY ) {
211 SECTION( LABEL_CORRECTNESS ) {
213 const char* checkpointFn =
"test_checkpoint.bp";
221 int legalNumNodes = 1;
223 auto testFunc = [&](
Qureg qureg) {
229 if (qureg.numNodes != legalNumNodes)
233 REQUIRE_AGREE(qureg, newQureg);
239 SECTION( LABEL_STATEVEC ) {
if (QUEST_COMPILE_ADIOS2) TEST_ON_CACHED_QUREGS(getCachedStatevecs(), testFunc); SUCCEED( ); }
240 SECTION( LABEL_DENSMATR ) {
if (QUEST_COMPILE_ADIOS2) TEST_ON_CACHED_QUREGS(getCachedDensmatrs(), testFunc); SUCCEED( ); }
242 CAPTURE( checkpointFn );
249 std::filesystem::remove_all(checkpointFn);
253 SECTION( LABEL_VALIDATION ) {
255 SECTION(
"adios2 not compiled" ) {
257 if (!QUEST_COMPILE_ADIOS2)
258 REQUIRE_THROWS_WITH(
createQuregFromFile(
"dummy.bp"), ContainsSubstring(
"compiled with ADIOS2") );
263 SECTION(
"bad name" ) {
265 if (QUEST_COMPILE_ADIOS2)
266 REQUIRE_THROWS_WITH(
createQuregFromFile(
"BAD_FILENAME"), ContainsSubstring(
"could not be opened") );
271 SECTION(
"differing distributions" ) {
274 if (QUEST_COMPILE_ADIOS2 &&
getQuESTEnv().numNodes > 1) {
280 CAPTURE( quregDistrib.numNodes );
283 const char* fn =
"test_checkpoint.bp";
285 REQUIRE_THROWS_WITH(
createQuregFromFile(fn), ContainsSubstring(
"distributions must match") );
291 std::filesystem::remove_all(fn);
Qureg createQuregFromFile(const char *fn)
int getQuESTNumGpuThreadsPerBlock()
void setQuESTNumGpuThreadsPerBlock(int numThreadsPerBlock)
void saveQuregToFile(Qureg qureg, const char *fn)
void initRandomPureState(Qureg qureg)
Qureg createCustomQureg(int numQubits, int isDensMatr, int useDistrib, int useGpuAccel, int useMultithread)
void destroyQureg(Qureg qureg)
TEST_CASE("setQuESTNumGpuThreadsPerBlock", TEST_CATEGORY)