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

General purpose QEngineCPU implementation. More...

#include <qengine_cpu.hpp>

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

Public Member Functions

 QEngineCPU (bitLenInt qBitCount, bitCapInt initState, qrack_rand_gen_ptr rgp=nullptr, complex phaseFac=CMPLX_DEFAULT_ARG, bool doNorm=false, bool randomGlobalPhase=true, bool ignored=false, int ignored2=-1, bool useHardwareRNG=true, bool useSparseStateVec=false, real1_f norm_thresh=REAL1_EPSILON, std::vector< int > ignored3={}, bitLenInt ignored4=0, real1_f ignored5=FP_NORM_EPSILON)
 Initialize a coherent unit with qBitCount number of bits, to initState unsigned integer permutation state, with a shared random number generator, with a specific phase. More...
 
virtual ~QEngineCPU ()
 
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 real1_f FirstNonzeroPhase ()
 Get phase of lowest permutation nonzero amplitude. More...
 
virtual void ZeroAmplitudes ()
 Set all amplitudes to 0, and optionally temporarily deallocate state vector RAM. More...
 
virtual void FreeStateVec (complex *sv=NULL)
 
virtual void GetAmplitudePage (complex *pagePtr, bitCapIntOcl offset, bitCapIntOcl length)
 Copy a "page" of amplitudes from this QEngine's internal state, into pagePtr. More...
 
virtual void SetAmplitudePage (const complex *pagePtr, bitCapIntOcl offset, bitCapIntOcl length)
 Copy a "page" of amplitudes from pagePtr into this QEngine's internal state. More...
 
virtual 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...
 
virtual void ShuffleBuffers (QEnginePtr engine)
 Swap the high half of this engine with the low half of another. More...
 
virtual bool IsZeroAmplitude ()
 Returns "true" only if amplitudes are all totally 0. More...
 
virtual void CopyStateVec (QEnginePtr src)
 Exactly copy the state vector of a different QEngine instance. More...
 
virtual QEnginePtr CloneEmpty ()
 Clone this QEngine's settings, with a zeroed state vector. More...
 
virtual 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...
 
virtual 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...
 
virtual void SetQuantumState (const complex *inputState)
 Set arbitrary pure quantum state, in unsigned int permutation basis. More...
 
virtual void GetQuantumState (complex *outputState)
 Get pure quantum state, in unsigned int permutation basis. More...
 
virtual void GetProbs (real1 *outputProbs)
 Get all probabilities, in unsigned int permutation basis. 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 bitLenInt Compose (QEngineCPUPtr toCopy)
 Combine (a copy of) another QEngineCPU with this one, after the last bit index of this one. 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)
 Combine (copies) each QEngineCPU in the vector with this one, after the last bit index of this one. More...
 
virtual bitLenInt Compose (QEngineCPUPtr toCopy, bitLenInt start)
 Combine (a copy of) another QEngineCPU with this one, inserted at the "start" index. More...
 
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 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 void XMask (bitCapInt mask)
 Masked X gate. More...
 
virtual void PhaseParity (real1_f radians, bitCapInt mask)
 Parity phase gate. More...
 
virtual void ROL (bitLenInt shift, bitLenInt start, bitLenInt length)
 "Circular shift left" - shift bits left, and carry last bits. 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 bitLenInt *controls, bitLenInt controlLen)
 Add integer (without sign, with controls) More...
 
virtual void INCS (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
 Add an integer to the register, with sign and without carry. More...
 
virtual void INCBCD (bitCapInt toAdd, bitLenInt start, bitLenInt length)
 Add BCD integer (without sign) 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 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 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 bitLenInt *controls, bitLenInt controlLen)
 Controlled multiplication by integer. More...
 
virtual void CDIV (bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const bitLenInt *controls, bitLenInt controlLen)
 Controlled division by power of integer. More...
 
virtual void CMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const bitLenInt *controls, bitLenInt controlLen)
 Controlled multiplication modulo N by integer, (out of place) More...
 
virtual void CIMULModNOut (bitCapInt toMul, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const bitLenInt *controls, bitLenInt controlLen)
 Inverse of controlled multiplication modulo N by integer, (out of place) More...
 
virtual void CPOWModNOut (bitCapInt base, bitCapInt modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const bitLenInt *controls, bitLenInt controlLen)
 Controlled, raise a classical base to a quantum power, modulo N, (out of place) 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 bitCapInt IndexedLDA (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, const unsigned char *values, bool resetValue=true)
 Set 8 bit register bits based on read from classical memory. More...
 
virtual bitCapInt IndexedADC (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)
 Add based on an indexed load from classical memory. More...
 
virtual bitCapInt IndexedSBC (bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, const unsigned char *values)
 Subtract based on an indexed load 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 SetPermutation (bitCapInt perm, complex phaseFac=CMPLX_DEFAULT_ARG)
 Set to a specific permutation of all qubits. More...
 
virtual void UniformlyControlledSingleBit (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubitIndex, const complex *mtrxs, const bitCapInt *mtrxSkipPowers, bitLenInt mtrxSkipLen, bitCapInt mtrxSkipValueMask)
 
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...
 
virtual void CUniformParityRZ (const bitLenInt *controls, bitLenInt controlLen, 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 real1_f Prob (bitLenInt qubitIndex)
 PSEUDO-QUANTUM Direct measure of bit probability to be in |1> state. 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 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 void NormalizeState (real1_f nrm=REAL1_DEFAULT_ARG, real1_f norm_thresh=REAL1_DEFAULT_ARG, real1_f phaseArg=ZERO_R1)
 Apply the normalization factor found by UpdateRunningNorm() or on the fly by a single bit gate. More...
 
virtual real1_f SumSqrDiff (QInterfacePtr toCompare)
 
virtual real1_f SumSqrDiff (QEngineCPUPtr toCompare)
 
virtual QInterfacePtr Clone ()
 Clone this QInterface. 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 void SetQubitCount (bitLenInt qb)
 
virtual real1_f GetRunningNorm ()
 Get in-flight renormalization factor. More...
 
virtual void ZMask (bitCapInt mask)
 Masked Z gate. More...
 
virtual bool ForceM (bitLenInt qubitIndex, bool result, bool doForce=true, bool doApply=true)
 PSEUDO-QUANTUM - Acts like a measurement gate, except with a specified forced result. More...
 
virtual bitCapInt ForceM (const bitLenInt *bits, bitLenInt length, const 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 Mtrx (const complex *mtrx, bitLenInt qubit)
 Apply an arbitrary single bit unitary transformation. More...
 
virtual void MCMtrx (const bitLenInt *controls, bitLenInt controlLen, const complex *mtrx, bitLenInt target)
 Apply an arbitrary single bit unitary transformation, with arbitrary control bits. More...
 
virtual void MACMtrx (const bitLenInt *controls, bitLenInt controlLen, const complex *mtrx, bitLenInt target)
 Apply an arbitrary single bit unitary transformation, with arbitrary (anti-)control bits. More...
 
virtual void CSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary control bits. More...
 
virtual void AntiCSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply a swap with arbitrary (anti) control bits. More...
 
virtual void CSqrtSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary control bits. More...
 
virtual void AntiCSqrtSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply a square root of swap with arbitrary (anti) control bits. More...
 
virtual void CISqrtSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary control bits. More...
 
virtual void AntiCISqrtSwap (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubit1, bitLenInt qubit2)
 Apply an inverse square root of swap with arbitrary (anti) control bits. 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 INCC (bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Add integer (without sign, with carry) More...
 
virtual void DECC (bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
 Subtract classical integer (without sign, with carry) 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 bitLenInt *controls, bitLenInt controlLen)
 Subtract integer (without sign, with controls) 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, applying a 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 of square root of swap gate. More...
 
virtual void FSim (real1_f theta, real1_f phi, bitLenInt qubitIndex1, bitLenInt qubitIndex2)
 "fSim" gate, (useful in the simulation of particles with fermionic statistics) More...
 
virtual real1_f ProbAll (bitCapInt fullRegister)
 PSEUDO-QUANTUM Direct measure of full register probability to be in permutation state. More...
 
virtual void ProbRegAll (bitLenInt start, bitLenInt length, real1 *probsArray)
 
virtual void ApplyControlled2x2 (const bitLenInt *controls, bitLenInt controlLen, bitLenInt target, const complex *mtrx)
 
virtual void ApplyAntiControlled2x2 (const bitLenInt *controls, bitLenInt controlLen, bitLenInt target, const complex *mtrx)
 
virtual QInterfacePtr Decompose (bitLenInt start, bitLenInt length)
 Schmidt decompose a length of qubits. 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 DECBCD (bitCapInt toSub, bitLenInt start, bitLenInt length)
 Subtract classical BCD integer (without sign) 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...
 
- 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 void SetConcurrency (uint32_t threadsPerEngine)
 Set the number of threads in parallel for loops, per component QEngine. More...
 
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 void Phase (const complex topLeft, const complex bottomRight, bitLenInt qubitIndex)
 Apply a single bit transformation that only effects phase. More...
 
virtual void Invert (const complex topRight, const complex bottomLeft, bitLenInt qubitIndex)
 Apply a single bit transformation that reverses bit probability and might effect phase. More...
 
virtual void MCPhase (const bitLenInt *controls, bitLenInt controlLen, complex topLeft, complex bottomRight, bitLenInt target)
 Apply a single bit transformation that only effects phase, with arbitrary control bits. More...
 
virtual void MCInvert (const bitLenInt *controls, bitLenInt controlLen, 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 bitLenInt *controls, bitLenInt controlLen, 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 bitLenInt *controls, bitLenInt controlLen, 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 UniformlyControlledSingleBit (const bitLenInt *controls, bitLenInt controlLen, 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 CU (const bitLenInt *controls, bitLenInt controlLen, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
 Controlled general unitary gate. More...
 
virtual void AntiCU (const bitLenInt *controls, bitLenInt controlLen, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
 (Anti-)Controlled general unitary gate More...
 
virtual void H (bitLenInt qubitIndex)
 Hadamard gate. More...
 
virtual void SqrtH (bitLenInt qubitIndex)
 Square root of Hadamard gate. More...
 
virtual void SH (bitLenInt qubitIndex)
 Y-basis transformation gate. More...
 
virtual void HIS (bitLenInt qubitIndex)
 Y-basis (inverse) transformation gate. More...
 
virtual void S (bitLenInt qubitIndex)
 S gate. More...
 
virtual void IS (bitLenInt qubitIndex)
 Inverse S gate. More...
 
virtual void T (bitLenInt qubitIndex)
 T gate. More...
 
virtual void IT (bitLenInt qubitIndex)
 Inverse T gate. More...
 
virtual void PhaseRootN (bitLenInt n, bitLenInt qubitIndex)
 "PhaseRootN" gate More...
 
virtual void IPhaseRootN (bitLenInt n, bitLenInt qubitIndex)
 Inverse "PhaseRootN" gate. More...
 
virtual void Y (bitLenInt qubitIndex)
 Y gate. More...
 
virtual void YMask (bitCapInt mask)
 Masked Y gate. More...
 
virtual void Z (bitLenInt qubitIndex)
 Z gate. More...
 
virtual void SqrtX (bitLenInt qubitIndex)
 Square root of X gate. More...
 
virtual void ISqrtX (bitLenInt qubitIndex)
 Inverse square root of X gate. More...
 
virtual void SqrtXConjT (bitLenInt qubitIndex)
 Phased square root of X gate. More...
 
virtual void ISqrtXConjT (bitLenInt qubitIndex)
 Inverse phased square root of X gate. More...
 
virtual void SqrtY (bitLenInt qubitIndex)
 Square root of Y gate. More...
 
virtual void ISqrtY (bitLenInt qubitIndex)
 Square root of Y 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 bitLenInt *controls, bitLenInt controlLen, bitLenInt qubitIndex, const real1 *angles)
 Apply a "uniformly controlled" rotation of a bit around the Pauli Y axis. More...
 
virtual void UniformlyControlledRZ (const bitLenInt *controls, bitLenInt controlLen, bitLenInt qubitIndex, const real1 *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 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 bitLenInt *controls, bitLenInt controlLen, 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 CRY (real1_f radians, bitLenInt control, bitLenInt target)
 Controlled 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 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 CFullAdd (const bitLenInt *controls, bitLenInt controlLen, bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
 Controlled quantum analog of classical "Full Adder" gate. More...
 
virtual void CIFullAdd (const bitLenInt *controls, bitLenInt controlLen, 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 bitLenInt *controls, bitLenInt controlLen, 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 bitLenInt *controls, bitLenInt controlLen, 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 bitLenInt *qubits, bitLenInt length, 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 bitLenInt *qubits, bitLenInt length, 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 bitLenInt *bits, bitLenInt length)
 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 bitLenInt *bits, bitLenInt length, real1 *probsArray)
 Direct measure of listed permutation probability. More...
 
virtual real1_f ExpectationBitsAll (const bitLenInt *bits, bitLenInt length, bitCapInt offset=0)
 Get permutation expectation value of bits. More...
 
virtual std::map< bitCapInt, int > MultiShotMeasureMask (const bitCapInt *qPowers, bitLenInt qPowerCount, unsigned shots)
 Statistical measure of masked permutation probability. More...
 
virtual void MultiShotMeasureMask (const bitCapInt *qPowers, bitLenInt qPowerCount, unsigned shots, unsigned *shotsArray)
 Statistical measure of masked permutation probability (returned as array) More...
 
virtual void SetBit (bitLenInt qubitIndex1, 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 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 bitLenInt *qubits, bitLenInt length, 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 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 (int dID, bool forceReInit=false)
 Set the device index, if more than one device is available. More...
 
virtual int64_t GetDevice ()
 Get the device index. More...
 
bitCapIntOcl GetMaxSize ()
 Get maximum number of amplitudes that can be allocated on current device. More...
 
- Public Member Functions inherited from Qrack::ParallelFor
 ParallelFor ()
 
virtual ~ParallelFor ()
 
void SetConcurrencyLevel (unsigned num)
 
unsigned GetConcurrencyLevel ()
 
bitCapIntOcl GetStride ()
 
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 bitCapIntOcl *maskArray, const bitLenInt maskLen, 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...
 
void par_for_qbdt (const bitCapInt begin, const bitCapInt end, BdtFunc fn)
 Iterate over a QBDT tree. More...
 
real1_f par_norm (const bitCapIntOcl maxQPower, const StateVectorPtr stateArray, real1_f norm_thresh=ZERO_R1)
 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

typedef std::function< void(void)> DispatchFn
 
typedef std::function< bitCapIntOcl(const bitCapIntOcl &, const bitCapIntOcl &)> IOFn
 
typedef std::function< bitCapIntOcl(const bitCapIntOcl &)> MFn
 

Protected Member Functions

StateVectorSparsePtr CastStateVecSparse ()
 
virtual real1_f GetExpectation (bitLenInt valueStart, bitLenInt valueLength)
 
virtual StateVectorPtr AllocStateVec (bitCapIntOcl elemCount)
 
virtual void ResetStateVec (StateVectorPtr sv)
 
virtual void Dispatch (bitCapInt workItemCount, DispatchFn fn)
 
void DecomposeDispose (bitLenInt start, bitLenInt length, QEngineCPUPtr dest)
 Minimally decompose a set of contigious bits from the separable unit. More...
 
virtual void Apply2x2 (bitCapIntOcl offset1, bitCapIntOcl offset2, const complex *mtrx, bitLenInt bitCount, const bitCapIntOcl *qPowersSorted, bool doCalcNorm, real1_f norm_thresh=REAL1_DEFAULT_ARG)
 
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 ApplyM (bitCapInt mask, bitCapInt result, complex nrm)
 
virtual void INCDECC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Add integer (without sign, with carry) More...
 
virtual void INCDECSC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (without overflow flag) More...
 
virtual void INCDECSC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
 Common driver method behind INCSC and DECSC (with overflow flag) More...
 
virtual void INCDECBCDC (bitCapInt toMod, bitLenInt inOutStart, bitLenInt length, bitLenInt carryIndex)
 Add BCD integer (without sign, with carry) More...
 
void MULDIV (const IOFn &inFn, const IOFn &outFn, const bitCapInt &toMul, const bitLenInt &inOutStart, const bitLenInt &carryStart, const bitLenInt &length)
 
void CMULDIV (const IOFn &inFn, const IOFn &outFn, const bitCapInt &toMul, const bitLenInt &inOutStart, const bitLenInt &carryStart, const bitLenInt &length, const bitLenInt *controls, const bitLenInt controlLen)
 
void ModNOut (const MFn &kernelFn, const bitCapInt &modN, const bitLenInt &inStart, const bitLenInt &outStart, const bitLenInt &length, const bool &inverse=false)
 
void CModNOut (const MFn &kernelFn, const bitCapInt &modN, const bitLenInt &inStart, const bitLenInt &outStart, const bitLenInt &length, const bitLenInt *controls, const bitLenInt &controlLen, const bool &inverse=false)
 
- Protected Member Functions inherited from Qrack::QEngine
bool IsPhase (const complex *mtrx)
 
bool IsInvert (const complex *mtrx)
 
bool IsIdentity (const complex *mtrx, bool isControlled)
 
- Protected Member Functions inherited from Qrack::QInterface
template<typename GateFunc >
void ControlledLoopFixture (bitLenInt length, GateFunc gate)
 
void FreeAligned (void *toFree)
 
complex GetNonunitaryPhase ()
 
template<typename Fn >
void MACWrapper (const bitLenInt *controls, bitLenInt controlLen, Fn fn)
 

Protected Attributes

StateVectorPtr stateVec
 
bool isSparse
 
- Protected Attributes inherited from Qrack::QEngine
bool useHostRam
 
bitCapIntOcl maxQPowerOcl
 The value stored in runningNorm should always be the total probability implied by the norm of all amplitudes, summed, at each update. More...
 
real1 runningNorm
 
- Protected Attributes inherited from Qrack::QInterface
bitLenInt qubitCount
 
bitCapInt maxQPower
 
uint32_t randomSeed
 
qrack_rand_gen_ptr rand_generator
 
std::uniform_real_distribution< real1_frand_distribution
 
std::shared_ptr< RdRandomhardware_rand_generator
 
bool doNormalize
 
bool randGlobalPhase
 
bool useRDRAND
 
real1 amplitudeFloor
 

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

General purpose QEngineCPU implementation.

Member Typedef Documentation

◆ DispatchFn

typedef std::function<void(void)> Qrack::QEngineCPU::DispatchFn
protected

◆ IOFn

typedef std::function<bitCapIntOcl(const bitCapIntOcl&, const bitCapIntOcl&)> Qrack::QEngineCPU::IOFn
protected

◆ MFn

typedef std::function<bitCapIntOcl(const bitCapIntOcl&)> Qrack::QEngineCPU::MFn
protected

Constructor & Destructor Documentation

◆ QEngineCPU()

Qrack::QEngineCPU::QEngineCPU ( bitLenInt  qBitCount,
bitCapInt  initState,
qrack_rand_gen_ptr  rgp = nullptr,
complex  phaseFac = CMPLX_DEFAULT_ARG,
bool  doNorm = false,
bool  randomGlobalPhase = true,
bool  useHostMem = false,
int  deviceID = -1,
bool  useHardwareRNG = true,
bool  useSparseStateVec = false,
real1_f  norm_thresh = REAL1_EPSILON,
std::vector< int >  devList = {},
bitLenInt  qubitThreshold = 0,
real1_f  sep_thresh = FP_NORM_EPSILON 
)

Initialize a coherent unit with qBitCount number of bits, to initState unsigned integer permutation state, with a shared random number generator, with a specific phase.

(Note that "useHostMem" is required as a parameter to normalize constructors for use with the CreateQuantumInterface() factory, but it serves no function in QEngineCPU.)

Warning
Overall phase is generally arbitrary and unknowable. Setting two QEngineCPU instances to the same phase usually makes sense only if they are initialized at the same time.

◆ ~QEngineCPU()

virtual Qrack::QEngineCPU::~QEngineCPU ( )
inlinevirtual

Member Function Documentation

◆ AllocStateVec()

StateVectorPtr Qrack::QEngineCPU::AllocStateVec ( bitCapIntOcl  elemCount)
protectedvirtual

◆ Apply2x2()

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

Implements Qrack::QEngine.

◆ ApplyM()

void Qrack::QEngineCPU::ApplyM ( bitCapInt  mask,
bitCapInt  result,
complex  nrm 
)
protectedvirtual

Implements Qrack::QEngine.

◆ CastStateVecSparse()

StateVectorSparsePtr Qrack::QEngineCPU::CastStateVecSparse ( )
inlineprotected

◆ CloneEmpty()

QEnginePtr Qrack::QEngineCPU::CloneEmpty ( )
virtual

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

Implements Qrack::QEngine.

◆ CModNOut()

void Qrack::QEngineCPU::CModNOut ( const MFn kernelFn,
const bitCapInt modN,
const bitLenInt inStart,
const bitLenInt outStart,
const bitLenInt length,
const bitLenInt controls,
const bitLenInt controlLen,
const bool &  inverse = false 
)
protected

◆ CMULDIV()

void Qrack::QEngineCPU::CMULDIV ( const IOFn inFn,
const IOFn outFn,
const bitCapInt toMul,
const bitLenInt inOutStart,
const bitLenInt carryStart,
const bitLenInt length,
const bitLenInt controls,
const bitLenInt  controlLen 
)
protected

◆ Compose() [1/5]

bitLenInt Qrack::QEngineCPU::Compose ( QEngineCPUPtr  toCopy)
virtual

Combine (a copy of) another QEngineCPU with this one, after the last bit index of this one.

(If the programmer doesn't want to "cheat," it is left up to them to delete the old unit that was added.

◆ Compose() [2/5]

virtual bitLenInt Qrack::QEngineCPU::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/5]

std::map< QInterfacePtr, bitLenInt > Qrack::QEngineCPU::Compose ( std::vector< QInterfacePtr toCopy)
virtual

Combine (copies) each QEngineCPU in the vector with this one, after the last bit index of this one.

(If the programmer doesn't want to "cheat," it is left up to them to delete the old unit that was added.

Returns a mapping of the index into the new QEngine that each old one was mapped to.

Reimplemented from Qrack::QInterface.

◆ Compose() [4/5]

bitLenInt Qrack::QEngineCPU::Compose ( QEngineCPUPtr  toCopy,
bitLenInt  start 
)
virtual

Combine (a copy of) another QEngineCPU with this one, inserted at the "start" index.

(If the programmer doesn't want to "cheat," it is left up to them to delete the old unit that was added.

◆ Compose() [5/5]

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

Reimplemented from Qrack::QInterface.

◆ CopyStateVec()

virtual void Qrack::QEngineCPU::CopyStateVec ( QEnginePtr  src)
inlinevirtual

Exactly copy the state vector of a different QEngine instance.

Implements Qrack::QEngine.

◆ Decompose()

void Qrack::QEngineCPU::Decompose ( bitLenInt  start,
QInterfacePtr  dest 
)
virtual

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.

◆ DecomposeDispose()

void Qrack::QEngineCPU::DecomposeDispose ( bitLenInt  start,
bitLenInt  length,
QEngineCPUPtr  destination 
)
protected

Minimally decompose a set of contigious bits from the separable unit.

The length of this separable unit is reduced by the length of bits decomposed, and the bits removed are output in the destination QEngineCPU pointer. The destination object must be initialized to the correct number of bits, in 0 permutation state.

◆ Dispatch()

virtual void Qrack::QEngineCPU::Dispatch ( bitCapInt  workItemCount,
DispatchFn  fn 
)
inlineprotectedvirtual

◆ Dispose() [1/2]

void Qrack::QEngineCPU::Dispose ( bitLenInt  start,
bitLenInt  length 
)
virtual

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::QEngineCPU::Dispose ( bitLenInt  start,
bitLenInt  length,
bitCapInt  disposedPerm 
)
virtual

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

Implements Qrack::QInterface.

◆ Dump()

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

◆ Finish()

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

◆ FirstNonzeroPhase()

virtual real1_f Qrack::QEngineCPU::FirstNonzeroPhase ( )
inlinevirtual

Get phase of lowest permutation nonzero amplitude.

Reimplemented from Qrack::QInterface.

◆ FreeStateVec()

virtual void Qrack::QEngineCPU::FreeStateVec ( complex sv = NULL)
inlinevirtual

Implements Qrack::QEngine.

◆ GetAmplitude()

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

Get the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ GetAmplitudePage()

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

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

Implements Qrack::QEngine.

◆ GetExpectation()

real1_f Qrack::QEngineCPU::GetExpectation ( bitLenInt  valueStart,
bitLenInt  valueLength 
)
protectedvirtual

Implements Qrack::QEngine.

◆ GetProbs()

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

Get all probabilities, in unsigned int permutation basis.

Implements Qrack::QInterface.

◆ GetQuantumState()

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

Get pure quantum state, in unsigned int permutation basis.

Implements Qrack::QInterface.

◆ INCDECBCDC()

void Qrack::QEngineCPU::INCDECBCDC ( bitCapInt  toMod,
bitLenInt  inOutStart,
bitLenInt  length,
bitLenInt  carryIndex 
)
protectedvirtual

Add BCD integer (without sign, with carry)

Implements Qrack::QAlu.

◆ INCDECC()

void Qrack::QEngineCPU::INCDECC ( bitCapInt  toMod,
bitLenInt  inOutStart,
bitLenInt  length,
bitLenInt  carryIndex 
)
protectedvirtual

Add integer (without sign, with carry)

Reimplemented from Qrack::QEngine.

◆ INCDECSC() [1/2]

void Qrack::QEngineCPU::INCDECSC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  carryIndex 
)
protectedvirtual

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

Implements Qrack::QAlu.

◆ INCDECSC() [2/2]

void Qrack::QEngineCPU::INCDECSC ( bitCapInt  toMod,
bitLenInt  start,
bitLenInt  length,
bitLenInt  overflowIndex,
bitLenInt  carryIndex 
)
protectedvirtual

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

Implements Qrack::QAlu.

◆ isFinished()

virtual bool Qrack::QEngineCPU::isFinished ( )
inlinevirtual

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

Reimplemented from Qrack::QInterface.

◆ IsZeroAmplitude()

virtual bool Qrack::QEngineCPU::IsZeroAmplitude ( )
inlinevirtual

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

Implements Qrack::QEngine.

◆ ModNOut()

void Qrack::QEngineCPU::ModNOut ( const MFn kernelFn,
const bitCapInt modN,
const bitLenInt inStart,
const bitLenInt outStart,
const bitLenInt length,
const bool &  inverse = false 
)
protected

◆ MULDIV()

void Qrack::QEngineCPU::MULDIV ( const IOFn inFn,
const IOFn outFn,
const bitCapInt toMul,
const bitLenInt inOutStart,
const bitLenInt carryStart,
const bitLenInt length 
)
protected

◆ PhaseParity()

void Qrack::QEngineCPU::PhaseParity ( real1_f  radians,
bitCapInt  mask 
)
virtual

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.

◆ QueueSetDoNormalize()

virtual void Qrack::QEngineCPU::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()

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

◆ ResetStateVec()

virtual void Qrack::QEngineCPU::ResetStateVec ( StateVectorPtr  sv)
inlineprotectedvirtual

◆ SetAmplitude()

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

Sets the representational amplitude of a full permutation.

Warning
PSEUDO-QUANTUM

Implements Qrack::QInterface.

◆ SetAmplitudePage() [1/2]

virtual void Qrack::QEngineCPU::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/2]

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

◆ SetQuantumState()

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

Set arbitrary pure quantum state, in unsigned int permutation basis.

Implements Qrack::QInterface.

◆ ShuffleBuffers()

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

◆ UpdateRunningNorm()

void Qrack::QEngineCPU::UpdateRunningNorm ( real1_f  norm_thresh = REAL1_DEFAULT_ARG)
protectedvirtual

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::QEngineCPU::XMask ( bitCapInt  mask)
virtual

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()

virtual void Qrack::QEngineCPU::ZeroAmplitudes ( )
inlinevirtual

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

Implements Qrack::QEngine.

Member Data Documentation

◆ isSparse

bool Qrack::QEngineCPU::isSparse
protected

◆ stateVec

StateVectorPtr Qrack::QEngineCPU::stateVec
protected

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