Qrack  1.7
General classical-emulating-quantum development framework
qunit.hpp
Go to the documentation of this file.
1 //
3 // (C) Copyright 2017-2018, Daniel Strano and the Qrack and VM6502Q contributors.
4 //
5 // QUnit maintains explicit separability of qubits as an optimization on a QEngine.
6 // See https://arxiv.org/abs/1710.05867
7 // (The makers of Qrack have no affiliation with the authors of that paper.)
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 <random>
16 
17 #include "qinterface.hpp"
18 
19 namespace Qrack {
20 
22 struct QEngineShard {
25 };
26 
27 class QUnit;
28 typedef std::shared_ptr<QUnit> QUnitPtr;
29 
30 class QUnit : public QInterface {
31 protected:
33  std::vector<QEngineShard> shards;
34 
35  std::shared_ptr<std::default_random_engine> rand_generator;
36 
37  virtual void SetQubitCount(bitLenInt qb)
38  {
39  shards.resize(qb);
41  }
42 
43 public:
44  QUnit(QInterfaceEngine eng, bitLenInt qBitCount, bitCapInt initState = 0,
45  std::shared_ptr<std::default_random_engine> rgp = nullptr);
46 
47  virtual void SetQuantumState(complex* inputState);
48  virtual void SetPermutation(bitCapInt perm) { SetReg(0, qubitCount, perm); }
49  virtual bitLenInt Cohere(QInterfacePtr toCopy);
50  virtual std::map<QInterfacePtr, bitLenInt> Cohere(std::vector<QInterfacePtr> toCopy);
51  virtual void Decohere(bitLenInt start, bitLenInt length, QInterfacePtr dest);
52  virtual void Dispose(bitLenInt start, bitLenInt length);
53 
59  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
60  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
61  virtual void CNOT(bitLenInt control, bitLenInt target);
62  virtual void AntiCNOT(bitLenInt control, bitLenInt target);
63  virtual void H(bitLenInt qubit);
64  virtual bool M(bitLenInt qubit);
65  virtual void X(bitLenInt qubit);
66  virtual void Y(bitLenInt qubit);
67  virtual void Z(bitLenInt qubit);
68  virtual void CY(bitLenInt control, bitLenInt target);
69  virtual void CZ(bitLenInt control, bitLenInt target);
70 
82  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
83  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
84  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
85  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
86  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
87  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
88 
100  virtual void RT(double radians, bitLenInt qubit);
101  virtual void RX(double radians, bitLenInt qubit);
102  virtual void CRX(double radians, bitLenInt control, bitLenInt target);
103  virtual void RY(double radians, bitLenInt qubit);
104  virtual void CRY(double radians, bitLenInt control, bitLenInt target);
105  virtual void RZ(double radians, bitLenInt qubit);
106  virtual void CRZ(double radians, bitLenInt control, bitLenInt target);
107  virtual void CRT(double radians, bitLenInt control, bitLenInt target);
108 
117  virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length);
118  virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length);
119 
120  virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length);
121  virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
122  virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex);
123  virtual void INCSC(
124  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
125  virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
126  virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length);
127  virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
128  virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length);
129  virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
130  virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex);
131  virtual void DECSC(
132  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
133  virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
134  virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length);
135  virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
136 
145  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length);
146  virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex);
147  virtual void PhaseFlip();
148  virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value);
149  virtual bitCapInt MReg(bitLenInt start, bitLenInt length);
150  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
151  bitLenInt valueLength, unsigned char* values);
152  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
153  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values);
154  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
155  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values);
156  virtual void Swap(bitLenInt qubit1, bitLenInt qubit2);
157 
166  virtual void CopyState(QUnitPtr orig);
167  virtual void CopyState(QInterfacePtr orig);
168  virtual double Prob(bitLenInt qubit);
169  virtual double ProbAll(bitCapInt fullRegister);
170  virtual void SetBit(bitLenInt qubit1, bool value);
171 
174 protected:
175  typedef void (QInterface::*INCxFn)(bitCapInt, bitLenInt, bitLenInt, bitLenInt);
177  void INCx(INCxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flagIndex);
178  void INCxx(
179  INCxxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flag1Index, bitLenInt flag2Index);
180 
181  QInterfacePtr Entangle(std::initializer_list<bitLenInt*> bits);
182  QInterfacePtr EntangleRange(bitLenInt start, bitLenInt length);
183  QInterfacePtr EntangleRange(bitLenInt start, bitLenInt length, bitLenInt start2, bitLenInt length2);
184 
185  template <class It> QInterfacePtr EntangleIterator(It first, It last);
186 
187  template <typename F, typename... B> void EntangleAndCallMember(F fn, B... bits);
188  template <typename F, typename... B> void EntangleAndCall(F fn, B... bits);
189 
190  void OrderContiguous(QInterfacePtr unit);
191 
192  void Detach(bitLenInt start, bitLenInt length, QInterfacePtr dest);
193 
194  struct QSortEntry {
195  bitLenInt bit;
196  bitLenInt mapped;
197  bool operator<(const QSortEntry& rhs) { return mapped < rhs.mapped; }
198  bool operator>(const QSortEntry& rhs) { return mapped > rhs.mapped; }
199  };
200  void SortUnit(QInterfacePtr unit, std::vector<QSortEntry>& bits, bitLenInt low, bitLenInt high);
201 
202  /* Debugging and diagnostic routines. */
203  void DumpShards();
204  QInterfacePtr GetUnit(bitLenInt bit) { return shards[bit].unit; }
205 };
206 
207 } // namespace Qrack
Definition: qunit.hpp:194
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:86
bitLenInt mapped
Definition: qunit.hpp:196
QInterfacePtr unit
Definition: qunit.hpp:23
std::shared_ptr< QUnit > QUnitPtr
Definition: qunit.hpp:27
std::shared_ptr< std::default_random_engine > rand_generator
Definition: qunit.hpp:35
virtual void SetQubitCount(bitLenInt qb)
Definition: qunit.hpp:37
QInterfaceEngine engine
Definition: qunit.hpp:32
bool operator<(const QSortEntry &rhs)
Definition: qunit.hpp:197
#define complex
Definition: qinterface.hpp:30
std::vector< QEngineShard > shards
Definition: qunit.hpp:33
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:42
#define bitCapInt
Definition: qinterface.hpp:21
#define bitLenInt
Definition: qinterface.hpp:20
QInterfacePtr GetUnit(bitLenInt bit)
Definition: qunit.hpp:204
Associates a QInterface object with a set of bits.
Definition: qunit.hpp:22
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:81
bool operator>(const QSortEntry &rhs)
Definition: qunit.hpp:198
bitLenInt mapped
Definition: qunit.hpp:24
bitLenInt bit
Definition: qunit.hpp:195
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:34
Definition: qunit.hpp:30
virtual void SetPermutation(bitCapInt perm)
Set to a specific permutation.
Definition: qunit.hpp:48
Definition: complex16simd.hpp:21