Qrack  1.7
General classical-emulating-quantum development framework
qunit.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017, 2018. All rights reserved.
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 ApplySingleBit(const complex* mtrx, bool doCalcNorm, bitLenInt qubit);
60  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
61  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target);
62  virtual void CNOT(bitLenInt control, bitLenInt target);
63  virtual void AntiCNOT(bitLenInt control, bitLenInt target);
64  virtual void H(bitLenInt qubit);
65  virtual bool M(bitLenInt qubit);
66  virtual void X(bitLenInt qubit);
67  virtual void Y(bitLenInt qubit);
68  virtual void Z(bitLenInt qubit);
69  virtual void CY(bitLenInt control, bitLenInt target);
70  virtual void CZ(bitLenInt control, bitLenInt target);
71 
83  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
84  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
85  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
86  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
87  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
88  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
89 
101  virtual void RT(real1 radians, bitLenInt qubit);
102  virtual void RX(real1 radians, bitLenInt qubit);
103  virtual void RY(real1 radians, bitLenInt qubit);
104  virtual void RZ(real1 radians, bitLenInt qubit);
105  virtual void Exp(real1 radians, bitLenInt qubit);
106  virtual void ExpX(real1 radians, bitLenInt qubit);
107  virtual void ExpY(real1 radians, bitLenInt qubit);
108  virtual void ExpZ(real1 radians, bitLenInt qubit);
109  virtual void CRX(real1 radians, bitLenInt control, bitLenInt target);
110  virtual void CRY(real1 radians, bitLenInt control, bitLenInt target);
111  virtual void CRZ(real1 radians, bitLenInt control, bitLenInt target);
112  virtual void CRT(real1 radians, bitLenInt control, bitLenInt target);
113 
122  virtual void INC(bitCapInt toAdd, bitLenInt start, bitLenInt length);
123  virtual void INCC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
124  virtual void INCS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex);
125  virtual void INCSC(
126  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
127  virtual void INCSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
128  virtual void INCBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length);
129  virtual void INCBCDC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
130  virtual void DEC(bitCapInt toSub, bitLenInt start, bitLenInt length);
131  virtual void DECC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
132  virtual void DECS(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex);
133  virtual void DECSC(
134  bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex, bitLenInt carryIndex);
135  virtual void DECSC(bitCapInt toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
136  virtual void DECBCD(bitCapInt toAdd, bitLenInt start, bitLenInt length);
137  virtual void DECBCDC(bitCapInt toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
138 
147  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length);
148  virtual void CPhaseFlipIfLess(bitCapInt greaterPerm, bitLenInt start, bitLenInt length, bitLenInt flagIndex);
149  virtual void PhaseFlip();
150  virtual void SetReg(bitLenInt start, bitLenInt length, bitCapInt value);
151  virtual bitCapInt MReg(bitLenInt start, bitLenInt length);
152  virtual bitCapInt IndexedLDA(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
153  bitLenInt valueLength, unsigned char* values);
154  virtual bitCapInt IndexedADC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
155  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values);
156  virtual bitCapInt IndexedSBC(bitLenInt indexStart, bitLenInt indexLength, bitLenInt valueStart,
157  bitLenInt valueLength, bitLenInt carryIndex, unsigned char* values);
158  virtual void Swap(bitLenInt qubit1, bitLenInt qubit2);
159 
168  virtual void CopyState(QUnitPtr orig);
169  virtual void CopyState(QInterfacePtr orig);
170  virtual real1 Prob(bitLenInt qubit);
171  virtual real1 ProbAll(bitCapInt fullRegister);
172  virtual void SetBit(bitLenInt qubit1, bool value);
173 
176 protected:
177  typedef void (QInterface::*INCxFn)(bitCapInt, bitLenInt, bitLenInt, bitLenInt);
179  void INCx(INCxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flagIndex);
180  void INCxx(
181  INCxxFn fn, bitCapInt toMod, bitLenInt start, bitLenInt length, bitLenInt flag1Index, bitLenInt flag2Index);
182 
183  QInterfacePtr Entangle(std::initializer_list<bitLenInt*> bits);
184  QInterfacePtr EntangleRange(bitLenInt start, bitLenInt length);
185  QInterfacePtr EntangleRange(bitLenInt start, bitLenInt length, bitLenInt start2, bitLenInt length2);
186 
187  template <class It> QInterfacePtr EntangleIterator(It first, It last);
188 
189  template <typename F, typename... B> void EntangleAndCallMember(F fn, B... bits);
190  template <typename F, typename... B> void EntangleAndCall(F fn, B... bits);
191 
192  void OrderContiguous(QInterfacePtr unit);
193 
194  void Detach(bitLenInt start, bitLenInt length, QInterfacePtr dest);
195 
196  struct QSortEntry {
197  bitLenInt bit;
198  bitLenInt mapped;
199  bool operator<(const QSortEntry& rhs) { return mapped < rhs.mapped; }
200  bool operator>(const QSortEntry& rhs) { return mapped > rhs.mapped; }
201  };
202  void SortUnit(QInterfacePtr unit, std::vector<QSortEntry>& bits, bitLenInt low, bitLenInt high);
203 
204  /* Debugging and diagnostic routines. */
205  void DumpShards();
206  QInterfacePtr GetUnit(bitLenInt bit) { return shards[bit].unit; }
207 };
208 
209 } // namespace Qrack
Definition: qunit.hpp:196
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:103
bitLenInt mapped
Definition: qunit.hpp:198
QInterfacePtr unit
Definition: qunit.hpp:23
#define real1
Definition: qinterface.hpp:35
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:199
#define complex
Definition: qinterface.hpp:34
std::vector< QEngineShard > shards
Definition: qunit.hpp:33
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:49
#define bitCapInt
Definition: qinterface.hpp:22
#define bitLenInt
Definition: qinterface.hpp:21
QInterfacePtr GetUnit(bitLenInt bit)
Definition: qunit.hpp:206
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:94
bool operator>(const QSortEntry &rhs)
Definition: qunit.hpp:200
bitLenInt mapped
Definition: qunit.hpp:24
bitLenInt bit
Definition: qunit.hpp:197
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:41
Definition: qunit.hpp:30
virtual void SetPermutation(bitCapInt perm)
Set to a specific permutation.
Definition: qunit.hpp:48
Definition: complex16simd.hpp:21