The Quantum Exact Simulation Toolkit v4.3.0
Loading...
Searching...
No Matches
Multiplication
 TEST_CASE ("leftapplySwap", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliX", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliY", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliZ", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliStr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliGadget", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyCompMatr1", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyCompMatr2", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyDiagMatr1", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyDiagMatr2", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplySwap", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPauliX", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPauliY", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPauliZ", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPauliStr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPauliGadget", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyCompMatr1", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyCompMatr2", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyDiagMatr1", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyDiagMatr2", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyCompMatr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyDiagMatr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyDiagMatrPower", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyMultiQubitNot", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPhaseGadget", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyCompMatr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyDiagMatr", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyDiagMatrPower", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyMultiQubitNot", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyPhaseGadget", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyFullStateDiagMatr", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 
 TEST_CASE ("rightapplyFullStateDiagMatr", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 
 TEST_CASE ("leftapplyFullStateDiagMatrPower", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 
 TEST_CASE ("rightapplyFullStateDiagMatrPower", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 
 TEST_CASE ("leftapplyQubitProjector", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyQubitProjector", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyMultiQubitProjector", TEST_CATEGORY_MULT)
 
 TEST_CASE ("rightapplyMultiQubitProjector", TEST_CATEGORY_MULT)
 
 TEST_CASE ("leftapplyPauliStrSum", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 
 TEST_CASE ("rightapplyPauliStrSum", TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG)
 

Detailed Description

Function Documentation

◆ TEST_CASE() [1/40]

TEST_CASE ( "leftapplyCompMatr" ,
TEST_CATEGORY_MULT  )

Definition at line 2410 of file operations.cpp.

2410 {
2411 auto func = static_cast<void(*)(Qureg, int*, int, CompMatr)>(leftapplyCompMatr);
2412 testOperation<zero,any,compmatr,leftapply>(func, nullptr);
2413}
void leftapplyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)
Definition qureg.h:49

◆ TEST_CASE() [2/40]

TEST_CASE ( "leftapplyCompMatr1" ,
TEST_CATEGORY_MULT  )

Definition at line 2386 of file operations.cpp.

2386{ testOperation<zero,one,compmatr,leftapply>(leftapplyCompMatr1, nullptr); }
void leftapplyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)

◆ TEST_CASE() [3/40]

TEST_CASE ( "leftapplyCompMatr2" ,
TEST_CATEGORY_MULT  )

Definition at line 2387 of file operations.cpp.

2387{ testOperation<zero,two,compmatr,leftapply>(leftapplyCompMatr2, nullptr); }
void leftapplyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matr)

◆ TEST_CASE() [4/40]

TEST_CASE ( "leftapplyDiagMatr" ,
TEST_CATEGORY_MULT  )

Definition at line 2415 of file operations.cpp.

2415 {
2416 auto func = static_cast<void(*)(Qureg, int*, int, DiagMatr)>(leftapplyDiagMatr);
2417 testOperation<zero,any,diagmatr,leftapply>(func, nullptr);
2418}
void leftapplyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)

◆ TEST_CASE() [5/40]

TEST_CASE ( "leftapplyDiagMatr1" ,
TEST_CATEGORY_MULT  )

Definition at line 2388 of file operations.cpp.

2388{ testOperation<zero,one,diagmatr,leftapply>(leftapplyDiagMatr1, nullptr); }
void leftapplyDiagMatr1(Qureg qureg, int target, DiagMatr1 matr)

◆ TEST_CASE() [6/40]

TEST_CASE ( "leftapplyDiagMatr2" ,
TEST_CATEGORY_MULT  )

Definition at line 2389 of file operations.cpp.

2389{ testOperation<zero,two,diagmatr,leftapply>(leftapplyDiagMatr2, nullptr); }
void leftapplyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matr)

◆ TEST_CASE() [7/40]

TEST_CASE ( "leftapplyDiagMatrPower" ,
TEST_CATEGORY_MULT  )

Definition at line 2420 of file operations.cpp.

2420 {
2421 auto func = static_cast<void(*)(Qureg, int*, int, DiagMatr, qcomp)>(leftapplyDiagMatrPower);
2422 testOperation<zero,any,diagpower,leftapply>(func, nullptr);
2423}
void leftapplyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)

◆ TEST_CASE() [8/40]

TEST_CASE ( "leftapplyFullStateDiagMatr" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2467 of file operations.cpp.

2467 {
2468
2469 PREPARE_TEST( numQubits, cachedSV, cachedDM, refSV, refDM );
2470
2471 auto cachedMatrs = getCachedFullStateDiagMatrs();
2472
2473 SECTION( LABEL_CORRECTNESS ) {
2474
2475 qmatrix refMatr = getRandomDiagonalMatrix(getPow2(numQubits));
2476 auto apiFunc = leftapplyFullStateDiagMatr;
2477
2478 GENERATE( range(0, getNumTestedMixedDeploymentRepetitions()) );
2479
2480 SECTION( LABEL_STATEVEC ) {
2481
2482 auto refFunc = [&] (qvector& state, qmatrix matr) { leftapplyReferenceOperator(state, matr); };
2483
2484 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedSV, cachedMatrs, apiFunc, refSV, refMatr, refFunc);
2485 }
2486
2487 SECTION( LABEL_DENSMATR ) {
2488
2489 auto refFunc = [&] (qmatrix& state, qmatrix matr) { leftapplyReferenceOperator(state, matr); };
2490
2491 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedDM, cachedMatrs, apiFunc, refDM, refMatr, refFunc);
2492 }
2493 }
2494
2495 /// @todo input validation
2496}
void leftapplyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)

◆ TEST_CASE() [9/40]

TEST_CASE ( "leftapplyFullStateDiagMatrPower" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2524 of file operations.cpp.

2524 {
2525
2526 PREPARE_TEST( numQubits, cachedSV, cachedDM, refSV, refDM );
2527
2528 auto cachedMatrs = getCachedFullStateDiagMatrs();
2529
2530 SECTION( LABEL_CORRECTNESS ) {
2531
2532 qmatrix refMatr = getRandomDiagonalMatrix(getPow2(numQubits));
2533 qcomp exponent = getRandomComplex();
2534
2535 auto apiFunc = [&](Qureg qureg, FullStateDiagMatr matr) {
2536 return leftapplyFullStateDiagMatrPower(qureg, matr, exponent);
2537 };
2538
2539 CAPTURE( exponent );
2540
2541 GENERATE( range(0, getNumTestedMixedDeploymentRepetitions()) );
2542
2543 SECTION( LABEL_STATEVEC ) {
2544
2545 auto refFunc = [&] (qvector& state, qmatrix matr) {
2546 matr = getPowerOfDiagonalMatrix(matr, exponent);
2547 leftapplyReferenceOperator(state, matr);
2548 };
2549
2550 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedSV, cachedMatrs, apiFunc, refSV, refMatr, refFunc);
2551 }
2552
2553 SECTION( LABEL_DENSMATR ) {
2554
2555 auto refFunc = [&] (qmatrix& state, qmatrix matr) {
2556 matr = getPowerOfDiagonalMatrix(matr, exponent);
2557 leftapplyReferenceOperator(state, matr);
2558 };
2559
2560 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedDM, cachedMatrs, apiFunc, refDM, refMatr, refFunc);
2561 }
2562 }
2563
2564 /// @todo input validation
2565}
void leftapplyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)
qcomp getRandomComplex()
Definition random.cpp:107

◆ TEST_CASE() [10/40]

TEST_CASE ( "leftapplyMultiQubitNot" ,
TEST_CATEGORY_MULT  )

Definition at line 2425 of file operations.cpp.

2425 {
2426 auto func = static_cast<void(*)(Qureg, int*, int)>(leftapplyMultiQubitNot);
2427 testOperation<zero,any,none,leftapply>(func, VariableSizeMatrices::X);
2428}
void leftapplyMultiQubitNot(Qureg qureg, int *targets, int numTargets)

◆ TEST_CASE() [11/40]

TEST_CASE ( "leftapplyMultiQubitProjector" ,
TEST_CATEGORY_MULT  )

Definition at line 2728 of file operations.cpp.

2728 {
2729
2730 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2731
2732 SECTION( LABEL_CORRECTNESS ) {
2733
2734 int numTargs = GENERATE_COPY( range(1,numQubits+1) );
2735 auto targets = GENERATE_TARGS( numQubits, numTargs );
2736 auto outcomes = getRandomOutcomes(numTargs);
2737
2738 qmatrix projector = getProjector(targets, outcomes, numQubits);
2739
2740 auto testFunc = [&](Qureg qureg, auto& ref) {
2741 leftapplyMultiQubitProjector(qureg, targets.data(), outcomes.data(), numTargs);
2742 leftapplyReferenceOperator(ref, projector);
2743 };
2744
2745 CAPTURE( targets, outcomes );
2746 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(statevecQuregs, statevecRef, testFunc); }
2747 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2748 }
2749
2750 SECTION( LABEL_VALIDATION ) {
2751
2752 Qureg qureg = getArbitraryCachedStatevec();
2753 int targets[] = {0, 1, 2};
2754 int outcomes[] = {0, 1, 0};
2755 int numTargets = 3;
2756
2757 SECTION( "qureg uninitialised" ) {
2758
2759 Qureg badQureg = qureg;
2760 badQureg.numQubits = -1;
2761 REQUIRE_THROWS_WITH(
2762 leftapplyMultiQubitProjector(badQureg, targets, outcomes, numTargets),
2763 ContainsSubstring("invalid Qureg")
2764 );
2765 }
2766
2767 SECTION( "invalid target qubits" ) {
2768
2769 int badTargets[] = {0, 1, GENERATE_COPY( -1, qureg.numQubits) };
2770 REQUIRE_THROWS_WITH(
2771 leftapplyMultiQubitProjector(qureg, badTargets, outcomes, numTargets),
2772 ContainsSubstring("target")
2773 );
2774 }
2775
2776 SECTION( "duplicate target qubits" ) {
2777
2778 int dupTargets[] = {0, 1, 1};
2779 REQUIRE_THROWS_WITH(
2780 leftapplyMultiQubitProjector(qureg, dupTargets, outcomes, numTargets),
2781 ContainsSubstring("duplicate")
2782 );
2783 }
2784
2785 SECTION( "invalid number of targets" ) {
2786
2787 int badNumTargs = GENERATE( 0, -1 );
2788 REQUIRE_THROWS_WITH(
2789 leftapplyMultiQubitProjector(qureg, targets, outcomes, badNumTargs),
2790 ContainsSubstring("targets")
2791 );
2792
2793 badNumTargs = qureg.numQubits + 1;
2794 REQUIRE_THROWS_WITH(
2795 leftapplyMultiQubitProjector(qureg, targets, outcomes, badNumTargs),
2796 ContainsSubstring("exceeds the number of qubits in the Qureg")
2797 );
2798 }
2799
2800 SECTION( "invalid outcomes" ) {
2801
2802 int badOutcomes[] = {0, 1, GENERATE( -1, 2 ) };
2803 REQUIRE_THROWS_WITH(
2804 leftapplyMultiQubitProjector(qureg, targets, badOutcomes, numTargets),
2805 ContainsSubstring("outcome")
2806 );
2807 }
2808
2809 SECTION( "targets mismatch outcomes (C++ only)" ) {
2810
2811 REQUIRE_THROWS_WITH(
2812 leftapplyMultiQubitProjector(qureg, {0,1,2}, {0,1}),
2813 ContainsSubstring("inconsistent")
2814 );
2815 }
2816
2817 // projector does NOT validate outcome probability
2818 }
2819}
void leftapplyMultiQubitProjector(Qureg qureg, int *qubits, int *outcomes, int numQubits)

◆ TEST_CASE() [12/40]

TEST_CASE ( "leftapplyPauliGadget" ,
TEST_CATEGORY_MULT  )

Definition at line 2385 of file operations.cpp.

2385{ testOperation<zero,any,pauligad,leftapply>(leftapplyPauliGadget, nullptr); }
void leftapplyPauliGadget(Qureg qureg, PauliStr str, qreal angle)

◆ TEST_CASE() [13/40]

TEST_CASE ( "leftapplyPauliStr" ,
TEST_CATEGORY_MULT  )

Definition at line 2384 of file operations.cpp.

2384{ testOperation<zero,any,paulistr,leftapply>(leftapplyPauliStr, nullptr); }
void leftapplyPauliStr(Qureg qureg, PauliStr str)

◆ TEST_CASE() [14/40]

TEST_CASE ( "leftapplyPauliStrSum" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2924 of file operations.cpp.

2924 {
2925
2926 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2927
2928 SECTION( LABEL_CORRECTNESS ) {
2929
2930 int numQubits = getNumCachedQubits();
2931 int numTerms = GENERATE_COPY( 1, 2, 10 );
2932
2933 PauliStrSum sum = createRandomPauliStrSum(numQubits, numTerms);
2934
2935 auto testFunc = [&](Qureg qureg, auto& ref) {
2936
2937 // must use (and ergo make) an identically-deployed workspace
2938 Qureg workspace = createCloneQureg(qureg);
2939 leftapplyPauliStrSum(qureg, sum, workspace);
2940 destroyQureg(workspace);
2941
2942 ref = getMatrix(sum, numQubits) * ref;
2943 };
2944
2945 CAPTURE( numTerms );
2946 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(statevecQuregs, statevecRef, testFunc); }
2947 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2948 }
2949
2950 SECTION( LABEL_VALIDATION ) {
2951
2952 Qureg qureg = getArbitraryCachedStatevec();
2953 PauliStrSum sum = createRandomPauliStrSum(numQubits, 2);
2954
2955 SECTION( "qureg uninitialised" ) {
2956
2957 Qureg badQureg = qureg;
2958 badQureg.numQubits = -1;
2959 Qureg workspace = createCloneQureg(qureg);
2960 REQUIRE_THROWS_WITH(
2961 leftapplyPauliStrSum(badQureg, sum, workspace),
2962 ContainsSubstring("invalid Qureg")
2963 );
2964 destroyQureg(workspace);
2965 }
2966
2967 destroyPauliStrSum(sum);
2968
2969 /// @todo remaining input validation
2970 }
2971}
void leftapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)
void destroyPauliStrSum(PauliStrSum sum)
Definition paulis.cpp:251
Qureg createCloneQureg(Qureg qureg)
Definition qureg.cpp:325
void destroyQureg(Qureg qureg)
Definition qureg.cpp:340

◆ TEST_CASE() [15/40]

TEST_CASE ( "leftapplyPauliX" ,
TEST_CATEGORY_MULT  )

Definition at line 2381 of file operations.cpp.

2381{ testOperation<zero,one,none,leftapply>(leftapplyPauliX, FixedMatrices::X); }
void leftapplyPauliX(Qureg qureg, int target)

◆ TEST_CASE() [16/40]

TEST_CASE ( "leftapplyPauliY" ,
TEST_CATEGORY_MULT  )

Definition at line 2382 of file operations.cpp.

2382{ testOperation<zero,one,none,leftapply>(leftapplyPauliY, FixedMatrices::Y); }
void leftapplyPauliY(Qureg qureg, int target)

◆ TEST_CASE() [17/40]

TEST_CASE ( "leftapplyPauliZ" ,
TEST_CATEGORY_MULT  )

Definition at line 2383 of file operations.cpp.

2383{ testOperation<zero,one,none,leftapply>(leftapplyPauliZ, FixedMatrices::Z); }
void leftapplyPauliZ(Qureg qureg, int target)

◆ TEST_CASE() [18/40]

TEST_CASE ( "leftapplyPhaseGadget" ,
TEST_CATEGORY_MULT  )

Definition at line 2430 of file operations.cpp.

2430 {
2431 auto func = static_cast<void(*)(Qureg, int*, int, qreal)>(leftapplyPhaseGadget);
2432 testOperation<zero,any,scalar,leftapply>(func, VariableSizeParameterisedMatrices::Z);
2433}
void leftapplyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)

◆ TEST_CASE() [19/40]

TEST_CASE ( "leftapplyQubitProjector" ,
TEST_CATEGORY_MULT  )

Definition at line 2602 of file operations.cpp.

2602 {
2603
2604 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2605
2606 SECTION( LABEL_CORRECTNESS ) {
2607
2608 GENERATE( range(0,10) );
2609 int target = GENERATE_COPY( range(0,numQubits) );
2610 int outcome = GENERATE( 0, 1 );
2611
2612 qmatrix projector = getProjector(outcome);
2613
2614 auto testFunc = [&](Qureg qureg, auto& ref) {
2615 leftapplyQubitProjector(qureg, target, outcome);
2616 leftapplyReferenceOperator(ref, {target}, projector);
2617 };
2618
2619 CAPTURE( target, outcome );
2620 SECTION( LABEL_STATEVEC ) { TEST_ON_CACHED_QUREGS(statevecQuregs, statevecRef, testFunc); }
2621 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2622 }
2623
2624 SECTION( LABEL_VALIDATION ) {
2625
2626 Qureg qureg = getArbitraryCachedStatevec();
2627
2628 SECTION( "qureg uninitialised" ) {
2629
2630 Qureg badQureg = qureg;
2631 badQureg.numQubits = -1;
2632 REQUIRE_THROWS_WITH(
2633 leftapplyQubitProjector(badQureg, 0, 0),
2634 ContainsSubstring("invalid Qureg")
2635 );
2636 }
2637
2638 SECTION( "invalid target qubit" ) {
2639
2640 int badTarget = GENERATE_COPY( -1, qureg.numQubits );
2641 REQUIRE_THROWS_WITH(
2642 leftapplyQubitProjector(qureg, badTarget, 0),
2643 ContainsSubstring("target")
2644 );
2645 }
2646
2647 SECTION( "invalid outcome" ) {
2648
2649 int badOutcome = GENERATE_COPY( -1, 2 );
2650 REQUIRE_THROWS_WITH(
2651 leftapplyQubitProjector(qureg, 0, badOutcome),
2652 ContainsSubstring("outcome")
2653 );
2654 }
2655
2656 // projector does NOT validate outcome probability
2657 }
2658}
void leftapplyQubitProjector(Qureg qureg, int qubit, int outcome)

◆ TEST_CASE() [20/40]

TEST_CASE ( "leftapplySwap" ,
TEST_CATEGORY_MULT  )

OPERATOR TESTS

Definition at line 2380 of file operations.cpp.

2380{ testOperation<zero,two,none,leftapply>(leftapplySwap, FixedMatrices::SWAP); }
void leftapplySwap(Qureg qureg, int qubit1, int qubit2)

◆ TEST_CASE() [21/40]

TEST_CASE ( "rightapplyCompMatr" ,
TEST_CATEGORY_MULT  )

Definition at line 2436 of file operations.cpp.

2436 {
2437 auto func = static_cast<void(*)(Qureg, int*, int, CompMatr)>(rightapplyCompMatr);
2438 testOperation<zero,any,compmatr,rightapply>(func, nullptr);
2439}
void rightapplyCompMatr(Qureg qureg, int *targets, int numTargets, CompMatr matrix)

◆ TEST_CASE() [22/40]

TEST_CASE ( "rightapplyCompMatr1" ,
TEST_CATEGORY_MULT  )

Definition at line 2397 of file operations.cpp.

2397{ testOperation<zero,one,compmatr,rightapply>(rightapplyCompMatr1, nullptr); }
void rightapplyCompMatr1(Qureg qureg, int target, CompMatr1 matrix)

◆ TEST_CASE() [23/40]

TEST_CASE ( "rightapplyCompMatr2" ,
TEST_CATEGORY_MULT  )

Definition at line 2398 of file operations.cpp.

2398{ testOperation<zero,two,compmatr,rightapply>(rightapplyCompMatr2, nullptr); }
void rightapplyCompMatr2(Qureg qureg, int target1, int target2, CompMatr2 matrix)

◆ TEST_CASE() [24/40]

TEST_CASE ( "rightapplyDiagMatr" ,
TEST_CATEGORY_MULT  )

Definition at line 2441 of file operations.cpp.

2441 {
2442 auto func = static_cast<void(*)(Qureg, int*, int, DiagMatr)>(rightapplyDiagMatr);
2443 testOperation<zero,any,diagmatr,rightapply>(func, nullptr);
2444}
void rightapplyDiagMatr(Qureg qureg, int *targets, int numTargets, DiagMatr matrix)

◆ TEST_CASE() [25/40]

TEST_CASE ( "rightapplyDiagMatr1" ,
TEST_CATEGORY_MULT  )

Definition at line 2399 of file operations.cpp.

2399{ testOperation<zero,one,diagmatr,rightapply>(rightapplyDiagMatr1, nullptr); }
void rightapplyDiagMatr1(Qureg qureg, int target, DiagMatr1 matrix)

◆ TEST_CASE() [26/40]

TEST_CASE ( "rightapplyDiagMatr2" ,
TEST_CATEGORY_MULT  )

Definition at line 2400 of file operations.cpp.

2400{ testOperation<zero,two,diagmatr,rightapply>(rightapplyDiagMatr2, nullptr); }
void rightapplyDiagMatr2(Qureg qureg, int target1, int target2, DiagMatr2 matrix)

◆ TEST_CASE() [27/40]

TEST_CASE ( "rightapplyDiagMatrPower" ,
TEST_CATEGORY_MULT  )

Definition at line 2446 of file operations.cpp.

2446 {
2447 auto func = static_cast<void(*)(Qureg, int*, int, DiagMatr, qcomp)>(rightapplyDiagMatrPower);
2448 testOperation<zero,any,diagpower,rightapply>(func, nullptr);
2449}
void rightapplyDiagMatrPower(Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)

◆ TEST_CASE() [28/40]

TEST_CASE ( "rightapplyFullStateDiagMatr" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2499 of file operations.cpp.

2499 {
2500
2501 PREPARE_TEST( numQubits, cachedSV, cachedDM, refSV, refDM );
2502
2503 auto cachedMatrs = getCachedFullStateDiagMatrs();
2504
2505 SECTION( LABEL_CORRECTNESS ) {
2506
2507 qmatrix refMatr = getRandomDiagonalMatrix(getPow2(numQubits));
2508 auto apiFunc = rightapplyFullStateDiagMatr;
2509
2510 GENERATE( range(0, getNumTestedMixedDeploymentRepetitions()) );
2511
2512 SECTION( LABEL_DENSMATR ) {
2513
2514 auto refFunc = [&] (qmatrix& state, qmatrix matr) { rightapplyReferenceOperator(state, matr); };
2515
2516 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedDM, cachedMatrs, apiFunc, refDM, refMatr, refFunc);
2517 }
2518 }
2519
2520 /// @todo input validation
2521}
void rightapplyFullStateDiagMatr(Qureg qureg, FullStateDiagMatr matrix)

◆ TEST_CASE() [29/40]

TEST_CASE ( "rightapplyFullStateDiagMatrPower" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2568 of file operations.cpp.

2568 {
2569
2570 PREPARE_TEST( numQubits, cachedSV, cachedDM, refSV, refDM );
2571
2572 auto cachedMatrs = getCachedFullStateDiagMatrs();
2573
2574 SECTION( LABEL_CORRECTNESS ) {
2575
2576 qmatrix refMatr = getRandomDiagonalMatrix(getPow2(numQubits));
2577 qcomp exponent = getRandomComplex();
2578
2579 auto apiFunc = [&](Qureg qureg, FullStateDiagMatr matr) {
2580 return rightapplyFullStateDiagMatrPower(qureg, matr, exponent);
2581 };
2582
2583 CAPTURE( exponent );
2584
2585 GENERATE( range(0, getNumTestedMixedDeploymentRepetitions()) );
2586
2587 SECTION( LABEL_DENSMATR ) {
2588
2589 auto refFunc = [&] (qmatrix& state, qmatrix matr) {
2590 matr = getPowerOfDiagonalMatrix(matr, exponent);
2591 rightapplyReferenceOperator(state, matr);
2592 };
2593
2594 TEST_ON_CACHED_QUREG_AND_MATRIX( cachedDM, cachedMatrs, apiFunc, refDM, refMatr, refFunc);
2595 }
2596 }
2597
2598 /// @todo input validation
2599}
void rightapplyFullStateDiagMatrPower(Qureg qureg, FullStateDiagMatr matrix, qcomp exponent)

◆ TEST_CASE() [30/40]

TEST_CASE ( "rightapplyMultiQubitNot" ,
TEST_CATEGORY_MULT  )

Definition at line 2451 of file operations.cpp.

2451 {
2452 auto func = static_cast<void(*)(Qureg, int*, int)>(rightapplyMultiQubitNot);
2453 testOperation<zero,any,none,rightapply>(func, VariableSizeMatrices::X);
2454}
void rightapplyMultiQubitNot(Qureg qureg, int *targets, int numTargets)

◆ TEST_CASE() [31/40]

TEST_CASE ( "rightapplyMultiQubitProjector" ,
TEST_CATEGORY_MULT  )

Definition at line 2822 of file operations.cpp.

2822 {
2823
2824 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2825
2826 SECTION( LABEL_CORRECTNESS ) {
2827
2828 int numTargs = GENERATE_COPY( range(1,numQubits+1) );
2829 auto targets = GENERATE_TARGS( numQubits, numTargs );
2830 auto outcomes = getRandomOutcomes(numTargs);
2831
2832 qmatrix projector = getProjector(targets, outcomes, numQubits);
2833
2834 auto testFunc = [&](Qureg qureg, auto& ref) {
2835 rightapplyMultiQubitProjector(qureg, targets.data(), outcomes.data(), numTargs);
2836 rightapplyReferenceOperator(ref, projector);
2837 };
2838
2839 CAPTURE( targets, outcomes );
2840 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2841 }
2842
2843 SECTION( LABEL_VALIDATION ) {
2844
2845 Qureg qureg = getArbitraryCachedDensmatr();
2846 int targets[] = {0, 1, 2};
2847 int outcomes[] = {0, 1, 0};
2848 int numTargets = 3;
2849
2850 SECTION( "qureg uninitialised" ) {
2851
2852 Qureg badQureg = qureg;
2853 badQureg.numQubits = -1;
2854 REQUIRE_THROWS_WITH(
2855 rightapplyMultiQubitProjector(badQureg, targets, outcomes, numTargets),
2856 ContainsSubstring("invalid Qureg")
2857 );
2858 }
2859
2860 SECTION( "qureg is not density matrix" ) {
2861
2862 Qureg badQureg = getArbitraryCachedStatevec();
2863 REQUIRE_THROWS_WITH(
2864 rightapplyMultiQubitProjector(badQureg, targets, outcomes, numTargets),
2865 ContainsSubstring("received a statevector")
2866 );
2867 }
2868
2869 SECTION( "invalid target qubits" ) {
2870
2871 int badTargets[] = {0, 1, GENERATE_COPY( -1, qureg.numQubits) };
2872 REQUIRE_THROWS_WITH(
2873 rightapplyMultiQubitProjector(qureg, badTargets, outcomes, numTargets),
2874 ContainsSubstring("target")
2875 );
2876 }
2877
2878 SECTION( "duplicate target qubits" ) {
2879
2880 int dupTargets[] = {0, 1, 1};
2881 REQUIRE_THROWS_WITH(
2882 rightapplyMultiQubitProjector(qureg, dupTargets, outcomes, numTargets),
2883 ContainsSubstring("duplicate")
2884 );
2885 }
2886
2887 SECTION( "invalid number of targets" ) {
2888
2889 int badNumTargs = GENERATE( 0, -1 );
2890 REQUIRE_THROWS_WITH(
2891 rightapplyMultiQubitProjector(qureg, targets, outcomes, badNumTargs),
2892 ContainsSubstring("targets")
2893 );
2894
2895 badNumTargs = qureg.numQubits + 1;
2896 REQUIRE_THROWS_WITH(
2897 rightapplyMultiQubitProjector(qureg, targets, outcomes, badNumTargs),
2898 ContainsSubstring("exceeds the number of qubits in the Qureg")
2899 );
2900 }
2901
2902 SECTION( "invalid outcomes" ) {
2903
2904 int badOutcomes[] = {0, 1, GENERATE( -1, 2 ) };
2905 REQUIRE_THROWS_WITH(
2906 rightapplyMultiQubitProjector(qureg, targets, badOutcomes, numTargets),
2907 ContainsSubstring("outcome")
2908 );
2909 }
2910
2911 SECTION( "targets mismatch outcomes (C++ only)" ) {
2912
2913 REQUIRE_THROWS_WITH(
2914 rightapplyMultiQubitProjector(qureg, {0,1,2}, {0,1}),
2915 ContainsSubstring("inconsistent")
2916 );
2917 }
2918
2919 // projector does NOT validate outcome probability
2920 }
2921}
void rightapplyMultiQubitProjector(Qureg qureg, int *qubits, int *outcomes, int numQubits)

◆ TEST_CASE() [32/40]

TEST_CASE ( "rightapplyPauliGadget" ,
TEST_CATEGORY_MULT  )

Definition at line 2396 of file operations.cpp.

2396{ testOperation<zero,any,pauligad,rightapply>(rightapplyPauliGadget, nullptr); }
void rightapplyPauliGadget(Qureg qureg, PauliStr str, qreal angle)

◆ TEST_CASE() [33/40]

TEST_CASE ( "rightapplyPauliStr" ,
TEST_CATEGORY_MULT  )

Definition at line 2395 of file operations.cpp.

2395{ testOperation<zero,any,paulistr,rightapply>(rightapplyPauliStr, nullptr); }
void rightapplyPauliStr(Qureg qureg, PauliStr str)

◆ TEST_CASE() [34/40]

TEST_CASE ( "rightapplyPauliStrSum" ,
TEST_CATEGORY_MULT LABEL_MIXED_DEPLOY_TAG )

Definition at line 2974 of file operations.cpp.

2974 {
2975
2976 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2977
2978 SECTION( LABEL_CORRECTNESS ) {
2979
2980 int numQubits = getNumCachedQubits();
2981 int numTerms = GENERATE_COPY( 1, 2, 10 );
2982
2983 PauliStrSum sum = createRandomPauliStrSum(numQubits, numTerms);
2984
2985 auto testFunc = [&](Qureg qureg, auto& ref) {
2986
2987 // must use (and ergo make) an identically-deployed workspace
2988 Qureg workspace = createCloneQureg(qureg);
2989 rightapplyPauliStrSum(qureg, sum, workspace);
2990 destroyQureg(workspace);
2991
2992 ref = ref * getMatrix(sum, numQubits);
2993 };
2994
2995 CAPTURE( numTerms );
2996 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2997 }
2998
2999 SECTION( LABEL_VALIDATION ) {
3000
3001 Qureg qureg = getArbitraryCachedStatevec();
3002 PauliStrSum sum = createRandomPauliStrSum(numQubits, 2);
3003
3004 SECTION( "qureg uninitialised" ) {
3005
3006 Qureg badQureg = qureg;
3007 badQureg.numQubits = -1;
3008 Qureg workspace = createCloneQureg(qureg);
3009 REQUIRE_THROWS_WITH(
3010 rightapplyPauliStrSum(badQureg, sum, workspace),
3011 ContainsSubstring("invalid Qureg")
3012 );
3013 destroyQureg(workspace);
3014 }
3015
3016 destroyPauliStrSum(sum);
3017
3018 /// @todo remaining input validation
3019 }
3020}
void rightapplyPauliStrSum(Qureg qureg, PauliStrSum sum, Qureg workspace)

◆ TEST_CASE() [35/40]

TEST_CASE ( "rightapplyPauliX" ,
TEST_CATEGORY_MULT  )

Definition at line 2392 of file operations.cpp.

2392{ testOperation<zero,one,none,rightapply>(rightapplyPauliX, FixedMatrices::X); }
void rightapplyPauliX(Qureg qureg, int target)

◆ TEST_CASE() [36/40]

TEST_CASE ( "rightapplyPauliY" ,
TEST_CATEGORY_MULT  )

Definition at line 2393 of file operations.cpp.

2393{ testOperation<zero,one,none,rightapply>(rightapplyPauliY, FixedMatrices::Y); }
void rightapplyPauliY(Qureg qureg, int target)

◆ TEST_CASE() [37/40]

TEST_CASE ( "rightapplyPauliZ" ,
TEST_CATEGORY_MULT  )

Definition at line 2394 of file operations.cpp.

2394{ testOperation<zero,one,none,rightapply>(rightapplyPauliZ, FixedMatrices::Z); }
void rightapplyPauliZ(Qureg qureg, int target)

◆ TEST_CASE() [38/40]

TEST_CASE ( "rightapplyPhaseGadget" ,
TEST_CATEGORY_MULT  )

Definition at line 2456 of file operations.cpp.

2456 {
2457 auto func = static_cast<void(*)(Qureg, int*, int, qreal)>(rightapplyPhaseGadget);
2458 testOperation<zero,any,scalar,rightapply>(func, VariableSizeParameterisedMatrices::Z);
2459}
void rightapplyPhaseGadget(Qureg qureg, int *targets, int numTargets, qreal angle)

◆ TEST_CASE() [39/40]

TEST_CASE ( "rightapplyQubitProjector" ,
TEST_CATEGORY_MULT  )

Definition at line 2661 of file operations.cpp.

2661 {
2662
2663 PREPARE_TEST( numQubits, statevecQuregs, densmatrQuregs, statevecRef, densmatrRef );
2664
2665 SECTION( LABEL_CORRECTNESS ) {
2666
2667 GENERATE( range(0,10) );
2668 int target = GENERATE_COPY( range(0,numQubits) );
2669 int outcome = GENERATE( 0, 1 );
2670
2671 qmatrix projector = getProjector(outcome);
2672
2673 auto testFunc = [&](Qureg qureg, auto& ref) {
2674 rightapplyQubitProjector(qureg, target, outcome);
2675 rightapplyReferenceOperator(ref, {target}, projector);
2676 };
2677
2678 CAPTURE( target, outcome );
2679 SECTION( LABEL_DENSMATR ) { TEST_ON_CACHED_QUREGS(densmatrQuregs, densmatrRef, testFunc); }
2680 }
2681
2682 SECTION( LABEL_VALIDATION ) {
2683
2684 Qureg qureg = getArbitraryCachedDensmatr();
2685
2686 SECTION( "qureg uninitialised" ) {
2687
2688 Qureg badQureg = qureg;
2689 badQureg.numQubits = -1;
2690 REQUIRE_THROWS_WITH(
2691 rightapplyQubitProjector(badQureg, 0, 0),
2692 ContainsSubstring("invalid Qureg")
2693 );
2694 }
2695
2696 SECTION( "qureg is not density matrix" ) {
2697
2698 Qureg badQureg = getArbitraryCachedStatevec();
2699 REQUIRE_THROWS_WITH(
2700 rightapplyQubitProjector(badQureg, 0, 0),
2701 ContainsSubstring("received a statevector")
2702 );
2703 }
2704
2705 SECTION( "invalid target qubit" ) {
2706
2707 int badTarget = GENERATE_COPY( -1, qureg.numQubits );
2708 REQUIRE_THROWS_WITH(
2709 rightapplyQubitProjector(qureg, badTarget, 0),
2710 ContainsSubstring("target")
2711 );
2712 }
2713
2714 SECTION( "invalid outcome" ) {
2715
2716 int badOutcome = GENERATE_COPY( -1, 2 );
2717 REQUIRE_THROWS_WITH(
2718 rightapplyQubitProjector(qureg, 0, badOutcome),
2719 ContainsSubstring("outcome")
2720 );
2721 }
2722
2723 // projector does NOT validate outcome probability
2724 }
2725}
void rightapplyQubitProjector(Qureg qureg, int qubit, int outcome)

◆ TEST_CASE() [40/40]

TEST_CASE ( "rightapplySwap" ,
TEST_CATEGORY_MULT  )

Definition at line 2391 of file operations.cpp.

2391{ testOperation<zero,two,none,rightapply>(rightapplySwap, FixedMatrices::SWAP); }
void rightapplySwap(Qureg qureg, int qubit1, int qubit2)