Qrack  9.0
General classical-emulating-quantum development framework
Namespaces | Macros
qunit.cpp File Reference
#include "qfactory.hpp"
#include <ctime>
#include <initializer_list>
#include <map>
Include dependency graph for qunit.cpp:

Namespaces

 Qrack
 

Macros

#define DIRTY(shard)   (shard.isPhaseDirty || shard.isProbDirty)
 
#define IS_AMP_0(c)   ((2 * norm(c)) <= separabilityThreshold)
 
#define IS_1_CMPLX(c)   (norm(ONE_CMPLX - (c)) <= FP_NORM_EPSILON)
 
#define SHARD_STATE(shard)   ((2 * norm(shard.amp0)) < ONE_R1)
 
#define QUEUED_PHASE(shard)
 
#define CACHED_X(shard)   ((shard.pauliBasis == PauliX) && !DIRTY(shard) && !QUEUED_PHASE(shard))
 
#define CACHED_X_OR_Y(shard)   ((shard.pauliBasis != PauliZ) && !DIRTY(shard) && !QUEUED_PHASE(shard))
 
#define CACHED_Z(shard)   ((shard.pauliBasis == PauliZ) && !DIRTY(shard) && !QUEUED_PHASE(shard))
 
#define CACHED_ZERO(q)
 
#define CACHED_ONE(q)
 
#define CACHED_PLUS(q)
 
#define UNSAFE_CACHED_ZERO_OR_ONE(shard)    (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && (IS_NORM_0(shard.amp0) || IS_NORM_0(shard.amp1)))
 
#define UNSAFE_CACHED_X(shard)    (!shard.isProbDirty && (shard.pauliBasis == PauliX) && (IS_NORM_0(shard.amp0) || IS_NORM_0(shard.amp1)))
 
#define UNSAFE_CACHED_ONE(shard)   (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && IS_NORM_0(shard.amp0))
 
#define UNSAFE_CACHED_ZERO(shard)   (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && IS_NORM_0(shard.amp1))
 
#define IS_SAME_UNIT(shard1, shard2)   (shard1.unit && (shard1.unit == shard2.unit))
 
#define ARE_CLIFFORD(shard1, shard2)    ((engines[0U] == QINTERFACE_STABILIZER_HYBRID) && shard1.isClifford() && shard2.isClifford())
 
#define BLOCKED_SEPARATE(shard)   (shard.unit && shard.unit->isClifford() && !shard.unit->TrySeparate(shard.mapped))
 
#define IS_PHASE_OR_INVERT(mtrx)    ((IS_NORM_0(mtrx[1U]) && IS_NORM_0(mtrx[2U])) || (IS_NORM_0(mtrx[0U]) && IS_NORM_0(mtrx[3U])))
 
#define CTRLED_GEN_WRAP(ctrld)
 
#define CTRLED_PHASE_INVERT_WRAP(ctrld, ctrldgen, isInvert, top, bottom)
 
#define CTRLED_SWAP_WRAP(ctrld, bare, anti)
 
#define CTRL_GEN_ARGS   mappedControls, trnsMtrx, shards[target].mapped, controlPerm
 
#define CTRL_S_ARGS   mappedControls, shards[qubit1].mapped, shards[qubit2].mapped
 
#define CTRL_P_ARGS   mappedControls, topLeft, bottomRight, shards[target].mapped, controlPerm
 
#define CTRL_I_ARGS   mappedControls, topRight, bottomLeft, shards[target].mapped, controlPerm
 

Macro Definition Documentation

◆ ARE_CLIFFORD

#define ARE_CLIFFORD (   shard1,
  shard2 
)     ((engines[0U] == QINTERFACE_STABILIZER_HYBRID) && shard1.isClifford() && shard2.isClifford())

◆ BLOCKED_SEPARATE

#define BLOCKED_SEPARATE (   shard)    (shard.unit && shard.unit->isClifford() && !shard.unit->TrySeparate(shard.mapped))

◆ CACHED_ONE

#define CACHED_ONE (   q)
Value:
(CACHED_Z(shards[q]) && !(shards[q].unit && shards[q].unit->isClifford() && shards[q].unit->GetTInjection()) && \
((ONE_R1_F - ProbBase(q)) <= FP_NORM_EPSILON))
constexpr real1_f ONE_R1_F
Definition: qrack_types.hpp:154
QRACK_CONST real1 FP_NORM_EPSILON
Definition: qrack_types.hpp:243
std::map< QInterface *, std::map< uintq, bitLenInt > > shards
Definition: pinvoke_api.cpp:262
#define CACHED_Z(shard)
Definition: qunit.cpp:39

◆ CACHED_PLUS

#define CACHED_PLUS (   q)
Value:
(CACHED_X(shards[q]) && !(shards[q].unit && shards[q].unit->isClifford() && shards[q].unit->GetTInjection()) && \
(ProbBase(q) <= FP_NORM_EPSILON))
#define CACHED_X(shard)
Definition: qunit.cpp:37

◆ CACHED_X

#define CACHED_X (   shard)    ((shard.pauliBasis == PauliX) && !DIRTY(shard) && !QUEUED_PHASE(shard))

◆ CACHED_X_OR_Y

#define CACHED_X_OR_Y (   shard)    ((shard.pauliBasis != PauliZ) && !DIRTY(shard) && !QUEUED_PHASE(shard))

◆ CACHED_Z

#define CACHED_Z (   shard)    ((shard.pauliBasis == PauliZ) && !DIRTY(shard) && !QUEUED_PHASE(shard))

◆ CACHED_ZERO

#define CACHED_ZERO (   q)
Value:
(CACHED_Z(shards[q]) && !(shards[q].unit && shards[q].unit->isClifford() && shards[q].unit->GetTInjection()) && \
(ProbBase(q) <= FP_NORM_EPSILON))

◆ CTRL_GEN_ARGS

#define CTRL_GEN_ARGS   mappedControls, trnsMtrx, shards[target].mapped, controlPerm

◆ CTRL_I_ARGS

#define CTRL_I_ARGS   mappedControls, topRight, bottomLeft, shards[target].mapped, controlPerm

◆ CTRL_P_ARGS

#define CTRL_P_ARGS   mappedControls, topLeft, bottomRight, shards[target].mapped, controlPerm

◆ CTRL_S_ARGS

#define CTRL_S_ARGS   mappedControls, shards[qubit1].mapped, shards[qubit2].mapped

◆ CTRLED_GEN_WRAP

#define CTRLED_GEN_WRAP (   ctrld)
Value:
ApplyEitherControlled( \
controlVec, { target }, \
[&](QInterfacePtr unit, std::vector<bitLenInt> mappedControls) { \
complex trnsMtrx[4U]{ ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX }; \
if (shards[target].pauliBasis == PauliX) { \
TransformX2x2(mtrx, trnsMtrx); \
} else if (shards[target].pauliBasis == PauliY) { \
TransformY2x2(mtrx, trnsMtrx); \
} else { \
std::copy(mtrx, mtrx + 4U, trnsMtrx); \
} \
unit->ctrld; \
}, \
false);
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:28
@ PauliX
Pauli X operator. Corresponds to Q# constant "PauliX.".
Definition: qinterface.hpp:38
@ PauliY
Pauli Y operator. Corresponds to Q# constant "PauliY.".
Definition: qinterface.hpp:40
QRACK_CONST complex ZERO_CMPLX
Definition: qrack_types.hpp:240
MICROSOFT_QUANTUM_DECL void U(_In_ uintq sid, _In_ uintq q, _In_ double theta, _In_ double phi, _In_ double lambda)
(External API) 3-parameter unitary gate
Definition: pinvoke_api.cpp:1362

◆ CTRLED_PHASE_INVERT_WRAP

#define CTRLED_PHASE_INVERT_WRAP (   ctrld,
  ctrldgen,
  isInvert,
  top,
  bottom 
)
Value:
ApplyEitherControlled( \
controlVec, { target }, \
[&](QInterfacePtr unit, std::vector<bitLenInt> mappedControls) { \
if (shards[target].pauliBasis == PauliX) { \
complex trnsMtrx[4U]{ ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX }; \
if (isInvert) { \
TransformXInvert(top, bottom, trnsMtrx); \
} else { \
TransformPhase(top, bottom, trnsMtrx); \
} \
unit->ctrldgen; \
} else if (shards[target].pauliBasis == PauliY) { \
complex trnsMtrx[4U]{ ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX, ZERO_CMPLX }; \
if (isInvert) { \
TransformYInvert(top, bottom, trnsMtrx); \
} else { \
TransformPhase(top, bottom, trnsMtrx); \
} \
unit->ctrldgen; \
} else { \
unit->ctrld; \
} \
}, \
!isInvert);

◆ CTRLED_SWAP_WRAP

#define CTRLED_SWAP_WRAP (   ctrld,
  bare,
  anti 
)
Value:
ThrowIfQbIdArrayIsBad(controls, qubitCount, \
"QUnit Swap variant parameter controls array values must be within allocated qubit bounds!"); \
if (qubit1 >= qubitCount) { \
throw std::invalid_argument( \
"QUnit Swap variant qubit index parameter must be within allocated qubit bounds!"); \
} \
if (qubit2 >= qubitCount) { \
throw std::invalid_argument( \
"QUnit Swap variant qubit index parameter must be within allocated qubit bounds!"); \
} \
if (qubit1 == qubit2) { \
return; \
} \
std::vector<bitLenInt> controlVec; \
bitCapInt _perm = anti ? 0U : (pow2(controls.size()) - 1U); \
if (TrimControls(controls, controlVec, &_perm)) { \
return; \
} \
if (!controlVec.size()) { \
bare; \
return; \
} \
ApplyEitherControlled( \
controlVec, { qubit1, qubit2 }, \
[&](QInterfacePtr unit, std::vector<bitLenInt> mappedControls) { unit->ctrld; }, false)
void ThrowIfQbIdArrayIsBad(const std::vector< bitLenInt > &controls, const bitLenInt &qubitCount, std::string message)
Definition: qrack_functions.hpp:71
bitCapInt pow2(const bitLenInt &p)
Definition: qrack_functions.hpp:22

◆ DIRTY

#define DIRTY (   shard)    (shard.isPhaseDirty || shard.isProbDirty)

◆ IS_1_CMPLX

#define IS_1_CMPLX (   c)    (norm(ONE_CMPLX - (c)) <= FP_NORM_EPSILON)

◆ IS_AMP_0

#define IS_AMP_0 (   c)    ((2 * norm(c)) <= separabilityThreshold)

◆ IS_PHASE_OR_INVERT

#define IS_PHASE_OR_INVERT (   mtrx)     ((IS_NORM_0(mtrx[1U]) && IS_NORM_0(mtrx[2U])) || (IS_NORM_0(mtrx[0U]) && IS_NORM_0(mtrx[3U])))

◆ IS_SAME_UNIT

#define IS_SAME_UNIT (   shard1,
  shard2 
)    (shard1.unit && (shard1.unit == shard2.unit))

◆ QUEUED_PHASE

#define QUEUED_PHASE (   shard)
Value:
((shard.targetOfShards.size() != 0U) || (shard.controlsShards.size() != 0U) || \
(shard.antiTargetOfShards.size() != 0U) || (shard.antiControlsShards.size() != 0U))

◆ SHARD_STATE

#define SHARD_STATE (   shard)    ((2 * norm(shard.amp0)) < ONE_R1)

◆ UNSAFE_CACHED_ONE

#define UNSAFE_CACHED_ONE (   shard)    (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && IS_NORM_0(shard.amp0))

◆ UNSAFE_CACHED_X

#define UNSAFE_CACHED_X (   shard)     (!shard.isProbDirty && (shard.pauliBasis == PauliX) && (IS_NORM_0(shard.amp0) || IS_NORM_0(shard.amp1)))

◆ UNSAFE_CACHED_ZERO

#define UNSAFE_CACHED_ZERO (   shard)    (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && IS_NORM_0(shard.amp1))

◆ UNSAFE_CACHED_ZERO_OR_ONE

#define UNSAFE_CACHED_ZERO_OR_ONE (   shard)     (!shard.isProbDirty && (shard.pauliBasis == PauliZ) && (IS_NORM_0(shard.amp0) || IS_NORM_0(shard.amp1)))