10#include "quest/include/quest.h"
12#include <catch2/catch_test_macros.hpp>
13#include <catch2/matchers/catch_matchers_floating_point.hpp>
15#include "tests/utils/macros.hpp"
16#include "tests/utils/cache.hpp"
17#include "tests/utils/compare.hpp"
18#include "tests/utils/random.hpp"
27using namespace Catch::Matchers;
35void testDensityMatrixEvolution(
Qureg psi,
Qureg rho) {
36 DEMAND( psi.numQubits == rho.numQubits );
43 qreal eps = std::max({(qreal) 1E-5, getTestAbsoluteEpsilon()});
44 REQUIRE_THAT(
calcPurity(rho), WithinAbs(1, eps) );
45 REQUIRE_THAT(
calcPurity(psi), WithinAbs(1, eps) );
48 REQUIRE_THAT(
calcFidelity(rho, psi), WithinAbs(1, eps) );
51 int maxNumCompMatrTargs = std::min({6, (int) psi.logNumAmpsPerNode, (
int) rho.logNumAmpsPerNode});
52 int maxNumDiagMatrTargs = std::min({8, psi.numQubits});
53 int maxNumPauliStrTargs = psi.numQubits;
54 int maxNumPauliGadTargs = psi.numQubits;
55 int maxNumPhaseGadTargs = psi.numQubits;
62 int numReps = 10 * psi.numQubits;
69 for (
int r=0; r<numReps; r++) {
70 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,1);
77 for (
int r=0; r<numReps; r++) {
78 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 2,2);
85 for (
int r=0; r<numReps; r++) {
86 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumCompMatrTargs);
95 for (
int r=0; r<numReps; r++) {
96 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,1);
103 for (
int r=0; r<numReps; r++) {
104 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 2,2);
111 for (
int r=0; r<numReps; r++) {
112 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumDiagMatrTargs);
114 setDiagMatr(matr, getDiagonals(getRandomDiagonalUnitary(targs.size())));
121 for (
int r=0; r<numReps; r++) {
122 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumDiagMatrTargs);
125 setDiagMatr(matr, getDiagonals(getRandomDiagonalUnitary(targs.size())));
134 for (
int r=0; r<numReps; r++) {
135 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 2,2);
141 for (
int r=0; r<numReps; r++) {
142 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumPauliStrTargs);
143 PauliStr str = getRandomPauliStr(targs);
149 for (
int r=0; r<numReps; r++) {
150 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumPauliGadTargs);
151 PauliStr str = getRandomPauliStr(targs);
158 for (
int r=0; r<numReps; r++) {
159 auto [ctrls,states,targs] = getRandomVariNumCtrlsStatesTargs(psi.numQubits, 1,maxNumPhaseGadTargs);
166 REQUIRE_THAT(
calcPurity(rho), WithinAbs(1, eps) );
167 REQUIRE_THAT(
calcPurity(psi), WithinAbs(1, eps) );
172 REQUIRE_THAT(
calcFidelity(rho, psi), WithinAbs(1, eps) );
175 for (
int r=0; r<numReps; r++) {
176 PauliStr str = getRandomPauliStr(rho.numQubits);
179 REQUIRE_THAT( psiExpec, WithinAbs(rhoExpec, eps) );
183 for (
int q=0; q<psi.numQubits; q++) {
186 REQUIRE_THAT( psiProb, WithinAbs(rhoProb, eps) );
190 for (
int r=0; r<numReps; r++) {
192 vector<int> targets = getRandomSubRange(0, psi.numQubits, numTargets);
193 vector<int> outcomes = getRandomOutcomes(targets.size());
196 REQUIRE_THAT( psiProb, WithinAbs(rhoProb, eps) );
200 for (
int r=0; r<numReps; r++) {
204 REQUIRE_THAT( psiProb, WithinAbs(rhoProb, eps) );
208 for (
int r=0; r<numReps; r++) {
209 vector<int> targs = getRandomSubRange(0, rho.numQubits, 2);
223 int qubitOutcome = 0;
225 qreal outcomeProb = 1;
232TEST_CASE(
"density evolution", TEST_TAG ) {
234 auto deployments = getSupportedDeployments();
237 for (
auto [rhoDeploy, rhoMPI, rhoGPU, rhoOMP] : deployments) {
238 for (
auto [psiDeploy, psiMPI, psiGPU, psiOMP] : deployments) {
241 if (psiMPI && !rhoMPI)
246 if (rhoMPI && rhoMPI) numQubits = 12;
247 if (rhoOMP && rhoOMP) numQubits = 12;
248 if (rhoGPU && psiGPU) numQubits = 14;
251 "rho = " + rhoDeploy +
", " +
252 "psi = " + psiDeploy +
", " +
253 "qubits = " + std::to_string(numQubits));
255 DYNAMIC_SECTION( label ) {
260 testDensityMatrixEvolution(psi, rho);
qreal calcFidelity(Qureg qureg, Qureg other)
qreal calcExpecPauliStr(Qureg qureg, PauliStr str)
qreal calcProbOfQubitOutcome(Qureg qureg, int qubit, int outcome)
qreal calcProbOfBasisState(Qureg qureg, qindex index)
qreal calcProbOfMultiQubitOutcome(Qureg qureg, int *qubits, int *outcomes, int numQubits)
qreal calcPurity(Qureg qureg)
qreal calcTotalProb(Qureg qureg)
void mixDepolarising(Qureg qureg, int qubit, qreal prob)
void mixTwoQubitDephasing(Qureg qureg, int qubit1, int qubit2, qreal prob)
void mixDamping(Qureg qureg, int qubit, qreal prob)
void mixPaulis(Qureg qureg, int qubit, qreal probX, qreal probY, qreal probZ)
void mixTwoQubitDepolarising(Qureg qureg, int qubit1, int qubit2, qreal prob)
void mixDephasing(Qureg qureg, int qubit, qreal prob)
void initRandomPureState(Qureg qureg)
void initPureState(Qureg qureg, Qureg pure)
CompMatr createCompMatr(int numQubits)
DiagMatr createDiagMatr(int numQubits)
void destroyDiagMatr(DiagMatr matrix)
void destroyCompMatr(CompMatr matrix)
static CompMatr2 getCompMatr2(qcomp **in)
static CompMatr1 getCompMatr1(qcomp **in)
static DiagMatr2 getDiagMatr2(qcomp *in)
static DiagMatr1 getDiagMatr1(qcomp *in)
void setDiagMatr(DiagMatr out, qcomp *in)
void setCompMatr(CompMatr matr, qcomp **vals)
void applyMultiStateControlledCompMatr1(Qureg qureg, int *controls, int *states, int numControls, int target, CompMatr1 matrix)
void applyMultiStateControlledCompMatr2(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2, CompMatr2 matr)
void applyMultiStateControlledCompMatr(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, CompMatr matr)
void applyMultiStateControlledDiagMatr1(Qureg qureg, int *controls, int *states, int numControls, int target, DiagMatr1 matr)
void applyMultiStateControlledDiagMatr2(Qureg qureg, int *controls, int *states, int numControls, int target1, int target2, DiagMatr2 matr)
void applyMultiStateControlledDiagMatrPower(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
void applyMultiStateControlledDiagMatr(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix)
void applyMultiStateControlledPauliGadget(Qureg qureg, int *controls, int *states, int numControls, PauliStr str, qreal angle)
void applyMultiStateControlledPauliStr(Qureg qureg, int *controls, int *states, int numControls, PauliStr str)
void applyMultiStateControlledPhaseGadget(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, qreal angle)
void applyMultiStateControlledSwap(Qureg qureg, int *controls, int *states, int numControls, int qubit1, int qubit2)
Qureg createCustomQureg(int numQubits, int isDensMatr, int useDistrib, int useGpuAccel, int useMultithread)
void destroyQureg(Qureg qureg)
qmatrix getRandomUnitary(int numQb)
qreal getRandomReal(qreal min, qreal maxExcl)
int getRandomInt(int min, int maxExcl)
TEST_CASE("calcExpecPauliStr", TEST_CATEGORY)