Qrack  9.0
General classical-emulating-quantum development framework
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Qrack::QHybrid Class Reference

A "Qrack::QHybrid" internally switched between Qrack::QEngineCPU and Qrack::QEngineOCL to maximize qubit-count-dependent performance. More...

#include <qhybrid.hpp>

Inheritance diagram for Qrack::QHybrid:
Inheritance graph
[legend]
Collaboration diagram for Qrack::QHybrid:
Collaboration graph
[legend]

Public Member Functions

 QHybrid (bitLenInt qBitCount, bitCapInt initState=0U, qrack_rand_gen_ptr rgp=nullptr, complex phaseFac=CMPLX_DEFAULT_ARG, bool doNorm=false, bool randomGlobalPhase=true, bool useHostMem=false, int64_t deviceId=-1, bool useHardwareRNG=true, bool useSparseStateVec=false, real1_f norm_thresh=REAL1_EPSILON, std::vector< int64_t > devList={}, bitLenInt qubitThreshold=0U, real1_f ignored2=FP_NORM_EPSILON_F)
 
void SetQubitCount (bitLenInt qb)
 
QEnginePtr MakeEngine (bool isOpenCL)
 
bool isOpenCL ()
 Returns "true" if current simulation is OpenCL-based. More...
 
void SetConcurrency (uint32_t threadCount)
 Set the number of threads in parallel for loops, per component QEngine. More...
 
void SwitchGpuMode (bool useGpu)
 Switches between CPU and GPU modes. More...
 
void SwitchPagerMode (bool usePager)
 Switches between paged and non-paged modes. More...
 
void SwitchModes (bool useGpu, bool usePager)
 
real1_f GetRunningNorm ()
 Get in-flight renormalization factor. More...
 
void ZeroAmplitudes ()
 Set all amplitudes to 0, and optionally temporarily deallocate state vector RAM. More...
 
bool IsZeroAmplitude ()
 Returns "true" only if amplitudes are all totally 0. More...
 
void CopyStateVec (QEnginePtr src)
 Exactly copy the state vector of a different QEngine instance. More...
 
void CopyStateVec (QHybridPtr src)
 
void GetAmplitudePage (complex *pagePtr, bitCapIntOcl offset, bitCapIntOcl length)
 Copy a "page" of amplitudes from this QEngine's internal state, into pagePtr. More...
 
void SetAmplitudePage (const complex *pagePtr, bitCapIntOcl offset, bitCapIntOcl length)
 Copy a "page" of amplitudes from pagePtr into this QEngine's internal state. More...
 
void SetAmplitudePage (QHybridPtr pageEnginePtr, bitCapIntOcl srcOffset, bitCapIntOcl dstOffset, bitCapIntOcl length)
 
void SetAmplitudePage (QEnginePtr pageEnginePtr, bitCapIntOcl srcOffset, bitCapIntOcl dstOffset, bitCapIntOcl length)
 Copy a "page" of amplitudes from another QEngine, pointed to by pageEnginePtr, into this QEngine's internal state. More...
 
void ShuffleBuffers (QEnginePtr oEngine)
 Swap the high half of this engine with the low half of another. More...
 
void ShuffleBuffers (QHybridPtr oEngine)
 
QEnginePtr CloneEmpty ()
 Clone this QEngine's settings, with a zeroed state vector. More...
 
void QueueSetDoNormalize (bool doNorm)
 Add an operation to the (OpenCL) queue, to set the value of doNormalize, which controls whether to automatically normalize the state. More...
 
void QueueSetRunningNorm (real1_f runningNrm)
 Add an operation to the (OpenCL) queue, to set the value of runningNorm, which is the normalization constant for the next normalization operation. More...
 
void ApplyM (bitCapInt regMask, bitCapInt result, complex nrm)
 
real1_f ProbReg (bitLenInt start, bitLenInt length, bitCapInt permutation)
 Direct measure of register permutation probability. More...
 
bitLenInt Compose (QHybridPtr toCopy)
 
bitLenInt Compose (QInterfacePtr toCopy)
 Combine another QInterface with this one, after the last bit index of this one. More...
 
bitLenInt Compose (QHybridPtr toCopy, bitLenInt start)
 
bitLenInt Compose (QInterfacePtr toCopy, bitLenInt start)
 
bitLenInt ComposeNoClone (QHybridPtr toCopy)
 
bitLenInt ComposeNoClone (QInterfacePtr toCopy)
 
void Decompose (bitLenInt start, QInterfacePtr dest)
 Minimally decompose a set of contiguous bits from the separably composed unit, into "destination". More...
 
bool TryDecompose (bitLenInt start, QInterfacePtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
 
void Decompose (bitLenInt start, QHybridPtr dest)
 
void Dispose (bitLenInt start, bitLenInt length)
 Minimally decompose a set of contiguous bits from the separably composed unit, and discard the separable bits from index "start" for "length.". More...
 
void Dispose (bitLenInt start, bitLenInt length, bitCapInt disposedPerm)
 Dispose a a contiguous set of qubits that are already in a permutation eigenstate. More...
 
bitLenInt Allocate (bitLenInt start, bitLenInt length)
 Allocate new "length" count of |0> state qubits at specified qubit index start position. More...
 
bool TryDecompose (bitLenInt start, QHybridPtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
 
void SetQuantumState (const complex *inputState)
 Set an arbitrary pure quantum state representation. More...
 
void GetQuantumState (complex *outputState)
 Get the pure quantum state representation. More...
 
void GetProbs (real1 *outputProbs)
 Get the pure quantum state representation. More...
 
complex GetAmplitude (bitCapInt perm)
 Get the representational amplitude of a full permutation. More...
 
void SetAmplitude (bitCapInt perm, complex amp)
 Sets the representational amplitude of a full permutation. More...
 
void SetPermutation (bitCapInt perm, complex phaseFac=CMPLX_DEFAULT_ARG)
 Set to a specific permutation of all qubits. More...
 
void Mtrx (const complex *mtrx, bitLenInt qubitIndex)
 Apply an arbitrary single bit unitary transformation. More...
 
void Phase (complex topLeft, complex bottomRight, bitLenInt qubitIndex)
 Apply a single bit transformation that only effects phase. More...
 
void Invert (complex topRight, complex bottomLeft, bitLenInt qubitIndex)
 Apply a single bit transformation that reverses bit probability and might effect phase. More...
 
void MCMtrx (const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
 Apply an arbitrary single bit unitary transformation, with arbitrary control bits. More...
 
void MACMtrx (const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
 Apply an arbitrary single bit unitary transformation, with arbitrary (anti-)control bits. More...
 
void UniformlyControlledSingleBit (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs, const std::vector< bitCapInt > mtrxSkipPowers, bitCapInt mtrxSkipValueMask)
 
void XMask (bitCapInt mask)
 Masked X gate. More...
 
void PhaseParity (real1_f radians, bitCapInt mask)
 Parity phase gate. More...
 
real1_f CProb (bitLenInt control, bitLenInt target)
 Direct measure of bit probability to be in |1> state, if control bit is |1>. More...
 
real1_f ACProb (bitLenInt control, bitLenInt target)
 Direct measure of bit probability to be in |1> state, if control bit is |0>. More...
 
void UniformParityRZ (bitCapInt mask, real1_f angle)
 If the target qubit set parity is odd, this applies a phase factor of \(e^{i angle}\). More...
 
void CUniformParityRZ (const std::vector< bitLenInt > &controls, bitCapInt mask, real1_f angle)
 If the controls are set and the target qubit set parity is odd, this applies a phase factor of \(e^{i angle}\). More...
 
void CSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary control bits. More...
 
void AntiCSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary (anti) control bits. More...
 
void CSqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary control bits. More...
 
void AntiCSqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary (anti) control bits. More...
 
void CISqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary control bits. More...
 
void AntiCISqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary (anti) control bits. More...
 
bool ForceM (bitLenInt qubit, bool result, bool doForce=true, bool doApply=true)
 PSEUDO-QUANTUM - Acts like a measurement gate, except with a specified forced result. More...
 
void INC (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Add integer (without sign) More...
 
void CINC (bitCapInt toAdd, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Add integer (without sign, with controls) More...
 
void INCC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add integer (without sign, with carry) More...
 
void INCS (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
 Add a classical integer to the register, with sign and without carry. More...
 
void INCSC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
 Add a classical integer to the register, with sign and with carry. More...
 
void INCSC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add a classical integer to the register, with sign and with (phase-based) carry. More...
 
void DECC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract classical integer (without sign, with carry) More...
 
void DECSC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
 Subtract a classical integer from the register, with sign and with carry. More...
 
void DECSC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract a classical integer from the register, with sign and with carry. More...
 
void INCBCD (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Add classical BCD integer (without sign) More...
 
void INCBCDC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add classical BCD integer (without sign, with carry) More...
 
void DECBCDC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract BCD integer (without sign, with carry) More...
 
void MUL (bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
 Multiply by integer. More...
 
void DIV (bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
 Divide by integer. More...
 
void MULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
 Multiplication modulo N by integer, (out of place) More...
 
void IMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
 Inverse of multiplication modulo N by integer, (out of place) More...
 
void POWModNOut (bitCapInt base, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
 Raise a classical base to a quantum power, modulo N, (out of place) More...
 
void CMUL (bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled multiplication by integer. More...
 
void CDIV (bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled division by power of integer. More...
 
void CMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled multiplication modulo N by integer, (out of place) More...
 
void CIMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Inverse of controlled multiplication modulo N by integer, (out of place) More...
 
void CPOWModNOut (bitCapInt base, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled, raise a classical base to a quantum power, modulo N, (out of place) More...
 
bitCapInt IndexedLDA (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, const unsigned char *values, bool resetValue=true)
 Set 8 bit register bits by a superposed index-offset-based read from classical memory. More...
 
bitCapInt IndexedADC (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)
 Add to entangled 8 bit register state with a superposed index-offset-based read from classical memory. More...
 
bitCapInt IndexedSBC (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)
 Subtract from an entangled 8 bit register state with a superposed index-offset-based read from classical memory. More...
 
void Hash (bitLenInt start, bitLenInt length, const unsigned char *values)
 Transform a length of qubit register via lookup through a hash table. More...
 
void CPhaseFlipIfLess (bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex)
 The 6502 uses its carry flag also as a greater-than/less-than flag, for the CMP operation. More...
 
void PhaseFlipIfLess (bitCapInt greaterPerm, bitLenInt start, bitLenInt length)
 This is an expedient for an adaptive Grover's search for a function's global minimum. More...
 
void Swap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Swap values of two bits in register. More...
 
void ISwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Swap values of two bits in register, and apply phase factor of i if bits are different. More...
 
void IISwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are different. More...
 
void SqrtSwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Square root of Swap gate. More...
 
void ISqrtSwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Inverse square root of Swap gate. More...
 
void FSim (real1_f theta, real1_f phi, bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics) More...
 
real1_f Prob (bitLenInt qubitIndex)
 Direct measure of bit probability to be in |1> state. More...
 
real1_f CtrlOrAntiProb (bool controlState, bitLenInt control, bitLenInt target)
 
real1_f ProbAll (bitCapInt fullRegister)
 Direct measure of full permutation probability. More...
 
real1_f ProbMask (bitCapInt mask, bitCapInt permutation)
 Direct measure of masked permutation probability. More...
 
real1_f ProbParity (bitCapInt mask)
 Overall probability of any odd permutation of the masked set of bits. More...
 
bool ForceMParity (bitCapInt mask, bool result, bool doForce=true)
 Act as if is a measurement of parity of the masked set of qubits was applied, except force the (usually random) result. More...
 
real1_f SumSqrDiff (QInterfacePtr toCompare)
 
real1_f SumSqrDiff (QHybridPtr toCompare)
 
void UpdateRunningNorm (real1_f norm_thresh=REAL1_DEFAULT_ARG)
 Force a calculation of the norm of the state vector, in order to make it unit length before the next probability or measurement operation. More...
 
void NormalizeState (real1_f nrm=REAL1_DEFAULT_ARG, real1_f norm_thresh=REAL1_DEFAULT_ARG, real1_f phaseArg=ZERO_R1_F)
 Apply the normalization factor found by UpdateRunningNorm() or on the fly by a single bit gate. More...
 
real1_f ExpectationBitsAll (const std::vector< bitLenInt > &bits, bitCapInt offset=0)
 Get permutation expectation value of bits. More...
 
void Finish ()
 If asynchronous work is still running, block until it finishes. More...
 
bool isFinished ()
 Returns "false" if asynchronous work is still running, and "true" if all previously dispatched asynchronous work is done. More...
 
void Dump ()
 If asynchronous work is still running, let the simulator know that it can be aborted. More...
 
QInterfacePtr Clone ()
 Clone this QInterface. More...
 
void SetDevice (int64_t dID)
 Set GPU device ID. More...
 
int64_t GetDevice ()
 Get GPU device ID. More...
 
bitCapIntOcl GetMaxSize ()
 
virtual void ApplyM (bitCapInt qPower, bool result, complex nrm)
 
virtual void ApplyM (bitCapInt regMask, bitCapInt result, complex nrm)=0
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)
 
virtual void Decompose (bitLenInt start, QInterfacePtr dest)=0
 Minimally decompose a set of contiguous bits from the separably composed unit, into "destination". More...
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)=0
 Schmidt decompose a length of qubits. More...
 
- Public Member Functions inherited from Qrack::QEngine
 QEngine (bitLenInt qBitCount, qrack_rand_gen_ptr rgp=nullptr, bool doNorm=false, bool randomGlobalPhase=true, bool useHostMem=false, bool useHardwareRNG=true, real1_f norm_thresh=REAL1_EPSILON)
 
 QEngine ()
 Default constructor, primarily for protected internal use. More...
 
virtual ~QEngine ()
 
virtual void SwitchHostPtr (bool useHostMem)
 Switch to/from host/device state vector bufffer. More...
 
virtual void ResetHostPtr ()
 Reset host/device state vector bufffer usage to default. More...
 
virtual void ZMask (bitCapInt mask)
 Masked Z gate. More...
 
virtual bitCapInt ForceM (const std::vector< bitLenInt > &bits, const std::vector< bool > &values, bool doApply=true)
 Measure permutation state of a register. More...
 
virtual bitCapInt ForceMReg (bitLenInt start, bitLenInt length, bitCapInt result, bool doForce=true, bool doApply=true)
 Measure permutation state of a register. More...
 
virtual void ApplyM (bitCapInt qPower, bool result, complex nrm)
 
virtual void UCMtrx (const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target, bitCapInt controlPerm)
 Apply an arbitrary single bit unitary transformation, with arbitrary control bits, with arbitary control permutation. More...
 
virtual bool M (bitLenInt q)
 
virtual void X (bitLenInt q)
 
virtual void DEC (bitCapInt toSub, bitLenInt start, bitLenInt length)
 Add integer (without sign) More...
 
virtual void DECS (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
 Add a classical integer to the register, with sign and without carry. More...
 
virtual void CDEC (bitCapInt toSub, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Subtract integer (without sign, with controls) More...
 
virtual void ProbRegAll (bitLenInt start, bitLenInt length, real1 *probsArray)
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)
 Schmidt decompose a length of qubits. More...
 
virtual std::map< bitCapInt, int > MultiShotMeasureMask (const std::vector< bitCapInt > &qPowers, unsigned shots)
 Statistical measure of masked permutation probability. More...
 
virtual void MultiShotMeasureMask (const std::vector< bitCapInt > &qPowers, unsigned shots, unsigned long long *shotsArray)
 Statistical measure of masked permutation probability (returned as array) More...
 
virtual bool M (bitLenInt qubitIndex)
 Measurement gate. More...
 
virtual bitCapInt M (const std::vector< bitLenInt > &bits)
 Measure bits with indices in array, and return a mask of the results. More...
 
virtual void X (bitLenInt qubit)
 X gate. More...
 
virtual void X (bitLenInt start, bitLenInt length)
 Bitwise Pauli X (or logical "NOT") operator. More...
 
virtual void Swap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Swap values of two bits in register. More...
 
virtual void ISwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Swap values of two bits in register, and apply phase factor of i if bits are different. More...
 
virtual void IISwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are different. More...
 
virtual void SqrtSwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Square root of Swap gate. More...
 
virtual void ISqrtSwap (bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 Inverse square root of Swap gate. More...
 
virtual void FSim (real1_f theta, real1_f phi, bitLenInt qubitIndex1, bitLenInt qubitIndex2)=0
 The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics) More...
 
virtual void Decompose (bitLenInt start, QInterfacePtr dest)=0
 Minimally decompose a set of contiguous bits from the separably composed unit, into "destination". More...
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)=0
 Schmidt decompose a length of qubits. More...
 
- Public Member Functions inherited from Qrack::QAlu
virtual void DECBCD (bitCapInt toSub, bitLenInt start, bitLenInt length)
 Subtract classical BCD integer (without sign) More...
 
- Public Member Functions inherited from Qrack::QParity
virtual bool MParity (bitCapInt mask)
 Measure (and collapse) parity of the masked set of qubits. More...
 
- Public Member Functions inherited from Qrack::QInterface
 QInterface (bitLenInt n, qrack_rand_gen_ptr rgp=nullptr, bool doNorm=false, bool useHardwareRNG=true, bool randomGlobalPhase=true, real1_f norm_thresh=REAL1_EPSILON)
 
 QInterface ()
 Default constructor, primarily for protected internal use. More...
 
virtual ~QInterface ()
 
void SetRandomSeed (uint32_t seed)
 
virtual bitLenInt GetQubitCount ()
 Get the count of bits in this register. More...
 
virtual bitCapInt GetMaxQPower ()
 Get the maximum number of basis states, namely \( 2^n \) for \( n \) qubits. More...
 
virtual bool GetIsArbitraryGlobalPhase ()
 
real1_f Rand ()
 Generate a random real number between 0 and 1. More...
 
virtual std::map< QInterfacePtr, bitLenIntCompose (std::vector< QInterfacePtr > toCopy)
 
virtual bitLenInt Allocate (bitLenInt length)
 Allocate new "length" count of |0> state qubits at end of qubit index position. More...
 
virtual void MCPhase (const std::vector< bitLenInt > &controls, complex topLeft, complex bottomRight, bitLenInt target)
 Apply a single bit transformation that only effects phase, with arbitrary control bits. More...
 
virtual void MCInvert (const std::vector< bitLenInt > &controls, complex topRight, complex bottomLeft, bitLenInt target)
 Apply a single bit transformation that reverses bit probability and might effect phase, with arbitrary control bits. More...
 
virtual void MACPhase (const std::vector< bitLenInt > &controls, complex topLeft, complex bottomRight, bitLenInt target)
 Apply a single bit transformation that only effects phase, with arbitrary (anti-)control bits. More...
 
virtual void MACInvert (const std::vector< bitLenInt > &controls, complex topRight, complex bottomLeft, bitLenInt target)
 Apply a single bit transformation that reverses bit probability and might effect phase, with arbitrary (anti-)control bits. More...
 
virtual void UCPhase (const std::vector< bitLenInt > &controls, complex topLeft, complex bottomRight, bitLenInt target, bitCapInt perm)
 Apply a single bit transformation that only effects phase, with arbitrary control bits, with arbitrary control permutation. More...
 
virtual void UCInvert (const std::vector< bitLenInt > &controls, complex topRight, complex bottomLeft, bitLenInt target, bitCapInt perm)
 Apply a single bit transformation that reverses bit probability and might effect phase, with arbitrary control bits, with arbitrary control permutation. More...
 
virtual void UniformlyControlledSingleBit (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs)
 Apply a "uniformly controlled" arbitrary single bit unitary transformation. More...
 
virtual void UniformlyControlledSingleBit (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs, const std::vector< bitCapInt > &mtrxSkipPowers, bitCapInt mtrxSkipValueMask)
 
virtual void TimeEvolve (Hamiltonian h, real1_f timeDiff)
 To define a Hamiltonian, give a vector of controlled single bit gates ("HamiltonianOp" instances) that are applied by left-multiplication in low-to-high vector index order on the state vector. More...
 
virtual void CCNOT (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Doubly-controlled NOT gate. More...
 
virtual void AntiCCNOT (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Anti doubly-controlled NOT gate. More...
 
virtual void CNOT (bitLenInt control, bitLenInt target)
 Controlled NOT gate. More...
 
virtual void AntiCNOT (bitLenInt control, bitLenInt target)
 Anti controlled NOT gate. More...
 
virtual void CY (bitLenInt control, bitLenInt target)
 Controlled Y gate. More...
 
virtual void AntiCY (bitLenInt control, bitLenInt target)
 Anti controlled Y gate. More...
 
virtual void CCY (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Doubly-Controlled Y gate. More...
 
virtual void AntiCCY (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Anti doubly-controlled Y gate. More...
 
virtual void CZ (bitLenInt control, bitLenInt target)
 Controlled Z gate. More...
 
virtual void AntiCZ (bitLenInt control, bitLenInt target)
 Anti controlled Z gate. More...
 
virtual void CCZ (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Doubly-Controlled Z gate. More...
 
virtual void AntiCCZ (bitLenInt control1, bitLenInt control2, bitLenInt target)
 Anti doubly-controlled Z gate. More...
 
virtual void U (bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
 General unitary gate. More...
 
virtual void U2 (bitLenInt target, real1_f phi, real1_f lambda)
 2-parameter unitary gate More...
 
virtual void IU2 (bitLenInt target, real1_f phi, real1_f lambda)
 Inverse 2-parameter unitary gate. More...
 
virtual void AI (bitLenInt target, real1_f azimuth, real1_f inclination)
 "Azimuth, Inclination" (RY-RZ) More...
 
virtual void IAI (bitLenInt target, real1_f azimuth, real1_f inclination)
 Invert "Azimuth, Inclination" (RY-RZ) More...
 
virtual void CAI (bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
 Controlled "Azimuth, Inclination" (RY-RZ) More...
 
virtual void AntiCAI (bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
 (Anti-)Controlled "Azimuth, Inclination" (RY-RZ) More...
 
virtual void CIAI (bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
 Controlled inverse "Azimuth, Inclination" (RY-RZ) More...
 
virtual void AntiCIAI (bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
 (Anti-)Controlled inverse "Azimuth, Inclination" (RY-RZ) More...
 
virtual void CU (const std::vector< bitLenInt > &controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
 Controlled general unitary gate. More...
 
virtual void AntiCU (const std::vector< bitLenInt > &controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
 (Anti-)Controlled general unitary gate More...
 
virtual void H (bitLenInt qubit)
 Hadamard gate. More...
 
virtual void SqrtH (bitLenInt qubit)
 Square root of Hadamard gate. More...
 
virtual void SH (bitLenInt qubit)
 Y-basis transformation gate. More...
 
virtual void HIS (bitLenInt qubit)
 Y-basis (inverse) transformation gate. More...
 
virtual void S (bitLenInt qubit)
 S gate. More...
 
virtual void IS (bitLenInt qubit)
 Inverse S gate. More...
 
virtual void T (bitLenInt qubit)
 T gate. More...
 
virtual void IT (bitLenInt qubit)
 Inverse T gate. More...
 
virtual void PhaseRootN (bitLenInt n, bitLenInt qubit)
 "PhaseRootN" gate More...
 
virtual void IPhaseRootN (bitLenInt n, bitLenInt qubit)
 Inverse "PhaseRootN" gate. More...
 
virtual void Y (bitLenInt qubit)
 Y gate. More...
 
virtual void YMask (bitCapInt mask)
 Masked Y gate. More...
 
virtual void Z (bitLenInt qubit)
 Z gate. More...
 
virtual void SqrtX (bitLenInt qubit)
 Square root of X gate. More...
 
virtual void ISqrtX (bitLenInt qubit)
 Inverse square root of X gate. More...
 
virtual void SqrtY (bitLenInt qubit)
 Square root of Y gate. More...
 
virtual void ISqrtY (bitLenInt qubit)
 Inverse square root of Y gate. More...
 
virtual void SqrtW (bitLenInt qubit)
 Square root of W gate. More...
 
virtual void ISqrtW (bitLenInt qubit)
 Inverse square root of W gate. More...
 
virtual void CH (bitLenInt control, bitLenInt target)
 Controlled H gate. More...
 
virtual void AntiCH (bitLenInt control, bitLenInt target)
 (Anti-)controlled H gate More...
 
virtual void CS (bitLenInt control, bitLenInt target)
 Controlled S gate. More...
 
virtual void AntiCS (bitLenInt control, bitLenInt target)
 (Anti-)controlled S gate More...
 
virtual void CIS (bitLenInt control, bitLenInt target)
 Controlled inverse S gate. More...
 
virtual void AntiCIS (bitLenInt control, bitLenInt target)
 (Anti-)controlled inverse S gate More...
 
virtual void CT (bitLenInt control, bitLenInt target)
 Controlled T gate. More...
 
virtual void CIT (bitLenInt control, bitLenInt target)
 Controlled inverse T gate. More...
 
virtual void CPhaseRootN (bitLenInt n, bitLenInt control, bitLenInt target)
 Controlled "PhaseRootN" gate. More...
 
virtual void AntiCPhaseRootN (bitLenInt n, bitLenInt control, bitLenInt target)
 (Anti-)controlled "PhaseRootN" gate More...
 
virtual void CIPhaseRootN (bitLenInt n, bitLenInt control, bitLenInt target)
 Controlled inverse "PhaseRootN" gate. More...
 
virtual void AntiCIPhaseRootN (bitLenInt n, bitLenInt control, bitLenInt target)
 (Anti-)controlled inverse "PhaseRootN" gate More...
 
virtual void AND (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "AND" gate. More...
 
virtual void OR (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "OR" gate. More...
 
virtual void XOR (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "XOR" gate. More...
 
virtual void CLAND (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "AND" gate. More...
 
virtual void CLOR (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "OR" gate. More...
 
virtual void CLXOR (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "XOR" gate. More...
 
virtual void NAND (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "NAND" gate. More...
 
virtual void NOR (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "NOR" gate. More...
 
virtual void XNOR (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
 Quantum analog of classical "XNOR" gate. More...
 
virtual void CLNAND (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "NAND" gate. More...
 
virtual void CLNOR (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "NOR" gate. More...
 
virtual void CLXNOR (bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
 Quantum analog of classical "XNOR" gate. More...
 
virtual void UniformlyControlledRY (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, real1 const *angles)
 Apply a "uniformly controlled" rotation of a bit around the Pauli Y axis. More...
 
virtual void UniformlyControlledRZ (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, real1 const *angles)
 Apply a "uniformly controlled" rotation of a bit around the Pauli Z axis. More...
 
virtual void RT (real1_f radians, bitLenInt qubitIndex)
 Phase shift gate. More...
 
virtual void RX (real1_f radians, bitLenInt qubitIndex)
 X axis rotation gate. More...
 
virtual void RY (real1_f radians, bitLenInt qubitIndex)
 Y axis rotation gate. More...
 
virtual void RZ (real1_f radians, bitLenInt qubitIndex)
 Z axis rotation gate. More...
 
virtual void CRZ (real1_f radians, bitLenInt control, bitLenInt target)
 Controlled Z axis rotation gate. More...
 
virtual void CRY (real1_f radians, bitLenInt control, bitLenInt target)
 Controlled Y axis rotation gate. More...
 
virtual void RTDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction phase shift gate. More...
 
virtual void RXDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction X axis rotation gate. More...
 
virtual void Exp (real1_f radians, bitLenInt qubitIndex)
 (Identity) Exponentiation gate More...
 
virtual void Exp (const std::vector< bitLenInt > &controls, bitLenInt qubit, const complex *matrix2x2, bool antiCtrled=false)
 Imaginary exponentiation of arbitrary 2x2 gate. More...
 
virtual void ExpDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction (identity) exponentiation gate. More...
 
virtual void ExpX (real1_f radians, bitLenInt qubitIndex)
 Pauli X exponentiation gate. More...
 
virtual void ExpXDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction Pauli X exponentiation gate. More...
 
virtual void ExpY (real1_f radians, bitLenInt qubitIndex)
 Pauli Y exponentiation gate. More...
 
virtual void ExpYDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction Pauli Y exponentiation gate. More...
 
virtual void ExpZ (real1_f radians, bitLenInt qubitIndex)
 Pauli Z exponentiation gate. More...
 
virtual void ExpZDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction Pauli Z exponentiation gate. More...
 
virtual void CRX (real1_f radians, bitLenInt control, bitLenInt target)
 Controlled X axis rotation gate. More...
 
virtual void CRXDyad (int numerator, int denomPower, bitLenInt control, bitLenInt target)
 Controlled dyadic fraction X axis rotation gate. More...
 
virtual void RYDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction Y axis rotation gate. More...
 
virtual void CRYDyad (int numerator, int denomPower, bitLenInt control, bitLenInt target)
 Controlled dyadic fraction y axis rotation gate. More...
 
virtual void RZDyad (int numerator, int denomPower, bitLenInt qubitIndex)
 Dyadic fraction Z axis rotation gate. More...
 
virtual void CRZDyad (int numerator, int denomPower, bitLenInt control, bitLenInt target)
 Controlled dyadic fraction Z axis rotation gate. More...
 
virtual void CRT (real1_f radians, bitLenInt control, bitLenInt target)
 Controlled "phase shift gate". More...
 
virtual void CRTDyad (int numerator, int denomPower, bitLenInt control, bitLenInt target)
 Controlled dyadic fraction "phase shift gate". More...
 
virtual void H (bitLenInt start, bitLenInt length)
 Bitwise Hadamard. More...
 
virtual void X (bitLenInt start, bitLenInt length)
 Bitwise Pauli X (or logical "NOT") operator. More...
 
virtual void ROL (bitLenInt shift, bitLenInt start, bitLenInt length)
 Circular shift left - shift bits left, and carry last bits. More...
 
virtual void ROR (bitLenInt shift, bitLenInt start, bitLenInt length)
 Circular shift right - shift bits right, and carry first bits. More...
 
virtual void ASL (bitLenInt shift, bitLenInt start, bitLenInt length)
 Arithmetic shift left, with last 2 bits as sign and carry. More...
 
virtual void ASR (bitLenInt shift, bitLenInt start, bitLenInt length)
 Arithmetic shift right, with last 2 bits as sign and carry. More...
 
virtual void LSL (bitLenInt shift, bitLenInt start, bitLenInt length)
 Logical shift left, filling the extra bits with |0> More...
 
virtual void LSR (bitLenInt shift, bitLenInt start, bitLenInt length)
 Logical shift right, filling the extra bits with |0> More...
 
virtual void FullAdd (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
 Quantum analog of classical "Full Adder" gate. More...
 
virtual void IFullAdd (bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
 Inverse of FullAdd. More...
 
virtual void CFullAdd (const std::vector< bitLenInt > &controls, bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
 Controlled quantum analog of classical "Full Adder" gate. More...
 
virtual void CIFullAdd (const std::vector< bitLenInt > &controls, bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
 Inverse of CFullAdd. More...
 
virtual void ADC (bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
 Add a quantum integer to a quantum integer, with carry. More...
 
virtual void IADC (bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
 Inverse of ADC. More...
 
virtual void CADC (const std::vector< bitLenInt > &controls, bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
 Add a quantum integer to a quantum integer, with carry and with controls. More...
 
virtual void CIADC (const std::vector< bitLenInt > &controls, bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
 Inverse of CADC. More...
 
virtual void QFT (bitLenInt start, bitLenInt length, bool trySeparate=false)
 Quantum Fourier Transform - Apply the quantum Fourier transform to the register. More...
 
virtual void QFTR (const std::vector< bitLenInt > &qubits, bool trySeparate=false)
 Quantum Fourier Transform (random access) - Apply the quantum Fourier transform to the register. More...
 
virtual void IQFT (bitLenInt start, bitLenInt length, bool trySeparate=false)
 Inverse Quantum Fourier Transform - Apply the inverse quantum Fourier transform to the register. More...
 
virtual void IQFTR (const std::vector< bitLenInt > &qubits, bool trySeparate=false)
 Inverse Quantum Fourier Transform (random access) - Apply the inverse quantum Fourier transform to the register. More...
 
virtual void ZeroPhaseFlip (bitLenInt start, bitLenInt length)
 Reverse the phase of the state where the register equals zero. More...
 
virtual void PhaseFlip ()
 Phase flip always - equivalent to Z X Z X on any bit in the QInterface. More...
 
virtual void SetReg (bitLenInt start, bitLenInt length, bitCapInt value)
 Set register bits to given permutation. More...
 
virtual bitCapInt MReg (bitLenInt start, bitLenInt length)
 Measure permutation state of a register. More...
 
virtual bitCapInt MAll ()
 Measure permutation state of all coherent bits. More...
 
virtual bitCapInt M (const std::vector< bitLenInt > &bits)
 Measure bits with indices in array, and return a mask of the results. More...
 
virtual void Reverse (bitLenInt first, bitLenInt last)
 Reverse all of the bits in a sequence. More...
 
virtual void ProbMaskAll (bitCapInt mask, real1 *probsArray)
 Direct measure of masked permutation probability. More...
 
virtual void ProbBitsAll (const std::vector< bitLenInt > &bits, real1 *probsArray)
 Direct measure of listed permutation probability. More...
 
virtual real1_f ExpectationBitsFactorized (const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, bitCapInt offset=0U)
 Get expectation value of bits, given an array of qubit weights. More...
 
virtual real1_f ExpectationBitsFactorizedRdm (bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, bitCapInt offset=0)
 Get (reduced density matrix) expectation value of bits, given an array of qubit weights. More...
 
virtual real1_f ExpectationFloatsFactorized (const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
 Get expectation value of bits, given a (floating-point) array of qubit weights. More...
 
virtual real1_f ExpectationFloatsFactorizedRdm (bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
 Get (reduced density matrix) expectation value of bits, given a (floating-point) array of qubit weights. More...
 
virtual real1_f ProbRdm (bitLenInt qubitIndex)
 Direct measure of bit probability to be in |1> state, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual real1_f ProbAllRdm (bool roundRz, bitCapInt fullRegister)
 Direct measure of full permutation probability, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual real1_f ProbMaskRdm (bool roundRz, bitCapInt mask, bitCapInt permutation)
 Direct measure of masked permutation probability, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual real1_f ExpectationBitsAllRdm (bool roundRz, const std::vector< bitLenInt > &bits, bitCapInt offset=0U)
 Get permutation expectation value of bits, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual void SetBit (bitLenInt qubit, bool value)
 Set individual bit to pure |0> (false) or |1> (true) state. More...
 
virtual bool ApproxCompare (QInterfacePtr toCompare, real1_f error_tol=TRYDECOMPOSE_EPSILON)
 Compare state vectors approximately, component by component, to determine whether this state vector is the same as the target. More...
 
virtual bool isBinaryDecisionTree ()
 Returns "true" if current state representation is definitely a binary decision tree, "false" if it is definitely not, or "true" if it cannot be determined. More...
 
virtual bool isClifford ()
 Returns "true" if current state is identifiably within the Clifford set, or "false" if it is not or cannot be determined. More...
 
virtual bool isClifford (bitLenInt qubit)
 Returns "true" if current qubit state is identifiably within the Clifford set, or "false" if it is not or cannot be determined. More...
 
virtual bool TrySeparate (const std::vector< bitLenInt > &qubits, real1_f error_tol)
 Qrack::QUnit types maintain explicit separation of representations of qubits, which reduces memory usage and increases gate speed. More...
 
virtual bool TrySeparate (bitLenInt qubit)
 Single-qubit TrySeparate() More...
 
virtual bool TrySeparate (bitLenInt qubit1, bitLenInt qubit2)
 Two-qubit TrySeparate() More...
 
virtual double GetUnitaryFidelity ()
 When "Schmidt-decomposition rounding parameter" ("SDRP") is being used, starting from initial 1.0 fidelity, we compound the "unitary fidelity" by successive multiplication by one minus two times the true unitary probability discarded in each single rounding event. More...
 
virtual void ResetUnitaryFidelity ()
 Reset the internal fidelity calculation tracker to 1.0. More...
 
virtual void SetSdrp (real1_f sdrp)
 Set the "Schmidt decomposition rounding parameter" value, (between 0 and 1) More...
 
virtual void SetReactiveSeparate (bool isAggSep)
 Set reactive separation option (on by default if available) More...
 
virtual bool GetReactiveSeparate ()
 Get reactive separation option. More...
 
virtual void SetTInjection (bool useGadget)
 Set the option to use T-injection gadgets (off by default) More...
 
virtual bool GetTInjection ()
 Get the option to use T-injection gadgets. More...
 
bitCapIntOcl GetMaxSize ()
 Get maximum number of amplitudes that can be allocated on current device. More...
 
virtual real1_f FirstNonzeroPhase ()
 Get phase of lowest permutation nonzero amplitude. More...
 
virtual void DepolarizingChannelWeak1Qb (bitLenInt qubit, real1_f lambda)
 Simulate a local qubit depolarizing noise channel, under a stochastic "weak simulation condition." Under "weak" condition, sampling and exact state queries are not accurate, but sampling can be achieved via repeated full execution of a noisy circuit, for each hardware-realistic measurement sample. More...
 
virtual bitLenInt DepolarizingChannelStrong1Qb (bitLenInt qubit, real1_f lambda)
 Simulate a local qubit depolarizing noise channel, under a "strong simulation condition." "Strong" condition supports measurement sampling and direct queries of state, but the expression of state is in terms of one retained ancillary qubit per applied noise channel. More...
 
- Public Member Functions inherited from Qrack::ParallelFor
 ParallelFor ()
 
void SetConcurrencyLevel (unsigned num)
 
unsigned GetConcurrencyLevel ()
 
bitCapIntOcl GetStride ()
 
bitLenInt GetPreferredConcurrencyPower ()
 
void par_for_inc (const bitCapIntOcl begin, const bitCapIntOcl itemCount, IncrementFunc, ParallelFunc fn)
 Iterate through the permutations a maximum of end-begin times, allowing the caller to control the incrementation offset through 'inc'. More...
 
void par_for (const bitCapIntOcl begin, const bitCapIntOcl end, ParallelFunc fn)
 Call fn once for every numerical value between begin and end. More...
 
void par_for_skip (const bitCapIntOcl begin, const bitCapIntOcl end, const bitCapIntOcl skipPower, const bitLenInt skipBitCount, ParallelFunc fn)
 Skip over the skipPower bits. More...
 
void par_for_mask (const bitCapIntOcl, const bitCapIntOcl, const std::vector< bitCapIntOcl > &maskArray, ParallelFunc fn)
 Skip over the bits listed in maskArray in the same fashion as par_for_skip. More...
 
void par_for_set (const std::set< bitCapIntOcl > &sparseSet, ParallelFunc fn)
 Iterate over a sparse state vector. More...
 
void par_for_set (const std::vector< bitCapIntOcl > &sparseSet, ParallelFunc fn)
 Iterate over a sparse state vector. More...
 
void par_for_sparse_compose (const std::vector< bitCapIntOcl > &lowSet, const std::vector< bitCapIntOcl > &highSet, const bitLenInt &highStart, ParallelFunc fn)
 Iterate over the power set of 2 sparse state vectors. More...
 
real1_f par_norm (const bitCapIntOcl maxQPower, const StateVectorPtr stateArray, real1_f norm_thresh=ZERO_R1_F)
 Calculate the normal for the array, (with flooring). More...
 
real1_f par_norm_exact (const bitCapIntOcl maxQPower, const StateVectorPtr stateArray)
 Calculate the normal for the array, (without flooring.) More...
 

Protected Member Functions

real1_f GetExpectation (bitLenInt valueStart, bitLenInt valueLength)
 
void Apply2x2 (bitCapIntOcl offset1, bitCapIntOcl offset2, const complex *mtrx, bitLenInt bitCount, const bitCapIntOcl *qPowersSorted, bool doCalcNorm, real1_f norm_thresh=REAL1_DEFAULT_ARG)
 
void ApplyControlled2x2 (const std::vector< bitLenInt > &controls, bitLenInt target, const complex *mtrx)
 
void ApplyAntiControlled2x2 (const std::vector< bitLenInt > &controls, bitLenInt target, const complex *mtrx)
 
void INCDECC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCC and DECC (without sign, with carry) More...
 
void INCDECSC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (without overflow flag) More...
 
void INCDECSC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (with overflow flag) More...
 
void INCDECBCDC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (without overflow flag) More...
 
- Protected Member Functions inherited from Qrack::QEngine
bool IsPhase (complex const *mtrx)
 
bool IsInvert (complex const *mtrx)
 
bool IsIdentity (complex const *mtrx, bool isControlled)
 
void EitherMtrx (const std::vector< bitLenInt > &controls, complex const *mtrx, bitLenInt target, bool isAnti)
 
- Protected Member Functions inherited from Qrack::QInterface
complex GetNonunitaryPhase ()
 
template<typename Fn >
void MACWrapper (const std::vector< bitLenInt > &controls, Fn fn)
 
bitCapInt SampleClone (const std::vector< bitCapInt > &qPowers)
 

Protected Attributes

bool isGpu
 
bool isPager
 
bool useRDRAND
 
bool isSparse
 
bitLenInt gpuThresholdQubits
 
bitLenInt pagerThresholdQubits
 
real1_f separabilityThreshold
 
int64_t devID
 
QEnginePtr engine
 
complex phaseFactor
 
std::vector< int64_t > deviceIDs
 
- Protected Attributes inherited from Qrack::QEngine
bool useHostRam
 
real1 runningNorm
 The value stored in runningNorm should always be the total probability implied by the norm of all amplitudes, summed, at each update. More...
 
bitCapIntOcl maxQPowerOcl
 
- Protected Attributes inherited from Qrack::QInterface
bool doNormalize
 
bool randGlobalPhase
 
bool useRDRAND
 
bitLenInt qubitCount
 
uint32_t randomSeed
 
real1 amplitudeFloor
 
bitCapInt maxQPower
 
qrack_rand_gen_ptr rand_generator
 
std::uniform_real_distribution< real1_srand_distribution
 
std::shared_ptr< RdRandomhardware_rand_generator
 

Additional Inherited Members

- Static Protected Member Functions inherited from Qrack::QInterface
static real1_f normHelper (complex c)
 
static real1_f clampProb (real1_f toClamp)
 

Detailed Description

A "Qrack::QHybrid" internally switched between Qrack::QEngineCPU and Qrack::QEngineOCL to maximize qubit-count-dependent performance.

Constructor & Destructor Documentation

◆ QHybrid()

Qrack::QHybrid::QHybrid ( bitLenInt  qBitCount,
bitCapInt  initState = 0U,
qrack_rand_gen_ptr  rgp = nullptr,
complex  phaseFac = CMPLX_DEFAULT_ARG,
bool  doNorm = false,
bool  randomGlobalPhase = true,
bool  useHostMem = false,
int64_t  deviceId = -1,
bool  useHardwareRNG = true,
bool  useSparseStateVec = false,
real1_f  norm_thresh = REAL1_EPSILON,
std::vector< int64_t >  devList = {},
bitLenInt  qubitThreshold = 0U,
real1_f  ignored2 = FP_NORM_EPSILON_F 
)

Member Function Documentation

◆ ACProb()

real1_f Qrack::QHybrid::ACProb ( bitLenInt  control,
bitLenInt  target 
)
inlinevirtual

Direct measure of bit probability to be in |1> state, if control bit is |0>.

Warning
PSEUDO-QUANTUM

Reimplemented from Qrack::QEngine.

◆ Allocate()

bitLenInt Qrack::QHybrid::Allocate ( bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

Allocate new "length" count of |0> state qubits at specified qubit index start position.

Implements Qrack::QInterface.

◆ AntiCISqrtSwap()

void Qrack::QHybrid::AntiCISqrtSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply an inverse square root of swap with arbitrary (anti) control bits.

Reimplemented from Qrack::QEngine.

◆ AntiCSqrtSwap()

void Qrack::QHybrid::AntiCSqrtSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply a square root of swap with arbitrary (anti) control bits.

Reimplemented from Qrack::QEngine.

◆ AntiCSwap()

void Qrack::QHybrid::AntiCSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply a swap with arbitrary (anti) control bits.

Reimplemented from Qrack::QEngine.

◆ Apply2x2()

void Qrack::QHybrid::Apply2x2 ( bitCapIntOcl  offset1,
bitCapIntOcl  offset2,
const complex mtrx,
bitLenInt  bitCount,
const bitCapIntOcl qPowersSorted,
bool  doCalcNorm,
real1_f  norm_thresh = REAL1_DEFAULT_ARG 
)
inlineprotectedvirtual

Implements Qrack::QEngine.

◆ ApplyAntiControlled2x2()

void Qrack::QHybrid::ApplyAntiControlled2x2 ( const std::vector< bitLenInt > &  controls,
bitLenInt  target,
const complex mtrx 
)
inlineprotectedvirtual

Reimplemented from Qrack::QEngine.

◆ ApplyControlled2x2()

void Qrack::QHybrid::ApplyControlled2x2 ( const std::vector< bitLenInt > &  controls,
bitLenInt  target,
const complex mtrx 
)
inlineprotectedvirtual

Reimplemented from Qrack::QEngine.

◆ ApplyM() [1/3]

virtual void Qrack::QEngine::ApplyM
inline

◆ ApplyM() [2/3]

void Qrack::QHybrid::ApplyM ( bitCapInt  regMask,
bitCapInt  result,
complex  nrm 
)
inlinevirtual

Implements Qrack::QEngine.

◆ ApplyM() [3/3]

virtual void Qrack::QEngine::ApplyM

◆ CDIV()

void Qrack::QHybrid::CDIV ( bitCapInt  toDiv,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Controlled division by power of integer.

Implements Qrack::QAlu.

◆ CIMULModNOut()

void Qrack::QHybrid::CIMULModNOut ( bitCapInt  toMul,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Inverse of controlled multiplication modulo N by integer, (out of place)

Reimplemented from Qrack::QEngine.

◆ CINC()

void Qrack::QHybrid::CINC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Add integer (without sign, with controls)

Reimplemented from Qrack::QEngine.

◆ CISqrtSwap()

void Qrack::QHybrid::CISqrtSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply an inverse square root of swap with arbitrary control bits.

Reimplemented from Qrack::QEngine.

◆ Clone()

QInterfacePtr Qrack::QHybrid::Clone ( )
inlinevirtual

Clone this QInterface.

Implements Qrack::QInterface.

◆ CloneEmpty()

QEnginePtr Qrack::QHybrid::CloneEmpty ( )
inlinevirtual

Clone this QEngine's settings, with a zeroed state vector.

Implements Qrack::QEngine.

◆ CMUL()

void Qrack::QHybrid::CMUL ( bitCapInt  toMul,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Controlled multiplication by integer.

Implements Qrack::QAlu.

◆ CMULModNOut()

void Qrack::QHybrid::CMULModNOut ( bitCapInt  toMul,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Controlled multiplication modulo N by integer, (out of place)

Reimplemented from Qrack::QEngine.

◆ Compose() [1/4]

bitLenInt Qrack::QHybrid::Compose ( QHybridPtr  toCopy)
inline

◆ Compose() [2/4]

bitLenInt Qrack::QHybrid::Compose ( QHybridPtr  toCopy,
bitLenInt  start 
)
inline

◆ Compose() [3/4]

bitLenInt Qrack::QHybrid::Compose ( QInterfacePtr  toCopy)
inlinevirtual

Combine another QInterface with this one, after the last bit index of this one.

"Compose" combines the quantum description of state of two independent QInterface objects into one object, containing the full permutation basis of the full object. The "inputState" bits are added after the last qubit index of the QInterface to which we "Compose." Informally, "Compose" is equivalent to "just setting another group of qubits down next to the first" without interacting them. Schroedinger's equation can form a description of state for two independent subsystems at once or "separable quantum subsystems" without interacting them. Once the description of state of the independent systems is combined, we can interact them, and we can describe their entanglements to each other, in which case they are no longer independent. A full entangled description of quantum state is not possible for two independent quantum subsystems until we "Compose" them.

"Compose" multiplies the probabilities of the indepedent permutation states of the two subsystems to find the probabilites of the entire set of combined permutations, by simple combinatorial reasoning. If the probablity of the "left-hand" subsystem being in |00> is 1/4, and the probablity of the "right-hand" subsystem being in |101> is 1/8, than the probability of the combined |00101> permutation state is 1/32, and so on for all permutations of the new combined state.

If the programmer doesn't want to "cheat" quantum mechanically, then the original copy of the state which is duplicated into the larger QInterface should be "thrown away" to satisfy "no clone theorem." This is not semantically enforced in Qrack, because optimization of an emulator might be acheived by "cloning" "under-the-hood" while only exposing a quantum mechanically consistent API or instruction set.

Returns the quantum bit offset that the QInterface was appended at, such that bit 5 in toCopy is equal to offset+5 in this object.

Reimplemented from Qrack::QInterface.

◆ Compose() [4/4]

bitLenInt Qrack::QHybrid::Compose ( QInterfacePtr  toCopy,
bitLenInt  start 
)
inlinevirtual

Reimplemented from Qrack::QInterface.

◆ ComposeNoClone() [1/2]

bitLenInt Qrack::QHybrid::ComposeNoClone ( QHybridPtr  toCopy)
inline

◆ ComposeNoClone() [2/2]

bitLenInt Qrack::QHybrid::ComposeNoClone ( QInterfacePtr  toCopy)
inlinevirtual

Reimplemented from Qrack::QInterface.

◆ CopyStateVec() [1/2]

void Qrack::QHybrid::CopyStateVec ( QEnginePtr  src)
inlinevirtual

Exactly copy the state vector of a different QEngine instance.

Implements Qrack::QEngine.

◆ CopyStateVec() [2/2]

void Qrack::QHybrid::CopyStateVec ( QHybridPtr  src)
inline

◆ CPhaseFlipIfLess()

void Qrack::QHybrid::CPhaseFlipIfLess ( bitCapInt  greaterPerm,
bitLenInt  start,
bitLenInt  length,
bitLenInt  flagIndex 
)
inlinevirtual

The 6502 uses its carry flag also as a greater-than/less-than flag, for the CMP operation.

Implements Qrack::QAlu.

◆ CPOWModNOut()

void Qrack::QHybrid::CPOWModNOut ( bitCapInt  base,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length,
const std::vector< bitLenInt > &  controls 
)
inlinevirtual

Controlled, raise a classical base to a quantum power, modulo N, (out of place)

Implements Qrack::QAlu.

◆ CProb()

real1_f Qrack::QHybrid::CProb ( bitLenInt  control,
bitLenInt  target 
)
inlinevirtual

Direct measure of bit probability to be in |1> state, if control bit is |1>.

Warning
PSEUDO-QUANTUM

Reimplemented from Qrack::QEngine.

◆ CSqrtSwap()

void Qrack::QHybrid::CSqrtSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply a square root of swap with arbitrary control bits.

Reimplemented from Qrack::QEngine.

◆ CSwap()

void Qrack::QHybrid::CSwap ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubit1,
bitLenInt  qubit2 
)
inlinevirtual

Apply a swap with arbitrary control bits.

Reimplemented from Qrack::QEngine.

◆ CtrlOrAntiProb()

real1_f Qrack::QHybrid::CtrlOrAntiProb ( bool  controlState,
bitLenInt  control,
bitLenInt  target 
)
inlinevirtual

Reimplemented from Qrack::QEngine.

◆ CUniformParityRZ()

void Qrack::QHybrid::CUniformParityRZ ( const std::vector< bitLenInt > &  controls,
bitCapInt  mask,
real1_f  angle 
)
inlinevirtual

If the controls are set and the target qubit set parity is odd, this applies a phase factor of \(e^{i angle}\).

If the controls are set and the target qubit set parity is even, this applies the conjugate, \(e^{-i angle}\). Otherwise, do nothing if any control is not set.

Implements Qrack::QParity.

◆ DECBCDC()

void Qrack::QHybrid::DECBCDC ( bitCapInt  toSub,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Subtract BCD integer (without sign, with carry)

Reimplemented from Qrack::QAlu.

◆ DECC()

void Qrack::QHybrid::DECC ( bitCapInt  toSub,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Subtract classical integer (without sign, with carry)

Subtract integer (without sign, with carry)

Reimplemented from Qrack::QEngine.

◆ Decompose() [1/5]

virtual QInterfacePtr Qrack::QEngine::Decompose
inline

◆ Decompose() [2/5]

virtual QInterfacePtr Qrack::QInterface::Decompose

Schmidt decompose a length of qubits.

◆ Decompose() [3/5]

void Qrack::QHybrid::Decompose ( bitLenInt  start,
QHybridPtr  dest 
)
inline

◆ Decompose() [4/5]

void Qrack::QHybrid::Decompose ( bitLenInt  start,
QInterfacePtr  dest 
)
inlinevirtual

Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".

Minimally decompose a set of contigious bits from the separably composed unit. The length of this separable unit is reduced by the length of bits decomposed, and the bits removed are output in the destination QInterface pointer. The destination object must be initialized to the correct number of bits, in 0 permutation state. For quantum mechanical accuracy, the bit set removed and the bit set left behind should be quantum mechanically "separable."

Like how "Compose" is like "just setting another group of qubits down next to the first," if two sets of qubits are not entangled, then "Decompose" is like "just moving a few qubits away from the rest." Schroedinger's equation does not require bits to be explicitly interacted in order to describe their permutation basis, and the descriptions of state of separable subsystems, those which are not entangled with other subsystems, are just as easily removed from the description of state. (This is equivalent to a "Schmidt decomposition.")

If we have for example 5 qubits, and we wish to separate into "left" and "right" subsystems of 3 and 2 qubits, we sum probabilities of one permutation of the "left" three over ALL permutations of the "right" two, for all permutations, and vice versa, like so:

\( P(|1000>|xy>) = P(|1000 00>) + P(|1000 10>) + P(|1000 01>) + P(|1000 11>). \)

If the subsystems are not "separable," i.e. if they are entangled, this operation is not well-motivated, and its output is not necessarily defined. (The summing of probabilities over permutations of subsytems will be performed as described above, but this is not quantum mechanically meaningful.) To ensure that the subsystem is "separable," i.e. that it has no entanglements to other subsystems in the QInterface, it can be measured with M(), or else all qubits other than the subsystem can be measured.

Implements Qrack::QInterface.

◆ Decompose() [5/5]

virtual void Qrack::QInterface::Decompose

Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".

Minimally decompose a set of contigious bits from the separably composed unit. The length of this separable unit is reduced by the length of bits decomposed, and the bits removed are output in the destination QInterface pointer. The destination object must be initialized to the correct number of bits, in 0 permutation state. For quantum mechanical accuracy, the bit set removed and the bit set left behind should be quantum mechanically "separable."

Like how "Compose" is like "just setting another group of qubits down next to the first," if two sets of qubits are not entangled, then "Decompose" is like "just moving a few qubits away from the rest." Schroedinger's equation does not require bits to be explicitly interacted in order to describe their permutation basis, and the descriptions of state of separable subsystems, those which are not entangled with other subsystems, are just as easily removed from the description of state. (This is equivalent to a "Schmidt decomposition.")

If we have for example 5 qubits, and we wish to separate into "left" and "right" subsystems of 3 and 2 qubits, we sum probabilities of one permutation of the "left" three over ALL permutations of the "right" two, for all permutations, and vice versa, like so:

\( P(|1000>|xy>) = P(|1000 00>) + P(|1000 10>) + P(|1000 01>) + P(|1000 11>). \)

If the subsystems are not "separable," i.e. if they are entangled, this operation is not well-motivated, and its output is not necessarily defined. (The summing of probabilities over permutations of subsytems will be performed as described above, but this is not quantum mechanically meaningful.) To ensure that the subsystem is "separable," i.e. that it has no entanglements to other subsystems in the QInterface, it can be measured with M(), or else all qubits other than the subsystem can be measured.

◆ DECSC() [1/2]

void Qrack::QHybrid::DECSC ( bitCapInt  toSub,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Subtract a classical integer from the register, with sign and with carry.

Subtract an integer from the register, with sign and with carry.

If the overflow is set, flip phase on overflow. Because the register length is an arbitrary number of bits, the sign bit position on the integer to add is variable. Hence, the integer to add is specified as cast to an unsigned format, with the sign bit assumed to be set at the appropriate position before the cast.

Reimplemented from Qrack::QAlu.

◆ DECSC() [2/2]

void Qrack::QHybrid::DECSC ( bitCapInt  toSub,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex,
bitLenInt  carryIndex 
)
inlinevirtual

Subtract a classical integer from the register, with sign and with carry.

Subtract an integer from the register, with sign and without carry.

Because the register length is an arbitrary number of bits, the sign bit position on the integer to add is variable. Hence, the integer to add is specified as cast to an unsigned format, with the sign bit assumed to be set at the appropriate position before the cast.

Reimplemented from Qrack::QAlu.

◆ Dispose() [1/2]

void Qrack::QHybrid::Dispose ( bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

Minimally decompose a set of contiguous bits from the separably composed unit, and discard the separable bits from index "start" for "length.".

Minimally decompose a set of contigious bits from the separably composed unit. The length of this separable unit is reduced by the length of bits decomposed, and the bits removed are output in the destination QInterface pointer. The destination object must be initialized to the correct number of bits, in 0 permutation state. For quantum mechanical accuracy, the bit set removed and the bit set left behind should be quantum mechanically "separable."

Like how "Compose" is like "just setting another group of qubits down next to the first," if two sets of qubits are not entangled, then "Decompose" is like "just moving a few qubits away from the rest." Schroedinger's equation does not require bits to be explicitly interacted in order to describe their permutation basis, and the descriptions of state of separable subsystems, those which are not entangled with other subsystems, are just as easily removed from the description of state. (This is equivalent to a "Schmidt decomposition.")

If we have for example 5 qubits, and we wish to separate into "left" and "right" subsystems of 3 and 2 qubits, we sum probabilities of one permutation of the "left" three over ALL permutations of the "right" two, for all permutations, and vice versa, like so:

\( P(|1000>|xy>) = P(|1000 00>) + P(|1000 10>) + P(|1000 01>) + P(|1000 11>). \)

If the subsystems are not "separable," i.e. if they are entangled, this operation is not well-motivated, and its output is not necessarily defined. (The summing of probabilities over permutations of subsytems will be performed as described above, but this is not quantum mechanically meaningful.) To ensure that the subsystem is "separable," i.e. that it has no entanglements to other subsystems in the QInterface, it can be measured with M(), or else all qubits other than the subsystem can be measured.

Implements Qrack::QInterface.

◆ Dispose() [2/2]

void Qrack::QHybrid::Dispose ( bitLenInt  start,
bitLenInt  length,
bitCapInt  disposedPerm 
)
inlinevirtual

Dispose a a contiguous set of qubits that are already in a permutation eigenstate.

Implements Qrack::QInterface.

◆ DIV()

void Qrack::QHybrid::DIV ( bitCapInt  toDiv,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length 
)
inlinevirtual

Divide by integer.

Implements Qrack::QAlu.

◆ Dump()

void Qrack::QHybrid::Dump ( )
inlinevirtual

If asynchronous work is still running, let the simulator know that it can be aborted.

Note that this method is typically used internally where appropriate, such that user code typically does not call Dump().

Reimplemented from Qrack::QInterface.

◆ ExpectationBitsAll()

real1_f Qrack::QHybrid::ExpectationBitsAll ( const std::vector< bitLenInt > &  bits,
bitCapInt  offset = 0 
)
inlinevirtual

Get permutation expectation value of bits.

The permutation expectation value of all included bits is returned, with bits valued from low to high as the order of the "bits" array parameter argument.

Warning
PSEUDO-QUANTUM

Reimplemented from Qrack::QInterface.

◆ Finish()

void Qrack::QHybrid::Finish ( )
inlinevirtual

If asynchronous work is still running, block until it finishes.

Note that this is never necessary to get correct, timely return values. QEngines and other layers will always internally "Finish" when necessary for correct return values. This is primarily for debugging and benchmarking.

Reimplemented from Qrack::QInterface.

◆ ForceM()

bool Qrack::QHybrid::ForceM ( bitLenInt  qubitIndex,
bool  result,
bool  doForce = true,
bool  doApply = true 
)
inlinevirtual

PSEUDO-QUANTUM - Acts like a measurement gate, except with a specified forced result.

Reimplemented from Qrack::QEngine.

◆ ForceMParity()

bool Qrack::QHybrid::ForceMParity ( bitCapInt  mask,
bool  result,
bool  doForce = true 
)
inlinevirtual

Act as if is a measurement of parity of the masked set of qubits was applied, except force the (usually random) result.

Warning
PSEUDO-QUANTUM

Implements Qrack::QParity.

◆ FSim()

void Qrack::QHybrid::FSim ( real1_f  theta,
real1_f  phi,
bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics)

Reimplemented from Qrack::QEngine.

◆ GetAmplitude()

complex Qrack::QHybrid::GetAmplitude ( bitCapInt  perm)
inlinevirtual

Get the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetAmplitudePage()

void Qrack::QHybrid::GetAmplitudePage ( complex pagePtr,
bitCapIntOcl  offset,
bitCapIntOcl  length 
)
inlinevirtual

Copy a "page" of amplitudes from this QEngine's internal state, into pagePtr.

Implements Qrack::QEngine.

◆ GetDevice()

int64_t Qrack::QHybrid::GetDevice ( )
inlinevirtual

Get GPU device ID.

Reimplemented from Qrack::QEngine.

◆ GetExpectation()

real1_f Qrack::QHybrid::GetExpectation ( bitLenInt  valueStart,
bitLenInt  valueLength 
)
inlineprotectedvirtual

Implements Qrack::QEngine.

◆ GetMaxSize()

bitCapIntOcl Qrack::QHybrid::GetMaxSize ( )
inline

◆ GetProbs()

void Qrack::QHybrid::GetProbs ( real1 outputProbs)
inlinevirtual

Get the pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetQuantumState()

void Qrack::QHybrid::GetQuantumState ( complex outputState)
inlinevirtual

Get the pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetRunningNorm()

real1_f Qrack::QHybrid::GetRunningNorm ( )
inlinevirtual

Get in-flight renormalization factor.

Reimplemented from Qrack::QEngine.

◆ Hash()

void Qrack::QHybrid::Hash ( bitLenInt  start,
bitLenInt  length,
const unsigned char *  values 
)
inlinevirtual

Transform a length of qubit register via lookup through a hash table.

The hash table must be a one-to-one function, otherwise the behavior of this method is undefined. The value array definition convention is the same as IndexedLDA(). Essentially, this is an IndexedLDA() operation that replaces the index register with the value register, but the lookup table must therefore be one-to-one, for this operation to be unitary, as required.

Implements Qrack::QAlu.

◆ IISwap()

void Qrack::QHybrid::IISwap ( bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are different.

Reimplemented from Qrack::QEngine.

◆ IMULModNOut()

void Qrack::QHybrid::IMULModNOut ( bitCapInt  toMul,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length 
)
inlinevirtual

Inverse of multiplication modulo N by integer, (out of place)

Reimplemented from Qrack::QEngine.

◆ INC()

void Qrack::QHybrid::INC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

Add integer (without sign)

Reimplemented from Qrack::QEngine.

◆ INCBCD()

void Qrack::QHybrid::INCBCD ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

Add classical BCD integer (without sign)

Implements Qrack::QAlu.

◆ INCBCDC()

void Qrack::QHybrid::INCBCDC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Add classical BCD integer (without sign, with carry)

Add BCD integer (without sign, with carry)

Reimplemented from Qrack::QAlu.

◆ INCC()

void Qrack::QHybrid::INCC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Add integer (without sign, with carry)

Reimplemented from Qrack::QEngine.

◆ INCDECBCDC()

void Qrack::QHybrid::INCDECBCDC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlineprotectedvirtual

Common driver method behind INCSC and DECSC (without overflow flag)

Implements Qrack::QAlu.

◆ INCDECC()

void Qrack::QHybrid::INCDECC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlineprotectedvirtual

Common driver method behind INCC and DECC (without sign, with carry)

Reimplemented from Qrack::QEngine.

◆ INCDECSC() [1/2]

void Qrack::QHybrid::INCDECSC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlineprotectedvirtual

Common driver method behind INCSC and DECSC (without overflow flag)

Implements Qrack::QAlu.

◆ INCDECSC() [2/2]

void Qrack::QHybrid::INCDECSC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex,
bitLenInt  carryIndex 
)
inlineprotectedvirtual

Common driver method behind INCSC and DECSC (with overflow flag)

Implements Qrack::QAlu.

◆ INCS()

void Qrack::QHybrid::INCS ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex 
)
inlinevirtual

Add a classical integer to the register, with sign and without carry.

Reimplemented from Qrack::QEngine.

◆ INCSC() [1/2]

void Qrack::QHybrid::INCSC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
inlinevirtual

Add a classical integer to the register, with sign and with (phase-based) carry.

Add an integer to the register, with sign and with carry.

Flip phase on overflow. Because the register length is an arbitrary number of bits, the sign bit position on the integer to add is variable. Hence, the integer to add is specified as cast to an unsigned format, with the sign bit assumed to be set at the appropriate position before the cast.

Reimplemented from Qrack::QAlu.

◆ INCSC() [2/2]

void Qrack::QHybrid::INCSC ( bitCapInt  toAdd,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex,
bitLenInt  carryIndex 
)
inlinevirtual

Add a classical integer to the register, with sign and with carry.

Add an integer to the register, with sign and with carry.

If the overflow is set, flip phase on overflow. Because the register length is an arbitrary number of bits, the sign bit position on the integer to add is variable. Hence, the integer to add is specified as cast to an unsigned format, with the sign bit assumed to be set at the appropriate position before the cast.

Reimplemented from Qrack::QAlu.

◆ IndexedADC()

bitCapInt Qrack::QHybrid::IndexedADC ( bitLenInt  indexStart,
bitLenInt  indexLength,
bitLenInt  valueStart,
bitLenInt  valueLength,
bitLenInt  carryIndex,
const unsigned char *  values 
)
inlinevirtual

Add to entangled 8 bit register state with a superposed index-offset-based read from classical memory.

"inputStart" is the start index of 8 qubits that act as an index into the 256 byte "values" array. The "outputStart" bits would usually already be entangled with the "inputStart" bits via a IndexedLDA() operation. With the "inputStart" bits being a "key" and the "outputStart" bits being a value, the permutation state |key, value> is mapped to |key, value + values[key]>. This is similar to classical parallel addition of two arrays. However, when either of the registers are measured, both registers will collapse into one random VALID key-value pair, with any addition or subtraction done to the "value." See IndexedLDA() for context.

FOR BEST EFFICIENCY, the "values" array should be allocated aligned to a 64-byte boundary. (See the unit tests suite code for an example of how to align the allocation.)

While a QInterface represents an interacting set of qubit-based registers, or a virtual quantum chip, the registers need to interact in some way with (classical or quantum) RAM. IndexedLDA is a RAM access method similar to the X addressing mode of the MOS 6502 chip, if the X register can be in a state of coherent superposition when it loads from RAM. "IndexedADC" and "IndexedSBC" perform add and subtract (with carry) operations on a state usually initially prepared with IndexedLDA().

Implements Qrack::QAlu.

◆ IndexedLDA()

bitCapInt Qrack::QHybrid::IndexedLDA ( bitLenInt  indexStart,
bitLenInt  indexLength,
bitLenInt  valueStart,
bitLenInt  valueLength,
const unsigned char *  values,
bool  resetValue = true 
)
inlinevirtual

Set 8 bit register bits by a superposed index-offset-based read from classical memory.

"inputStart" is the start index of 8 qubits that act as an index into the 256 byte "values" array. The "outputStart" bits are first cleared, then the separable |input, 00000000> permutation state is mapped to |input, values[input]>, with "values[input]" placed in the "outputStart" register. FOR BEST EFFICIENCY, the "values" array should be allocated aligned to a 64-byte boundary. (See the unit tests suite code for an example of how to align the allocation.)

While a QInterface represents an interacting set of qubit-based registers, or a virtual quantum chip, the registers need to interact in some way with (classical or quantum) RAM. IndexedLDA is a RAM access method similar to the X addressing mode of the MOS 6502 chip, if the X register can be in a state of coherent superposition when it loads from RAM.

The physical motivation for this addressing mode can be explained as follows: say that we have a superconducting quantum interface device (SQUID) based chip. SQUIDs have already been demonstrated passing coherently superposed electrical currents. In a sufficiently quantum-mechanically isolated qubit chip with a classical cache, with both classical RAM and registers likely cryogenically isolated from the environment, SQUIDs could (hopefully) pass coherently superposed electrical currents into the classical RAM cache to load values into a qubit register. The state loaded would be a superposition of the values of all RAM to which coherently superposed electrical currents were passed.

In qubit system similar to the MOS 6502, say we have qubit-based "accumulator" and "X index" registers, and say that we start with a superposed X index register. In (classical) X addressing mode, the X index register value acts an offset into RAM from a specified starting address. The X addressing mode of a LoaD Accumulator (LDA) instruction, by the physical mechanism described above, should load the accumulator in quantum parallel with the values of every different address of RAM pointed to in superposition by the X index register. The superposed values in the accumulator are entangled with those in the X index register, by way of whatever values the classical RAM pointed to by X held at the time of the load. (If the RAM at index "36" held an unsigned char value of "27," then the value "36" in the X index register becomes entangled with the value "27" in the accumulator, and so on in quantum parallel for all superposed values of the X index register, at once.) If the X index register or accumulator are then measured, the two registers will both always collapse into a random but valid key-value pair of X index offset and value at that classical RAM address.

Note that a "superposed store operation in classical RAM" is not possible by analagous reasoning. Classical RAM would become entangled with both the accumulator and the X register. When the state of the registers was collapsed, we would find that only one "store" operation to a single memory address had actually been carried out, consistent with the address offset in the collapsed X register and the byte value in the collapsed accumulator. It would not be possible by this model to write in quantum parallel to more than one address of classical memory at a time.

Implements Qrack::QAlu.

◆ IndexedSBC()

bitCapInt Qrack::QHybrid::IndexedSBC ( bitLenInt  indexStart,
bitLenInt  indexLength,
bitLenInt  valueStart,
bitLenInt  valueLength,
bitLenInt  carryIndex,
const unsigned char *  values 
)
inlinevirtual

Subtract from an entangled 8 bit register state with a superposed index-offset-based read from classical memory.

"inputStart" is the start index of 8 qubits that act as an index into the 256 byte "values" array. The "outputStart" bits would usually already be entangled with the "inputStart" bits via a IndexedLDA() operation. With the "inputStart" bits being a "key" and the "outputStart" bits being a value, the permutation state |key, value> is mapped to |key, value - values[key]>. This is similar to classical parallel addition of two arrays. However, when either of the registers are measured, both registers will collapse into one random VALID key-value pair, with any addition or subtraction done to the "value." See QInterface::IndexedLDA for context.

FOR BEST EFFICIENCY, the "values" array should be allocated aligned to a 64-byte boundary. (See the unit tests suite code for an example of how to align the allocation.)

While a QInterface represents an interacting set of qubit-based registers, or a virtual quantum chip, the registers need to interact in some way with (classical or quantum) RAM. IndexedLDA is a RAM access method similar to the X addressing mode of the MOS 6502 chip, if the X register can be in a state of coherent superposition when it loads from RAM. "IndexedADC" and "IndexedSBC" perform add and subtract (with carry) operations on a state usually initially prepared with IndexedLDA().

Implements Qrack::QAlu.

◆ Invert()

void Qrack::QHybrid::Invert ( complex  topRight,
complex  bottomLeft,
bitLenInt  qubitIndex 
)
inlinevirtual

Apply a single bit transformation that reverses bit probability and might effect phase.

Reimplemented from Qrack::QInterface.

◆ isFinished()

bool Qrack::QHybrid::isFinished ( )
inlinevirtual

Returns "false" if asynchronous work is still running, and "true" if all previously dispatched asynchronous work is done.

Reimplemented from Qrack::QInterface.

◆ isOpenCL()

bool Qrack::QHybrid::isOpenCL ( )
inlinevirtual

Returns "true" if current simulation is OpenCL-based.

Reimplemented from Qrack::QInterface.

◆ ISqrtSwap()

void Qrack::QHybrid::ISqrtSwap ( bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

Inverse square root of Swap gate.

Reimplemented from Qrack::QEngine.

◆ ISwap()

void Qrack::QHybrid::ISwap ( bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

Swap values of two bits in register, and apply phase factor of i if bits are different.

Reimplemented from Qrack::QEngine.

◆ IsZeroAmplitude()

bool Qrack::QHybrid::IsZeroAmplitude ( )
inlinevirtual

Returns "true" only if amplitudes are all totally 0.

Implements Qrack::QEngine.

◆ MACMtrx()

void Qrack::QHybrid::MACMtrx ( const std::vector< bitLenInt > &  controls,
const complex mtrx,
bitLenInt  target 
)
inlinevirtual

Apply an arbitrary single bit unitary transformation, with arbitrary (anti-)control bits.

Reimplemented from Qrack::QEngine.

◆ MakeEngine()

QEnginePtr Qrack::QHybrid::MakeEngine ( bool  isOpenCL)

◆ MCMtrx()

void Qrack::QHybrid::MCMtrx ( const std::vector< bitLenInt > &  controls,
const complex mtrx,
bitLenInt  target 
)
inlinevirtual

Apply an arbitrary single bit unitary transformation, with arbitrary control bits.

Reimplemented from Qrack::QEngine.

◆ Mtrx()

void Qrack::QHybrid::Mtrx ( const complex mtrx,
bitLenInt  qubitIndex 
)
inlinevirtual

Apply an arbitrary single bit unitary transformation.

Reimplemented from Qrack::QEngine.

◆ MUL()

void Qrack::QHybrid::MUL ( bitCapInt  toMul,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length 
)
inlinevirtual

Multiply by integer.

Implements Qrack::QAlu.

◆ MULModNOut()

void Qrack::QHybrid::MULModNOut ( bitCapInt  toMul,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length 
)
inlinevirtual

Multiplication modulo N by integer, (out of place)

Reimplemented from Qrack::QEngine.

◆ NormalizeState()

void Qrack::QHybrid::NormalizeState ( real1_f  nrm = REAL1_DEFAULT_ARG,
real1_f  norm_thresh = REAL1_DEFAULT_ARG,
real1_f  phaseArg = ZERO_R1_F 
)
inlinevirtual

Apply the normalization factor found by UpdateRunningNorm() or on the fly by a single bit gate.

(On an actual quantum computer, the state should never require manual normalization.)

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ Phase()

void Qrack::QHybrid::Phase ( complex  topLeft,
complex  bottomRight,
bitLenInt  qubitIndex 
)
inlinevirtual

Apply a single bit transformation that only effects phase.

Reimplemented from Qrack::QInterface.

◆ PhaseFlipIfLess()

void Qrack::QHybrid::PhaseFlipIfLess ( bitCapInt  greaterPerm,
bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

This is an expedient for an adaptive Grover's search for a function's global minimum.

Implements Qrack::QAlu.

◆ PhaseParity()

void Qrack::QHybrid::PhaseParity ( real1_f  radians,
bitCapInt  mask 
)
inlinevirtual

Parity phase gate.

Applies e^(i*angle) phase factor to all combinations of bits with odd parity, based upon permutations of qubits.

Reimplemented from Qrack::QInterface.

◆ POWModNOut()

void Qrack::QHybrid::POWModNOut ( bitCapInt  base,
bitCapInt  modN,
bitLenInt  inStart,
bitLenInt  outStart,
bitLenInt  length 
)
inlinevirtual

Raise a classical base to a quantum power, modulo N, (out of place)

Implements Qrack::QAlu.

◆ Prob()

real1_f Qrack::QHybrid::Prob ( bitLenInt  qubitIndex)
inlinevirtual

Direct measure of bit probability to be in |1> state.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ ProbAll()

real1_f Qrack::QHybrid::ProbAll ( bitCapInt  fullRegister)
inlinevirtual

Direct measure of full permutation probability.

Warning
PSEUDO-QUANTUM

Reimplemented from Qrack::QEngine.

◆ ProbMask()

real1_f Qrack::QHybrid::ProbMask ( bitCapInt  mask,
bitCapInt  permutation 
)
inlinevirtual

Direct measure of masked permutation probability.

Returns probability of permutation of the mask.

"mask" masks the bits to check the probability of. "permutation" sets the 0 or 1 value for each bit in the mask. Bits which are set in the mask can be set to 0 or 1 in the permutation, while reset bits in the mask should be 0 in the permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QEngine.

◆ ProbParity()

real1_f Qrack::QHybrid::ProbParity ( bitCapInt  mask)
inlinevirtual

Overall probability of any odd permutation of the masked set of bits.

Implements Qrack::QParity.

◆ ProbReg()

real1_f Qrack::QHybrid::ProbReg ( bitLenInt  start,
bitLenInt  length,
bitCapInt  permutation 
)
inlinevirtual

Direct measure of register permutation probability.

Returns probability of permutation of the register.

Warning
PSEUDO-QUANTUM

Implements Qrack::QEngine.

◆ QueueSetDoNormalize()

void Qrack::QHybrid::QueueSetDoNormalize ( bool  doNorm)
inlinevirtual

Add an operation to the (OpenCL) queue, to set the value of doNormalize, which controls whether to automatically normalize the state.

Implements Qrack::QEngine.

◆ QueueSetRunningNorm()

void Qrack::QHybrid::QueueSetRunningNorm ( real1_f  runningNrm)
inlinevirtual

Add an operation to the (OpenCL) queue, to set the value of runningNorm, which is the normalization constant for the next normalization operation.

Implements Qrack::QEngine.

◆ SetAmplitude()

void Qrack::QHybrid::SetAmplitude ( bitCapInt  perm,
complex  amp 
)
inlinevirtual

Sets the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ SetAmplitudePage() [1/3]

void Qrack::QHybrid::SetAmplitudePage ( const complex pagePtr,
bitCapIntOcl  offset,
bitCapIntOcl  length 
)
inlinevirtual

Copy a "page" of amplitudes from pagePtr into this QEngine's internal state.

Implements Qrack::QEngine.

◆ SetAmplitudePage() [2/3]

void Qrack::QHybrid::SetAmplitudePage ( QEnginePtr  pageEnginePtr,
bitCapIntOcl  srcOffset,
bitCapIntOcl  dstOffset,
bitCapIntOcl  length 
)
inlinevirtual

Copy a "page" of amplitudes from another QEngine, pointed to by pageEnginePtr, into this QEngine's internal state.

Implements Qrack::QEngine.

◆ SetAmplitudePage() [3/3]

void Qrack::QHybrid::SetAmplitudePage ( QHybridPtr  pageEnginePtr,
bitCapIntOcl  srcOffset,
bitCapIntOcl  dstOffset,
bitCapIntOcl  length 
)
inline

◆ SetConcurrency()

void Qrack::QHybrid::SetConcurrency ( uint32_t  threadsPerEngine)
inlinevirtual

Set the number of threads in parallel for loops, per component QEngine.

Reimplemented from Qrack::QInterface.

◆ SetDevice()

void Qrack::QHybrid::SetDevice ( int64_t  dID)
inlinevirtual

Set GPU device ID.

Reimplemented from Qrack::QEngine.

◆ SetPermutation()

void Qrack::QHybrid::SetPermutation ( bitCapInt  perm,
complex  phaseFac = CMPLX_DEFAULT_ARG 
)
inlinevirtual

Set to a specific permutation of all qubits.

Reimplemented from Qrack::QInterface.

◆ SetQuantumState()

void Qrack::QHybrid::SetQuantumState ( const complex inputState)
inlinevirtual

Set an arbitrary pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ SetQubitCount()

void Qrack::QHybrid::SetQubitCount ( bitLenInt  qb)
inlinevirtual

Reimplemented from Qrack::QEngine.

◆ ShuffleBuffers() [1/2]

void Qrack::QHybrid::ShuffleBuffers ( QEnginePtr  engine)
inlinevirtual

Swap the high half of this engine with the low half of another.

This is necessary for gates which cross sub-engine boundaries.

Implements Qrack::QEngine.

◆ ShuffleBuffers() [2/2]

void Qrack::QHybrid::ShuffleBuffers ( QHybridPtr  oEngine)
inline

◆ SqrtSwap()

void Qrack::QHybrid::SqrtSwap ( bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

Square root of Swap gate.

Reimplemented from Qrack::QEngine.

◆ SumSqrDiff() [1/2]

real1_f Qrack::QHybrid::SumSqrDiff ( QHybridPtr  toCompare)
inline

◆ SumSqrDiff() [2/2]

real1_f Qrack::QHybrid::SumSqrDiff ( QInterfacePtr  toCompare)
inlinevirtual

Implements Qrack::QInterface.

◆ Swap()

void Qrack::QHybrid::Swap ( bitLenInt  qubitIndex1,
bitLenInt  qubitIndex2 
)
inlinevirtual

Swap values of two bits in register.

Reimplemented from Qrack::QEngine.

◆ SwitchGpuMode()

void Qrack::QHybrid::SwitchGpuMode ( bool  useGpu)
inline

Switches between CPU and GPU modes.

(This will not incur a performance penalty, if the chosen mode matches the current mode.) Mode switching happens automatically when qubit counts change, but Compose() and Decompose() might leave their destination QInterface parameters in the opposite mode.

◆ SwitchModes()

void Qrack::QHybrid::SwitchModes ( bool  useGpu,
bool  usePager 
)
inline

◆ SwitchPagerMode()

void Qrack::QHybrid::SwitchPagerMode ( bool  usePager)
inline

Switches between paged and non-paged modes.

(This will not incur a performance penalty, if the chosen mode matches the current mode.) Mode switching happens automatically when qubit counts change, but Compose() and Decompose() might leave their destination QInterface parameters in the opposite mode.

◆ TryDecompose() [1/2]

bool Qrack::QHybrid::TryDecompose ( bitLenInt  start,
QHybridPtr  dest,
real1_f  error_tol = TRYDECOMPOSE_EPSILON 
)
inline

◆ TryDecompose() [2/2]

bool Qrack::QHybrid::TryDecompose ( bitLenInt  start,
QInterfacePtr  dest,
real1_f  error_tol = TRYDECOMPOSE_EPSILON 
)
inlinevirtual

Reimplemented from Qrack::QInterface.

◆ UniformlyControlledSingleBit()

void Qrack::QHybrid::UniformlyControlledSingleBit ( const std::vector< bitLenInt > &  controls,
bitLenInt  qubitIndex,
const complex mtrxs,
const std::vector< bitCapInt mtrxSkipPowers,
bitCapInt  mtrxSkipValueMask 
)
inline

◆ UniformParityRZ()

void Qrack::QHybrid::UniformParityRZ ( bitCapInt  mask,
real1_f  angle 
)
inlinevirtual

If the target qubit set parity is odd, this applies a phase factor of \(e^{i angle}\).

If the target qubit set parity is even, this applies the conjugate, e^{-i angle}.

Reimplemented from Qrack::QParity.

◆ UpdateRunningNorm()

void Qrack::QHybrid::UpdateRunningNorm ( real1_f  norm_thresh = REAL1_DEFAULT_ARG)
inlinevirtual

Force a calculation of the norm of the state vector, in order to make it unit length before the next probability or measurement operation.

(On an actual quantum computer, the state should never require manual normalization.)

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ XMask()

void Qrack::QHybrid::XMask ( bitCapInt  mask)
inlinevirtual

Masked X gate.

Applies the Pauli "X" operator to all qubits in the mask. A qubit index "n" is in the mask if (((1 << n) & mask)

0). The Pauli "X" operator is equivalent to a logical "NOT."

Reimplemented from Qrack::QInterface.

◆ ZeroAmplitudes()

void Qrack::QHybrid::ZeroAmplitudes ( )
inlinevirtual

Set all amplitudes to 0, and optionally temporarily deallocate state vector RAM.

Implements Qrack::QEngine.

Member Data Documentation

◆ deviceIDs

std::vector<int64_t> Qrack::QHybrid::deviceIDs
protected

◆ devID

int64_t Qrack::QHybrid::devID
protected

◆ engine

QEnginePtr Qrack::QHybrid::engine
protected

◆ gpuThresholdQubits

bitLenInt Qrack::QHybrid::gpuThresholdQubits
protected

◆ isGpu

bool Qrack::QHybrid::isGpu
protected

◆ isPager

bool Qrack::QHybrid::isPager
protected

◆ isSparse

bool Qrack::QHybrid::isSparse
protected

◆ pagerThresholdQubits

bitLenInt Qrack::QHybrid::pagerThresholdQubits
protected

◆ phaseFactor

complex Qrack::QHybrid::phaseFactor
protected

◆ separabilityThreshold

real1_f Qrack::QHybrid::separabilityThreshold
protected

◆ useRDRAND

bool Qrack::QHybrid::useRDRAND
protected

The documentation for this class was generated from the following files: