Qrack  1.7
General classical-emulating-quantum development framework
qinterface.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017, 2018. All rights reserved.
4 //
5 // This is a multithreaded, universal quantum register simulation, allowing
6 // (nonphysical) register cloning and direct measurement of probability and
7 // phase, to leverage what advantages classical emulation of qubits can have.
8 //
9 // Licensed under the GNU General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/gpl-3.0.en.html
11 // for details.
12 
13 #pragma once
14 
15 #include <ctime>
16 #include <map>
17 #include <math.h>
18 #include <memory>
19 #include <random>
20 #include <vector>
21 #define bitLenInt uint8_t
22 #define bitCapInt uint64_t
23 #define bitsInByte 8
24 
25 #include "config.h"
26 
27 #if ENABLE_COMPLEX8
28 #include <complex>
29 #define complex std::complex<float>
30 #define real1 float
31 #define min_norm 1e-9
32 #else
33 #include "common/complex16simd.hpp"
34 #define complex Complex16Simd
35 #define real1 double
36 #define min_norm 1e-15
37 #endif
38 
39 namespace Qrack {
40 
41 class QInterface;
42 typedef std::shared_ptr<QInterface> QInterfacePtr;
43 
50 
60 
66 
76 
78 #if ENABLE_OPENCL
80 #else
81  QINTERFACE_OPTIMAL = QINTERFACE_CPU,
82 #endif
83 
85 };
86 
94 class QInterface {
95 protected:
98 
99  uint32_t randomSeed;
100  std::shared_ptr<std::default_random_engine> rand_generator;
101  std::uniform_real_distribution<real1> rand_distribution;
102 
103  virtual void SetQubitCount(bitLenInt qb)
104  {
105  qubitCount = qb;
106  maxQPower = 1 << qubitCount;
107  }
108 
110  virtual real1 Rand() { return rand_distribution(*rand_generator); }
111  virtual void SetRandomSeed(uint32_t seed) { rand_generator->seed(seed); }
112 
113 public:
114  QInterface(bitLenInt n, std::shared_ptr<std::default_random_engine> rgp = nullptr)
115  : rand_distribution(0.0, 1.0)
116  {
117  SetQubitCount(n);
118 
119  if (rgp == NULL) {
120  rand_generator = std::make_shared<std::default_random_engine>();
121  randomSeed = std::time(0);
122  SetRandomSeed(randomSeed);
123  } else {
124  rand_generator = rgp;
125  }
126  }
127 
129  virtual ~QInterface(){};
130 
132  int GetQubitCount() { return qubitCount; }
133 
135  int GetMaxQPower() { return maxQPower; }
136 
138  virtual void SetQuantumState(complex* inputState) = 0;
139 
141  virtual void SetPermutation(bitCapInt perm) = 0;
142 
179  virtual bitLenInt Cohere(QInterfacePtr toCopy) = 0;
180  virtual std::map<QInterfacePtr, bitLenInt> Cohere(std::vector<QInterfacePtr> toCopy) = 0;
181 
221  virtual void Decohere(bitLenInt start, bitLenInt length, QInterfacePtr dest) = 0;
222 
260  virtual void Dispose(bitLenInt start, bitLenInt length) = 0;
261 
273  virtual void ApplySingleBit(const complex* mtrx, bool doCalcNorm, bitLenInt qubitIndex) = 0;
274 
280  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target) = 0;
281 
287  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
288 
294  virtual void CNOT(bitLenInt control, bitLenInt target) = 0;
295 
301  virtual void AntiCNOT(bitLenInt control, bitLenInt target);
302 
308  virtual void H(bitLenInt qubitIndex) = 0;
309 
357  virtual bool M(bitLenInt qubitIndex) = 0;
358 
365  virtual void X(bitLenInt qubitIndex) = 0;
366 
374  virtual void Y(bitLenInt qubitIndex) = 0;
375 
382  virtual void Z(bitLenInt qubitIndex) = 0;
383 
390  virtual void CY(bitLenInt control, bitLenInt target) = 0;
391 
398  virtual void CZ(bitLenInt control, bitLenInt target) = 0;
399 
416  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
417 
423  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
424 
430  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
431 
437  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
438 
444  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
445 
451  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
452 
469  virtual void RT(real1 radians, bitLenInt qubitIndex) = 0;
470 
477  virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex);
478 
484  virtual void RX(real1 radians, bitLenInt qubitIndex) = 0;
485 
491  virtual void RXDyad(int numerator, int denomPower, bitLenInt qubitIndex);
492 
498  virtual void Exp(real1 radians, bitLenInt qubitIndex) = 0;
499 
505  virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubitIndex);
506 
512  virtual void ExpX(real1 radians, bitLenInt qubitIndex) = 0;
513 
519  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubitIndex);
520 
526  virtual void ExpY(real1 radians, bitLenInt qubitIndex) = 0;
527 
533  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubitIndex);
534 
540  virtual void ExpZ(real1 radians, bitLenInt qubitIndex) = 0;
541 
547  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubitIndex);
548 
554  virtual void CRX(real1 radians, bitLenInt control, bitLenInt target) = 0;
555 
562  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
563 
569  virtual void RY(real1 radians, bitLenInt qubitIndex) = 0;
570 
577  virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex);
578 
585  virtual void CRY(real1 radians, bitLenInt control, bitLenInt target) = 0;
586 
593  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
594 
600  virtual void RZ(real1 radians, bitLenInt qubitIndex) = 0;
601 
608  virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex);
609 
616  virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target) = 0;
617 
624  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
625 
633  virtual void CRT(real1 radians, bitLenInt control, bitLenInt target) = 0;
634 
641  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
642 
655  virtual void H(bitLenInt start, bitLenInt length);
656 
658  virtual void X(bitLenInt start, bitLenInt length);
659 
661  virtual void Y(bitLenInt start, bitLenInt length);
662 
664  virtual void Z(bitLenInt start, bitLenInt length);
665 
667  virtual void CNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
668 
670  virtual void AntiCNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
671 
673  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
674 
676  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
677 
684  virtual void AND(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
685 
692  virtual void CLAND(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
693 
695  virtual void OR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
696 
698  virtual void CLOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
699 
701  virtual void XOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
702 
704  virtual void CLXOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
705 
711  virtual void RT(real1 radians, bitLenInt start, bitLenInt length);
712 
719  virtual void RTDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
720 
726  virtual void RX(real1 radians, bitLenInt start, bitLenInt length);
727 
733  virtual void RXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
734 
740  virtual void CRX(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
741 
748  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
749 
755  virtual void RY(real1 radians, bitLenInt start, bitLenInt length);
756 
763  virtual void RYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
764 
771  virtual void CRY(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
772 
779  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
780 
786  virtual void RZ(real1 radians, bitLenInt start, bitLenInt length);
787 
794  virtual void RZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
795 
802  virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
803 
810  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
811 
818  virtual void CRT(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
819 
826  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
827 
833  virtual void Exp(real1 radians, bitLenInt start, bitLenInt length);
834 
840  virtual void ExpDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
841 
847  virtual void ExpX(real1 radians, bitLenInt start, bitLenInt length);
848 
854  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
855 
861  virtual void ExpY(real1 radians, bitLenInt start, bitLenInt length);
862 
868  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
869 
875  virtual void ExpZ(real1 radians, bitLenInt start, bitLenInt length);
876 
882  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
883 
890  virtual void CY(bitLenInt control, bitLenInt target, bitLenInt length);
891 
898  virtual void CZ(bitLenInt control, bitLenInt target, bitLenInt length);
899 
912  virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length);
913 
915  virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length);
916 
918  virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length);
919 
921  virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length);
922 
924  virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length);
925 
927  virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length);
928 
930  virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
931 
933  virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
934 
936  virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
937 
939  virtual void INCSC(
940  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
941 
943  virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
944 
946  virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
947 
949  virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
950 
952  virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length) = 0;
953 
955  virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
956 
958  virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
959 
961  virtual void DECSC(
962  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
963 
965  virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
966 
968  virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
969 
971  virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
972 
982  virtual void QFT(bitLenInt start, bitLenInt length);
983 
985  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length) = 0;
986 
988  virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex) = 0;
989 
991  virtual void PhaseFlip() = 0;
992 
994  virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value);
995 
997  virtual bitCapInt MReg(bitLenInt start, bitLenInt length);
998 
1056  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1057  bitLenInt valueLength, unsigned char* values) = 0;
1058 
1083  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1084  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
1085 
1110  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1111  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
1112 
1114  virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2) = 0;
1115 
1117  virtual void Swap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1118 
1120  virtual void Reverse(bitLenInt first, bitLenInt last)
1121  {
1122  while ((first < last) && (first < (last - 1))) {
1123  last--;
1124  Swap(first, last);
1125  first++;
1126  }
1127  }
1128 
1142  virtual void CopyState(QInterfacePtr orig) = 0;
1143 
1149  virtual real1 Prob(bitLenInt qubitIndex) = 0;
1150 
1156  virtual real1 ProbAll(bitCapInt fullRegister) = 0;
1157 
1167  virtual void SetBit(bitLenInt qubitIndex1, bool value);
1168 
1170 };
1171 } // namespace Qrack
Create a QEngineOCL, derived from QEngineCPU, leveraging OpenCL hardware to increase the speed of cer...
Definition: qinterface.hpp:59
virtual bitCapInt MReg(bitLenInt start, bitLenInt length)
Measure permutation state of a register.
Definition: qinterface.cpp:773
virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length)=0
Add integer (without sign)
virtual void SetQuantumState(complex *inputState)=0
Set an arbitrary pure quantum state.
virtual bool M(bitLenInt qubitIndex)=0
Measurement gate.
virtual void CRT(real1 radians, bitLenInt control, bitLenInt target)=0
Controlled "phase shift gate".
virtual void QFT(bitLenInt start, bitLenInt length)
Quantum Fourier Transform - Apply the quantum Fourier transform to the register.
Definition: qinterface.cpp:332
virtual void Exp(real1 radians, bitLenInt qubitIndex)=0
(Identity) Exponentiation gate
virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction "phase shift gate".
Definition: qinterface.cpp:658
virtual void H(bitLenInt qubitIndex)=0
Hadamard gate.
virtual void Y(bitLenInt qubitIndex)=0
Y gate.
virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: qinterface.cpp:53
virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli Y exponentiation gate.
Definition: qinterface.cpp:482
virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)=0
Add a classical integer to the register, with sign and without carry.
virtual void RXDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:556
virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift left, filling the extra bits with |0>
Definition: qinterface.cpp:306
virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift left - shift bits left, and carry last bits.
Definition: qinterface.cpp:783
virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift left, with last 2 bits as sign and carry.
Definition: qinterface.cpp:274
virtual void ApplySingleBit(const complex *mtrx, bool doCalcNorm, bitLenInt qubitIndex)=0
Apply an arbitrary single bit unitary transformation.
virtual void Z(bitLenInt qubitIndex)=0
Z gate.
virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)=0
Subtract a classical integer from the register, with sign and without carry.
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:103
virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Add classical BCD integer (without sign, with carry)
virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "AND" gate.
Definition: qinterface.cpp:88
virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:627
bitCapInt maxQPower
Definition: qinterface.hpp:97
Definition: qinterface.hpp:81
virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: qinterface.cpp:104
#define real1
Definition: qinterface.hpp:35
virtual void Decohere(bitLenInt start, bitLenInt length, QInterfacePtr dest)=0
Minimally decohere a set of contiguous bits from the full coherent unit, into "destination.".
virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:756
virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target)=0
Controlled Z axis rotation gate.
uint32_t randomSeed
Definition: qinterface.hpp:99
virtual void ExpZ(real1 radians, bitLenInt qubitIndex)=0
Pauli Z exponentiation gate.
virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Subtract classical integer (without sign, with carry)
virtual void Reverse(bitLenInt first, bitLenInt last)
Reverse all of the bits in a sequence.
Definition: qinterface.hpp:1120
virtual void RZ(real1 radians, bitLenInt qubitIndex)=0
Z axis rotation gate.
virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: qinterface.cpp:71
virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction phase shift gate.
Definition: qinterface.cpp:369
virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli X exponentiation gate.
Definition: qinterface.cpp:444
virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction (identity) exponentiation gate.
Definition: qinterface.cpp:406
virtual void CNOT(bitLenInt control, bitLenInt target)=0
Controlled NOT gate.
#define complex
Definition: qinterface.hpp:34
virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Y axis rotation gate.
Definition: qinterface.cpp:592
virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, unsigned char *values)=0
Subtract from an entangled 8 bit register state with a superposed index-offset-based read from classi...
virtual void SetPermutation(bitCapInt perm)=0
Set to a specific permutation.
virtual void RX(real1 radians, bitLenInt qubitIndex)=0
X axis rotation gate.
virtual void X(bitLenInt qubitIndex)=0
X gate.
virtual real1 Rand()
Generate a random real1 from 0 to 1.
Definition: qinterface.hpp:110
virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift right - shift bits right, and carry first bits.
Definition: qinterface.cpp:795
virtual bitLenInt Cohere(QInterfacePtr toCopy)=0
Combine another QInterface with this one, after the last bit index of this one.
virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)=0
Subtract a classical integer from the register, with sign and with carry.
virtual void RY(real1 radians, bitLenInt qubitIndex)=0
Y axis rotation gate.
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:49
virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:692
#define bitCapInt
Definition: qinterface.hpp:22
QInterface(bitLenInt n, std::shared_ptr< std::default_random_engine > rgp=nullptr)
Definition: qinterface.hpp:114
std::shared_ptr< std::default_random_engine > rand_generator
Definition: qinterface.hpp:100
Definition: qinterface.hpp:84
virtual void PhaseFlip()=0
Phase flip always - equivalent to Z X Z X on any bit in the QInterface.
virtual void SetRandomSeed(uint32_t seed)
Definition: qinterface.hpp:111
#define bitLenInt
Definition: qinterface.hpp:21
virtual void CY(bitLenInt control, bitLenInt target)=0
Controlled Y gate.
virtual ~QInterface()
Destructor of QInterface.
Definition: qinterface.hpp:129
virtual void CRY(real1 radians, bitLenInt control, bitLenInt target)=0
Controlled Y axis rotation gate.
virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length)=0
Subtract classical integer (without sign)
Definition: qinterface.hpp:77
virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift right, with last 2 bits as sign and carry.
Definition: qinterface.cpp:290
int GetMaxQPower()
Get the maximum number of basis states, namely for qubits.
Definition: qinterface.hpp:135
virtual real1 Prob(bitLenInt qubitIndex)=0
Direct measure of bit probability to be in |1> state.
virtual void CopyState(QInterfacePtr orig)=0
Direct copy of raw state vector to produce a clone.
virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length)=0
Subtract BCD integer (without sign)
virtual void ExpY(real1 radians, bitLenInt qubitIndex)=0
Pauli Y exponentiation gate.
virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, unsigned char *values)=0
Set 8 bit register bits by a superposed index-offset-based read from classical memory.
virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "AND" gate.
Definition: qinterface.cpp:35
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:94
virtual void SetBit(bitLenInt qubitIndex1, bool value)
Set individual bit to pure |0> (false) or |1> (true) state.
Definition: qinterface.cpp:161
virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value)
Set register bits to given permutation.
Definition: qinterface.cpp:347
virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart, bitLenInt valueLength, bitLenInt carryIndex, unsigned char *values)=0
Add to entangled 8 bit register state with a superposed index-offset-based read from classical memory...
virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex)=0
The 6502 uses its carry flag also as a greater-than/less-than flag, for the CMP operation.
bitLenInt qubitCount
Definition: qinterface.hpp:96
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that&#39;s needed ...
Definition: qinterface.hpp:75
virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)=0
Swap values of two bits in register.
virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Subtract BCD integer (without sign, with carry)
virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Add integer (without sign, with carry)
virtual real1 ProbAll(bitCapInt fullRegister)=0
Direct measure of full register probability to be in permutation state.
std::uniform_real_distribution< real1 > rand_distribution
Definition: qinterface.hpp:101
virtual void AntiCNOT(bitLenInt control, bitLenInt target)
Anti controlled NOT gate.
Definition: qinterface.cpp:17
virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction y axis rotation gate.
Definition: qinterface.cpp:725
virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli Z exponentiation gate.
Definition: qinterface.cpp:510
virtual void ExpX(real1 radians, bitLenInt qubitIndex)=0
Pauli X exponentiation gate.
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:41
virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)=0
Doubly-controlled NOT gate.
virtual void Dispose(bitLenInt start, bitLenInt length)=0
Minimally decohere a set of contigious bits from the full coherent unit, throwing these qubits away...
Definition: complex16simd.hpp:21
virtual void RT(real1 radians, bitLenInt qubitIndex)=0
Phase shift gate.
virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length)=0
Add classical BCD integer (without sign)
virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift right, filling the extra bits with |0>
Definition: qinterface.cpp:319
Create a QEngineOCLMUlti, composed from multiple QEngineOCLs, using OpenCL in parallel across 2^N dev...
Definition: qinterface.hpp:65
virtual void CRX(real1 radians, bitLenInt control, bitLenInt target)=0
Controlled X axis rotation gate.
int GetQubitCount()
Get the count of bits in this register.
Definition: qinterface.hpp:132
virtual void CZ(bitLenInt control, bitLenInt target)=0
Controlled Z gate.
virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
Anti doubly-controlled NOT gate.
Definition: qinterface.cpp:24
virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: qinterface.cpp:95
virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length)=0
Reverse the phase of the state where the register equals zero.
virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex)=0
Add a classical integer to the register, with sign and with carry.
Create a QEngineCPU leveraging only local CPU and memory resources.
Definition: qinterface.hpp:54