57 qbdt->GetQuantumState(sv.get());
59 engine->GetQuantumState(sv.get());
61 nEngine->SetQuantumState(sv.get());
63 qbdt = std::dynamic_pointer_cast<QBdt>(nEngine);
67 engine = std::dynamic_pointer_cast<QEngine>(nEngine);
86 const double threshold = getenv(
"QRACK_QBDT_HYBRID_THRESHOLD")
87 ? std::stod(getenv(
"QRACK_QBDT_HYBRID_THRESHOLD"))
107 bool randomGlobalPhase =
true,
bool useHostMem =
false, int64_t deviceId = -1,
bool useHardwareRNG =
true,
108 bool useSparseStateVec =
false,
real1_f norm_thresh =
REAL1_EPSILON, std::vector<int64_t> devList = {},
114 bool useHostMem =
false, int64_t deviceId = -1,
bool useHardwareRNG =
true,
bool useSparseStateVec =
false,
120 bool useHostMem =
false, int64_t deviceId = -1,
bool useHardwareRNG =
true,
bool useSparseStateVec =
false,
124 useHostMem, deviceId, useHardwareRNG, useSparseStateVec, norm_thresh, devList, qubitThreshold,
145 return qbdt->ProbReg(start, length, permutation);
148 return engine->ProbReg(start, length, permutation);
155 toCopy->SwitchMode(!
engine);
157 return engine->Compose(toCopy->engine);
169 toCopy->SwitchMode(!
engine);
171 return engine->Compose(toCopy->engine, start);
181 return Compose(std::dynamic_pointer_cast<QBdtHybrid>(toCopy), start);
186 toCopy->SwitchMode(!
engine);
188 return engine->ComposeNoClone(toCopy->engine);
198 return ComposeNoClone(std::dynamic_pointer_cast<QBdtHybrid>(toCopy));
207 q = std::dynamic_pointer_cast<QBdt>(
qbdt->Decompose(start, length));
210 e = std::dynamic_pointer_cast<QEngine>(
engine->Decompose(start, length));
218 Decompose(start, std::dynamic_pointer_cast<QBdtHybrid>(dest));
222 return TryDecompose(start, std::dynamic_pointer_cast<QBdtHybrid>(dest), error_tol);
227 dest->SwitchMode(
false);
228 if (
engine->TryDecompose(start, dest->engine, error_tol)) {
239 dest->SwitchMode(!
engine);
241 qbdt->Decompose(start, dest->qbdt);
244 engine->Decompose(start, dest->engine);
251 qbdt->Dispose(start, length);
254 engine->Dispose(start, length);
261 qbdt->Dispose(start, length, disposedPerm);
264 engine->Dispose(start, length, disposedPerm);
276 qbdt->Allocate(start, length);
278 engine->Allocate(start, length);
288 qbdt->SetQuantumState(inputState);
290 engine->SetQuantumState(inputState);
296 qbdt->GetQuantumState(outputState);
298 engine->GetQuantumState(outputState);
304 qbdt->GetProbs(outputProbs);
306 engine->GetProbs(outputProbs);
312 return qbdt->GetAmplitude(perm);
315 return engine->GetAmplitude(perm);
320 qbdt->SetAmplitude(perm, amp);
322 engine->SetAmplitude(perm, amp);
328 qbdt->SetPermutation(perm, phaseFac);
338 qbdt->Mtrx(mtrx, qubitIndex);
340 engine->Mtrx(mtrx, qubitIndex);
346 qbdt->Phase(topLeft, bottomRight, qubitIndex);
348 engine->Phase(topLeft, bottomRight, qubitIndex);
354 qbdt->Invert(topRight, bottomLeft, qubitIndex);
356 engine->Invert(topRight, bottomLeft, qubitIndex);
362 qbdt->MCMtrx(controls, mtrx, target);
365 engine->MCMtrx(controls, mtrx, target);
371 qbdt->MACMtrx(controls, mtrx, target);
374 engine->MACMtrx(controls, mtrx, target);
380 const complex* mtrxs,
const std::vector<bitCapInt> mtrxSkipPowers,
const bitCapInt& mtrxSkipValueMask)
383 qbdt->UniformlyControlledSingleBit(controls, qubitIndex, mtrxs, mtrxSkipPowers, mtrxSkipValueMask);
386 engine->UniformlyControlledSingleBit(controls, qubitIndex, mtrxs, mtrxSkipPowers, mtrxSkipValueMask);
401 qbdt->PhaseParity(radians, mask);
403 engine->PhaseParity(radians, mask);
410 return qbdt->CProb(control, target);
413 return engine->CProb(control, target);
418 return qbdt->ACProb(control, target);
421 return engine->ACProb(control, target);
427 qbdt->UniformParityRZ(mask, angle);
430 engine->UniformParityRZ(mask, angle);
436 qbdt->CUniformParityRZ(controls, mask, angle);
439 engine->CUniformParityRZ(controls, mask, angle);
446 qbdt->CSwap(controls, qubit1, qubit2);
449 engine->CSwap(controls, qubit1, qubit2);
455 qbdt->AntiCSwap(controls, qubit1, qubit2);
458 engine->AntiCSwap(controls, qubit1, qubit2);
464 qbdt->CSqrtSwap(controls, qubit1, qubit2);
467 engine->CSqrtSwap(controls, qubit1, qubit2);
473 qbdt->AntiCSqrtSwap(controls, qubit1, qubit2);
476 engine->AntiCSqrtSwap(controls, qubit1, qubit2);
482 qbdt->CISqrtSwap(controls, qubit1, qubit2);
485 engine->CISqrtSwap(controls, qubit1, qubit2);
491 qbdt->AntiCISqrtSwap(controls, qubit1, qubit2);
494 engine->AntiCISqrtSwap(controls, qubit1, qubit2);
501 return qbdt->ForceM(qubit, result, doForce, doApply);
504 return engine->ForceM(qubit, result, doForce, doApply);
542 qbdt->INC(toAdd, start, length);
544 engine->INC(toAdd, start, length);
550 qbdt->DEC(toSub, start, length);
552 engine->DEC(toSub, start, length);
558 qbdt->CDEC(toSub, inOutStart, length, controls);
561 engine->CDEC(toSub, inOutStart, length, controls);
567 qbdt->INCDECC(toAdd, start, length, carryIndex);
569 engine->INCDECC(toAdd, start, length, carryIndex);
575 qbdt->CINC(toAdd, inOutStart, length, controls);
578 engine->CINC(toAdd, inOutStart, length, controls);
584 qbdt->INCC(toAdd, start, length, carryIndex);
587 engine->INCC(toAdd, start, length, carryIndex);
593 qbdt->INCS(toAdd, start, length, overflowIndex);
596 engine->INCS(toAdd, start, length, overflowIndex);
602 qbdt->DECS(toAdd, start, length, overflowIndex);
605 engine->DECS(toAdd, start, length, overflowIndex);
611 engine->INCSC(toAdd, start, length, overflowIndex, carryIndex);
616 engine->INCSC(toAdd, start, length, carryIndex);
621 qbdt->DECC(toSub, start, length, carryIndex);
624 engine->DECC(toSub, start, length, carryIndex);
630 engine->DECSC(toSub, start, length, overflowIndex, carryIndex);
635 engine->DECSC(toSub, start, length, carryIndex);
641 engine->INCDECSC(toAdd, start, length, overflowIndex, carryIndex);
646 engine->INCDECSC(toAdd, start, length, carryIndex);
652 engine->INCBCD(toAdd, start, length);
657 engine->INCBCDC(toAdd, start, length, carryIndex);
662 engine->DECBCDC(toSub, start, length, carryIndex);
668 qbdt->MUL(toMul, inOutStart, carryStart, length);
670 engine->MUL(toMul, inOutStart, carryStart, length);
676 qbdt->DIV(toDiv, inOutStart, carryStart, length);
678 engine->DIV(toDiv, inOutStart, carryStart, length);
685 qbdt->MULModNOut(toMul, modN, inStart, outStart, length);
687 engine->MULModNOut(toMul, modN, inStart, outStart, length);
694 qbdt->IMULModNOut(toMul, modN, inStart, outStart, length);
696 engine->IMULModNOut(toMul, modN, inStart, outStart, length);
703 engine->POWModNOut(base, modN, inStart, outStart, length);
706 const std::vector<bitLenInt>& controls)
709 qbdt->CMUL(toMul, inOutStart, carryStart, length, controls);
712 engine->CMUL(toMul, inOutStart, carryStart, length, controls);
716 const std::vector<bitLenInt>& controls)
719 qbdt->CDIV(toDiv, inOutStart, carryStart, length, controls);
722 engine->CDIV(toDiv, inOutStart, carryStart, length, controls);
726 bitLenInt length,
const std::vector<bitLenInt>& controls)
729 qbdt->CMULModNOut(toMul, modN, inStart, outStart, length, controls);
732 engine->CMULModNOut(toMul, modN, inStart, outStart, length, controls);
736 bitLenInt length,
const std::vector<bitLenInt>& controls)
739 qbdt->CIMULModNOut(toMul, modN, inStart, outStart, length, controls);
742 engine->CIMULModNOut(toMul, modN, inStart, outStart, length, controls);
746 bitLenInt length,
const std::vector<bitLenInt>& controls)
749 engine->CPOWModNOut(base, modN, inStart, outStart, length, controls);
753 const unsigned char* values,
bool resetValue =
true)
756 return engine->IndexedLDA(indexStart, indexLength, valueStart, valueLength, values, resetValue);
759 bitLenInt carryIndex,
const unsigned char* values)
762 return engine->IndexedADC(indexStart, indexLength, valueStart, valueLength, carryIndex, values);
765 bitLenInt carryIndex,
const unsigned char* values)
768 return engine->IndexedSBC(indexStart, indexLength, valueStart, valueLength, carryIndex, values);
773 engine->Hash(start, length, values);
779 engine->CPhaseFlipIfLess(greaterPerm, start, length, flagIndex);
784 engine->PhaseFlipIfLess(greaterPerm, start, length);
791 qbdt->Swap(qubitIndex1, qubitIndex2);
793 engine->Swap(qubitIndex1, qubitIndex2);
799 qbdt->ISwap(qubitIndex1, qubitIndex2);
802 engine->ISwap(qubitIndex1, qubitIndex2);
808 qbdt->IISwap(qubitIndex1, qubitIndex2);
811 engine->IISwap(qubitIndex1, qubitIndex2);
817 qbdt->SqrtSwap(qubitIndex1, qubitIndex2);
820 engine->SqrtSwap(qubitIndex1, qubitIndex2);
826 qbdt->ISqrtSwap(qubitIndex1, qubitIndex2);
829 engine->ISqrtSwap(qubitIndex1, qubitIndex2);
835 qbdt->FSim(theta, phi, qubitIndex1, qubitIndex2);
838 engine->FSim(theta, phi, qubitIndex1, qubitIndex2);
845 return qbdt->Prob(qubitIndex);
848 return engine->Prob(qubitIndex);
861 return qbdt->ProbMask(mask, permutation);
864 return engine->ProbMask(mask, permutation);
869 return qbdt->ProbParity(mask);
872 return engine->ProbParity(mask);
877 return qbdt->ForceMParity(mask, result, doForce);
880 return engine->ForceMParity(mask, result, doForce);
886 toCompare->SwitchMode(!
engine);
888 return qbdt->SumSqrDiff(toCompare->qbdt);
891 return engine->SumSqrDiff(toCompare->engine);
897 qbdt->UpdateRunningNorm(norm_thresh);
899 engine->UpdateRunningNorm(norm_thresh);
906 qbdt->NormalizeState(nrm, norm_thresh, phaseArg);
908 engine->NormalizeState(nrm, norm_thresh, phaseArg);
915 return qbdt->ExpectationBitsAll(bits, offset);
918 return engine->ExpectationBitsAll(bits, offset);
923 return qbdt->VarianceBitsAll(bits, offset);
926 return engine->VarianceBitsAll(bits, offset);
941 return qbdt->isFinished();
944 return engine->isFinished();
963 c->qbdt = std::dynamic_pointer_cast<QBdt>(
qbdt->Clone());
965 c->SwitchMode(
false);
966 c->engine->CopyStateVec(
engine);
976 qbdt->SetDevice(dID);
986 qbdt->SetDeviceList(dIDs);
988 engine->SetDeviceList(dIDs);
998 return qbdt->GetMaxSize();
1001 return engine->GetMaxSize();
double bi_to_double(const BigInteger &in)
Definition: big_integer.hpp:483
unsigned GetConcurrencyLevel()
Definition: parallel_for.hpp:41
A "Qrack::QBdtHybrid" internally switched between Qrack::QBdt and Qrack::QHybrid to maximize entangle...
Definition: qbdthybrid.hpp:26
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...
Definition: qbdthybrid.hpp:758
QBdtHybrid(bitLenInt qBitCount, const bitCapInt &initState=ZERO_BCI, qrack_rand_gen_ptr rgp=nullptr, const complex &phaseFac=CMPLX_DEFAULT_ARG, bool doNorm=false, bool randomGlobalPhase=true, bool useHostMem=false, int64_t deviceId=-1, bool useHardwareRNG=true, bool useSparseStateVec=false, real1_f norm_thresh=REAL1_EPSILON, std::vector< int64_t > devList={}, bitLenInt qubitThreshold=0U, real1_f separation_thresh=_qrack_qunit_sep_thresh)
Definition: qbdthybrid.hpp:118
void SetDeviceList(std::vector< int64_t > dIDs)
Set the device index list, if more than one device is available.
Definition: qbdthybrid.hpp:982
bitCapInt MAll()
Measure permutation state of all coherent bits.
Definition: qbdthybrid.hpp:507
bool ForceMParity(const 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 (usual...
Definition: qbdthybrid.hpp:874
void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Swap values of two bits in register.
Definition: qbdthybrid.hpp:788
bool ForceM(bitLenInt qubit, bool result, bool doForce=true, bool doApply=true)
Act as if is a measurement was applied, except force the (usually random) result.
Definition: qbdthybrid.hpp:498
void MACMtrx(const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
Apply an arbitrary single bit unitary transformation, with arbitrary (anti-)control bits.
Definition: qbdthybrid.hpp:368
void INCSC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add a classical integer to the register, with sign and with (phase-based) carry.
Definition: qbdthybrid.hpp:613
void IMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
Inverse of multiplication modulo N by integer, (out of place)
Definition: qbdthybrid.hpp:690
real1_f ACProb(bitLenInt control, bitLenInt target)
Direct measure of bit probability to be in |1> state, if control bit is |0>.
Definition: qbdthybrid.hpp:415
void Mtrx(const complex *mtrx, bitLenInt qubitIndex)
Apply an arbitrary single bit unitary transformation.
Definition: qbdthybrid.hpp:335
void DEC(const bitCapInt &toSub, bitLenInt start, bitLenInt length)
Add integer (without sign)
Definition: qbdthybrid.hpp:547
void CDEC(const bitCapInt &toSub, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Subtract integer (without sign, with controls)
Definition: qbdthybrid.hpp:555
bitLenInt Compose(QInterfacePtr toCopy)
Combine another QInterface with this one, after the last bit index of this one.
Definition: qbdthybrid.hpp:165
void UniformParityRZ(const bitCapInt &mask, real1_f angle)
If the target qubit set parity is odd, this applies a phase factor of .
Definition: qbdthybrid.hpp:424
bitLenInt ComposeNoClone(QBdtHybridPtr toCopy)
Definition: qbdthybrid.hpp:183
real1_f VarianceBitsAll(const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Direct measure of variance of listed permutation probability.
Definition: qbdthybrid.hpp:920
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 ...
Definition: qbdthybrid.hpp:894
bitLenInt Compose(QInterfacePtr toCopy, bitLenInt start)
Compose() a QInterface peer, inserting its qubit into index order at start index.
Definition: qbdthybrid.hpp:179
void MUL(const bitCapInt &toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
Multiply by integer.
Definition: qbdthybrid.hpp:665
void INCDECSC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Common driver method behind INCSC and DECSC (without overflow flag)
Definition: qbdthybrid.hpp:643
bool TryDecompose(bitLenInt start, QInterfacePtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
Attempt to Decompose() a bit range.
Definition: qbdthybrid.hpp:220
real1_f ExpectationBitsAll(const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Get permutation expectation value of bits.
Definition: qbdthybrid.hpp:912
real1_f ProbParity(const bitCapInt &mask)
Overall probability of any odd permutation of the masked set of bits.
Definition: qbdthybrid.hpp:866
void DECSC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
Subtract a classical integer from the register, with sign and with carry.
Definition: qbdthybrid.hpp:627
QInterfacePtr MakeSimulator(bool isBdt, const bitCapInt &perm=ZERO_BCI, const complex &phaseFac=CMPLX_DEFAULT_ARG)
Definition: qbdthybrid.cpp:59
QBdtHybrid(std::vector< QInterfaceEngine > eng, bitLenInt qBitCount, const bitCapInt &initState=ZERO_BCI, qrack_rand_gen_ptr rgp=nullptr, const complex &phaseFac=CMPLX_DEFAULT_ARG, bool doNorm=false, bool randomGlobalPhase=true, bool useHostMem=false, int64_t deviceId=-1, bool useHardwareRNG=true, bool useSparseStateVec=false, real1_f norm_thresh=REAL1_EPSILON, std::vector< int64_t > devList={}, bitLenInt qubitThreshold=0U, real1_f separation_thresh=_qrack_qunit_sep_thresh)
Definition: qbdthybrid.cpp:17
void INCDECC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Common driver method behind INCC and DECC (without sign, with carry)
Definition: qbdthybrid.hpp:564
void AntiCSqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a square root of swap with arbitrary (anti) control bits.
Definition: qbdthybrid.hpp:470
void DECSC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract a classical integer from the register, with sign and with carry.
Definition: qbdthybrid.hpp:632
void SqrtSwap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Square root of Swap gate.
Definition: qbdthybrid.hpp:814
int64_t devID
Definition: qbdthybrid.hpp:36
QBdtPtr qbdt
Definition: qbdthybrid.hpp:37
void Decompose(bitLenInt start, QInterfacePtr dest)
Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".
Definition: qbdthybrid.hpp:216
virtual bitLenInt Compose(QInterfacePtr toCopy)
Combine another QInterface with this one, after the last bit index of this one.
Definition: qinterface.hpp:371
void INCSC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
Add a classical integer to the register, with sign and with carry.
Definition: qbdthybrid.hpp:608
complex phaseFactor
Definition: qbdthybrid.hpp:39
void XMask(const bitCapInt &mask)
Masked X gate.
Definition: qbdthybrid.hpp:390
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.
Definition: qbdthybrid.hpp:902
bitLenInt thresholdQubits
Definition: qbdthybrid.hpp:34
bitLenInt ComposeNoClone(QInterfacePtr toCopy)
This is a variant of Compose() for a toCopy argument that will definitely not be reused once "Compose...
Definition: qbdthybrid.hpp:196
void ISwap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Swap values of two bits in register, and apply phase factor of i if bits are different.
Definition: qbdthybrid.hpp:796
void Phase(const complex &topLeft, const complex &bottomRight, bitLenInt qubitIndex)
Apply a single bit transformation that only effects phase.
Definition: qbdthybrid.hpp:343
QInterfacePtr Decompose(bitLenInt start, bitLenInt length)
Schmidt decompose a length of qubits.
Definition: qbdthybrid.hpp:201
bitCapIntOcl GetMaxSize()
Definition: qbdthybrid.hpp:995
void CPOWModNOut(const bitCapInt &base, const 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)
Definition: qbdthybrid.hpp:745
std::vector< int64_t > deviceIDs
Definition: qbdthybrid.hpp:40
void INCS(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
Add a classical integer to the register, with sign and without carry.
Definition: qbdthybrid.hpp:590
void GetProbs(real1 *outputProbs)
Get the pure quantum state representation.
Definition: qbdthybrid.hpp:301
void DIV(const bitCapInt &toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)
Divide by integer.
Definition: qbdthybrid.hpp:673
virtual void Decompose(bitLenInt start, QInterfacePtr dest)=0
Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".
std::vector< int64_t > GetDeviceList()
Get the device index.
Definition: qbdthybrid.hpp:993
void SetConcurrency(uint32_t threadCount)
Set the number of threads in parallel for loops, per component QEngine.
Definition: qbdthybrid.hpp:132
real1_f separabilityThreshold
Definition: qbdthybrid.hpp:35
real1_f SumSqrDiff(QInterfacePtr toCompare)
Calculates (1 - <\psi_e|\psi_c>) between states |\psi_c> and |\psi_e>.
Definition: qbdthybrid.hpp:883
void X(bitLenInt q)
Definition: qbdthybrid.hpp:531
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 classi...
Definition: qbdthybrid.hpp:764
QInterfacePtr Clone()
Clone this QInterface.
Definition: qbdthybrid.hpp:956
void AntiCSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a swap with arbitrary (anti) control bits.
Definition: qbdthybrid.hpp:452
real1_f Prob(bitLenInt qubitIndex)
Direct measure of bit probability to be in |1> state.
Definition: qbdthybrid.hpp:842
void INCC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add integer (without sign, with carry)
Definition: qbdthybrid.hpp:581
void PhaseFlipIfLess(const bitCapInt &greaterPerm, bitLenInt start, bitLenInt length)
This is an expedient for an adaptive Grover's search for a function's global minimum.
Definition: qbdthybrid.hpp:781
void MCMtrx(const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
Apply an arbitrary single bit unitary transformation, with arbitrary control bits.
Definition: qbdthybrid.hpp:359
real1_f ProbMask(const bitCapInt &mask, const bitCapInt &permutation)
Direct measure of masked permutation probability.
Definition: qbdthybrid.hpp:858
void MULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
Multiplication modulo N by integer, (out of place)
Definition: qbdthybrid.hpp:681
void ISqrtSwap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Inverse square root of Swap gate.
Definition: qbdthybrid.hpp:823
bool M(bitLenInt q)
Definition: qbdthybrid.hpp:522
void SetAmplitude(const bitCapInt &perm, const complex &)
Sets the representational amplitude of a full permutation.
Definition: qbdthybrid.hpp:317
void CMUL(const bitCapInt &toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Controlled multiplication by integer.
Definition: qbdthybrid.hpp:705
void POWModNOut(const bitCapInt &base, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
Raise a classical base to a quantum power, modulo N, (out of place)
Definition: qbdthybrid.hpp:699
void Finish()
If asynchronous work is still running, block until it finishes.
Definition: qbdthybrid.hpp:929
void CUniformParityRZ(const std::vector< bitLenInt > &controls, const bitCapInt &mask, real1_f angle)
If the controls are set and the target qubit set parity is odd, this applies a phase factor of .
Definition: qbdthybrid.hpp:433
bool useHostRam
Definition: qbdthybrid.hpp:33
void INCDECSC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)
Common driver method behind INCSC and DECSC (with overflow flag)
Definition: qbdthybrid.hpp:637
real1_f SumSqrDiff(QBdtHybridPtr toCompare)
Definition: qbdthybrid.hpp:884
void INCBCD(const bitCapInt &toAdd, bitLenInt start, bitLenInt length)
Add classical BCD integer (without sign)
Definition: qbdthybrid.hpp:649
void CIMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Inverse of controlled multiplication modulo N by integer, (out of place)
Definition: qbdthybrid.hpp:735
void INC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length)
Add integer (without sign)
Definition: qbdthybrid.hpp:539
void FSim(real1_f theta, real1_f phi, bitLenInt qubitIndex1, bitLenInt qubitIndex2)
The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics)
Definition: qbdthybrid.hpp:832
bitLenInt Compose(QBdtHybridPtr toCopy)
Definition: qbdthybrid.hpp:152
void Dump()
If asynchronous work is still running, let the simulator know that it can be aborted.
Definition: qbdthybrid.hpp:947
std::vector< QInterfaceEngine > engines
Definition: qbdthybrid.hpp:41
int64_t GetDevice()
Get the device index.
Definition: qbdthybrid.hpp:992
void Dispose(bitLenInt start, bitLenInt length, const bitCapInt &disposedPerm)
Dispose a a contiguous set of qubits that are already in a permutation eigenstate.
Definition: qbdthybrid.hpp:257
void Dispose(bitLenInt start, bitLenInt length)
Minimally decompose a set of contiguous bits from the separably composed unit, and discard the separa...
Definition: qbdthybrid.hpp:247
real1_f ProbReg(bitLenInt start, bitLenInt length, const bitCapInt &permutation)
Direct measure of register permutation probability.
Definition: qbdthybrid.hpp:142
void CMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Controlled multiplication modulo N by integer, (out of place)
Definition: qbdthybrid.hpp:725
void CISqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply an inverse square root of swap with arbitrary control bits.
Definition: qbdthybrid.hpp:479
void SwitchMode(bool useBdt)
Switches between QBdt and QEngine modes.
Definition: qbdthybrid.hpp:48
bool useRDRAND
Definition: qbdthybrid.hpp:31
real1_f CProb(bitLenInt control, bitLenInt target)
Direct measure of bit probability to be in |1> state, if control bit is |1>.
Definition: qbdthybrid.hpp:407
void CSqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a square root of swap with arbitrary control bits.
Definition: qbdthybrid.hpp:461
void CheckThreshold()
Definition: qbdthybrid.hpp:71
void SetQuantumState(const complex *inputState)
Set an arbitrary pure quantum state representation.
Definition: qbdthybrid.hpp:285
void SetDevice(int64_t dID)
Set the device index, if more than one device is available.
Definition: qbdthybrid.hpp:972
void DECBCDC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract BCD integer (without sign, with carry)
Definition: qbdthybrid.hpp:659
bool TryDecompose(bitLenInt start, QBdtHybridPtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
Definition: qbdthybrid.hpp:224
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.
Definition: qbdthybrid.hpp:752
void Decompose(bitLenInt start, QBdtHybridPtr dest)
Definition: qbdthybrid.hpp:236
QEnginePtr engine
Definition: qbdthybrid.hpp:38
bool isSparse
Definition: qbdthybrid.hpp:32
void Invert(const complex &topRight, const complex &bottomLeft, bitLenInt qubitIndex)
Apply a single bit transformation that reverses bit probability and might effect phase.
Definition: qbdthybrid.hpp:351
void PhaseParity(real1_f radians, const bitCapInt &mask)
Parity phase gate.
Definition: qbdthybrid.hpp:398
void UniformlyControlledSingleBit(const std::vector< bitLenInt > &controls, bitLenInt qubitIndex, const complex *mtrxs, const std::vector< bitCapInt > mtrxSkipPowers, const bitCapInt &mtrxSkipValueMask)
Definition: qbdthybrid.hpp:379
bitLenInt Compose(QBdtHybridPtr toCopy, bitLenInt start)
Definition: qbdthybrid.hpp:166
void AntiCISqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply an inverse square root of swap with arbitrary (anti) control bits.
Definition: qbdthybrid.hpp:488
bool isFinished()
Returns "false" if asynchronous work is still running, and "true" if all previously dispatched asynch...
Definition: qbdthybrid.hpp:938
void CDIV(const bitCapInt &toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Controlled division by power of integer.
Definition: qbdthybrid.hpp:715
void DECS(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
Add a classical integer to the register, with sign and without carry.
Definition: qbdthybrid.hpp:599
complex GetAmplitude(const bitCapInt &perm)
Get the representational amplitude of a full permutation.
Definition: qbdthybrid.hpp:309
void IISwap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are differe...
Definition: qbdthybrid.hpp:805
void CINC(const bitCapInt &toAdd, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Add integer (without sign, with controls)
Definition: qbdthybrid.hpp:572
void INCBCDC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add classical BCD integer (without sign, with carry)
Definition: qbdthybrid.hpp:654
void Hash(bitLenInt start, bitLenInt length, const unsigned char *values)
Transform a length of qubit register via lookup through a hash table.
Definition: qbdthybrid.hpp:770
bitLenInt Allocate(bitLenInt start, bitLenInt length)
Allocate new "length" count of |0> state qubits at specified qubit index start position.
Definition: qbdthybrid.hpp:269
void GetQuantumState(complex *outputState)
Get the pure quantum state representation.
Definition: qbdthybrid.hpp:293
void SetPermutation(const bitCapInt &perm, const complex &phaseFac=CMPLX_DEFAULT_ARG)
Set to a specific permutation of all qubits.
Definition: qbdthybrid.hpp:325
void CPhaseFlipIfLess(const 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.
Definition: qbdthybrid.hpp:776
void DECC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract classical integer (without sign, with carry)
Definition: qbdthybrid.hpp:618
real1_f ProbAll(const bitCapInt &fullRegister)
Direct measure of full permutation probability.
Definition: qbdthybrid.hpp:850
void CSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a swap with arbitrary control bits.
Definition: qbdthybrid.hpp:443
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:141
bitCapInt maxQPower
Definition: qinterface.hpp:149
virtual void SetConcurrency(uint32_t threadsPerEngine)
Set the number of threads in parallel for loops, per component QEngine.
Definition: qinterface.hpp:275
real1 amplitudeFloor
Definition: qinterface.hpp:148
virtual bitLenInt Allocate(bitLenInt length)
Allocate new "length" count of |0> state qubits at end of qubit index position.
Definition: qinterface.hpp:477
virtual bitLenInt Compose(QInterfacePtr toCopy)
Combine another QInterface with this one, after the last bit index of this one.
Definition: qinterface.hpp:371
qrack_rand_gen_ptr rand_generator
Definition: qinterface.hpp:150
bool randGlobalPhase
Definition: qinterface.hpp:144
virtual void Decompose(bitLenInt start, QInterfacePtr dest)=0
Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:268
bitLenInt qubitCount
Definition: qinterface.hpp:146
bool doNormalize
Definition: qinterface.hpp:143
Definition: qparity.hpp:22
Half-precision floating-point type.
Definition: half.hpp:2222
virtual void UniformlyControlledSingleBit(const std::vector< bitLenInt > &controls, bitLenInt qubit, const complex *mtrxs)
Apply a "uniformly controlled" arbitrary single bit unitary transformation.
Definition: qinterface.hpp:634
virtual void X(bitLenInt qubit)
X gate.
Definition: qinterface.hpp:1091
virtual void U(bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
General unitary gate.
Definition: rotational.cpp:18
virtual bool M(bitLenInt qubit)
Measurement gate.
Definition: qinterface.hpp:1020
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
@ QINTERFACE_OPTIMAL_BASE
Definition: qinterface.hpp:124
std::shared_ptr< QEngine > QEnginePtr
Definition: qrack_types.hpp:159
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:29
const real1_f _qrack_qunit_sep_thresh
Definition: qrack_functions.hpp:249
QRACK_CONST real1_f TRYDECOMPOSE_EPSILON
Definition: qrack_types.hpp:270
bitLenInt log2Ocl(bitCapIntOcl n)
Definition: qrack_functions.hpp:95
std::shared_ptr< QBdt > QBdtPtr
Definition: qbdt.hpp:31
std::shared_ptr< QBdtHybrid > QBdtHybridPtr
Definition: qbdthybrid.hpp:18
std::complex< real1 > complex
Definition: qrack_types.hpp:136
const bitLenInt PSTRIDEPOW_DEFAULT
Definition: qrack_functions.hpp:255
QRACK_CONST real1 FP_NORM_EPSILON
Definition: qrack_types.hpp:268
QRACK_CONST real1 REAL1_EPSILON
Definition: qrack_types.hpp:208
float real1_f
Definition: qrack_types.hpp:103
QRACK_CONST complex CMPLX_DEFAULT_ARG
Definition: qrack_types.hpp:267
const bitCapInt ZERO_BCI
Definition: qrack_types.hpp:138
bitCapIntOcl pow2Ocl(const bitLenInt &p)
Definition: qrack_functions.hpp:144
uint32 log2(uint32 m, unsigned int n=32)
Fixed point binary logarithm.
Definition: half.hpp:1700
#define REAL1_DEFAULT_ARG
Definition: qrack_types.hpp:185
#define bitLenInt
Definition: qrack_types.hpp:42
#define ZERO_R1_F
Definition: qrack_types.hpp:168
#define qrack_rand_gen_ptr
Definition: qrack_types.hpp:164
#define bitCapInt
Definition: qrack_types.hpp:66
#define bitCapIntOcl
Definition: qrack_types.hpp:54
#define ONE_R1_F
Definition: qrack_types.hpp:171