Qrack  1.7
General classical-emulating-quantum development framework
qinterface.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano 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 <map>
16 #include <math.h>
17 #include <memory>
18 #include <vector>
19 
20 #define bitLenInt uint8_t
21 #define bitCapInt uint64_t
22 #define bitsInByte 8
23 
24 #include "common/complex16simd.hpp"
25 
26 #if ENABLE_AVX
28 #endif
29 
30 #define complex Complex16Simd
31 
32 namespace Qrack {
33 
34 class QInterface;
35 typedef std::shared_ptr<QInterface> QInterfacePtr;
36 
43 
53 
63 
65 #if ENABLE_OPENCL
67 #else
68  QINTERFACE_OPTIMAL = QINTERFACE_CPU,
69 #endif
70 
72 };
73 
81 class QInterface {
82 protected:
85 
86  virtual void SetQubitCount(bitLenInt qb)
87  {
88  qubitCount = qb;
89  maxQPower = 1 << qubitCount;
90  }
91 
92 public:
94 
96  virtual ~QInterface(){};
97 
99  int GetQubitCount() { return qubitCount; }
100 
102  int GetMaxQPower() { return maxQPower; }
103 
105  virtual void SetQuantumState(complex* inputState) = 0;
106 
108  virtual void SetPermutation(bitCapInt perm) = 0;
109 
146  virtual bitLenInt Cohere(QInterfacePtr toCopy) = 0;
147  virtual std::map<QInterfacePtr, bitLenInt> Cohere(std::vector<QInterfacePtr> toCopy) = 0;
148 
188  virtual void Decohere(bitLenInt start, bitLenInt length, QInterfacePtr dest) = 0;
189 
227  virtual void Dispose(bitLenInt start, bitLenInt length) = 0;
228 
239  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target) = 0;
240 
246  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target) = 0;
247 
253  virtual void CNOT(bitLenInt control, bitLenInt target) = 0;
254 
260  virtual void AntiCNOT(bitLenInt control, bitLenInt target) = 0;
261 
267  virtual void H(bitLenInt qubitIndex) = 0;
268 
316  virtual bool M(bitLenInt qubitIndex) = 0;
317 
324  virtual void X(bitLenInt qubitIndex) = 0;
325 
333  virtual void Y(bitLenInt qubitIndex) = 0;
334 
341  virtual void Z(bitLenInt qubitIndex) = 0;
342 
349  virtual void CY(bitLenInt control, bitLenInt target) = 0;
350 
357  virtual void CZ(bitLenInt control, bitLenInt target) = 0;
358 
375  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit) = 0;
376 
382  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit) = 0;
383 
389  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit) = 0;
390 
396  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit) = 0;
397 
403  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit) = 0;
404 
410  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit) = 0;
411 
428  virtual void RT(double radians, bitLenInt qubitIndex) = 0;
429 
436  virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex);
437 
443  virtual void RX(double radians, bitLenInt qubitIndex) = 0;
444 
450  virtual void RXDyad(int numerator, int denomPower, bitLenInt qubitIndex);
451 
457  virtual void CRX(double radians, bitLenInt control, bitLenInt target) = 0;
458 
465  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
466 
472  virtual void RY(double radians, bitLenInt qubitIndex) = 0;
473 
480  virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex);
481 
488  virtual void CRY(double radians, bitLenInt control, bitLenInt target) = 0;
489 
496  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
497 
503  virtual void RZ(double radians, bitLenInt qubitIndex) = 0;
504 
511  virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex);
512 
519  virtual void CRZ(double radians, bitLenInt control, bitLenInt target) = 0;
520 
527  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
528 
536  virtual void CRT(double radians, bitLenInt control, bitLenInt target) = 0;
537 
544  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
545 
558  virtual void H(bitLenInt start, bitLenInt length);
559 
561  virtual void X(bitLenInt start, bitLenInt length);
562 
564  virtual void Y(bitLenInt start, bitLenInt length);
565 
567  virtual void Z(bitLenInt start, bitLenInt length);
568 
570  virtual void CNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
571 
573  virtual void AntiCNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
574 
576  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
577 
579  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
580 
587  virtual void AND(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
588 
595  virtual void CLAND(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
596 
598  virtual void OR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
599 
601  virtual void CLOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
602 
604  virtual void XOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
605 
607  virtual void CLXOR(bitLenInt qInputStart, bitCapInt classicalInput, bitLenInt outputStart, bitLenInt length);
608 
614  virtual void RT(double radians, bitLenInt start, bitLenInt length);
615 
622  virtual void RTDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
623 
629  virtual void RX(double radians, bitLenInt start, bitLenInt length);
630 
636  virtual void RXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
637 
643  virtual void CRX(double radians, bitLenInt control, bitLenInt target, bitLenInt length);
644 
651  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
652 
658  virtual void RY(double radians, bitLenInt start, bitLenInt length);
659 
666  virtual void RYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
667 
674  virtual void CRY(double radians, bitLenInt control, bitLenInt target, bitLenInt length);
675 
682  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
683 
689  virtual void RZ(double radians, bitLenInt start, bitLenInt length);
690 
697  virtual void RZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
698 
705  virtual void CRZ(double radians, bitLenInt control, bitLenInt target, bitLenInt length);
706 
713  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
714 
721  virtual void CRT(double radians, bitLenInt control, bitLenInt target, bitLenInt length);
722 
729  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
730 
737  virtual void CY(bitLenInt control, bitLenInt target, bitLenInt length);
738 
745  virtual void CZ(bitLenInt control, bitLenInt target, bitLenInt length);
746 
759  virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length);
760 
762  virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length);
763 
765  virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length);
766 
768  virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length);
769 
771  virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length) = 0;
772 
774  virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length) = 0;
775 
777  virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
778 
780  virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
781 
783  virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
784 
786  virtual void INCSC(
787  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
788 
790  virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
791 
793  virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
794 
796  virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
797 
799  virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length) = 0;
800 
802  virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
803 
805  virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex) = 0;
806 
808  virtual void DECSC(
809  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex) = 0;
810 
812  virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
813 
815  virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length) = 0;
816 
818  virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex) = 0;
819 
829  virtual void QFT(bitLenInt start, bitLenInt length);
830 
832  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length) = 0;
833 
835  virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex) = 0;
836 
838  virtual void PhaseFlip() = 0;
839 
841  virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value) = 0;
842 
844  virtual bitCapInt MReg(bitLenInt start, bitLenInt length) = 0;
845 
903  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
904  bitLenInt valueLength, unsigned char* values) = 0;
905 
930  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
931  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
932 
957  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
958  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values) = 0;
959 
961  virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2) = 0;
962 
964  virtual void Swap(bitLenInt start1, bitLenInt start2, bitLenInt length);
965 
967  virtual void Reverse(bitLenInt first, bitLenInt last)
968  {
969  while ((first < last) && (first < (last - 1))) {
970  last--;
971  Swap(first, last);
972  first++;
973  }
974  }
975 
989  virtual void CopyState(QInterfacePtr orig) = 0;
990 
996  virtual double Prob(bitLenInt qubitIndex) = 0;
997 
1003  virtual double ProbAll(bitCapInt fullRegister) = 0;
1004 
1014  virtual void SetBit(bitLenInt qubitIndex1, bool value);
1015 
1017 };
1018 } // namespace Qrack
Create a QEngineOCL, derived from QEngineCPU, leveraging OpenCL hardware to increase the speed of cer...
Definition: qinterface.hpp:52
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 QFT(bitLenInt start, bitLenInt length)
Quantum Fourier Transform - Apply the quantum Fourier transform to the register.
Definition: qinterface.cpp:235
virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction "phase shift gate".
Definition: qinterface.cpp:401
virtual void H(bitLenInt qubitIndex)=0
Hadamard gate.
virtual void Y(bitLenInt qubitIndex)=0
Y gate.
virtual void RT(double radians, bitLenInt qubitIndex)=0
Phase shift gate.
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:299
virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift left, filling the extra bits with |0>
Definition: qinterface.cpp:209
virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift left, with last 2 bits as sign and carry.
Definition: qinterface.cpp:177
virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)=0
Quantum analog of classical "OR" gate.
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.
QInterface(bitLenInt n)
Definition: qinterface.hpp:93
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:86
virtual bitCapInt MReg(bitLenInt start, bitLenInt length)=0
Measure permutation state of a register.
virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)=0
Add classical BCD integer (without sign, with carry)
virtual void RZDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:370
bitCapInt maxQPower
Definition: qinterface.hpp:84
Definition: qinterface.hpp:68
virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)=0
Quantum analog of classical "AND" gate.
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 CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)=0
Quantum analog of classical "XOR" gate.
virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:499
virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value)=0
Set register bits to given permutation.
virtual void CRY(double radians, bitLenInt control, bitLenInt target)=0
Controlled Y axis rotation 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:967
virtual void RTDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction phase shift gate.
Definition: qinterface.cpp:264
virtual void CNOT(bitLenInt control, bitLenInt target)=0
Controlled NOT gate.
#define complex
Definition: qinterface.hpp:30
virtual void CRZ(double radians, bitLenInt control, bitLenInt target)=0
Controlled Z axis rotation gate.
virtual void RX(double radians, bitLenInt qubitIndex)=0
X axis rotation gate.
virtual void RYDyad(int numerator, int denomPower, bitLenInt qubitIndex)
Dyadic fraction Y axis rotation gate.
Definition: qinterface.cpp:335
virtual void RZ(double radians, bitLenInt qubitIndex)=0
Z axis rotation gate.
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 AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)=0
Anti doubly-controlled NOT gate.
virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)=0
Quantum analog of classical "AND" gate.
virtual void X(bitLenInt qubitIndex)=0
X gate.
virtual bitLenInt Cohere(QInterfacePtr toCopy)=0
Combine another QInterface with this one, after the last bit index of this one.
virtual void CRX(double radians, bitLenInt control, bitLenInt target)=0
Controlled X axis rotation gate.
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 ROL(bitLenInt shift, bitLenInt start, bitLenInt length)=0
Circular shift left - shift bits left, and carry last bits.
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:42
virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:435
#define bitCapInt
Definition: qinterface.hpp:21
virtual void RY(double radians, bitLenInt qubitIndex)=0
Y axis rotation gate.
virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length)=0
Circular shift right - shift bits right, and carry first bits.
Definition: qinterface.hpp:71
virtual void PhaseFlip()=0
Phase flip always - equivalent to Z X Z X on any bit in the QInterface.
#define bitLenInt
Definition: qinterface.hpp:20
virtual void CY(bitLenInt control, bitLenInt target)=0
Controlled Y gate.
virtual ~QInterface()
Destructor of QInterface.
Definition: qinterface.hpp:96
virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length)=0
Subtract classical integer (without sign)
Definition: qinterface.hpp:64
virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)=0
Quantum analog of classical "XOR" gate.
virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift right, with last 2 bits as sign and carry.
Definition: qinterface.cpp:193
int GetMaxQPower()
Get the maximum number of basis states, namely for qubits.
Definition: qinterface.hpp:102
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 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.
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:81
virtual void SetBit(bitLenInt qubitIndex1, bool value)
Set individual bit to pure |0> (false) or |1> (true) state.
Definition: qinterface.cpp:64
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:83
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that&#39;s needed ...
Definition: qinterface.hpp:62
virtual void Swap(bitLenInt qubitIndex1, bitLenInt qubitIndex2)=0
Swap values of two bits in register.
virtual double ProbAll(bitCapInt fullRegister)=0
Direct measure of full register probability to be in permutation state.
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 void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction y axis rotation gate.
Definition: qinterface.cpp:468
virtual void CRT(double radians, bitLenInt control, bitLenInt target)=0
Controlled "phase shift gate".
virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)=0
Quantum analog of classical "OR" gate.
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:34
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 double Prob(bitLenInt qubitIndex)=0
Direct measure of bit probability to be in |1> state.
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:222
int GetQubitCount()
Get the count of bits in this register.
Definition: qinterface.hpp:99
virtual void CZ(bitLenInt control, bitLenInt target)=0
Controlled Z gate.
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:47
virtual void AntiCNOT(bitLenInt control, bitLenInt target)=0
Anti controlled NOT gate.