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 #define polar(A, B) std::polar(A, B)
33 #else
34 #include "common/complex16simd.hpp"
35 #define complex Complex16Simd
36 #define real1 double
37 #define min_norm 1e-15
38 #endif
39 
40 // The state vector must be an aligned piece of RAM, to be used by OpenCL.
41 // We align to an ALIGN_SIZE byte boundary.
42 #define ALIGN_SIZE 64
43 
44 namespace Qrack {
45 
46 class QInterface;
47 typedef std::shared_ptr<QInterface> QInterfacePtr;
48 
55 
65 
71 
81 
83 #if ENABLE_OPENCL
85 #else
86  QINTERFACE_OPTIMAL = QINTERFACE_CPU,
87 #endif
88 
90 };
91 
99 class QInterface {
100 protected:
105 
106  uint32_t randomSeed;
107  std::shared_ptr<std::default_random_engine> rand_generator;
108  std::uniform_real_distribution<real1> rand_distribution;
109 
110  virtual void SetQubitCount(bitLenInt qb)
111  {
112  qubitCount = qb;
113  maxQPower = 1 << qubitCount;
114  }
115 
117  virtual real1 Rand() { return rand_distribution(*rand_generator); }
118  virtual void SetRandomSeed(uint32_t seed) { rand_generator->seed(seed); }
119 
120  virtual void Apply2x2(bitCapInt offset1, bitCapInt offset2, const complex* mtrx, const bitLenInt bitCount,
121  const bitCapInt* qPowersSorted, bool doCalcNorm) = 0;
122  virtual void ApplyControlled2x2(bitLenInt control, bitLenInt target, const complex* mtrx, bool doCalcNorm);
123  virtual void ApplyAntiControlled2x2(bitLenInt control, bitLenInt target, const complex* mtrx, bool doCalcNorm);
124  virtual void ApplyDoublyControlled2x2(
125  bitLenInt control1, bitLenInt control2, bitLenInt target, const complex* mtrx, bool doCalcNorm);
126  virtual void ApplyDoublyAntiControlled2x2(
127  bitLenInt control1, bitLenInt control2, bitLenInt target, const complex* mtrx, bool doCalcNorm);
128  virtual void ApplyM(bitCapInt qPower, bool result, complex nrm) = 0;
129  virtual void NormalizeState(real1 nrm = -999.0) = 0;
130 
131 public:
132  QInterface(bitLenInt n, std::shared_ptr<std::default_random_engine> rgp = nullptr, bool doNorm = true)
133  : doNormalize(doNorm)
134  , rand_distribution(0.0, 1.0)
135  {
136  SetQubitCount(n);
137 
138  if (rgp == NULL) {
139  rand_generator = std::make_shared<std::default_random_engine>();
140  randomSeed = std::time(0);
141  SetRandomSeed(randomSeed);
142  } else {
143  rand_generator = rgp;
144  }
145  }
146 
148  virtual ~QInterface(){};
149 
151  int GetQubitCount() { return qubitCount; }
152 
154  int GetMaxQPower() { return maxQPower; }
155 
157  virtual void SetQuantumState(complex* inputState) = 0;
158 
160  virtual void SetPermutation(bitCapInt perm) = 0;
161 
198  virtual bitLenInt Cohere(QInterfacePtr toCopy) = 0;
199  virtual std::map<QInterfacePtr, bitLenInt> Cohere(std::vector<QInterfacePtr> toCopy);
200 
240  virtual void Decohere(bitLenInt start, bitLenInt length, QInterfacePtr dest) = 0;
241 
279  virtual void Dispose(bitLenInt start, bitLenInt length) = 0;
280 
292  virtual void ApplySingleBit(const complex* mtrx, bool doCalcNorm, bitLenInt qubitIndex);
293 
299  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
300 
306  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
307 
313  virtual void CNOT(bitLenInt control, bitLenInt target);
314 
320  virtual void AntiCNOT(bitLenInt control, bitLenInt target);
321 
327  virtual void H(bitLenInt qubitIndex);
328 
376  virtual bool M(bitLenInt qubitIndex);
377 
384  virtual void X(bitLenInt qubitIndex);
385 
393  virtual void Y(bitLenInt qubitIndex);
394 
401  virtual void Z(bitLenInt qubitIndex);
402 
409  virtual void CY(bitLenInt control, bitLenInt target);
410 
417  virtual void CZ(bitLenInt control, bitLenInt target);
418 
435  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
436 
442  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
443 
449  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
450 
456  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
457 
463  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
464 
470  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
471 
488  virtual void RT(real1 radians, bitLenInt qubitIndex);
489 
496  virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex);
497 
503  virtual void RX(real1 radians, bitLenInt qubitIndex);
504 
510  virtual void RXDyad(int numerator, int denomPower, bitLenInt qubitIndex);
511 
517  virtual void Exp(real1 radians, bitLenInt qubitIndex);
518 
524  virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubitIndex);
525 
531  virtual void ExpX(real1 radians, bitLenInt qubitIndex);
532 
538  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubitIndex);
539 
545  virtual void ExpY(real1 radians, bitLenInt qubitIndex);
546 
552  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubitIndex);
553 
559  virtual void ExpZ(real1 radians, bitLenInt qubitIndex);
560 
566  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubitIndex);
567 
573  virtual void CRX(real1 radians, bitLenInt control, bitLenInt target);
574 
581  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
582 
588  virtual void RY(real1 radians, bitLenInt qubitIndex);
589 
596  virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex);
597 
604  virtual void CRY(real1 radians, bitLenInt control, bitLenInt target);
605 
612  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
613 
619  virtual void RZ(real1 radians, bitLenInt qubitIndex);
620 
627  virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex);
628 
635  virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target);
636 
643  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
644 
652  virtual void CRT(real1 radians, bitLenInt control, bitLenInt target);
653 
660  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
661 
674  virtual void H(bitLenInt start, bitLenInt length);
675 
677  virtual void X(bitLenInt start, bitLenInt length);
678 
680  virtual void Y(bitLenInt start, bitLenInt length);
681 
683  virtual void Z(bitLenInt start, bitLenInt length);
684 
686  virtual void CNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
687 
689  virtual void AntiCNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
690 
692  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
693 
695  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
696 
703  virtual void AND(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
704 
711  virtual void CLAND(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
712 
714  virtual void OR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
715 
717  virtual void CLOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
718 
720  virtual void XOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
721 
723  virtual void CLXOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
724 
730  virtual void RT(real1 radians, bitLenInt start, bitLenInt length);
731 
738  virtual void RTDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
739 
745  virtual void RX(real1 radians, bitLenInt start, bitLenInt length);
746 
752  virtual void RXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
753 
759  virtual void CRX(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
760 
767  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
768 
774  virtual void RY(real1 radians, bitLenInt start, bitLenInt length);
775 
782  virtual void RYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
783 
790  virtual void CRY(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
791 
798  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
799 
805  virtual void RZ(real1 radians, bitLenInt start, bitLenInt length);
806 
813  virtual void RZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
814 
821  virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
822 
829  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
830 
837  virtual void CRT(real1 radians, bitLenInt control, bitLenInt target, bitLenInt length);
838 
845  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
846 
852  virtual void Exp(real1 radians, bitLenInt start, bitLenInt length);
853 
859  virtual void ExpDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
860 
866  virtual void ExpX(real1 radians, bitLenInt start, bitLenInt length);
867 
873  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
874 
880  virtual void ExpY(real1 radians, bitLenInt start, bitLenInt length);
881 
887  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
888 
894  virtual void ExpZ(real1 radians, bitLenInt start, bitLenInt length);
895 
901  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
902 
909  virtual void CY(bitLenInt control, bitLenInt target, bitLenInt length);
910 
917  virtual void CZ(bitLenInt control, bitLenInt target, bitLenInt length);
918 
931  virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length);
932 
934  virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length);
935 
937  virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length);
938 
940  virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length);
941 
943  virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length);
944 
946  virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length);
947 
949  virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
950 
952  virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
953 
955  virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
956 
958  virtual void INCSC(
959  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
960 
962  virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
963 
965  virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
966 
968  virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
969 
971  virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length) = 0;
972 
974  virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
975 
977  virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
978 
980  virtual void DECSC(
981  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
982 
984  virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
985 
987  virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
988 
990  virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
991 
993  virtual void MUL(
994  bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, bool clearCary = false) = 0;
995 
997  virtual void DIV(bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length) = 0;
998 
1000  virtual void CMUL(bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt controlBit,
1001  bitLenInt length, bool clearCarry = false) = 0;
1002 
1004  virtual void CDIV(
1005  bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt controlBit, bitLenInt length) = 0;
1006 
1016  virtual void QFT(bitLenInt start, bitLenInt length);
1017 
1019  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length) = 0;
1020 
1022  virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex) = 0;
1023 
1025  virtual void PhaseFlip() = 0;
1026 
1028  virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value);
1029 
1031  virtual bitCapInt MReg(bitLenInt start, bitLenInt length);
1032 
1091  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1092  bitLenInt valueLength, unsigned char* values) = 0;
1093 
1121  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1122  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
1123 
1151  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
1152  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
1153 
1155  virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2);
1156 
1158  virtual void Swap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1159 
1161  virtual void Reverse(bitLenInt first, bitLenInt last)
1162  {
1163  while ((first < last) && (first < (last - 1))) {
1164  last--;
1165  Swap(first, last);
1166  first++;
1167  }
1168  }
1169 
1183  virtual void CopyState(QInterfacePtr orig) = 0;
1184 
1190  virtual real1 Prob(bitLenInt qubitIndex) = 0;
1191 
1197  virtual real1 ProbAll(bitCapInt fullRegister) = 0;
1198 
1208  virtual void SetBit(bitLenInt qubitIndex1, bool value);
1209 
1219  virtual bool ForceM(bitLenInt qubitIndex, bool result, bool doForce = true, real1 nrmlzr = 1.0);
1220 
1222 };
1223 } // namespace Qrack
Create a QEngineOCL, derived from QEngineCPU, leveraging OpenCL hardware to increase the speed of cer...
Definition: qinterface.hpp:64
virtual bitCapInt MReg(bitLenInt start, bitLenInt length)
Measure permutation state of a register.
Definition: qinterface.cpp:649
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 void QFT(bitLenInt start, bitLenInt length)
Quantum Fourier Transform - Apply the quantum Fourier transform to the register.
Definition: qinterface.cpp:197
virtual void ApplyControlled2x2(bitLenInt control, bitLenInt target, const complex *mtrx, bool doCalcNorm)
Definition: protected.cpp:46
virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction "phase shift gate".
Definition: qinterface.cpp:534
QInterface(bitLenInt n, std::shared_ptr< std::default_random_engine > rgp=nullptr, bool doNorm=true)
Definition: qinterface.hpp:132
virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: operators.cpp:97
virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli Y exponentiation gate.
Definition: qinterface.cpp:358
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 CRY(real1 radians, bitLenInt control, bitLenInt target)
Controlled Y axis rotation gate.
Definition: rotational.cpp:111
virtual void RXDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:432
virtual void CDIV(bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt controlBit, bitLenInt length)=0
Controlled division by power of integer.
virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift left, filling the extra bits with |0>
Definition: qinterface.cpp:171
virtual void RY(real1 radians, bitLenInt qubitIndex)
Y axis rotation gate.
Definition: rotational.cpp:36
virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift left - shift bits left, and carry last bits.
Definition: qinterface.cpp:659
virtual void DIV(bitCapInt toDiv, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length)=0
Divide by integer.
virtual void CMUL(bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt controlBit, bitLenInt length, bool clearCarry=false)=0
Controlled multiplication by integer.
virtual void CRT(real1 radians, bitLenInt control, bitLenInt target)
Controlled "phase shift gate".
Definition: rotational.cpp:87
virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift left, with last 2 bits as sign and carry.
Definition: qinterface.cpp:139
virtual void X(bitLenInt qubitIndex)
X gate.
Definition: gates.cpp:147
virtual void ApplyAntiControlled2x2(bitLenInt control, bitLenInt target, const complex *mtrx, bool doCalcNorm)
Definition: protected.cpp:57
virtual void H(bitLenInt qubitIndex)
Hadamard gate.
Definition: gates.cpp:137
virtual void CRX(real1 radians, bitLenInt control, bitLenInt target)
Controlled X axis rotation gate.
Definition: rotational.cpp:100
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 CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
Doubly-controlled NOT gate.
Definition: gates.cpp:78
virtual void ApplySingleBit(const complex *mtrx, bool doCalcNorm, bitLenInt qubitIndex)
Apply an arbitrary single bit unitary transformation.
Definition: protected.cpp:39
real1 runningNorm
Definition: qinterface.hpp:103
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:110
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: operators.cpp:134
virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:503
bitCapInt maxQPower
Definition: qinterface.hpp:102
Definition: qinterface.hpp:86
virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: operators.cpp:152
#define real1
Definition: qinterface.hpp:36
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 Z(bitLenInt qubitIndex)
Z gate.
Definition: gates.cpp:165
virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:632
virtual void RT(real1 radians, bitLenInt qubitIndex)
Phase shift gate.
Definition: rotational.cpp:18
uint32_t randomSeed
Definition: qinterface.hpp:106
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:1161
virtual void ExpX(real1 radians, bitLenInt qubitIndex)
Pauli X exponentiation gate.
Definition: rotational.cpp:62
virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: operators.cpp:116
virtual void NormalizeState(real1 nrm=-999.0)=0
virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction phase shift gate.
Definition: qinterface.cpp:245
virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli X exponentiation gate.
Definition: qinterface.cpp:320
virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction (identity) exponentiation gate.
Definition: qinterface.cpp:282
#define complex
Definition: qinterface.hpp:35
virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Y axis rotation gate.
Definition: qinterface.cpp:468
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 bool M(bitLenInt qubitIndex)
Measurement gate.
Definition: gates.cpp:50
virtual void ApplyDoublyAntiControlled2x2(bitLenInt control1, bitLenInt control2, bitLenInt target, const complex *mtrx, bool doCalcNorm)
Definition: protected.cpp:82
virtual real1 Rand()
Generate a random real1 from 0 to 1.
Definition: qinterface.hpp:117
virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift right - shift bits right, and carry first bits.
Definition: qinterface.cpp:671
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.
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:54
virtual void MUL(bitCapInt toMul, bitLenInt inOutStart, bitLenInt carryStart, bitLenInt length, bool clearCary=false)=0
Multiply by integer.
virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:568
#define bitCapInt
Definition: qinterface.hpp:22
virtual void ApplyDoublyControlled2x2(bitLenInt control1, bitLenInt control2, bitLenInt target, const complex *mtrx, bool doCalcNorm)
Definition: protected.cpp:68
std::shared_ptr< std::default_random_engine > rand_generator
Definition: qinterface.hpp:107
Definition: qinterface.hpp:89
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:118
virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)
Swap values of two bits in register.
Definition: gates.cpp:61
virtual void ExpY(real1 radians, bitLenInt qubitIndex)
Pauli Y exponentiation gate.
Definition: rotational.cpp:70
#define bitLenInt
Definition: qinterface.hpp:21
virtual ~QInterface()
Destructor of QInterface.
Definition: qinterface.hpp:148
virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length)=0
Subtract classical integer (without sign)
Definition: qinterface.hpp:82
virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift right, with last 2 bits as sign and carry.
Definition: qinterface.cpp:155
int GetMaxQPower()
Get the maximum number of basis states, namely for qubits.
Definition: qinterface.hpp:154
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 CNOT(bitLenInt control, bitLenInt target)
Controlled NOT gate.
Definition: gates.cpp:111
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: operators.cpp:78
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:99
virtual void SetBit(bitLenInt qubitIndex1, bool value)
Set individual bit to pure |0> (false) or |1> (true) state.
Definition: gates.cpp:53
bool doNormalize
Definition: qinterface.hpp:104
virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value)
Set register bits to given permutation.
Definition: qinterface.cpp:212
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:101
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that&#39;s needed ...
Definition: qinterface.hpp:80
virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target)
Controlled Z axis rotation gate.
Definition: rotational.cpp:122
virtual void Apply2x2(bitCapInt offset1, bitCapInt offset2, const complex *mtrx, const bitLenInt bitCount, const bitCapInt *qPowersSorted, bool doCalcNorm)=0
virtual void RZ(real1 radians, bitLenInt qubitIndex)
Z axis rotation gate.
Definition: rotational.cpp:45
virtual void CY(bitLenInt control, bitLenInt target)
Controlled Y gate.
Definition: gates.cpp:174
virtual void ApplyM(bitCapInt qPower, bool result, complex nrm)=0
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:108
virtual void AntiCNOT(bitLenInt control, bitLenInt target)
Anti controlled NOT gate.
Definition: gates.cpp:124
virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction y axis rotation gate.
Definition: qinterface.cpp:601
virtual void RX(real1 radians, bitLenInt qubitIndex)
X axis rotation gate.
Definition: rotational.cpp:27
virtual void Y(bitLenInt qubitIndex)
Y gate.
Definition: gates.cpp:156
virtual bool ForceM(bitLenInt qubitIndex, bool result, bool doForce=true, real1 nrmlzr=1.0)
Act as though a measurement was applied, except force the result of the measurement.
Definition: gates.cpp:22
virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Pauli Z exponentiation gate.
Definition: qinterface.cpp:386
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:46
virtual void CZ(bitLenInt control, bitLenInt target)
Controlled Z gate.
Definition: gates.cpp:185
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 ExpZ(real1 radians, bitLenInt qubitIndex)
Pauli Z exponentiation gate.
Definition: rotational.cpp:79
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:184
Create a QEngineOCLMUlti, composed from multiple QEngineOCLs, using OpenCL in parallel across 2^N dev...
Definition: qinterface.hpp:70
int GetQubitCount()
Get the count of bits in this register.
Definition: qinterface.hpp:151
virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
Anti doubly-controlled NOT gate.
Definition: gates.cpp:95
virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: operators.cpp:142
virtual void Exp(real1 radians, bitLenInt qubitIndex)
(Identity) Exponentiation gate
Definition: rotational.cpp:54
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:59