Qrack  9.0
General classical-emulating-quantum development framework
Classes | Typedefs | Enumerations | Functions | Variables
Qrack Namespace Reference

Classes

union  complex2
 SIMD implementation of the double precision complex vector type of 2 complex numbers, only for AVX Apply2x2. More...
 
class  DispatchQueue
 
struct  OCLKernelHandle
 
class  OCLDeviceCall
 
class  OCLDeviceContext
 
struct  InitOClResult
 
class  OCLEngine
 "Qrack::OCLEngine" manages the single OpenCL context. More...
 
class  ParallelFor
 
class  RdRandom
 
struct  HamiltonianOp
 A Hamiltonian can be specified in terms of arbitrary controlled single bit gates, each one an "HamiltonianOp.". More...
 
struct  UniformHamiltonianOp
 
struct  MpsShard
 
class  QAlu
 
class  QBdt
 
class  QBdtNode
 
class  QBdtNodeInterface
 
class  QBdtHybrid
 A "Qrack::QBdtHybrid" internally switched between Qrack::QBdt and Qrack::QHybrid to maximize entanglement-dependent performance. More...
 
struct  QCircuitGate
 
class  QCircuit
 
class  QEngine
 Abstract QEngine implementation, for all "Schroedinger method" engines. More...
 
class  QEngineCPU
 General purpose QEngineCPU implementation. More...
 
struct  QueueItem
 
class  PoolItem
 
class  QEngineCUDA
 OpenCL enhanced QEngineCPU implementation. More...
 
class  bad_alloc
 
class  QEngineOCL
 OpenCL enhanced QEngineCPU implementation. More...
 
struct  PhaseShard
 Caches controlled gate phase between shards, (as a case of "gate fusion" optimization particularly useful to QUnit) More...
 
class  QEngineShard
 Associates a QInterface object with a set of bits. More...
 
class  QEngineShardMap
 
class  QHybrid
 A "Qrack::QHybrid" internally switched between Qrack::QEngineCPU and Qrack::QEngineOCL to maximize qubit-count-dependent performance. More...
 
class  QInterface
 A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods to operate on it as by gates and register-like instructions. More...
 
class  QNeuron
 
class  QPager
 A "Qrack::QPager" splits a "Qrack::QEngine" implementation into equal-length "pages." This helps both optimization and distribution of a single coherent quantum register across multiple devices. More...
 
class  QParity
 
struct  AmplitudeEntry
 
class  QStabilizer
 
struct  QUnitCliffordAmp
 
class  QStabilizerHybrid
 A "Qrack::QStabilizerHybrid" internally switched between Qrack::QStabilizer and Qrack::QEngine to maximize performance. More...
 
class  QTensorNetwork
 
class  QubitSwapMap
 
class  QUnit
 
struct  CliffordShard
 
class  QUnitClifford
 
struct  QEngineInfo
 
struct  DeviceInfo
 
class  QUnitMulti
 
class  StateVector
 
class  StateVectorArray
 
class  StateVectorSparse
 

Typedefs

typedef std::function< void(void)> DispatchFn
 
typedef std::shared_ptr< OCLDeviceContextDeviceContextPtr
 
typedef std::vector< cl::Event > EventVec
 
typedef std::shared_ptr< EventVecEventVecPtr
 
typedef std::complex< half_float::halfcomplex
 
typedef half_float::half real1
 
typedef float real1_f
 
typedef float real1_s
 
typedef std::shared_ptr< complexBitOp
 
typedef std::function< void(const bitCapIntOcl &, const unsigned &cpu)> ParallelFunc
 
typedef std::function< bitCapIntOcl(const bitCapIntOcl &)> IncrementFunc
 
typedef std::function< bitCapInt(const bitCapInt &)> BdtFunc
 
typedef std::function< void(const bitCapInt &, const unsigned &cpu)> ParallelFuncBdt
 
typedef std::shared_ptr< StateVectorStateVectorPtr
 
typedef std::shared_ptr< StateVectorArrayStateVectorArrayPtr
 
typedef std::shared_ptr< StateVectorSparseStateVectorSparsePtr
 
typedef std::shared_ptr< QEngineQEnginePtr
 
typedef std::shared_ptr< HamiltonianOpHamiltonianOpPtr
 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...
 
typedef std::vector< HamiltonianOpPtrHamiltonian
 
typedef std::shared_ptr< MpsShardMpsShardPtr
 
typedef std::shared_ptr< QAluQAluPtr
 
typedef std::shared_ptr< QBdtQBdtPtr
 
typedef std::shared_ptr< QBdtNodeQBdtNodePtr
 
typedef std::shared_ptr< QBdtNodeInterfaceQBdtNodeInterfacePtr
 
typedef std::shared_ptr< QBdtHybridQBdtHybridPtr
 
typedef std::shared_ptr< QCircuitGateQCircuitGatePtr
 
typedef std::shared_ptr< QCircuitQCircuitPtr
 
typedef std::shared_ptr< QEngineCPUQEngineCPUPtr
 
typedef unsigned long cl_map_flags
 
typedef unsigned long cl_mem_flags
 
typedef std::shared_ptr< void > BufferPtr
 
typedef std::shared_ptr< QEngineCUDAQEngineCUDAPtr
 
typedef std::shared_ptr< PoolItemPoolItemPtr
 
typedef std::shared_ptr< QEngineOCLQEngineOCLPtr
 
typedef QEngineShardQEngineShardPtr
 
typedef std::shared_ptr< PhaseShardPhaseShardPtr
 
typedef std::map< QEngineShardPtr, PhaseShardPtrShardToPhaseMap
 
typedef std::shared_ptr< QHybridQHybridPtr
 
typedef std::shared_ptr< QInterfaceQInterfacePtr
 
typedef std::shared_ptr< QNeuronQNeuronPtr
 
typedef std::shared_ptr< QPagerQPagerPtr
 
typedef std::shared_ptr< QParityQParityPtr
 
typedef std::shared_ptr< QStabilizerQStabilizerPtr
 
typedef std::shared_ptr< QStabilizerHybridQStabilizerHybridPtr
 
typedef std::shared_ptr< QTensorNetworkQTensorNetworkPtr
 
typedef std::shared_ptr< QUnitQUnitPtr
 
typedef std::shared_ptr< QUnitCliffordQUnitCliffordPtr
 
typedef std::shared_ptr< QUnitMultiQUnitMultiPtr
 

Enumerations

enum  OCLAPI {
  OCL_API_UNKNOWN = 0 , OCL_API_APPLY2X2 , OCL_API_APPLY2X2_SINGLE , OCL_API_APPLY2X2_NORM_SINGLE ,
  OCL_API_APPLY2X2_DOUBLE , OCL_API_APPLY2X2_WIDE , OCL_API_APPLY2X2_SINGLE_WIDE , OCL_API_APPLY2X2_NORM_SINGLE_WIDE ,
  OCL_API_APPLY2X2_DOUBLE_WIDE , OCL_API_PHASE_SINGLE , OCL_API_PHASE_SINGLE_WIDE , OCL_API_INVERT_SINGLE ,
  OCL_API_INVERT_SINGLE_WIDE , OCL_API_UNIFORMLYCONTROLLED , OCL_API_UNIFORMPARITYRZ , OCL_API_UNIFORMPARITYRZ_NORM ,
  OCL_API_CUNIFORMPARITYRZ , OCL_API_COMPOSE , OCL_API_COMPOSE_WIDE , OCL_API_COMPOSE_MID ,
  OCL_API_DECOMPOSEPROB , OCL_API_DECOMPOSEAMP , OCL_API_DISPOSEPROB , OCL_API_DISPOSE ,
  OCL_API_PROB , OCL_API_CPROB , OCL_API_PROBREG , OCL_API_PROBREGALL ,
  OCL_API_PROBMASK , OCL_API_PROBMASKALL , OCL_API_PROBPARITY , OCL_API_FORCEMPARITY ,
  OCL_API_EXPPERM , OCL_API_X_SINGLE , OCL_API_X_SINGLE_WIDE , OCL_API_X_MASK ,
  OCL_API_Z_SINGLE , OCL_API_Z_SINGLE_WIDE , OCL_API_PHASE_PARITY , OCL_API_ROL ,
  OCL_API_APPROXCOMPARE , OCL_API_NORMALIZE , OCL_API_NORMALIZE_WIDE , OCL_API_UPDATENORM ,
  OCL_API_APPLYM , OCL_API_APPLYMREG , OCL_API_CLEARBUFFER , OCL_API_SHUFFLEBUFFERS ,
  OCL_API_INC , OCL_API_CINC , OCL_API_INCDECC , OCL_API_INCS ,
  OCL_API_INCDECSC_1 , OCL_API_INCDECSC_2 , OCL_API_MUL , OCL_API_DIV ,
  OCL_API_MULMODN_OUT , OCL_API_IMULMODN_OUT , OCL_API_POWMODN_OUT , OCL_API_CMUL ,
  OCL_API_CDIV , OCL_API_CMULMODN_OUT , OCL_API_CIMULMODN_OUT , OCL_API_CPOWMODN_OUT ,
  OCL_API_FULLADD , OCL_API_IFULLADD , OCL_API_INDEXEDLDA , OCL_API_INDEXEDADC ,
  OCL_API_INDEXEDSBC , OCL_API_HASH , OCL_API_CPHASEFLIPIFLESS , OCL_API_PHASEFLIPIFLESS ,
  OCL_API_INCBCD , OCL_API_INCDECBCDC
}
 
enum  SPECIAL_2X2 {
  NONE = 0 , PAULIX , PAULIZ , INVERT ,
  PHASE
}
 
enum  Pauli { PauliI = 0 , PauliX = 1 , PauliY = 3 , PauliZ = 2 }
 Enumerated list of Pauli bases. More...
 
enum  QInterfaceEngine {
  QINTERFACE_CPU = 0 , QINTERFACE_OPENCL , QINTERFACE_CUDA , QINTERFACE_HYBRID ,
  QINTERFACE_BDT , QINTERFACE_BDT_HYBRID , QINTERFACE_STABILIZER , QINTERFACE_STABILIZER_HYBRID ,
  QINTERFACE_QPAGER , QINTERFACE_QUNIT , QINTERFACE_QUNIT_MULTI , QINTERFACE_QUNIT_CLIFFORD ,
  QINTERFACE_TENSOR_NETWORK , QINTERFACE_OPTIMAL_SCHROEDINGER = QINTERFACE_CPU , QINTERFACE_OPTIMAL_BASE = QINTERFACE_CPU , QINTERFACE_OPTIMAL = QINTERFACE_QUNIT ,
  QINTERFACE_OPTIMAL_MULTI = QINTERFACE_QUNIT_MULTI , QINTERFACE_MAX
}
 Enumerated list of supported engines. More...
 
enum  QNeuronActivationFn {
  Sigmoid = 0 , ReLU = 1 , GeLU = 2 , Generalized_Logistic = 3 ,
  Leaky_ReLU = 4
}
 Enumerated list of activation functions. More...
 

Functions

complex2 mtrxColShuff (const complex2 &mtrxCol)
 
complex2 matrixMul (const complex2 &mtrxCol1, const complex2 &mtrxCol2, const complex2 &mtrxCol1Shuff, const complex2 &mtrxCol2Shuff, const complex2 &qubit)
 
complex2 matrixMul (const float &nrm, const complex2 &mtrxCol1, const complex2 &mtrxCol2, const complex2 &mtrxCol1Shuff, const complex2 &mtrxCol2Shuff, const complex2 &qubit)
 
complex2 operator* (const double &lhs, const complex2 &rhs)
 
double norm (const complex2 &c)
 
complex2 operator* (const float &lhs, const complex2 &rhs)
 
bitCapInt pow2 (const bitLenInt &p)
 
bitCapIntOcl pow2Ocl (const bitLenInt &p)
 
bitCapInt pow2Mask (const bitLenInt &p)
 
bitCapIntOcl pow2MaskOcl (const bitLenInt &p)
 
bitLenInt log2 (bitCapInt n)
 
bitCapInt bitSlice (const bitLenInt &bit, const bitCapInt &source)
 
bitCapIntOcl bitSliceOcl (const bitLenInt &bit, const bitCapIntOcl &source)
 
bitCapInt bitRegMask (const bitLenInt &start, const bitLenInt &length)
 
bitCapIntOcl bitRegMaskOcl (const bitLenInt &start, const bitLenInt &length)
 
bool isPowerOfTwo (const bitCapInt &x)
 
bool isBadBitRange (const bitLenInt &start, const bitLenInt &length, const bitLenInt &qubitCount)
 
bool isBadPermRange (const bitCapIntOcl &start, const bitCapIntOcl &length, const bitCapIntOcl &maxQPowerOcl)
 
void ThrowIfQbIdArrayIsBad (const std::vector< bitLenInt > &controls, const bitLenInt &qubitCount, std::string message)
 
unsigned char * cl_alloc (size_t ucharCount)
 
void cl_free (void *toFree)
 
void mul2x2 (complex const *left, complex const *right, complex *out)
 
void exp2x2 (complex const *matrix2x2, complex *outMatrix2x2)
 
void log2x2 (complex const *matrix2x2, complex *outMatrix2x2)
 
void inv2x2 (complex const *matrix2x2, complex *outMatrix2x2)
 
bool isOverflowAdd (bitCapInt inOutInt, bitCapInt inInt, const bitCapInt &signMask, const bitCapInt &lengthPower)
 Check if an addition with overflow sets the flag. More...
 
bool isOverflowSub (bitCapInt inOutInt, bitCapInt inInt, const bitCapInt &signMask, const bitCapInt &lengthPower)
 Check if a subtraction with overflow sets the flag. More...
 
bitCapInt pushApartBits (const bitCapInt &perm, const std::vector< bitCapInt > &skipPowers)
 
bitCapInt intPow (bitCapInt base, bitCapInt power)
 
bitCapIntOcl intPowOcl (bitCapIntOcl base, bitCapIntOcl power)
 
bool operator== (QBdtNodeInterfacePtr lhs, QBdtNodeInterfacePtr rhs)
 
bool operator!= (QBdtNodeInterfacePtr lhs, QBdtNodeInterfacePtr rhs)
 
std::ostream & operator<< (std::ostream &os, const QCircuitGatePtr g)
 
std::istream & operator>> (std::istream &os, QCircuitGatePtr &g)
 
std::ostream & operator<< (std::ostream &os, const QCircuitPtr g)
 
std::istream & operator>> (std::istream &os, QCircuitPtr &g)
 
template<class BidirectionalIterator >
void reverse (BidirectionalIterator first, BidirectionalIterator last, bitCapInt stride)
 
template<class BidirectionalIterator >
void rotate (BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, bitCapInt stride)
 
template<typename... Ts>
QInterfacePtr CreateQuantumInterface (QInterfaceEngine engine1, QInterfaceEngine engine2, QInterfaceEngine engine3, Ts... args)
 Factory method to create specific engine implementations. More...
 
template<typename... Ts>
QInterfacePtr CreateQuantumInterface (QInterfaceEngine engine1, QInterfaceEngine engine2, Ts... args)
 
template<typename... Ts>
QInterfacePtr CreateQuantumInterface (QInterfaceEngine engine, Ts... args)
 
template<typename... Ts>
QInterfacePtr CreateQuantumInterface (std::vector< QInterfaceEngine > engines, Ts... args)
 
template<typename... Ts>
QInterfacePtr CreateArrangedLayers (bool md, bool sd, bool sh, bool bdt, bool pg, bool tn, bool hy, bool oc, Ts... args)
 
void _expLog2x2 (complex const *matrix2x2, complex *outMatrix2x2, bool isExp)
 
std::vector< std::string > _readDirectoryFileNames (const std::string &path)
 
std::string _getDefaultRandomNumberFilePath ()
 
void CL_CALLBACK _PopQueue (cl_event event, cl_int type, void *user_data)
 
 REG_GATE_1 (H)
 Apply Hadamard gate to each bit in "length," starting from bit index "start". More...
 
real1_f dyadAngle (int numerator, int denomPower)
 
std::ostream & operator<< (std::ostream &os, const QStabilizerPtr s)
 
std::istream & operator>> (std::istream &is, const QStabilizerPtr s)
 
std::ostream & operator<< (std::ostream &os, const QStabilizerHybridPtr s)
 
std::istream & operator>> (std::istream &is, const QStabilizerHybridPtr s)
 
std::ostream & operator<< (std::ostream &os, const QUnitCliffordPtr s)
 
std::istream & operator>> (std::istream &is, const QUnitCliffordPtr s)
 

Variables

static const __m256d SIGNMASK = _mm256_set_pd(-0.0, -0.0, -0.0, -0.0)
 
static const __m128 SIGNMASK = _mm_set_ps(0.0f, -0.0f, 0.0f, -0.0f)
 
const real1_f _qrack_qbdt_sep_thresh = FP_NORM_EPSILON
 
constexpr uint8_t ONE_BCI = 1U
 
const real1 ZERO_R1 = (real1)0.0f
 
constexpr real1_f ZERO_R1_F = 0.0f
 
const real1 ONE_R1 = (real1)1.0f
 
constexpr real1_f ONE_R1_F = 1.0f
 
const real1 REAL1_DEFAULT_ARG = (real1)-999.0f
 
const real1 REAL1_EPSILON = (real1)0.00000762939f
 
const real1 PI_R1 = (real1)M_PI
 
const real1 SQRT2_R1 = (real1)M_SQRT2
 
const real1 SQRT1_2_R1 = (real1)M_SQRT1_2
 
QRACK_CONST complex ONE_CMPLX = complex(ONE_R1, ZERO_R1)
 
QRACK_CONST complex ZERO_CMPLX = complex(ZERO_R1, ZERO_R1)
 
QRACK_CONST complex I_CMPLX = complex(ZERO_R1, ONE_R1)
 
QRACK_CONST complex CMPLX_DEFAULT_ARG = complex(REAL1_DEFAULT_ARG, REAL1_DEFAULT_ARG)
 
QRACK_CONST real1 FP_NORM_EPSILON = std::numeric_limits<real1>::epsilon()
 
QRACK_CONST real1_f TRYDECOMPOSE_EPSILON = (real1_f)(8 * FP_NORM_EPSILON)
 
constexpr real1_f FP_NORM_EPSILON_F = std::numeric_limits<real1_f>::epsilon()
 
QRACK_CONST complex C_SQRT1_2 = complex(SQRT1_2_R1, ZERO_R1)
 
QRACK_CONST complex C_SQRT_I = complex(SQRT1_2_R1, SQRT1_2_R1)
 
QRACK_CONST complex C_SQRT_N_I = complex(SQRT1_2_R1, -SQRT1_2_R1)
 
QRACK_CONST complex I_CMPLX_NEG = complex(ZERO_R1, -ONE_R1)
 
QRACK_CONST complex C_SQRT1_2_NEG = complex(-SQRT1_2_R1, ZERO_R1)
 

Typedef Documentation

◆ BdtFunc

typedef std::function<bitCapInt(const bitCapInt&)> Qrack::BdtFunc

◆ BitOp

typedef std::shared_ptr<complex> Qrack::BitOp

◆ BufferPtr

typedef std::shared_ptr< cl::Buffer > Qrack::BufferPtr

◆ cl_map_flags

typedef unsigned long Qrack::cl_map_flags

◆ cl_mem_flags

typedef unsigned long Qrack::cl_mem_flags

◆ complex

typedef std::complex<half_float::half> Qrack::complex

◆ DeviceContextPtr

typedef std::shared_ptr<OCLDeviceContext> Qrack::DeviceContextPtr

◆ DispatchFn

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

◆ EventVec

typedef std::vector<cl::Event> Qrack::EventVec

◆ EventVecPtr

typedef std::shared_ptr<EventVec> Qrack::EventVecPtr

◆ Hamiltonian

typedef std::vector<HamiltonianOpPtr> Qrack::Hamiltonian

◆ HamiltonianOpPtr

typedef std::shared_ptr<HamiltonianOp> Qrack::HamiltonianOpPtr

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.

To specify Hamiltonians with interaction terms, arbitrary sets of control bits may be specified for each term, in which case the term is acted only if the (superposable) control bits are true. The "antiCtrled" bool flips the overall convention, such that the term is acted only if all control bits are false. Additionally, for a combination of control bits and "anti-control" bits, an array of booleans, "ctrlToggles," of length "ctrlLen" may be specified that flips the activation state for each control bit, (relative the global anti- on/off convention,) without altering the state of the control bits.

The point of this "toggle" behavior is to allow enumeration of arbitrary local Hamiltonian terms with permutations of a set of control bits. For example, a Hamiltonian might represent an array of local electromagnetic potential wells. If there are 4 wells, each with independent potentials, control "toggles" could be used on two control bits, to enumerate all four permutations of two control bits with four different local Hamiltonian terms.

Warning
Hamiltonian components might not commute.

As a general point of linear algebra, where A and B are linear operators, e^{i * (A + B) * t} = e^{i * A * t} * e^{i * B * t} might NOT hold, if the operators A and B do not commute. As a rule of thumb, A will commute with B at least in the case that A and B act on entirely different sets of qubits. However, for defining the intended Hamiltonian, the programmer can be guaranteed that the exponential factors will be applied right-to-left, by left multiplication, in the order e^(i * H_(N - 1) * t) * e^(i * H_(N - 2) * t) * ... e^(i * H_0 * t) * |psi>. (For example, if A and B are single bit gates acting on the same bit, form their composition into one gate by the intended right-to-left fusion and apply them as a single HamiltonianOp.)

◆ IncrementFunc

typedef std::function<bitCapIntOcl(const bitCapIntOcl&)> Qrack::IncrementFunc

◆ MpsShardPtr

typedef std::shared_ptr<MpsShard> Qrack::MpsShardPtr

◆ ParallelFunc

typedef std::function<void(const bitCapIntOcl&, const unsigned& cpu)> Qrack::ParallelFunc

◆ ParallelFuncBdt

typedef std::function<void(const bitCapInt&, const unsigned& cpu)> Qrack::ParallelFuncBdt

◆ PhaseShardPtr

typedef std::shared_ptr<PhaseShard> Qrack::PhaseShardPtr

◆ PoolItemPtr

typedef std::shared_ptr< PoolItem > Qrack::PoolItemPtr

◆ QAluPtr

typedef std::shared_ptr<QAlu> Qrack::QAluPtr

◆ QBdtHybridPtr

typedef std::shared_ptr<QBdtHybrid> Qrack::QBdtHybridPtr

◆ QBdtNodeInterfacePtr

◆ QBdtNodePtr

typedef std::shared_ptr<QBdtNode> Qrack::QBdtNodePtr

◆ QBdtPtr

typedef std::shared_ptr<QBdt> Qrack::QBdtPtr

◆ QCircuitGatePtr

typedef std::shared_ptr<QCircuitGate> Qrack::QCircuitGatePtr

◆ QCircuitPtr

typedef std::shared_ptr<QCircuit> Qrack::QCircuitPtr

◆ QEngineCPUPtr

typedef std::shared_ptr<QEngineCPU> Qrack::QEngineCPUPtr

◆ QEngineCUDAPtr

typedef std::shared_ptr<QEngineCUDA> Qrack::QEngineCUDAPtr

◆ QEngineOCLPtr

typedef std::shared_ptr<QEngineOCL> Qrack::QEngineOCLPtr

◆ QEnginePtr

typedef std::shared_ptr< QEngine > Qrack::QEnginePtr

◆ QEngineShardPtr

◆ QHybridPtr

typedef std::shared_ptr<QHybrid> Qrack::QHybridPtr

◆ QInterfacePtr

typedef std::shared_ptr<QInterface> Qrack::QInterfacePtr

◆ QNeuronPtr

typedef std::shared_ptr<QNeuron> Qrack::QNeuronPtr

◆ QPagerPtr

typedef std::shared_ptr<QPager> Qrack::QPagerPtr

◆ QParityPtr

typedef std::shared_ptr<QParity> Qrack::QParityPtr

◆ QStabilizerHybridPtr

◆ QStabilizerPtr

typedef std::shared_ptr<QStabilizer> Qrack::QStabilizerPtr

◆ QTensorNetworkPtr

typedef std::shared_ptr<QTensorNetwork> Qrack::QTensorNetworkPtr

◆ QUnitCliffordPtr

typedef std::shared_ptr<QUnitClifford> Qrack::QUnitCliffordPtr

◆ QUnitMultiPtr

typedef std::shared_ptr<QUnitMulti> Qrack::QUnitMultiPtr

◆ QUnitPtr

typedef std::shared_ptr<QUnit> Qrack::QUnitPtr

◆ real1

◆ real1_f

typedef float Qrack::real1_f

◆ real1_s

typedef float Qrack::real1_s

◆ ShardToPhaseMap

◆ StateVectorArrayPtr

typedef std::shared_ptr<StateVectorArray> Qrack::StateVectorArrayPtr

◆ StateVectorPtr

typedef std::shared_ptr<StateVector> Qrack::StateVectorPtr

◆ StateVectorSparsePtr

Enumeration Type Documentation

◆ OCLAPI

Enumerator
OCL_API_UNKNOWN 
OCL_API_APPLY2X2 
OCL_API_APPLY2X2_SINGLE 
OCL_API_APPLY2X2_NORM_SINGLE 
OCL_API_APPLY2X2_DOUBLE 
OCL_API_APPLY2X2_WIDE 
OCL_API_APPLY2X2_SINGLE_WIDE 
OCL_API_APPLY2X2_NORM_SINGLE_WIDE 
OCL_API_APPLY2X2_DOUBLE_WIDE 
OCL_API_PHASE_SINGLE 
OCL_API_PHASE_SINGLE_WIDE 
OCL_API_INVERT_SINGLE 
OCL_API_INVERT_SINGLE_WIDE 
OCL_API_UNIFORMLYCONTROLLED 
OCL_API_UNIFORMPARITYRZ 
OCL_API_UNIFORMPARITYRZ_NORM 
OCL_API_CUNIFORMPARITYRZ 
OCL_API_COMPOSE 
OCL_API_COMPOSE_WIDE 
OCL_API_COMPOSE_MID 
OCL_API_DECOMPOSEPROB 
OCL_API_DECOMPOSEAMP 
OCL_API_DISPOSEPROB 
OCL_API_DISPOSE 
OCL_API_PROB 
OCL_API_CPROB 
OCL_API_PROBREG 
OCL_API_PROBREGALL 
OCL_API_PROBMASK 
OCL_API_PROBMASKALL 
OCL_API_PROBPARITY 
OCL_API_FORCEMPARITY 
OCL_API_EXPPERM 
OCL_API_X_SINGLE 
OCL_API_X_SINGLE_WIDE 
OCL_API_X_MASK 
OCL_API_Z_SINGLE 
OCL_API_Z_SINGLE_WIDE 
OCL_API_PHASE_PARITY 
OCL_API_ROL 
OCL_API_APPROXCOMPARE 
OCL_API_NORMALIZE 
OCL_API_NORMALIZE_WIDE 
OCL_API_UPDATENORM 
OCL_API_APPLYM 
OCL_API_APPLYMREG 
OCL_API_CLEARBUFFER 
OCL_API_SHUFFLEBUFFERS 
OCL_API_INC 
OCL_API_CINC 
OCL_API_INCDECC 
OCL_API_INCS 
OCL_API_INCDECSC_1 
OCL_API_INCDECSC_2 
OCL_API_MUL 
OCL_API_DIV 
OCL_API_MULMODN_OUT 
OCL_API_IMULMODN_OUT 
OCL_API_POWMODN_OUT 
OCL_API_CMUL 
OCL_API_CDIV 
OCL_API_CMULMODN_OUT 
OCL_API_CIMULMODN_OUT 
OCL_API_CPOWMODN_OUT 
OCL_API_FULLADD 
OCL_API_IFULLADD 
OCL_API_INDEXEDLDA 
OCL_API_INDEXEDADC 
OCL_API_INDEXEDSBC 
OCL_API_HASH 
OCL_API_CPHASEFLIPIFLESS 
OCL_API_PHASEFLIPIFLESS 
OCL_API_INCBCD 
OCL_API_INCDECBCDC 

◆ Pauli

Enumerated list of Pauli bases.

Enumerator
PauliI 

Pauli Identity operator. Corresponds to Q# constant "PauliI.".

PauliX 

Pauli X operator. Corresponds to Q# constant "PauliX.".

PauliY 

Pauli Y operator. Corresponds to Q# constant "PauliY.".

PauliZ 

Pauli Z operator. Corresponds to Q# constant "PauliZ.".

◆ QInterfaceEngine

Enumerated list of supported engines.

Use QINTERFACE_OPTIMAL for the best supported engine.

Enumerator
QINTERFACE_CPU 

Create a QEngineCPU leveraging only local CPU and memory resources.

QINTERFACE_OPENCL 

Create a QEngineOCL, leveraging OpenCL hardware to increase the speed of certain calculations.

QINTERFACE_CUDA 

Create a QEngineCUDA, leveraging CUDA hardware to increase the speed of certain calculations.

QINTERFACE_HYBRID 

Create a QHybrid, switching between QEngineCPU and QEngineOCL as efficient.

QINTERFACE_BDT 

Create a QBinaryDecisionTree, (CPU-based).

QINTERFACE_BDT_HYBRID 

Create a QBinaryDecisionTree, (CPU-based).

QINTERFACE_STABILIZER 

Create a QStabilizer, limited to Clifford/Pauli operations, but efficient.

QINTERFACE_STABILIZER_HYBRID 

Create a QStabilizerHybrid, switching between a QStabilizer and a QHybrid as efficient.

QINTERFACE_QPAGER 

Create a QPager, which breaks up the work of a QEngine into equally sized "pages.".

QINTERFACE_QUNIT 

Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that's needed for any given operation based on the entanglement of the bits involved.

This, combined with QINTERFACE_OPTIMAL, is the recommended object to use as a library consumer.

QINTERFACE_QUNIT_MULTI 

Create a QUnitMulti, which distributes the explicitly separated "shards" of a QUnit across available OpenCL devices.

QINTERFACE_QUNIT_CLIFFORD 

Clifford-specialized QUnit.

QINTERFACE_TENSOR_NETWORK 

Circuit-simplification layer, with (optional) recourse to cuTensorNetwork.

QINTERFACE_OPTIMAL_SCHROEDINGER 
QINTERFACE_OPTIMAL_BASE 
QINTERFACE_OPTIMAL 
QINTERFACE_OPTIMAL_MULTI 
QINTERFACE_MAX 

◆ QNeuronActivationFn

Enumerated list of activation functions.

Enumerator
Sigmoid 

Default.

ReLU 

Rectified linear.

GeLU 

Gaussian linear.

Generalized_Logistic 

Version of (default) "Sigmoid" with tunable sharpness.

Leaky_ReLU 

Leaky rectified linear.

◆ SPECIAL_2X2

Enumerator
NONE 
PAULIX 
PAULIZ 
INVERT 
PHASE 

Function Documentation

◆ _expLog2x2()

void Qrack::_expLog2x2 ( complex const *  matrix2x2,
complex outMatrix2x2,
bool  isExp 
)

◆ _getDefaultRandomNumberFilePath()

std::string Qrack::_getDefaultRandomNumberFilePath ( )

◆ _PopQueue()

void CL_CALLBACK Qrack::_PopQueue ( cl_event  event,
cl_int  type,
void *  user_data 
)

◆ _readDirectoryFileNames()

std::vector<std::string> Qrack::_readDirectoryFileNames ( const std::string &  path)

◆ bitRegMask()

bitCapInt Qrack::bitRegMask ( const bitLenInt start,
const bitLenInt length 
)
inline

◆ bitRegMaskOcl()

bitCapIntOcl Qrack::bitRegMaskOcl ( const bitLenInt start,
const bitLenInt length 
)
inline

◆ bitSlice()

bitCapInt Qrack::bitSlice ( const bitLenInt bit,
const bitCapInt source 
)
inline

◆ bitSliceOcl()

bitCapIntOcl Qrack::bitSliceOcl ( const bitLenInt bit,
const bitCapIntOcl source 
)
inline

◆ cl_alloc()

unsigned char * Qrack::cl_alloc ( size_t  ucharCount)

◆ cl_free()

void Qrack::cl_free ( void *  toFree)

◆ CreateArrangedLayers()

template<typename... Ts>
QInterfacePtr Qrack::CreateArrangedLayers ( bool  md,
bool  sd,
bool  sh,
bool  bdt,
bool  pg,
bool  tn,
bool  hy,
bool  oc,
Ts...  args 
)

◆ CreateQuantumInterface() [1/4]

template<typename... Ts>
QInterfacePtr Qrack::CreateQuantumInterface ( QInterfaceEngine  engine,
Ts...  args 
)

◆ CreateQuantumInterface() [2/4]

template<typename... Ts>
QInterfacePtr Qrack::CreateQuantumInterface ( QInterfaceEngine  engine1,
QInterfaceEngine  engine2,
QInterfaceEngine  engine3,
Ts...  args 
)

Factory method to create specific engine implementations.

◆ CreateQuantumInterface() [3/4]

template<typename... Ts>
QInterfacePtr Qrack::CreateQuantumInterface ( QInterfaceEngine  engine1,
QInterfaceEngine  engine2,
Ts...  args 
)

◆ CreateQuantumInterface() [4/4]

template<typename... Ts>
QInterfacePtr Qrack::CreateQuantumInterface ( std::vector< QInterfaceEngine engines,
Ts...  args 
)

◆ dyadAngle()

real1_f Qrack::dyadAngle ( int  numerator,
int  denomPower 
)
inline

◆ exp2x2()

void Qrack::exp2x2 ( complex const *  matrix2x2,
complex outMatrix2x2 
)

◆ intPow()

bitCapInt Qrack::intPow ( bitCapInt  base,
bitCapInt  power 
)

◆ intPowOcl()

bitCapIntOcl Qrack::intPowOcl ( bitCapIntOcl  base,
bitCapIntOcl  power 
)

◆ inv2x2()

void Qrack::inv2x2 ( complex const *  matrix2x2,
complex outMatrix2x2 
)

◆ isBadBitRange()

bool Qrack::isBadBitRange ( const bitLenInt start,
const bitLenInt length,
const bitLenInt qubitCount 
)
inline

◆ isBadPermRange()

bool Qrack::isBadPermRange ( const bitCapIntOcl start,
const bitCapIntOcl length,
const bitCapIntOcl maxQPowerOcl 
)
inline

◆ isOverflowAdd()

bool Qrack::isOverflowAdd ( bitCapInt  inOutInt,
bitCapInt  inInt,
const bitCapInt signMask,
const bitCapInt lengthPower 
)

Check if an addition with overflow sets the flag.

◆ isOverflowSub()

bool Qrack::isOverflowSub ( bitCapInt  inOutInt,
bitCapInt  inInt,
const bitCapInt signMask,
const bitCapInt lengthPower 
)

Check if a subtraction with overflow sets the flag.

◆ isPowerOfTwo()

bool Qrack::isPowerOfTwo ( const bitCapInt x)
inline

◆ log2()

bitLenInt Qrack::log2 ( bitCapInt  n)
inline

◆ log2x2()

void Qrack::log2x2 ( complex const *  matrix2x2,
complex outMatrix2x2 
)

◆ matrixMul() [1/2]

complex2 Qrack::matrixMul ( const complex2 mtrxCol1,
const complex2 mtrxCol2,
const complex2 mtrxCol1Shuff,
const complex2 mtrxCol2Shuff,
const complex2 qubit 
)
inline

◆ matrixMul() [2/2]

complex2 Qrack::matrixMul ( const float &  nrm,
const complex2 mtrxCol1,
const complex2 mtrxCol2,
const complex2 mtrxCol1Shuff,
const complex2 mtrxCol2Shuff,
const complex2 qubit 
)
inline

◆ mtrxColShuff()

complex2 Qrack::mtrxColShuff ( const complex2 mtrxCol)
inline

◆ mul2x2()

void Qrack::mul2x2 ( complex const *  left,
complex const *  right,
complex out 
)

◆ norm()

float Qrack::norm ( const complex2 c)
inline

◆ operator!=()

bool Qrack::operator!= ( QBdtNodeInterfacePtr  lhs,
QBdtNodeInterfacePtr  rhs 
)

◆ operator*() [1/2]

complex2 Qrack::operator* ( const double &  lhs,
const complex2 rhs 
)
inline

◆ operator*() [2/2]

complex2 Qrack::operator* ( const float &  lhs,
const complex2 rhs 
)
inline

◆ operator<<() [1/5]

std::ostream & Qrack::operator<< ( std::ostream &  os,
const QCircuitGatePtr  g 
)

◆ operator<<() [2/5]

std::ostream & Qrack::operator<< ( std::ostream &  os,
const QCircuitPtr  g 
)

◆ operator<<() [3/5]

std::ostream& Qrack::operator<< ( std::ostream &  os,
const QStabilizerHybridPtr  s 
)

◆ operator<<() [4/5]

std::ostream& Qrack::operator<< ( std::ostream &  os,
const QStabilizerPtr  s 
)

◆ operator<<() [5/5]

std::ostream& Qrack::operator<< ( std::ostream &  os,
const QUnitCliffordPtr  s 
)

◆ operator==()

bool Qrack::operator== ( QBdtNodeInterfacePtr  lhs,
QBdtNodeInterfacePtr  rhs 
)

◆ operator>>() [1/5]

std::istream& Qrack::operator>> ( std::istream &  is,
const QStabilizerHybridPtr  s 
)

◆ operator>>() [2/5]

std::istream& Qrack::operator>> ( std::istream &  is,
const QStabilizerPtr  s 
)

◆ operator>>() [3/5]

std::istream& Qrack::operator>> ( std::istream &  is,
const QUnitCliffordPtr  s 
)

◆ operator>>() [4/5]

std::istream & Qrack::operator>> ( std::istream &  os,
QCircuitGatePtr g 
)

◆ operator>>() [5/5]

std::istream & Qrack::operator>> ( std::istream &  os,
QCircuitPtr g 
)

◆ pow2()

bitCapInt Qrack::pow2 ( const bitLenInt p)
inline

◆ pow2Mask()

bitCapInt Qrack::pow2Mask ( const bitLenInt p)
inline

◆ pow2MaskOcl()

bitCapIntOcl Qrack::pow2MaskOcl ( const bitLenInt p)
inline

◆ pow2Ocl()

bitCapIntOcl Qrack::pow2Ocl ( const bitLenInt p)
inline

◆ pushApartBits()

bitCapInt Qrack::pushApartBits ( const bitCapInt perm,
const std::vector< bitCapInt > &  skipPowers 
)

◆ REG_GATE_1()

Qrack::REG_GATE_1 ( H  )

Apply Hadamard gate to each bit in "length," starting from bit index "start".

◆ reverse()

template<class BidirectionalIterator >
void Qrack::reverse ( BidirectionalIterator  first,
BidirectionalIterator  last,
bitCapInt  stride 
)

◆ rotate()

template<class BidirectionalIterator >
void Qrack::rotate ( BidirectionalIterator  first,
BidirectionalIterator  middle,
BidirectionalIterator  last,
bitCapInt  stride 
)

◆ ThrowIfQbIdArrayIsBad()

void Qrack::ThrowIfQbIdArrayIsBad ( const std::vector< bitLenInt > &  controls,
const bitLenInt qubitCount,
std::string  message 
)
inline

Variable Documentation

◆ _qrack_qbdt_sep_thresh

const real1_f Qrack::_qrack_qbdt_sep_thresh = FP_NORM_EPSILON

◆ C_SQRT1_2

◆ C_SQRT1_2_NEG

QRACK_CONST complex Qrack::C_SQRT1_2_NEG = complex(-SQRT1_2_R1, ZERO_R1)

◆ C_SQRT_I

◆ C_SQRT_N_I

◆ CMPLX_DEFAULT_ARG

◆ FP_NORM_EPSILON

QRACK_CONST real1 Qrack::FP_NORM_EPSILON = std::numeric_limits<real1>::epsilon()

◆ FP_NORM_EPSILON_F

constexpr real1_f Qrack::FP_NORM_EPSILON_F = std::numeric_limits<real1_f>::epsilon()
constexpr

◆ I_CMPLX

◆ I_CMPLX_NEG

QRACK_CONST complex Qrack::I_CMPLX_NEG = complex(ZERO_R1, -ONE_R1)

◆ ONE_BCI

constexpr uint8_t Qrack::ONE_BCI = 1U
constexpr

◆ ONE_CMPLX

QRACK_CONST complex Qrack::ONE_CMPLX = complex(ONE_R1, ZERO_R1)

◆ ONE_R1

const real1 Qrack::ONE_R1 = (real1)1.0f

◆ ONE_R1_F

constexpr real1_f Qrack::ONE_R1_F = 1.0f
constexpr

◆ PI_R1

const real1 Qrack::PI_R1 = (real1)M_PI

◆ REAL1_DEFAULT_ARG

const real1 Qrack::REAL1_DEFAULT_ARG = (real1)-999.0f

◆ REAL1_EPSILON

const real1 Qrack::REAL1_EPSILON = (real1)0.00000762939f

◆ SIGNMASK [1/2]

const __m256d Qrack::SIGNMASK = _mm256_set_pd(-0.0, -0.0, -0.0, -0.0)
static

◆ SIGNMASK [2/2]

const __m128 Qrack::SIGNMASK = _mm_set_ps(0.0f, -0.0f, 0.0f, -0.0f)
static

◆ SQRT1_2_R1

const real1 Qrack::SQRT1_2_R1 = (real1)M_SQRT1_2

◆ SQRT2_R1

const real1 Qrack::SQRT2_R1 = (real1)M_SQRT2

◆ TRYDECOMPOSE_EPSILON

QRACK_CONST real1_f Qrack::TRYDECOMPOSE_EPSILON = (real1_f)(8 * FP_NORM_EPSILON)

◆ ZERO_CMPLX

QRACK_CONST complex Qrack::ZERO_CMPLX = complex(ZERO_R1, ZERO_R1)

◆ ZERO_R1

const real1 Qrack::ZERO_R1 = (real1)0.0f

◆ ZERO_R1_F

constexpr real1_f Qrack::ZERO_R1_F = 0.0f
constexpr