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

#include <qunit.hpp>

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

Classes

struct  QSortEntry
 

Public Member Functions

 QUnit (std::vector< QInterfaceEngine > eng, 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 > devIDs={}, bitLenInt qubitThreshold=0U, real1_f separation_thresh=FP_NORM_EPSILON_F)
 
 QUnit (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 > devIDs={}, bitLenInt qubitThreshold=0U, real1_f separation_thresh=FP_NORM_EPSILON_F)
 
virtual ~QUnit ()
 
virtual void SetConcurrency (uint32_t threadsPerEngine)
 Set the number of threads in parallel for loops, per component QEngine. More...
 
virtual void SetTInjection (bool useGadget)
 Set the option to use T-injection gadgets (off by default) 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 SetDevice (int64_t dID)
 Set the device index, if more than one device is available. More...
 
virtual int64_t GetDevice ()
 Get the device index. More...
 
real1_f ProbRdm (bitLenInt qubit)
 Direct measure of bit probability to be in |1> state, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual real1_f CProbRdm (bitLenInt control, bitLenInt target)
 
virtual real1_f ACProbRdm (bitLenInt control, bitLenInt target)
 
virtual void SetQuantumState (const complex *inputState)
 Set an arbitrary pure quantum state representation. More...
 
virtual void GetQuantumState (complex *outputState)
 Get the pure quantum state representation. More...
 
virtual void GetProbs (real1 *outputProbs)
 Get the pure quantum state representation. More...
 
virtual complex GetAmplitude (bitCapInt perm)
 Get the representational amplitude of a full permutation. More...
 
virtual void SetAmplitude (bitCapInt perm, complex amp)
 Sets the representational amplitude of a full permutation. More...
 
virtual void SetPermutation (bitCapInt perm, complex phaseFac=CMPLX_DEFAULT_ARG)
 Set to a specific permutation of all qubits. More...
 
virtual bitLenInt Compose (QUnitPtr toCopy)
 
virtual bitLenInt Compose (QInterfacePtr toCopy)
 Combine another QInterface with this one, after the last bit index of this one. More...
 
virtual bitLenInt Compose (QUnitPtr toCopy, bitLenInt start)
 
virtual bitLenInt Compose (QInterfacePtr toCopy, bitLenInt start)
 
virtual void Decompose (bitLenInt start, QInterfacePtr dest)
 Minimally decompose a set of contiguous bits from the separably composed unit, into "destination". More...
 
virtual void Decompose (bitLenInt start, QUnitPtr dest)
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)
 Schmidt decompose a length of qubits. More...
 
virtual 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...
 
virtual void Dispose (bitLenInt start, bitLenInt length, bitCapInt disposedPerm)
 Dispose a a contiguous set of qubits that are already in a permutation eigenstate. More...
 
virtual bitLenInt Allocate (bitLenInt start, bitLenInt length)
 Allocate new "length" count of |0> state qubits at specified qubit index start position. More...
 
virtual void H (bitLenInt target)
 Hadamard gate. More...
 
virtual void S (bitLenInt target)
 S gate. More...
 
virtual void IS (bitLenInt target)
 Inverse S gate. More...
 
virtual void ZMask (bitCapInt mask)
 Masked Z gate. More...
 
virtual void PhaseParity (real1 radians, bitCapInt mask)
 
virtual void Phase (complex topLeft, complex bottomRight, bitLenInt qubitIndex)
 Apply a single bit transformation that only effects phase. More...
 
virtual void Invert (complex topRight, complex bottomLeft, bitLenInt qubitIndex)
 Apply a single bit transformation that reverses bit probability and might effect phase. 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 controlPerm)
 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 controlPerm)
 Apply a single bit transformation that reverses bit probability and might effect phase, with arbitrary control bits, with arbitrary control permutation. More...
 
virtual void Mtrx (const complex *mtrx, bitLenInt qubit)
 Apply an arbitrary single bit unitary transformation. More...
 
virtual void MCMtrx (const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
 Apply an arbitrary single bit unitary transformation, with arbitrary control bits. More...
 
virtual 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...
 
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 void UniformlyControlledSingleBit (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs, const std::vector< bitCapInt > &mtrxSkipPowers, bitCapInt mtrxSkipValueMask)
 
virtual 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...
 
virtual void CSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary control bits. More...
 
virtual void AntiCSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary (anti) control bits. More...
 
virtual void CSqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary control bits. More...
 
virtual void AntiCSqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary (anti) control bits. More...
 
virtual void CISqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary control bits. More...
 
virtual void AntiCISqrtSwap (const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary (anti) control bits. More...
 
virtual bool ForceM (bitLenInt qubitIndex, bool result, bool doForce=true, bool doApply=true)
 Act as if is a measurement was applied, except force the (usually random) result. More...
 
virtual bitCapInt ForceMReg (bitLenInt start, bitLenInt length, bitCapInt result, bool doForce=true, bool doApply=true)
 Act as if is a measurement was applied, except force the (usually random) result. More...
 
virtual bitCapInt MAll ()
 Measure permutation state of all coherent bits. 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 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 INCDECC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCC and DECC (without sign, with carry) More...
 
virtual void MULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
 Multiplication modulo N by integer, (out of place) More...
 
virtual void IMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
 Inverse of multiplication modulo N by integer, (out of place) More...
 
virtual 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...
 
virtual 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...
 
virtual void INC (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Add integer (without sign) More...
 
virtual void CINC (bitCapInt toAdd, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Add integer (without sign, with controls) More...
 
virtual void INCC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add integer (without sign, with carry) More...
 
virtual void INCS (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
 Add a classical integer to the register, with sign and without carry. More...
 
virtual void INCDECSC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (with overflow flag) More...
 
virtual void INCDECSC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (without overflow flag) More...
 
virtual void DECC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract integer (without sign, with carry) More...
 
virtual void INCBCD (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Add classical BCD integer (without sign) More...
 
virtual void DECBCD (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Subtract classical BCD integer (without sign) More...
 
virtual void INCDECBCDC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (without overflow flag) More...
 
virtual void MUL (bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
 Multiply by integer. More...
 
virtual void DIV (bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
 Divide by integer. More...
 
virtual 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...
 
virtual void CMUL (bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled multiplication by integer. More...
 
virtual void CDIV (bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 Controlled division by power of integer. More...
 
virtual 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...
 
virtual 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...
 
virtual 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...
 
virtual 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...
 
virtual void Hash (bitLenInt start, bitLenInt length, const unsigned char *values)
 Transform a length of qubit register via lookup through a hash table. More...
 
virtual 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...
 
virtual 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...
 
virtual void SetReg (bitLenInt start, bitLenInt length, bitCapInt value)
 Set register bits to given permutation. More...
 
virtual void Swap (bitLenInt qubit1, bitLenInt qubit2)
 Swap values of two bits in register. More...
 
virtual void ISwap (bitLenInt qubit1, bitLenInt qubit2)
 Swap values of two bits in register, and apply phase factor of i if bits are different. More...
 
virtual void IISwap (bitLenInt qubit1, bitLenInt qubit2)
 Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are different. More...
 
virtual void SqrtSwap (bitLenInt qubit1, bitLenInt qubit2)
 Square root of Swap gate. More...
 
virtual void ISqrtSwap (bitLenInt qubit1, bitLenInt qubit2)
 Inverse square root of Swap gate. More...
 
virtual void FSim (real1_f theta, real1_f phi, bitLenInt qubit1, bitLenInt qubit2)
 The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics) More...
 
virtual real1_f Prob (bitLenInt qubit)
 Direct measure of bit probability to be in |1> state. More...
 
virtual real1_f ProbAll (bitCapInt perm)
 Direct measure of full permutation probability. More...
 
virtual real1_f ProbAllRdm (bool roundRz, bitCapInt perm)
 Direct measure of full permutation probability, treating all ancillary qubits as post-selected T gate gadgets. More...
 
virtual real1_f ProbParity (bitCapInt mask)
 Overall probability of any odd permutation of the masked set of bits. More...
 
virtual 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...
 
virtual real1_f SumSqrDiff (QInterfacePtr toCompare)
 
virtual real1_f SumSqrDiff (QUnitPtr toCompare)
 
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=0U)
 Get (reduced density matrix) expectation value of bits, given an array of qubit weights. More...
 
virtual 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...
 
virtual 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...
 
virtual void Finish ()
 If asynchronous work is still running, block until it finishes. More...
 
virtual bool isFinished ()
 Returns "false" if asynchronous work is still running, and "true" if all previously dispatched asynchronous work is done. More...
 
virtual void Dump ()
 If asynchronous work is still running, let the simulator know that it can be aborted. 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 QInterfacePtr Clone ()
 Clone this QInterface. More...
 
virtual bitLenInt Compose (QInterfacePtr toCopy)
 Combine another QInterface with this one, after the last bit index of this one. More...
 
virtual std::map< QInterfacePtr, bitLenIntCompose (std::vector< QInterfacePtr > toCopy)
 
virtual bitLenInt Compose (QInterfacePtr toCopy, bitLenInt start)
 
virtual bitLenInt Allocate (bitLenInt length)
 Allocate new "length" count of |0> state qubits at end of qubit index position. More...
 
virtual bitLenInt Allocate (bitLenInt start, bitLenInt length)=0
 Allocate new "length" count of |0> state qubits at specified qubit index start position. More...
 
virtual void H (bitLenInt qubit)
 Hadamard gate. More...
 
virtual void H (bitLenInt start, bitLenInt length)
 Bitwise Hadamard. More...
 
virtual void S (bitLenInt qubit)
 S gate. More...
 
virtual void IS (bitLenInt qubit)
 Inverse S gate. 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 bool ForceM (bitLenInt qubit, bool result, bool doForce=true, bool doApply=true)=0
 Act as if is a measurement was applied, except force the (usually random) result. More...
 
virtual bitCapInt ForceM (const std::vector< bitLenInt > &bits, const std::vector< bool > &values, bool doApply=true)
 Measure bits with indices in array, and return a mask of the results. More...
 
virtual bitCapInt ForceMReg (bitLenInt start, bitLenInt length, bitCapInt result, bool doForce=true, bool doApply=true)
 Act as if is a measurement was applied, except force the (usually random) result. 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 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...
 
- Public Member Functions inherited from Qrack::QAlu
virtual 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...
 
virtual 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...
 
virtual 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...
 
virtual void DECSC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract a classical integer from the register, with sign and with carry. More...
 
virtual void INCBCDC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add classical BCD integer (without sign, with carry) More...
 
virtual void DECBCDC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract BCD integer (without sign, with carry) More...
 
- Public Member Functions inherited from Qrack::QParity
virtual bool MParity (bitCapInt mask)
 Measure (and collapse) parity of the masked set of qubits. More...
 
virtual 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...
 
- 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 bitLenInt ComposeNoClone (QInterfacePtr toCopy)
 
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 UniformlyControlledSingleBit (const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs)
 Apply a "uniformly controlled" arbitrary single bit unitary transformation. More...
 
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 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 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 PhaseParity (real1_f radians, bitCapInt mask)
 Parity phase gate. More...
 
virtual void XMask (bitCapInt mask)
 Masked X 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 bitCapInt MReg (bitLenInt start, bitLenInt length)
 Measure permutation state of a register. More...
 
virtual bitCapInt M (const std::vector< bitLenInt > &bits)
 Measure bits with indices in array, and return a mask of the results. More...
 
virtual bitCapInt ForceM (const std::vector< bitLenInt > &bits, const std::vector< bool > &values, bool doApply=true)
 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 real1_f CProb (bitLenInt control, bitLenInt target)
 Direct measure of bit probability to be in |1> state, if control bit is |1>. More...
 
virtual real1_f ACProb (bitLenInt control, bitLenInt target)
 Direct measure of bit probability to be in |1> state, if control bit is |0>. More...
 
virtual real1_f ProbReg (bitLenInt start, bitLenInt length, bitCapInt permutation)
 Direct measure of register permutation probability. More...
 
virtual real1_f ProbMask (bitCapInt mask, bitCapInt permutation)
 Direct measure of masked permutation probability. 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 ExpectationBitsAll (const std::vector< bitLenInt > &bits, bitCapInt offset=0U)
 Get permutation expectation value of bits. 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 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 TryDecompose (bitLenInt start, QInterfacePtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
 
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 isOpenCL ()
 Returns "true" if current simulation is OpenCL-based. 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 Types

enum  RevertExclusivity { INVERT_AND_PHASE = 0 , ONLY_INVERT = 1 , ONLY_PHASE = 2 }
 
enum  RevertControl { CONTROLS_AND_TARGETS = 0 , ONLY_CONTROLS = 1 , ONLY_TARGETS = 2 }
 
enum  RevertAnti { CTRL_AND_ANTI = 0 , ONLY_CTRL = 1 , ONLY_ANTI = 2 }
 
typedef void(QAlu::* INCxFn) (bitCapInt, bitLenInt, bitLenInt, bitLenInt)
 
typedef void(QAlu::* INCxxFn) (bitCapInt, bitLenInt, bitLenInt, bitLenInt, bitLenInt)
 
typedef void(QAlu::* CMULFn) (bitCapInt toMod, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 
typedef void(QAlu::* CMULModFn) (bitCapInt toMod, bitCapInt modN, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
 
typedef bool(* ParallelUnitFn) (QInterfacePtr unit, real1_f param1, real1_f param2, real1_f param3, int64_t param4)
 

Protected Member Functions

QInterfacePtr MakeEngine (bitLenInt length, bitCapInt perm)
 
virtual complex GetAmplitudeOrProb (bitCapInt perm, bool isProb)
 
virtual void XBase (bitLenInt target)
 
virtual void YBase (bitLenInt target)
 
virtual void ZBase (bitLenInt target)
 
virtual real1_f ProbBase (bitLenInt qubit)
 
virtual bool TrySeparateClifford (bitLenInt qubit)
 
virtual void EitherISwap (bitLenInt qubit1, bitLenInt qubit2, bool isInverse)
 
void INT (bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt carryIndex, bool hasCarry, std::vector< bitLenInt > controlVec=std::vector< bitLenInt >())
 
void INTS (bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex, bool hasCarry)
 
void INCx (INCxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flagIndex)
 
void INCxx (INCxxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flag1Index, bitLenInt flag2Index)
 
QInterfacePtr CMULEntangle (std::vector< bitLenInt > controlVec, bitLenInt start, bitLenInt carryStart, bitLenInt length, std::vector< bitLenInt > *controlsMapped)
 
std::vector< bitLenIntCMULEntangle (std::vector< bitLenInt > controlVec, bitLenInt start, bitCapInt carryStart, bitLenInt length)
 
void CMULx (CMULFn fn, bitCapInt toMod, bitLenInt start, bitLenInt carryStart, bitLenInt length, std::vector< bitLenInt > controlVec)
 
void CMULModx (CMULModFn fn, bitCapInt toMod, bitCapInt modN, bitLenInt start, bitLenInt carryStart, bitLenInt length, std::vector< bitLenInt > controlVec)
 
bool INTCOptimize (bitCapInt toMod, bitLenInt start, bitLenInt length, bool isAdd, bitLenInt carryIndex)
 Check if carry arithmetic can be optimized. More...
 
bool INTSOptimize (bitCapInt toMod, bitLenInt start, bitLenInt length, bool isAdd, bitLenInt overflowIndex)
 Check if overflow arithmetic can be optimized. More...
 
bool INTSCOptimize (bitCapInt toMod, bitLenInt start, bitLenInt length, bool isAdd, bitLenInt carryIndex, bitLenInt overflowIndex)
 Check if arithmetic with both carry and overflow can be optimized. More...
 
bitCapInt GetIndexedEigenstate (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, const unsigned char *values)
 
bitCapInt GetIndexedEigenstate (bitLenInt start, bitLenInt length, const unsigned char *values)
 
real1_f ExpectationFactorized (bool isRdm, bool isFloat, const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, const std::vector< real1_f > &weights, bitCapInt offset, bool roundRz)
 
virtual QInterfacePtr Entangle (std::vector< bitLenInt > bits)
 
virtual QInterfacePtr Entangle (std::vector< bitLenInt * > bits)
 
virtual QInterfacePtr EntangleRange (bitLenInt start, bitLenInt length, bool isForProb=false)
 
virtual QInterfacePtr EntangleRange (bitLenInt start, bitLenInt length, bitLenInt start2, bitLenInt length2)
 
virtual QInterfacePtr EntangleRange (bitLenInt start, bitLenInt length, bitLenInt start2, bitLenInt length2, bitLenInt start3, bitLenInt length3)
 
virtual QInterfacePtr EntangleAll (bool isForProb=false)
 
virtual QInterfacePtr CloneBody (QUnitPtr copyPtr)
 
virtual bool CheckBitsPermutation (bitLenInt start, bitLenInt length=1)
 Check if all qubits in the range have cached probabilities indicating that they are in permutation basis eigenstates, for optimization. More...
 
virtual bitCapInt GetCachedPermutation (bitLenInt start, bitLenInt length)
 Assuming all bits in the range are in cached |0>/|1> eigenstates, read the unsigned integer value of the range. More...
 
virtual bitCapInt GetCachedPermutation (const std::vector< bitLenInt > &bitArray)
 
virtual bool CheckBitsPlus (bitLenInt qubitIndex, bitLenInt length)
 
virtual QInterfacePtr EntangleInCurrentBasis (std::vector< bitLenInt * >::iterator first, std::vector< bitLenInt * >::iterator last)
 
bool ParallelUnitApply (ParallelUnitFn fn, real1_f param1=ZERO_R1_F, real1_f param2=ZERO_R1_F, real1_f param3=ZERO_R1_F, int64_t param4=0)
 
virtual bool SeparateBit (bool value, bitLenInt qubit)
 
void OrderContiguous (QInterfacePtr unit)
 
virtual void Detach (bitLenInt start, bitLenInt length, QUnitPtr dest)
 
void SortUnit (QInterfacePtr unit, std::vector< QSortEntry > &bits, bitLenInt low, bitLenInt high)
 Sort a container of bits, calling Swap() on each. More...
 
bool TrimControls (const std::vector< bitLenInt > &controls, std::vector< bitLenInt > &controlVec, bitCapInt *perm)
 
template<typename CF >
void ApplyEitherControlled (std::vector< bitLenInt > controlVec, const std::vector< bitLenInt > targets, CF cfn, bool isPhase)
 
void ClampShard (bitLenInt qubit)
 
void TransformX2x2 (const complex *mtrxIn, complex *mtrxOut)
 
void TransformXInvert (complex topRight, complex bottomLeft, complex *mtrxOut)
 
void TransformY2x2 (const complex *mtrxIn, complex *mtrxOut)
 
void TransformYInvert (complex topRight, complex bottomLeft, complex *mtrxOut)
 
void TransformPhase (complex topLeft, complex bottomRight, complex *mtrxOut)
 
void RevertBasisX (bitLenInt i)
 
void RevertBasisY (bitLenInt i)
 
void RevertBasis1Qb (bitLenInt i)
 
void RevertBasisToX1Qb (bitLenInt i)
 
void RevertBasisToY1Qb (bitLenInt i)
 
void ConvertZToX (bitLenInt i)
 
void ConvertXToY (bitLenInt i)
 
void ConvertYToZ (bitLenInt i)
 
void ConvertZToY (bitLenInt i)
 
void ShardAI (bitLenInt qubit, real1_f azimuth, real1_f inclination)
 
void ApplyBuffer (PhaseShardPtr phaseShard, bitLenInt control, bitLenInt target, bool isAnti)
 
void ApplyBufferMap (bitLenInt bitIndex, ShardToPhaseMap bufferMap, RevertExclusivity exclusivity, bool isControl, bool isAnti, const std::set< bitLenInt > &exceptPartners, bool dumpSkipped)
 
void RevertBasis2Qb (bitLenInt i, RevertExclusivity exclusivity=INVERT_AND_PHASE, RevertControl controlExclusivity=CONTROLS_AND_TARGETS, RevertAnti antiExclusivity=CTRL_AND_ANTI, const std::set< bitLenInt > &exceptControlling={}, const std::set< bitLenInt > &exceptTargetedBy={}, bool dumpSkipped=false, bool skipOptimized=false)
 
void Flush0Eigenstate (bitLenInt i)
 
void Flush1Eigenstate (bitLenInt i)
 
void ToPermBasis (bitLenInt i)
 
void ToPermBasis (bitLenInt start, bitLenInt length)
 
void ToPermBasisAll ()
 
void ToPermBasisProb ()
 
void ToPermBasisProb (bitLenInt qubit)
 
void ToPermBasisProb (bitLenInt start, bitLenInt length)
 
void ToPermBasisMeasure (bitLenInt qubit)
 
void ToPermBasisMeasure (bitLenInt start, bitLenInt length)
 
void ToPermBasisAllMeasure ()
 
void DirtyShardRange (bitLenInt start, bitLenInt length)
 
void DirtyShardRangePhase (bitLenInt start, bitLenInt length)
 
void DirtyShardIndexVector (std::vector< bitLenInt > bitIndices)
 
void EndEmulation (bitLenInt target)
 
bitLenInt FindShardIndex (QEngineShardPtr shard)
 
void CommuteH (bitLenInt bitIndex)
 
void OptimizePairBuffers (bitLenInt control, bitLenInt target, bool anti)
 
- Protected Member Functions inherited from Qrack::QInterface
virtual void SetQubitCount (bitLenInt qb)
 
complex GetNonunitaryPhase ()
 
template<typename Fn >
void MACWrapper (const std::vector< bitLenInt > &controls, Fn fn)
 
bitCapInt SampleClone (const std::vector< bitCapInt > &qPowers)
 

Protected Attributes

bool freezeBasis2Qb
 
bool useHostRam
 
bool isSparse
 
bool isReactiveSeparate
 
bool useTGadget
 
bitLenInt thresholdQubits
 
real1_f separabilityThreshold
 
double logFidelity
 
int64_t devID
 
complex phaseFactor
 
QEngineShardMap shards
 
std::vector< int64_t > deviceIDs
 
std::vector< QInterfaceEngineengines
 
- 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)
 

Member Typedef Documentation

◆ CMULFn

typedef void(QAlu::* Qrack::QUnit::CMULFn) (bitCapInt toMod, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
protected

◆ CMULModFn

typedef void(QAlu::* Qrack::QUnit::CMULModFn) (bitCapInt toMod, bitCapInt modN, bitLenInt start, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
protected

◆ INCxFn

typedef void(QAlu::* Qrack::QUnit::INCxFn) (bitCapInt, bitLenInt, bitLenInt, bitLenInt)
protected

◆ INCxxFn

typedef void(QAlu::* Qrack::QUnit::INCxxFn) (bitCapInt, bitLenInt, bitLenInt, bitLenInt, bitLenInt)
protected

◆ ParallelUnitFn

typedef bool(* Qrack::QUnit::ParallelUnitFn) (QInterfacePtr unit, real1_f param1, real1_f param2, real1_f param3, int64_t param4)
protected

Member Enumeration Documentation

◆ RevertAnti

enum Qrack::QUnit::RevertAnti
protected
Enumerator
CTRL_AND_ANTI 
ONLY_CTRL 
ONLY_ANTI 

◆ RevertControl

Enumerator
CONTROLS_AND_TARGETS 
ONLY_CONTROLS 
ONLY_TARGETS 

◆ RevertExclusivity

Enumerator
INVERT_AND_PHASE 
ONLY_INVERT 
ONLY_PHASE 

Constructor & Destructor Documentation

◆ QUnit() [1/2]

Qrack::QUnit::QUnit ( std::vector< QInterfaceEngine eng,
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 >  devIDs = {},
bitLenInt  qubitThreshold = 0U,
real1_f  separation_thresh = FP_NORM_EPSILON_F 
)

◆ QUnit() [2/2]

Qrack::QUnit::QUnit ( 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 >  devIDs = {},
bitLenInt  qubitThreshold = 0U,
real1_f  separation_thresh = FP_NORM_EPSILON_F 
)
inline

◆ ~QUnit()

virtual Qrack::QUnit::~QUnit ( )
inlinevirtual

Member Function Documentation

◆ ACProbRdm()

virtual real1_f Qrack::QUnit::ACProbRdm ( bitLenInt  control,
bitLenInt  target 
)
inlinevirtual

◆ Allocate() [1/3]

virtual bitLenInt Qrack::QInterface::Allocate
inline

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

◆ Allocate() [2/3]

bitLenInt Qrack::QUnit::Allocate ( bitLenInt  start,
bitLenInt  length 
)
virtual

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

Implements Qrack::QInterface.

◆ Allocate() [3/3]

virtual bitLenInt Qrack::QInterface::Allocate

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

◆ ApplyBuffer()

void Qrack::QUnit::ApplyBuffer ( PhaseShardPtr  phaseShard,
bitLenInt  control,
bitLenInt  target,
bool  isAnti 
)
protected

◆ ApplyBufferMap()

void Qrack::QUnit::ApplyBufferMap ( bitLenInt  bitIndex,
ShardToPhaseMap  bufferMap,
RevertExclusivity  exclusivity,
bool  isControl,
bool  isAnti,
const std::set< bitLenInt > &  exceptPartners,
bool  dumpSkipped 
)
protected

◆ ApplyEitherControlled()

template<typename CF >
void Qrack::QUnit::ApplyEitherControlled ( std::vector< bitLenInt controlVec,
const std::vector< bitLenInt targets,
CF  cfn,
bool  isPhase 
)
protected

◆ CheckBitsPermutation()

bool Qrack::QUnit::CheckBitsPermutation ( bitLenInt  start,
bitLenInt  length = 1 
)
protectedvirtual

Check if all qubits in the range have cached probabilities indicating that they are in permutation basis eigenstates, for optimization.

◆ CheckBitsPlus()

bool Qrack::QUnit::CheckBitsPlus ( bitLenInt  qubitIndex,
bitLenInt  length 
)
protectedvirtual

◆ ClampShard()

void Qrack::QUnit::ClampShard ( bitLenInt  qubit)
inlineprotected

◆ CloneBody()

QInterfacePtr Qrack::QUnit::CloneBody ( QUnitPtr  copyPtr)
protectedvirtual

◆ CMULEntangle() [1/2]

std::vector<bitLenInt> Qrack::QUnit::CMULEntangle ( std::vector< bitLenInt controlVec,
bitLenInt  start,
bitCapInt  carryStart,
bitLenInt  length 
)
protected

◆ CMULEntangle() [2/2]

QInterfacePtr Qrack::QUnit::CMULEntangle ( std::vector< bitLenInt controlVec,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length,
std::vector< bitLenInt > *  controlsMapped 
)
protected

◆ CMULModx()

void Qrack::QUnit::CMULModx ( CMULModFn  fn,
bitCapInt  toMod,
bitCapInt  modN,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length,
std::vector< bitLenInt controlVec 
)
protected

◆ CMULx()

void Qrack::QUnit::CMULx ( CMULFn  fn,
bitCapInt  toMod,
bitLenInt  start,
bitLenInt  carryStart,
bitLenInt  length,
std::vector< bitLenInt controlVec 
)
protected

◆ CommuteH()

void Qrack::QUnit::CommuteH ( bitLenInt  bitIndex)
protected

◆ Compose() [1/7]

virtual bitLenInt Qrack::QInterface::Compose
inline

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.

◆ Compose() [2/7]

virtual bitLenInt Qrack::QUnit::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() [3/7]

bitLenInt Qrack::QInterface::Compose

◆ Compose() [4/7]

virtual bitLenInt Qrack::QUnit::Compose ( QInterfacePtr  toCopy,
bitLenInt  start 
)
inlinevirtual

Reimplemented from Qrack::QInterface.

◆ Compose() [5/7]

virtual bitLenInt Qrack::QUnit::Compose ( QUnitPtr  toCopy)
inlinevirtual

◆ Compose() [6/7]

virtual bitLenInt Qrack::QUnit::Compose ( QUnitPtr  toCopy,
bitLenInt  start 
)
inlinevirtual

◆ Compose() [7/7]

std::map< QInterfacePtr, bitLenInt > Qrack::QInterface::Compose

◆ ConvertXToY()

void Qrack::QUnit::ConvertXToY ( bitLenInt  i)
protected

◆ ConvertYToZ()

void Qrack::QUnit::ConvertYToZ ( bitLenInt  i)
protected

◆ ConvertZToX()

void Qrack::QUnit::ConvertZToX ( bitLenInt  i)
protected

◆ ConvertZToY()

void Qrack::QUnit::ConvertZToY ( bitLenInt  i)
protected

◆ CProbRdm()

virtual real1_f Qrack::QUnit::CProbRdm ( bitLenInt  control,
bitLenInt  target 
)
inlinevirtual

◆ Decompose() [1/3]

virtual QInterfacePtr Qrack::QUnit::Decompose ( bitLenInt  start,
bitLenInt  length 
)
inlinevirtual

Schmidt decompose a length of qubits.

Implements Qrack::QInterface.

◆ Decompose() [2/3]

virtual void Qrack::QUnit::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() [3/3]

virtual void Qrack::QUnit::Decompose ( bitLenInt  start,
QUnitPtr  dest 
)
inlinevirtual

◆ Detach()

void Qrack::QUnit::Detach ( bitLenInt  start,
bitLenInt  length,
QUnitPtr  dest 
)
protectedvirtual

Reimplemented in Qrack::QUnitMulti.

◆ DirtyShardIndexVector()

void Qrack::QUnit::DirtyShardIndexVector ( std::vector< bitLenInt bitIndices)
inlineprotected

◆ DirtyShardRange()

void Qrack::QUnit::DirtyShardRange ( bitLenInt  start,
bitLenInt  length 
)
inlineprotected

◆ DirtyShardRangePhase()

void Qrack::QUnit::DirtyShardRangePhase ( bitLenInt  start,
bitLenInt  length 
)
inlineprotected

◆ Dispose() [1/2]

virtual void Qrack::QUnit::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]

virtual void Qrack::QUnit::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.

◆ EitherISwap()

void Qrack::QUnit::EitherISwap ( bitLenInt  qubit1,
bitLenInt  qubit2,
bool  isInverse 
)
protectedvirtual

◆ EndEmulation()

void Qrack::QUnit::EndEmulation ( bitLenInt  target)
inlineprotected

◆ Entangle() [1/2]

QInterfacePtr Qrack::QUnit::Entangle ( std::vector< bitLenInt * >  bits)
protectedvirtual

◆ Entangle() [2/2]

QInterfacePtr Qrack::QUnit::Entangle ( std::vector< bitLenInt bits)
protectedvirtual

◆ EntangleAll()

virtual QInterfacePtr Qrack::QUnit::EntangleAll ( bool  isForProb = false)
inlineprotectedvirtual

◆ EntangleInCurrentBasis()

QInterfacePtr Qrack::QUnit::EntangleInCurrentBasis ( std::vector< bitLenInt * >::iterator  first,
std::vector< bitLenInt * >::iterator  last 
)
protectedvirtual

Reimplemented in Qrack::QUnitMulti.

◆ EntangleRange() [1/3]

QInterfacePtr Qrack::QUnit::EntangleRange ( bitLenInt  start,
bitLenInt  length,
bitLenInt  start2,
bitLenInt  length2 
)
protectedvirtual

◆ EntangleRange() [2/3]

QInterfacePtr Qrack::QUnit::EntangleRange ( bitLenInt  start,
bitLenInt  length,
bitLenInt  start2,
bitLenInt  length2,
bitLenInt  start3,
bitLenInt  length3 
)
protectedvirtual

◆ EntangleRange() [3/3]

QInterfacePtr Qrack::QUnit::EntangleRange ( bitLenInt  start,
bitLenInt  length,
bool  isForProb = false 
)
protectedvirtual

◆ ExpectationFactorized()

real1_f Qrack::QUnit::ExpectationFactorized ( bool  isRdm,
bool  isFloat,
const std::vector< bitLenInt > &  bits,
const std::vector< bitCapInt > &  perms,
const std::vector< real1_f > &  weights,
bitCapInt  offset,
bool  roundRz 
)
inlineprotected

◆ FindShardIndex()

bitLenInt Qrack::QUnit::FindShardIndex ( QEngineShardPtr  shard)
inlineprotected

◆ Flush0Eigenstate()

void Qrack::QUnit::Flush0Eigenstate ( bitLenInt  i)
protected

◆ Flush1Eigenstate()

void Qrack::QUnit::Flush1Eigenstate ( bitLenInt  i)
protected

◆ ForceM() [1/2]

virtual bool Qrack::QInterface::ForceM

Act as if is a measurement was applied, except force the (usually random) result.

Warning
PSEUDO-QUANTUM

◆ ForceM() [2/2]

bitCapInt Qrack::QInterface::ForceM

Measure bits with indices in array, and return a mask of the results.

Bit-wise apply measurement gate to a register.

◆ ForceMReg()

bitCapInt Qrack::QInterface::ForceMReg

Act as if is a measurement was applied, except force the (usually random) result.

Bit-wise apply measurement gate to a register.

Warning
PSEUDO-QUANTUM

◆ GetAmplitude()

complex Qrack::QUnit::GetAmplitude ( bitCapInt  perm)
virtual

Get the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetAmplitudeOrProb()

complex Qrack::QUnit::GetAmplitudeOrProb ( bitCapInt  perm,
bool  isProb 
)
protectedvirtual

◆ GetCachedPermutation() [1/2]

bitCapInt Qrack::QUnit::GetCachedPermutation ( bitLenInt  start,
bitLenInt  length 
)
protectedvirtual

Assuming all bits in the range are in cached |0>/|1> eigenstates, read the unsigned integer value of the range.

◆ GetCachedPermutation() [2/2]

bitCapInt Qrack::QUnit::GetCachedPermutation ( const std::vector< bitLenInt > &  bitArray)
protectedvirtual

◆ GetDevice()

virtual int64_t Qrack::QUnit::GetDevice ( )
inlinevirtual

Get the device index.

("-1" is default).

Reimplemented from Qrack::QInterface.

◆ GetIndexedEigenstate() [1/2]

bitCapInt Qrack::QUnit::GetIndexedEigenstate ( bitLenInt  indexStart,
bitLenInt  indexLength,
bitLenInt  valueStart,
bitLenInt  valueLength,
const unsigned char *  values 
)
protected

◆ GetIndexedEigenstate() [2/2]

bitCapInt Qrack::QUnit::GetIndexedEigenstate ( bitLenInt  start,
bitLenInt  length,
const unsigned char *  values 
)
protected

◆ GetProbs()

void Qrack::QUnit::GetProbs ( real1 outputProbs)
virtual

Get the pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetQuantumState()

void Qrack::QUnit::GetQuantumState ( complex outputState)
virtual

Get the pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetReactiveSeparate()

virtual bool Qrack::QUnit::GetReactiveSeparate ( )
inlinevirtual

Get reactive separation option.

If reactive separation is available, as in Qrack::QUnit, then turning this option on attempts to more-aggresively recover separability of subsystems. It can either hurt or help performance, though it commonly helps.

Reimplemented from Qrack::QInterface.

◆ H() [1/2]

virtual void Qrack::QInterface::H
inline

Hadamard gate.

Applies a Hadamard gate on qubit at "qubitIndex."

◆ H() [2/2]

virtual void Qrack::QInterface::H

Bitwise Hadamard.

◆ INCx()

void Qrack::QUnit::INCx ( INCxFn  fn,
bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  flagIndex 
)
protected

◆ INCxx()

void Qrack::QUnit::INCxx ( INCxxFn  fn,
bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  flag1Index,
bitLenInt  flag2Index 
)
protected

◆ INT()

void Qrack::QUnit::INT ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex,
bool  hasCarry,
std::vector< bitLenInt controlVec = std::vector<bitLenInt>() 
)
protected

◆ INTCOptimize()

bool Qrack::QUnit::INTCOptimize ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bool  isAdd,
bitLenInt  carryIndex 
)
protected

Check if carry arithmetic can be optimized.

◆ INTS()

void Qrack::QUnit::INTS ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex,
bitLenInt  carryIndex,
bool  hasCarry 
)
protected

◆ INTSCOptimize()

bool Qrack::QUnit::INTSCOptimize ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bool  isAdd,
bitLenInt  carryIndex,
bitLenInt  overflowIndex 
)
protected

Check if arithmetic with both carry and overflow can be optimized.

◆ INTSOptimize()

bool Qrack::QUnit::INTSOptimize ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bool  isAdd,
bitLenInt  overflowIndex 
)
protected

Check if overflow arithmetic can be optimized.

◆ IS()

virtual void Qrack::QInterface::IS
inline

Inverse S gate.

Applies an inverse 1/4 phase rotation to the qubit at "qubitIndex."

◆ isClifford() [1/2]

virtual bool Qrack::QInterface::isClifford
inlinevirtual

Returns "true" if current state is identifiably within the Clifford set, or "false" if it is not or cannot be determined.

Reimplemented from Qrack::QInterface.

◆ isClifford() [2/2]

virtual bool Qrack::QInterface::isClifford
inlinevirtual

Returns "true" if current qubit state is identifiably within the Clifford set, or "false" if it is not or cannot be determined.

Reimplemented from Qrack::QInterface.

◆ M() [1/3]

virtual bool Qrack::QUnit::M ( bitLenInt  q)
inlinevirtual

Implements Qrack::QAlu.

◆ M() [2/3]

virtual bool Qrack::QInterface::M
inline

Measurement gate.

Measures the qubit at "qubitIndex" and returns either "true" or "false." (This "gate" breaks unitarity.)

All physical evolution of a quantum state should be "unitary," except measurement. Measurement of a qubit "collapses" the quantum state into either only permutation states consistent with a |0> state for the bit, or else only permutation states consistent with a |1> state for the bit. Measurement also effectively multiplies the overall quantum state vector of the system by a random phase factor, equiprobable over all possible phase angles.

Effectively, when a bit measurement is emulated, Qrack calculates the norm of all permutation state components, to find their respective probabilities. The probabilities of all states in which the measured bit is "0" can be summed to give the probability of the bit being "0," and separately the probabilities of all states in which the measured bit is "1" can be summed to give the probability of the bit being "1." To simulate measurement, a random float between 0 and 1 is compared to the sum of the probability of all permutation states in which the bit is equal to "1". Depending on whether the random float is higher or lower than the probability, the qubit is determined to be either |0> or |1>, (up to phase). If the bit is determined to be |1>, then all permutation eigenstates in which the bit would be equal to |0> have their probability set to zero, and vice versa if the bit is determined to be |0>. Then, all remaining permutation states with nonzero probability are linearly rescaled so that the total probability of all permutation states is again "normalized" to exactly 100% or 1, (within double precision rounding error). Physically, the act of measurement should introduce an overall random phase factor on the state vector, which is emulated by generating another constantly distributed random float to select a phase angle between 0 and 2 * Pi.

Measurement breaks unitary evolution of state. All quantum gates except measurement should generally act as a unitary matrix on a permutation state vector. (Note that Boolean comparison convenience methods in Qrack such as "AND," "OR," and "XOR" employ the measurement operation in the act of first clearing output bits before filling them with the result of comparison, and these convenience methods therefore break unitary evolution of state, but in a physically realistic way. Comparable unitary operations would be performed with a combination of X and CCNOT gates, also called "Toffoli" gates, but the output bits would have to be assumed to be in a known fixed state, like all |0>, ahead of time to produce unitary logical comparison operations.)

◆ M() [3/3]

virtual bitCapInt Qrack::QInterface::M
inline

Measure bits with indices in array, and return a mask of the results.

◆ MakeEngine()

QInterfacePtr Qrack::QUnit::MakeEngine ( bitLenInt  length,
bitCapInt  perm 
)
protected

◆ OptimizePairBuffers()

void Qrack::QUnit::OptimizePairBuffers ( bitLenInt  control,
bitLenInt  target,
bool  anti 
)
protected

◆ OrderContiguous()

void Qrack::QUnit::OrderContiguous ( QInterfacePtr  unit)
protected

◆ ParallelUnitApply()

bool Qrack::QUnit::ParallelUnitApply ( ParallelUnitFn  fn,
real1_f  param1 = ZERO_R1_F,
real1_f  param2 = ZERO_R1_F,
real1_f  param3 = ZERO_R1_F,
int64_t  param4 = 0 
)
protected

◆ ProbBase()

real1_f Qrack::QUnit::ProbBase ( bitLenInt  qubit)
protectedvirtual

◆ ProbRdm()

real1_f Qrack::QUnit::ProbRdm ( bitLenInt  qubitIndex)
inlinevirtual

Direct measure of bit probability to be in |1> state, treating all ancillary qubits as post-selected T gate gadgets.

Warning
PSEUDO-QUANTUM

Reimplemented from Qrack::QInterface.

◆ RevertBasis1Qb()

void Qrack::QUnit::RevertBasis1Qb ( bitLenInt  i)
inlineprotected

◆ RevertBasis2Qb()

void Qrack::QUnit::RevertBasis2Qb ( bitLenInt  i,
RevertExclusivity  exclusivity = INVERT_AND_PHASE,
RevertControl  controlExclusivity = CONTROLS_AND_TARGETS,
RevertAnti  antiExclusivity = CTRL_AND_ANTI,
const std::set< bitLenInt > &  exceptControlling = {},
const std::set< bitLenInt > &  exceptTargetedBy = {},
bool  dumpSkipped = false,
bool  skipOptimized = false 
)
protected

◆ RevertBasisToX1Qb()

void Qrack::QUnit::RevertBasisToX1Qb ( bitLenInt  i)
inlineprotected

◆ RevertBasisToY1Qb()

void Qrack::QUnit::RevertBasisToY1Qb ( bitLenInt  i)
inlineprotected

◆ RevertBasisX()

void Qrack::QUnit::RevertBasisX ( bitLenInt  i)
inlineprotected

◆ RevertBasisY()

void Qrack::QUnit::RevertBasisY ( bitLenInt  i)
inlineprotected

◆ S()

virtual void Qrack::QInterface::S
inline

S gate.

Applies a 1/4 phase rotation to the qubit at "qubitIndex."

◆ SeparateBit()

bool Qrack::QUnit::SeparateBit ( bool  value,
bitLenInt  qubit 
)
protectedvirtual

Reimplemented in Qrack::QUnitMulti.

◆ SetAmplitude()

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

Sets the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ SetConcurrency()

virtual void Qrack::QUnit::SetConcurrency ( uint32_t  threadsPerEngine)
inlinevirtual

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

Reimplemented from Qrack::QInterface.

◆ SetDevice()

void Qrack::QUnit::SetDevice ( int64_t  dID)
virtual

Set the device index, if more than one device is available.

Implements Qrack::QInterface.

◆ SetPermutation()

void Qrack::QUnit::SetPermutation ( bitCapInt  perm,
complex  phaseFac = CMPLX_DEFAULT_ARG 
)
virtual

Set to a specific permutation of all qubits.

Reimplemented from Qrack::QInterface.

◆ SetQuantumState()

void Qrack::QUnit::SetQuantumState ( const complex inputState)
virtual

Set an arbitrary pure quantum state representation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ SetReactiveSeparate()

virtual void Qrack::QUnit::SetReactiveSeparate ( bool  isAggSep)
inlinevirtual

Set reactive separation option (on by default if available)

If reactive separation is available, as in Qrack::QUnit, then turning this option on attempts to more-aggresively recover separability of subsystems. It can either hurt or help performance, though it commonly helps.

Reimplemented from Qrack::QInterface.

◆ SetTInjection()

virtual void Qrack::QUnit::SetTInjection ( bool  useGadget)
inlinevirtual

Set the option to use T-injection gadgets (off by default)

If T-injection gadgets are available, as in Qrack::QStabilizerHybrid, then turning this option on attempts to simulate Clifford+T with polynomial resource gadgets. It can either hurt or help performance, though it commonly helps.

Reimplemented from Qrack::QInterface.

◆ ShardAI()

void Qrack::QUnit::ShardAI ( bitLenInt  qubit,
real1_f  azimuth,
real1_f  inclination 
)
protected

◆ SortUnit()

void Qrack::QUnit::SortUnit ( QInterfacePtr  unit,
std::vector< QSortEntry > &  bits,
bitLenInt  low,
bitLenInt  high 
)
protected

Sort a container of bits, calling Swap() on each.

◆ ToPermBasis() [1/2]

void Qrack::QUnit::ToPermBasis ( bitLenInt  i)
protected

◆ ToPermBasis() [2/2]

void Qrack::QUnit::ToPermBasis ( bitLenInt  start,
bitLenInt  length 
)
protected

◆ ToPermBasisAll()

void Qrack::QUnit::ToPermBasisAll ( )
inlineprotected

◆ ToPermBasisAllMeasure()

void Qrack::QUnit::ToPermBasisAllMeasure ( )
protected

◆ ToPermBasisMeasure() [1/2]

void Qrack::QUnit::ToPermBasisMeasure ( bitLenInt  qubit)
protected

◆ ToPermBasisMeasure() [2/2]

void Qrack::QUnit::ToPermBasisMeasure ( bitLenInt  start,
bitLenInt  length 
)
protected

◆ ToPermBasisProb() [1/3]

void Qrack::QUnit::ToPermBasisProb ( )
inlineprotected

◆ ToPermBasisProb() [2/3]

void Qrack::QUnit::ToPermBasisProb ( bitLenInt  qubit)
protected

◆ ToPermBasisProb() [3/3]

void Qrack::QUnit::ToPermBasisProb ( bitLenInt  start,
bitLenInt  length 
)
protected

◆ TransformPhase()

void Qrack::QUnit::TransformPhase ( complex  topLeft,
complex  bottomRight,
complex mtrxOut 
)
inlineprotected

◆ TransformX2x2()

void Qrack::QUnit::TransformX2x2 ( const complex mtrxIn,
complex mtrxOut 
)
inlineprotected

◆ TransformXInvert()

void Qrack::QUnit::TransformXInvert ( complex  topRight,
complex  bottomLeft,
complex mtrxOut 
)
inlineprotected

◆ TransformY2x2()

void Qrack::QUnit::TransformY2x2 ( const complex mtrxIn,
complex mtrxOut 
)
inlineprotected

◆ TransformYInvert()

void Qrack::QUnit::TransformYInvert ( complex  topRight,
complex  bottomLeft,
complex mtrxOut 
)
inlineprotected

◆ TrimControls()

bool Qrack::QUnit::TrimControls ( const std::vector< bitLenInt > &  controls,
std::vector< bitLenInt > &  controlVec,
bitCapInt perm 
)
protected

◆ TrySeparateClifford()

bool Qrack::QUnit::TrySeparateClifford ( bitLenInt  qubit)
protectedvirtual

◆ UniformlyControlledSingleBit() [1/2]

virtual void Qrack::QInterface::UniformlyControlledSingleBit
inline

Apply a "uniformly controlled" arbitrary single bit unitary transformation.

(See https://arxiv.org/abs/quant-ph/0312218)

A different unitary 2x2 complex matrix is associated with each permutation of the control bits. The first control bit index in the "controls" array is the least significant bit of the permutation, proceeding to the most significant bit. "mtrxs" is a flat (1-dimensional) array where each subsequent set of 4 components is an arbitrary 2x2 single bit gate associated with the next permutation of the control bits, starting from 0. All combinations of control bits apply one of the 4 component (flat 2x2) matrices. For k control bits, there are therefore 4 * 2^k complex components in "mtrxs," representing 2^k complex matrices of 2x2 components. (The component ordering in each matrix is the same as all other gates with an arbitrary 2x2 applied to a single bit, such as Qrack::ApplySingleBit.)

◆ UniformlyControlledSingleBit() [2/2]

void Qrack::QInterface::UniformlyControlledSingleBit

◆ X() [1/3]

virtual void Qrack::QUnit::X ( bitLenInt  q)
inlinevirtual

Implements Qrack::QAlu.

◆ X() [2/3]

virtual void Qrack::QInterface::X
inline

X gate.

Applies the Pauli "X" operator to the qubit at "qubitIndex." The Pauli "X" operator is equivalent to a logical "NOT."

◆ X() [3/3]

virtual void Qrack::QInterface::X
inline

Bitwise Pauli X (or logical "NOT") operator.

◆ XBase()

void Qrack::QUnit::XBase ( bitLenInt  target)
protectedvirtual

◆ YBase()

void Qrack::QUnit::YBase ( bitLenInt  target)
protectedvirtual

◆ ZBase()

void Qrack::QUnit::ZBase ( bitLenInt  target)
protectedvirtual

Member Data Documentation

◆ deviceIDs

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

◆ devID

int64_t Qrack::QUnit::devID
protected

◆ engines

std::vector<QInterfaceEngine> Qrack::QUnit::engines
protected

◆ freezeBasis2Qb

bool Qrack::QUnit::freezeBasis2Qb
protected

◆ isReactiveSeparate

bool Qrack::QUnit::isReactiveSeparate
protected

◆ isSparse

bool Qrack::QUnit::isSparse
protected

◆ logFidelity

double Qrack::QUnit::logFidelity
protected

◆ phaseFactor

complex Qrack::QUnit::phaseFactor
protected

◆ separabilityThreshold

real1_f Qrack::QUnit::separabilityThreshold
protected

◆ shards

QEngineShardMap Qrack::QUnit::shards
protected

◆ thresholdQubits

bitLenInt Qrack::QUnit::thresholdQubits
protected

◆ useHostRam

bool Qrack::QUnit::useHostRam
protected

◆ useTGadget

bool Qrack::QUnit::useTGadget
protected

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