Qrack  10.0
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-2023. 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 Lesser General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/lgpl-3.0.en.html
11 // for details.
12 
13 #pragma once
14 
15 #include "common/parallel_for.hpp"
16 #include "common/pauli.hpp"
17 #include "common/rdrandwrapper.hpp"
18 #include "hamiltonian.hpp"
19 
20 #include <map>
21 #include <random>
22 
23 #if ENABLE_UINT128
24 #include <ostream>
25 #endif
26 
27 namespace Qrack {
28 
29 class QInterface;
30 typedef std::shared_ptr<QInterface> QInterfacePtr;
31 
38 
43 
48 
53 
58 
63 
68 
73 
78 
83 
92 
98 
103 
108 
113 
114 #if ENABLE_OPENCL || ENABLE_CUDA
116 #if ENABLE_OPENCL
118 #else
120 #endif
121 #else
123 
125 #endif
126 
128 
130 
132 };
133 
141 class QInterface : public ParallelFor {
142 protected:
145  bool useRDRAND;
147  uint32_t randomSeed;
151  std::uniform_real_distribution<real1_s> rand_distribution;
152  std::shared_ptr<RdRandom> hardware_rand_generator;
153 
154  // Compilers have difficulty figuring out types and overloading if the "norm" handle is passed to std::transform. If
155  // you need a safe pointer to norm(), try this:
156  static inline real1_f normHelper(const complex& c) { return (real1_f)norm(c); }
157 
158  static inline real1_f clampProb(real1_f toClamp)
159  {
160  if (toClamp < ZERO_R1_F) {
161  toClamp = ZERO_R1_F;
162  }
163  if (toClamp > ONE_R1_F) {
164  toClamp = ONE_R1_F;
165  }
166  return toClamp;
167  }
168 
170  {
171  if (randGlobalPhase) {
172  real1_f angle = Rand() * 2 * (real1_f)PI_R1;
173  return complex((real1)cos(angle), (real1)sin(angle));
174  } else {
175  return ONE_CMPLX;
176  }
177  }
178 
179  template <typename Fn> void MACWrapper(const std::vector<bitLenInt>& controls, Fn fn)
180  {
181  bitCapInt xMask = ZERO_BCI;
182  for (const bitLenInt& control : controls) {
183  bi_or_ip(&xMask, pow2(control));
184  }
185 
186  XMask(xMask);
187  fn(controls);
188  XMask(xMask);
189  }
190 
191  virtual bitCapInt SampleClone(const std::vector<bitCapInt>& qPowers)
192  {
193  QInterfacePtr clone = Clone();
194 
195  const bitCapInt rawSample = clone->MAll();
196  bitCapInt sample = ZERO_BCI;
197  for (size_t i = 0U; i < qPowers.size(); ++i) {
198  if (bi_compare_0(rawSample & qPowers[i]) != 0) {
199  bi_or_ip(&sample, pow2(i));
200  }
201  }
202 
203  return sample;
204  }
205 
206  virtual real1_f ExpVarUnitaryAll(bool isExp, const std::vector<bitLenInt>& bits,
207  const std::vector<std::shared_ptr<complex>>& basisOps, std::vector<real1_f> eigenVals = {});
208  virtual real1_f ExpVarUnitaryAll(bool isExp, const std::vector<bitLenInt>& bits,
209  const std::vector<real1_f>& basisOps, std::vector<real1_f> eigenVals = {});
210  virtual real1_f ExpVarBitsAll(bool isExp, const std::vector<bitLenInt>& bits, const bitCapInt& offset = ZERO_BCI)
211  {
212  std::vector<bitCapInt> perms;
213  perms.reserve(bits.size() << 1U);
214  for (size_t i = 0U; i < bits.size(); ++i) {
215  perms.push_back(ZERO_BCI);
216  perms.push_back(pow2(i));
217  }
218 
219  return isExp ? ExpectationBitsFactorized(bits, perms, offset) : VarianceBitsFactorized(bits, perms, offset);
220  }
221 
222  virtual void Copy(QInterfacePtr orig)
223  {
224  orig->Finish();
225  doNormalize = orig->doNormalize;
226  randGlobalPhase = orig->randGlobalPhase;
227  useRDRAND = orig->useRDRAND;
228  qubitCount = orig->qubitCount;
229  randomSeed = orig->randomSeed;
230  amplitudeFloor = orig->amplitudeFloor;
231  maxQPower = orig->maxQPower;
232  rand_generator = orig->rand_generator;
233  rand_distribution = orig->rand_distribution;
234  hardware_rand_generator = orig->hardware_rand_generator;
235  }
236 
237 public:
238  QInterface(bitLenInt n, qrack_rand_gen_ptr rgp = nullptr, bool doNorm = false, bool useHardwareRNG = true,
239  bool randomGlobalPhase = true, real1_f norm_thresh = REAL1_EPSILON);
240 
243  : doNormalize(false)
244  , randGlobalPhase(true)
245  , useRDRAND(true)
246  , qubitCount(0U)
247  , randomSeed(0)
249  , maxQPower(ONE_BCI)
250  , rand_distribution(0.0, 1.0)
251  , hardware_rand_generator{ nullptr }
252  {
253  // Intentionally left blank
254  }
255 
256  virtual ~QInterface()
257  {
258  // Virtual destructor for inheritance
259  }
260 
261  void SetRandomSeed(uint32_t seed)
262  {
263  if (!!rand_generator) {
264  rand_generator->seed(seed);
265  }
266  }
267 
268  virtual void SetQubitCount(bitLenInt qb)
269  {
270  qubitCount = qb;
272  }
273 
275  virtual void SetConcurrency(uint32_t threadsPerEngine) { SetConcurrencyLevel(threadsPerEngine); }
276 
278  virtual bitLenInt GetQubitCount() { return qubitCount; }
279 
281  virtual bitCapInt GetMaxQPower() { return maxQPower; }
282 
284  virtual bitCapInt GetAmplitudeCount() { return maxQPower; }
285 
286  virtual bool GetIsArbitraryGlobalPhase() { return randGlobalPhase; }
287 
290  {
291  if (!!hardware_rand_generator) {
292  return hardware_rand_generator->Next();
293  } else {
295  }
296  }
297 
302  virtual void SetQuantumState(const complex* inputState) = 0;
303 
308  virtual void GetQuantumState(complex* outputState) = 0;
309 
314  virtual void GetReducedDensityMatrix(const std::vector<bitLenInt>& qubits, complex* outputState);
315 
318  virtual void GetProbs(real1* outputProbs) = 0;
319 
324  virtual complex GetAmplitude(const bitCapInt& perm) = 0;
325 
330  virtual void SetAmplitude(const bitCapInt& perm, const complex& amp) = 0;
331 
333  virtual void SetPermutation(const bitCapInt& perm, const complex& phaseFac = CMPLX_DEFAULT_ARG);
334 
371  virtual bitLenInt Compose(QInterfacePtr toCopy) { return Compose(toCopy, qubitCount); }
376  virtual bitLenInt ComposeNoClone(QInterfacePtr toCopy) { return Compose(toCopy); }
380  virtual std::map<QInterfacePtr, bitLenInt> Compose(std::vector<QInterfacePtr> toCopy);
384  virtual bitLenInt Compose(QInterfacePtr toCopy, bitLenInt start);
385 
423  virtual void Decompose(bitLenInt start, QInterfacePtr dest) = 0;
424 
428  virtual QInterfacePtr Decompose(bitLenInt start, bitLenInt length) = 0;
429 
467  virtual void Dispose(bitLenInt start, bitLenInt length) = 0;
468 
472  virtual void Dispose(bitLenInt start, bitLenInt length, const bitCapInt& disposedPerm) = 0;
473 
477  virtual bitLenInt Allocate(bitLenInt length) { return Allocate(qubitCount, length); }
478 
482  virtual bitLenInt Allocate(bitLenInt start, bitLenInt length) = 0;
483 
492  virtual void Mtrx(const complex* mtrx, bitLenInt qubit) = 0;
493 
497  virtual void MCMtrx(const std::vector<bitLenInt>& controls, const complex* mtrx, bitLenInt target) = 0;
498 
502  virtual void MACMtrx(const std::vector<bitLenInt>& controls, const complex* mtrx, bitLenInt target)
503  {
504  if (IS_NORM_0(mtrx[1U]) && IS_NORM_0(mtrx[2U])) {
505  MACPhase(controls, mtrx[0U], mtrx[3U], target);
506  } else if (IS_NORM_0(mtrx[0U]) && IS_NORM_0(mtrx[3U])) {
507  MACInvert(controls, mtrx[1U], mtrx[2U], target);
508  } else {
509  MACWrapper(controls, [this, mtrx, target](const std::vector<bitLenInt>& lc) { MCMtrx(lc, mtrx, target); });
510  }
511  }
512 
517  virtual void UCMtrx(
518  const std::vector<bitLenInt>& controls, const complex* mtrx, bitLenInt target, const bitCapInt& controlPerm);
519 
523  virtual void Phase(const complex& topLeft, const complex& bottomRight, bitLenInt qubit)
524  {
525  if ((randGlobalPhase || IS_NORM_0(ONE_CMPLX - topLeft)) && IS_NORM_0(topLeft - bottomRight)) {
526  return;
527  }
528 
529  const complex mtrx[4U]{ topLeft, ZERO_CMPLX, ZERO_CMPLX, bottomRight };
530  Mtrx(mtrx, qubit);
531  }
532 
536  virtual void Invert(const complex& topRight, const complex& bottomLeft, bitLenInt qubit)
537  {
538  const complex mtrx[4U]{ ZERO_CMPLX, topRight, bottomLeft, ZERO_CMPLX };
539  Mtrx(mtrx, qubit);
540  }
541 
545  virtual void MCPhase(
546  const std::vector<bitLenInt>& controls, const complex& topLeft, const complex& bottomRight, bitLenInt target)
547  {
548  if (IS_NORM_0(ONE_CMPLX - topLeft) && IS_NORM_0(ONE_CMPLX - bottomRight)) {
549  return;
550  }
551 
552  const complex mtrx[4U]{ topLeft, ZERO_CMPLX, ZERO_CMPLX, bottomRight };
553  MCMtrx(controls, mtrx, target);
554  }
555 
560  virtual void MCInvert(
561  const std::vector<bitLenInt>& controls, const complex& topRight, const complex& bottomLeft, bitLenInt target)
562  {
563  const complex mtrx[4U]{ ZERO_CMPLX, topRight, bottomLeft, ZERO_CMPLX };
564  MCMtrx(controls, mtrx, target);
565  }
566 
570  virtual void MACPhase(
571  const std::vector<bitLenInt>& controls, const complex& topLeft, const complex& bottomRight, bitLenInt target)
572  {
573  if (IS_NORM_0(ONE_CMPLX - topLeft) && IS_NORM_0(ONE_CMPLX - bottomRight)) {
574  return;
575  }
576 
577  MACWrapper(controls, [this, topLeft, bottomRight, target](const std::vector<bitLenInt>& lc) {
578  MCPhase(lc, topLeft, bottomRight, target);
579  });
580  }
581 
586  virtual void MACInvert(
587  const std::vector<bitLenInt>& controls, const complex& topRight, const complex& bottomLeft, bitLenInt target)
588  {
589  MACWrapper(controls, [this, topRight, bottomLeft, target](const std::vector<bitLenInt>& lc) {
590  MCInvert(lc, topRight, bottomLeft, target);
591  });
592  }
593 
598  virtual void UCPhase(const std::vector<bitLenInt>& controls, const complex& topLeft, const complex& bottomRight,
599  bitLenInt target, const bitCapInt& perm)
600  {
601  if (IS_NORM_0(ONE_CMPLX - topLeft) && IS_NORM_0(ONE_CMPLX - bottomRight)) {
602  return;
603  }
604 
605  const complex mtrx[4U]{ topLeft, ZERO_CMPLX, ZERO_CMPLX, bottomRight };
606  UCMtrx(controls, mtrx, target, perm);
607  }
608 
613  virtual void UCInvert(const std::vector<bitLenInt>& controls, const complex& topRight, const complex& bottomLeft,
614  bitLenInt target, const bitCapInt& perm)
615  {
616  const complex mtrx[4U]{ ZERO_CMPLX, topRight, bottomLeft, ZERO_CMPLX };
617  UCMtrx(controls, mtrx, target, perm);
618  }
619 
635  const std::vector<bitLenInt>& controls, bitLenInt qubit, const complex* mtrxs)
636  {
637  UniformlyControlledSingleBit(controls, qubit, mtrxs, std::vector<bitCapInt>(), ZERO_BCI);
638  }
639  virtual void UniformlyControlledSingleBit(const std::vector<bitLenInt>& controls, bitLenInt qubit,
640  const complex* mtrxs, const std::vector<bitCapInt>& mtrxSkipPowers, const bitCapInt& mtrxSkipValueMask);
641 
657  virtual void TimeEvolve(Hamiltonian h, real1_f timeDiff);
658 
662  virtual void CSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
663 
667  virtual void AntiCSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
668 
672  virtual void CSqrtSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
673 
677  virtual void AntiCSqrtSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
678 
682  virtual void CISqrtSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
683 
687  virtual void AntiCISqrtSwap(const std::vector<bitLenInt>& controls, bitLenInt qubit1, bitLenInt qubit2);
688 
694  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
695  {
696  const std::vector<bitLenInt> controls{ control1, control2 };
697  MCInvert(controls, ONE_CMPLX, ONE_CMPLX, target);
698  }
699 
705  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
706  {
707  const std::vector<bitLenInt> controls{ control1, control2 };
708  MACInvert(controls, ONE_CMPLX, ONE_CMPLX, target);
709  }
710 
716  virtual void CNOT(bitLenInt control, bitLenInt target)
717  {
718  const std::vector<bitLenInt> controls{ control };
719  MCInvert(controls, ONE_CMPLX, ONE_CMPLX, target);
720  }
721 
727  virtual void AntiCNOT(bitLenInt control, bitLenInt target)
728  {
729  const std::vector<bitLenInt> controls{ control };
730  MACInvert(controls, ONE_CMPLX, ONE_CMPLX, target);
731  }
732 
739  virtual void CY(bitLenInt control, bitLenInt target)
740  {
741  const std::vector<bitLenInt> controls{ control };
742  MCInvert(controls, -I_CMPLX, I_CMPLX, target);
743  }
744 
750  virtual void AntiCY(bitLenInt control, bitLenInt target)
751  {
752  const std::vector<bitLenInt> controls{ control };
753  MACInvert(controls, -I_CMPLX, I_CMPLX, target);
754  }
755 
762  virtual void CCY(bitLenInt control1, bitLenInt control2, bitLenInt target)
763  {
764  const std::vector<bitLenInt> controls{ control1, control2 };
765  MCInvert(controls, -I_CMPLX, I_CMPLX, target);
766  }
767 
773  virtual void AntiCCY(bitLenInt control1, bitLenInt control2, bitLenInt target)
774  {
775  const std::vector<bitLenInt> controls{ control1, control2 };
776  MACInvert(controls, -I_CMPLX, I_CMPLX, target);
777  }
778 
785  virtual void CZ(bitLenInt control, bitLenInt target)
786  {
787  const std::vector<bitLenInt> controls{ control };
788  MCPhase(controls, ONE_CMPLX, -ONE_CMPLX, target);
789  }
790 
796  virtual void AntiCZ(bitLenInt control, bitLenInt target)
797  {
798  const std::vector<bitLenInt> controls{ control };
799  MACPhase(controls, ONE_CMPLX, -ONE_CMPLX, target);
800  }
801 
808  virtual void CCZ(bitLenInt control1, bitLenInt control2, bitLenInt target)
809  {
810  const std::vector<bitLenInt> controls{ control1, control2 };
811  MCPhase(controls, ONE_CMPLX, -ONE_CMPLX, target);
812  }
813 
819  virtual void AntiCCZ(bitLenInt control1, bitLenInt control2, bitLenInt target)
820  {
821  const std::vector<bitLenInt> controls{ control1, control2 };
822  MACPhase(controls, ONE_CMPLX, -ONE_CMPLX, target);
823  }
824 
831  virtual void U(bitLenInt target, real1_f theta, real1_f phi, real1_f lambda);
832 
838  virtual void U2(bitLenInt target, real1_f phi, real1_f lambda) { U(target, (real1_f)(M_PI / 2), phi, lambda); }
839 
845  virtual void IU2(bitLenInt target, real1_f phi, real1_f lambda)
846  {
847  U(target, (real1_f)(M_PI / 2), (real1_f)(-lambda - PI_R1), (real1_f)(-phi + PI_R1));
848  }
849 
855  virtual void AI(bitLenInt target, real1_f azimuth, real1_f inclination);
856 
862  virtual void IAI(bitLenInt target, real1_f azimuth, real1_f inclination);
863 
869  virtual void CAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination);
870 
877  virtual void AntiCAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination);
878 
885  virtual void CIAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination);
886 
893  virtual void AntiCIAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination);
894 
902  virtual void CU(
903  const std::vector<bitLenInt>& controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda);
904 
912  virtual void AntiCU(
913  const std::vector<bitLenInt>& controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda);
914 
920  virtual void H(bitLenInt qubit)
921  {
925  Mtrx(mtrx, qubit);
926  }
927 
933  virtual void SqrtH(bitLenInt qubit)
934  {
935  QRACK_CONST complex m00 =
936  complex((real1)((ONE_R1 + SQRT2_R1) / (2 * SQRT2_R1)), (real1)((-ONE_R1 + SQRT2_R1) / (2 * SQRT2_R1)));
937  QRACK_CONST complex m01 = complex((real1)(SQRT1_2_R1 / 2), (real1)(-SQRT1_2_R1 / 2));
938  QRACK_CONST complex m10 = m01;
939  QRACK_CONST complex m11 =
940  complex((real1)((-ONE_R1 + SQRT2_R1) / (2 * SQRT2_R1)), (real1)((ONE_R1 + SQRT2_R1) / (2 * SQRT2_R1)));
941  QRACK_CONST complex mtrx[4]{ m00, m01, m10, m11 };
942  Mtrx(mtrx, qubit);
943  }
944 
950  virtual void SH(bitLenInt qubit)
951  {
954  QRACK_CONST complex C_I_SQRT1_2_NEG = complex(ZERO_R1, -SQRT1_2_R1);
955  QRACK_CONST complex mtrx[4]{ C_SQRT1_2, C_SQRT1_2, C_I_SQRT1_2, C_I_SQRT1_2_NEG };
956  Mtrx(mtrx, qubit);
957  }
958 
964  virtual void HIS(bitLenInt qubit)
965  {
968  QRACK_CONST complex C_I_SQRT1_2_NEG = complex(ZERO_R1, -SQRT1_2_R1);
969  QRACK_CONST complex mtrx[4]{ C_SQRT1_2, C_I_SQRT1_2_NEG, C_SQRT1_2, C_I_SQRT1_2 };
970  Mtrx(mtrx, qubit);
971  }
972 
1020  virtual bool M(bitLenInt qubit) { return ForceM(qubit, false, false); };
1021 
1027  virtual bool ForceM(bitLenInt qubit, bool result, bool doForce = true, bool doApply = true) = 0;
1028 
1034  virtual void S(bitLenInt qubit) { Phase(ONE_CMPLX, I_CMPLX, qubit); }
1035 
1041  virtual void IS(bitLenInt qubit) { Phase(ONE_CMPLX, -I_CMPLX, qubit); }
1042 
1048  virtual void T(bitLenInt qubit) { Phase(ONE_CMPLX, complex(SQRT1_2_R1, SQRT1_2_R1), qubit); }
1049 
1055  virtual void IT(bitLenInt qubit) { Phase(ONE_CMPLX, complex(SQRT1_2_R1, -SQRT1_2_R1), qubit); }
1056 
1062  virtual void PhaseRootN(bitLenInt n, bitLenInt qubit)
1063  {
1064  if (n == 0) {
1065  return;
1066  }
1067 
1068  Phase(ONE_CMPLX, pow(-ONE_CMPLX, (real1)(ONE_R1 / pow2Ocl(n - 1U))), qubit);
1069  }
1070 
1076  virtual void PhaseRootNMask(bitLenInt n, const bitCapInt& mask);
1077 
1083  virtual void PhaseParity(real1_f radians, const bitCapInt& mask);
1084 
1091  virtual void X(bitLenInt qubit) { Invert(ONE_CMPLX, ONE_CMPLX, qubit); }
1092 
1099  virtual void XMask(const bitCapInt& mask);
1100 
1108  virtual void Y(bitLenInt qubit) { Invert(-I_CMPLX, I_CMPLX, qubit); }
1109 
1116  virtual void YMask(const bitCapInt& mask);
1117 
1124  virtual void Z(bitLenInt qubit) { Phase(ONE_CMPLX, -ONE_CMPLX, qubit); }
1125 
1132  virtual void ZMask(const bitCapInt& mask);
1133 
1140  virtual void SqrtX(bitLenInt qubit)
1141  {
1142  QRACK_CONST complex ONE_PLUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(ONE_R1 / 2));
1143  QRACK_CONST complex ONE_MINUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1144  QRACK_CONST complex mtrx[4]{ ONE_PLUS_I_DIV_2, ONE_MINUS_I_DIV_2, ONE_MINUS_I_DIV_2, ONE_PLUS_I_DIV_2 };
1145  Mtrx(mtrx, qubit);
1146  }
1147 
1154  virtual void ISqrtX(bitLenInt qubit)
1155  {
1156  QRACK_CONST complex ONE_PLUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(ONE_R1 / 2));
1157  QRACK_CONST complex ONE_MINUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1158  QRACK_CONST complex mtrx[4]{ ONE_MINUS_I_DIV_2, ONE_PLUS_I_DIV_2, ONE_PLUS_I_DIV_2, ONE_MINUS_I_DIV_2 };
1159  Mtrx(mtrx, qubit);
1160  }
1161 
1169  virtual void SqrtY(bitLenInt qubit)
1170  {
1171  QRACK_CONST complex ONE_PLUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(ONE_R1 / 2));
1172  QRACK_CONST complex ONE_PLUS_I_DIV_2_NEG = complex((real1)(-ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1173  QRACK_CONST complex mtrx[4]{ ONE_PLUS_I_DIV_2, ONE_PLUS_I_DIV_2_NEG, ONE_PLUS_I_DIV_2, ONE_PLUS_I_DIV_2 };
1174  Mtrx(mtrx, qubit);
1175  }
1176 
1184  virtual void ISqrtY(bitLenInt qubit)
1185  {
1186  QRACK_CONST complex ONE_MINUS_I_DIV_2 = complex((real1)(ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1187  QRACK_CONST complex ONE_MINUS_I_DIV_2_NEG = complex((real1)(-ONE_R1 / 2), (real1)(ONE_R1 / 2));
1188  QRACK_CONST complex mtrx[4]{ ONE_MINUS_I_DIV_2, ONE_MINUS_I_DIV_2, ONE_MINUS_I_DIV_2_NEG, ONE_MINUS_I_DIV_2 };
1189  Mtrx(mtrx, qubit);
1190  }
1191 
1197  virtual void SqrtW(bitLenInt qubit)
1198  {
1200  QRACK_CONST complex m01 = complex((real1)(-ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1201  QRACK_CONST complex m10 = complex((real1)(ONE_R1 / 2), (real1)(-ONE_R1 / 2));
1202  QRACK_CONST complex mtrx[4]{ diag, m01, m10, diag };
1203  Mtrx(mtrx, qubit);
1204  }
1205 
1211  virtual void ISqrtW(bitLenInt qubit)
1212  {
1214  QRACK_CONST complex m01 = complex((real1)(ONE_R1 / 2), (real1)(ONE_R1 / 2));
1215  QRACK_CONST complex m10 = complex((real1)(-ONE_R1 / 2), (real1)(ONE_R1 / 2));
1216  QRACK_CONST complex mtrx[4]{ diag, m01, m10, diag };
1217  Mtrx(mtrx, qubit);
1218  }
1219 
1226  virtual void CH(bitLenInt control, bitLenInt target)
1227  {
1228  const std::vector<bitLenInt> controls{ control };
1232  MCMtrx(controls, mtrx, target);
1233  }
1234 
1241  virtual void AntiCH(bitLenInt control, bitLenInt target)
1242  {
1243  const std::vector<bitLenInt> controls{ control };
1247  MACMtrx(controls, mtrx, target);
1248  }
1249 
1256  virtual void CS(bitLenInt control, bitLenInt target)
1257  {
1258  const std::vector<bitLenInt> controls{ control };
1259  MCPhase(controls, ONE_CMPLX, I_CMPLX, target);
1260  }
1261 
1268  virtual void AntiCS(bitLenInt control, bitLenInt target)
1269  {
1270  const std::vector<bitLenInt> controls{ control };
1271  MACPhase(controls, ONE_CMPLX, I_CMPLX, target);
1272  }
1273 
1280  virtual void CIS(bitLenInt control, bitLenInt target)
1281  {
1282  const std::vector<bitLenInt> controls{ control };
1283  MCPhase(controls, ONE_CMPLX, -I_CMPLX, target);
1284  }
1285 
1292  virtual void AntiCIS(bitLenInt control, bitLenInt target)
1293  {
1294  const std::vector<bitLenInt> controls{ control };
1295  MACPhase(controls, ONE_CMPLX, -I_CMPLX, target);
1296  }
1297 
1304  virtual void CT(bitLenInt control, bitLenInt target)
1305  {
1306  const std::vector<bitLenInt> controls{ control };
1307  MCPhase(controls, ONE_CMPLX, complex(SQRT1_2_R1, SQRT1_2_R1), target);
1308  }
1309 
1316  virtual void CIT(bitLenInt control, bitLenInt target)
1317  {
1318  const std::vector<bitLenInt> controls{ control };
1319  MCPhase(controls, ONE_CMPLX, complex(SQRT1_2_R1, -SQRT1_2_R1), target);
1320  }
1321 
1328  virtual void CPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
1329  {
1330  if (n == 0) {
1331  return;
1332  }
1333 
1334  const std::vector<bitLenInt> controls{ control };
1335  MCPhase(controls, ONE_CMPLX, pow(-ONE_CMPLX, (real1)(ONE_R1 / pow2Ocl(n - 1U))), target);
1336  }
1337 
1344  virtual void AntiCPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
1345  {
1346  if (n == 0) {
1347  return;
1348  }
1349 
1350  const std::vector<bitLenInt> controls{ control };
1351  MACPhase(controls, ONE_CMPLX, pow(-ONE_CMPLX, (real1)(ONE_R1 / pow2Ocl(n - 1U))), target);
1352  }
1353 
1360  virtual void CIPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
1361  {
1362  if (n == 0) {
1363  return;
1364  }
1365 
1366  const std::vector<bitLenInt> controls{ control };
1367  MCPhase(controls, ONE_CMPLX, pow(-ONE_CMPLX, (real1)(-ONE_R1 / pow2Ocl(n - 1U))), target);
1368  }
1369 
1376  virtual void AntiCIPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
1377  {
1378  if (n == 0) {
1379  return;
1380  }
1381 
1382  const std::vector<bitLenInt> controls{ control };
1383  MACPhase(controls, ONE_CMPLX, pow(-ONE_CMPLX, (real1)(-ONE_R1 / pow2Ocl(n - 1U))), target);
1384  }
1385 
1402  virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1403 
1409  virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1410 
1416  virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1417 
1422  virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1423 
1428  virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1429 
1434  virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1435 
1441  virtual void NAND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1442 
1448  virtual void NOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1449 
1455  virtual void XNOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit);
1456 
1461  virtual void CLNAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1462 
1467  virtual void CLNOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1468 
1473  virtual void CLXNOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit);
1474 
1496  virtual void UniformlyControlledRY(const std::vector<bitLenInt>& controls, bitLenInt qubit, const real1* angles);
1497 
1508  virtual void UniformlyControlledRZ(const std::vector<bitLenInt>& controls, bitLenInt qubit, const real1* angles);
1509 
1515  virtual void RT(real1_f radians, bitLenInt qubit);
1516 
1522  virtual void RX(real1_f radians, bitLenInt qubit);
1523 
1529  virtual void RY(real1_f radians, bitLenInt qubit);
1530 
1536  virtual void RZ(real1_f radians, bitLenInt qubit);
1537 
1544  virtual void CRZ(real1_f radians, bitLenInt control, bitLenInt target);
1545 
1552  virtual void CRY(real1_f radians, bitLenInt control, bitLenInt target);
1553 
1554 #if ENABLE_ROT_API
1561  virtual void RTDyad(int numerator, int denomPower, bitLenInt qubit);
1562 
1568  virtual void RXDyad(int numerator, int denomPower, bitLenInt qubit);
1569 
1575  virtual void Exp(real1_f radians, bitLenInt qubit);
1576 
1582  virtual void Exp(
1583  const std::vector<bitLenInt>& controls, bitLenInt qubit, const complex* matrix2x2, bool antiCtrled = false);
1584 
1591  virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubit);
1592 
1598  virtual void ExpX(real1_f radians, bitLenInt qubit);
1599 
1606  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubit);
1607 
1613  virtual void ExpY(real1_f radians, bitLenInt qubit);
1614 
1621  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubit);
1622 
1628  virtual void ExpZ(real1_f radians, bitLenInt qubit);
1629 
1636  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubit);
1637 
1643  virtual void CRX(real1_f radians, bitLenInt control, bitLenInt target);
1644 
1650  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
1651 
1657  virtual void RYDyad(int numerator, int denomPower, bitLenInt qubit);
1658 
1665  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
1666 
1672  virtual void RZDyad(int numerator, int denomPower, bitLenInt qubit);
1673 
1680  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
1681 
1689  virtual void CRT(real1_f radians, bitLenInt control, bitLenInt target);
1690 
1697  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target);
1698 #endif
1699 
1712  virtual void H(bitLenInt start, bitLenInt length);
1713 
1715  virtual void X(bitLenInt start, bitLenInt length) { XMask(bitRegMask(start, length)); }
1716 
1717 #if ENABLE_REG_GATES
1718 
1720  virtual void U(bitLenInt start, bitLenInt length, real1_f theta, real1_f phi, real1_f lambda);
1721 
1723  virtual void U2(bitLenInt start, bitLenInt length, real1_f phi, real1_f lambda);
1724 
1726  virtual void SH(bitLenInt start, bitLenInt length);
1727 
1729  virtual void HIS(bitLenInt start, bitLenInt length);
1730 
1732  virtual void SqrtH(bitLenInt start, bitLenInt length);
1733 
1735  virtual void S(bitLenInt start, bitLenInt length);
1736 
1738  virtual void IS(bitLenInt start, bitLenInt length);
1739 
1741  virtual void T(bitLenInt start, bitLenInt length);
1742 
1744  virtual void IT(bitLenInt start, bitLenInt length);
1745 
1747  virtual void PhaseRootN(bitLenInt n, bitLenInt start, bitLenInt length);
1748 
1750  virtual void IPhaseRootN(bitLenInt n, bitLenInt start, bitLenInt length);
1751 
1753  virtual void Y(bitLenInt start, bitLenInt length);
1754 
1756  virtual void SqrtX(bitLenInt start, bitLenInt length);
1757 
1759  virtual void ISqrtX(bitLenInt start, bitLenInt length);
1760 
1762  virtual void SqrtY(bitLenInt start, bitLenInt length);
1763 
1765  virtual void ISqrtY(bitLenInt start, bitLenInt length);
1766 
1768  virtual void Z(bitLenInt start, bitLenInt length);
1769 
1771  virtual void CNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
1772 
1774  virtual void AntiCNOT(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
1775 
1777  virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1778 
1780  virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1781 
1783  virtual void CY(bitLenInt control, bitLenInt target, bitLenInt length);
1784 
1786  virtual void AntiCY(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
1787 
1789  virtual void CCY(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1790 
1792  virtual void AntiCCY(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1793 
1795  virtual void CZ(bitLenInt control, bitLenInt target, bitLenInt length);
1796 
1798  virtual void AntiCZ(bitLenInt inputBits, bitLenInt targetBits, bitLenInt length);
1799 
1801  virtual void CCZ(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1802 
1804  virtual void AntiCCZ(bitLenInt control1, bitLenInt control2, bitLenInt target, bitLenInt length);
1805 
1807  virtual void Swap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1808 
1810  virtual void ISwap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1811 
1813  virtual void IISwap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1814 
1816  virtual void SqrtSwap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1817 
1819  virtual void ISqrtSwap(bitLenInt start1, bitLenInt start2, bitLenInt length);
1820 
1822  virtual void FSim(real1_f theta, real1_f phi, bitLenInt start1, bitLenInt start2, bitLenInt length);
1823 
1830  virtual void AND(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1831 
1838  virtual void CLAND(bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1839 
1841  virtual void OR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1842 
1844  virtual void CLOR(bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1845 
1847  virtual void XOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1848 
1850  virtual void CLXOR(bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1851 
1853  virtual void NAND(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1854 
1856  virtual void CLNAND(
1857  bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1858 
1860  virtual void NOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1861 
1863  virtual void CLNOR(bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1864 
1866  virtual void XNOR(bitLenInt inputStart1, bitLenInt inputStart2, bitLenInt outputStart, bitLenInt length);
1867 
1869  virtual void CLXNOR(
1870  bitLenInt qInputStart, const bitCapInt& classicalInput, bitLenInt outputStart, bitLenInt length);
1871 
1872 #if ENABLE_ROT_API
1878  virtual void RT(real1_f radians, bitLenInt start, bitLenInt length);
1879 
1886  virtual void RTDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
1887 
1893  virtual void RX(real1_f radians, bitLenInt start, bitLenInt length);
1894 
1900  virtual void RXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
1901 
1907  virtual void CRX(real1_f radians, bitLenInt control, bitLenInt target, bitLenInt length);
1908 
1914  virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
1915 
1921  virtual void RY(real1_f radians, bitLenInt start, bitLenInt length);
1922 
1929  virtual void RYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
1930 
1937  virtual void CRY(real1_f radians, bitLenInt control, bitLenInt target, bitLenInt length);
1938 
1945  virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
1946 
1952  virtual void RZ(real1_f radians, bitLenInt start, bitLenInt length);
1953 
1959  virtual void RZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
1960 
1967  virtual void CRZ(real1_f radians, bitLenInt control, bitLenInt target, bitLenInt length);
1968 
1975  virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
1976 
1983  virtual void CRT(real1_f radians, bitLenInt control, bitLenInt target, bitLenInt length);
1984 
1991  virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target, bitLenInt length);
1992 
1998  virtual void Exp(real1_f radians, bitLenInt start, bitLenInt length);
1999 
2006  virtual void ExpDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
2007 
2013  virtual void ExpX(real1_f radians, bitLenInt start, bitLenInt length);
2014 
2021  virtual void ExpXDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
2022 
2028  virtual void ExpY(real1_f radians, bitLenInt start, bitLenInt length);
2029 
2036  virtual void ExpYDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
2037 
2043  virtual void ExpZ(real1_f radians, bitLenInt start, bitLenInt length);
2044 
2051  virtual void ExpZDyad(int numerator, int denomPower, bitLenInt start, bitLenInt length);
2052 #endif
2053 
2060  virtual void CH(bitLenInt control, bitLenInt target, bitLenInt length);
2061 
2068  virtual void CS(bitLenInt control, bitLenInt target, bitLenInt length);
2069 
2076  virtual void CIS(bitLenInt control, bitLenInt target, bitLenInt length);
2077 
2084  virtual void CT(bitLenInt control, bitLenInt target, bitLenInt length);
2085 
2092  virtual void CIT(bitLenInt control, bitLenInt target, bitLenInt length);
2093 
2100  virtual void CPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target, bitLenInt length);
2101 
2108  virtual void CIPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target, bitLenInt length);
2109 
2111 #endif
2112 
2120  virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length);
2121 
2123  virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length);
2124 
2126  virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length);
2127 
2129  virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length);
2130 
2132  virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length);
2133 
2135  virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length);
2136 
2138  virtual void INC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length);
2139 
2141  virtual void DEC(const bitCapInt& toSub, bitLenInt start, bitLenInt length)
2142  {
2143  const bitCapInt invToSub = pow2(length) - toSub;
2144  INC(invToSub, start, length);
2145  }
2146 
2148  virtual void INCDECC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex);
2149 
2151  virtual void INCC(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
2152  {
2153  const bool hasCarry = M(carryIndex);
2154  if (hasCarry) {
2155  X(carryIndex);
2156  INCDECC(toAdd + 1U, start, length, carryIndex);
2157  } else {
2158  INCDECC(toAdd, start, length, carryIndex);
2159  }
2160  }
2161 
2163  virtual void DECC(const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
2164  {
2165  const bool hasCarry = M(carryIndex);
2166  bitCapInt invToSub = pow2(length) - toSub;
2167  if (hasCarry) {
2168  X(carryIndex);
2169  } else {
2170  --invToSub;
2171  }
2172 
2173  INCDECC(invToSub, start, length, carryIndex);
2174  }
2175 
2177  virtual void CINC(
2178  const bitCapInt& toAdd, bitLenInt inOutStart, bitLenInt length, const std::vector<bitLenInt>& controls);
2179 
2181  virtual void CDEC(
2182  const bitCapInt& toSub, bitLenInt inOutStart, bitLenInt length, const std::vector<bitLenInt>& controls)
2183  {
2184  const bitCapInt invToSub = pow2(length) - toSub;
2185  CINC(invToSub, inOutStart, length, controls);
2186  }
2187 
2189  virtual void INCS(const bitCapInt& toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
2190  {
2191  const bitCapInt signMask = pow2(length - 1U);
2192  INC(signMask, start, length);
2193  INCDECC(toAdd & ~signMask, start, length, overflowIndex);
2194  if (bi_compare_0(toAdd & signMask) == 0) {
2195  DEC(signMask, start, length);
2196  }
2197  }
2198 
2200  virtual void DECS(const bitCapInt& toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
2201  {
2202  const bitCapInt invToSub = pow2(length) - toSub;
2203  INCS(invToSub, start, length, overflowIndex);
2204  }
2205 
2207  virtual void MULModNOut(
2208  const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length);
2209 
2211  virtual void IMULModNOut(
2212  const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length);
2213 
2215  virtual void CMULModNOut(const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart,
2216  bitLenInt length, const std::vector<bitLenInt>& controls);
2217 
2219  virtual void CIMULModNOut(const bitCapInt& toMul, const bitCapInt& modN, bitLenInt inStart, bitLenInt outStart,
2220  bitLenInt length, const std::vector<bitLenInt>& controls);
2221 
2227  virtual void FullAdd(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
2228  {
2229  // See https://quantumcomputing.stackexchange.com/questions/1654/how-do-i-add-11-using-a-quantum-computer
2230 
2231  // Assume outputBit is in 0 state.
2232  CCNOT(inputBit1, inputBit2, carryOut);
2233  CNOT(inputBit1, inputBit2);
2234  CCNOT(inputBit2, carryInSumOut, carryOut);
2235  CNOT(inputBit2, carryInSumOut);
2236  CNOT(inputBit1, inputBit2);
2237  }
2238 
2244  virtual void IFullAdd(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
2245  {
2246  // See https://quantumcomputing.stackexchange.com/questions/1654/how-do-i-add-11-using-a-quantum-computer
2247  // Quantum computing is reversible! Simply perform the inverse operations in reverse order!
2248  // (CNOT and CCNOT are self-inverse.)
2249 
2250  // Assume outputBit is in 0 state.
2251  CNOT(inputBit1, inputBit2);
2252  CNOT(inputBit2, carryInSumOut);
2253  CCNOT(inputBit2, carryInSumOut, carryOut);
2254  CNOT(inputBit1, inputBit2);
2255  CCNOT(inputBit1, inputBit2, carryOut);
2256  }
2257 
2263  virtual void CFullAdd(const std::vector<bitLenInt>& controls, bitLenInt inputBit1, bitLenInt inputBit2,
2264  bitLenInt carryInSumOut, bitLenInt carryOut);
2265 
2271  virtual void CIFullAdd(const std::vector<bitLenInt>& controls, bitLenInt inputBit1, bitLenInt inputBit2,
2272  bitLenInt carryInSumOut, bitLenInt carryOut);
2273 
2279  virtual void ADC(bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry);
2280 
2286  virtual void IADC(bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry);
2287 
2293  virtual void CADC(const std::vector<bitLenInt>& controls, bitLenInt input1, bitLenInt input2, bitLenInt output,
2294  bitLenInt length, bitLenInt carry);
2295 
2301  virtual void CIADC(const std::vector<bitLenInt>& controls, bitLenInt input1, bitLenInt input2, bitLenInt output,
2302  bitLenInt length, bitLenInt carry);
2303 
2318  virtual void QFT(bitLenInt start, bitLenInt length, bool trySeparate = false);
2319 
2326  virtual void QFTR(const std::vector<bitLenInt>& qubits, bool trySeparate = false);
2327 
2334  virtual void IQFT(bitLenInt start, bitLenInt length, bool trySeparate = false);
2335 
2342  virtual void IQFTR(const std::vector<bitLenInt>& qubits, bool trySeparate = false);
2343 
2345  virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length);
2346 
2348  virtual void PhaseFlip() { Phase(-ONE_CMPLX, -ONE_CMPLX, 0); }
2349 
2351  virtual void SetReg(bitLenInt start, bitLenInt length, const bitCapInt& value);
2352 
2354  virtual bitCapInt MReg(bitLenInt start, bitLenInt length) { return ForceMReg(start, length, ZERO_BCI, false); }
2355 
2357  virtual bitCapInt MAll() { return MReg(0, qubitCount); }
2358 
2364  virtual bitCapInt ForceMReg(
2365  bitLenInt start, bitLenInt length, const bitCapInt& result, bool doForce = true, bool doApply = true);
2366 
2368  virtual bitCapInt M(const std::vector<bitLenInt>& bits) { return ForceM(bits, std::vector<bool>()); }
2369 
2371  virtual bitCapInt ForceM(const std::vector<bitLenInt>& bits, const std::vector<bool>& values, bool doApply = true);
2372 
2374  virtual void Swap(bitLenInt qubit1, bitLenInt qubit2);
2375 
2377  virtual void ISwap(bitLenInt qubit1, bitLenInt qubit2);
2378 
2380  virtual void IISwap(bitLenInt qubit1, bitLenInt qubit2);
2381 
2383  virtual void SqrtSwap(bitLenInt qubit1, bitLenInt qubit2);
2384 
2386  virtual void ISqrtSwap(bitLenInt qubit1, bitLenInt qubit2);
2387 
2389  virtual void FSim(real1_f theta, real1_f phi, bitLenInt qubit1, bitLenInt qubit2)
2390  {
2391  const std::vector<bitLenInt> controls{ qubit1 };
2392  const real1 sinTheta = (real1)sin(theta);
2393  const complex expIPhi = exp(complex(ZERO_R1, -(real1)phi));
2394 
2395  MCPhase(controls, ONE_CMPLX, expIPhi, qubit2);
2396 
2397  if ((2 * abs(sinTheta)) <= (FP_NORM_EPSILON * PI_R1)) {
2398  // ISWAP power is 0.
2399  return;
2400  }
2401 
2402  const real1 sinThetaDiffNeg = ONE_R1 + sinTheta;
2403  if ((2 * abs(sinThetaDiffNeg)) <= (FP_NORM_EPSILON * PI_R1)) {
2404  return ISwap(qubit1, qubit2);
2405  }
2406 
2407  const real1 sinThetaDiffPos = ONE_R1 - sinTheta;
2408  if ((2 * abs(sinThetaDiffPos)) <= (FP_NORM_EPSILON * PI_R1)) {
2409  return IISwap(qubit1, qubit2);
2410  }
2411 
2412  // Decompose root of ISWAP gate:
2413 
2414  // RXX
2415  H(qubit1);
2416  H(qubit2);
2417  CNOT(qubit1, qubit2);
2418  RZ(2 * theta, qubit2);
2419  CNOT(qubit1, qubit2);
2420  H(qubit2);
2421  H(qubit1);
2422 
2423  // RYY
2424  S(qubit1);
2425  S(qubit2);
2426  H(qubit1);
2427  H(qubit2);
2428  CNOT(qubit1, qubit2);
2429  RZ(2 * theta, qubit2);
2430  CNOT(qubit1, qubit2);
2431  H(qubit2);
2432  H(qubit1);
2433  IS(qubit2);
2434  IS(qubit1);
2435  }
2436 
2438  virtual void Reverse(bitLenInt first, bitLenInt last)
2439  {
2440  while ((last > 0U) && (first < (last - 1U))) {
2441  --last;
2442  Swap(first, last);
2443  ++first;
2444  }
2445  }
2446 
2458  virtual real1_f Prob(bitLenInt qubit) = 0;
2462  virtual real1_f CProb(bitLenInt control, bitLenInt target)
2463  {
2464  AntiCNOT(control, target);
2465  const real1_f prob = Prob(target);
2466  AntiCNOT(control, target);
2467 
2468  return prob;
2469  }
2473  virtual real1_f ACProb(bitLenInt control, bitLenInt target)
2474  {
2475  CNOT(control, target);
2476  const real1_f prob = Prob(target);
2477  CNOT(control, target);
2478 
2479  return prob;
2480  }
2481 
2486  {
2487  real1_f totProb = ZERO_R1_F;
2488  real1_f highestProb = ZERO_R1_F;
2489  bitCapInt bestPerm = ZERO_BCI;
2490  for (bitCapInt p = ZERO_BCI; p < maxQPower; ++p) {
2491  real1_f prob = ProbAll(p);
2492  if (prob > highestProb) {
2493  highestProb = prob;
2494  bestPerm = p;
2495  }
2496  totProb += prob;
2497  if (highestProb > (ONE_R1_F - totProb)) {
2498  break;
2499  }
2500  }
2501 
2502  return bestPerm;
2503  }
2504 
2508  virtual std::vector<bitCapInt> HighestProbAll(size_t n);
2509 
2513  virtual real1_f ProbAll(const bitCapInt& fullRegister)
2514  {
2515  return clampProb((real1_f)norm(GetAmplitude(fullRegister)));
2516  }
2517 
2521  virtual real1_f ProbReg(bitLenInt start, bitLenInt length, const bitCapInt& permutation);
2522 
2530  virtual real1_f ProbMask(const bitCapInt& mask, const bitCapInt& permutation);
2531 
2538  virtual void ProbMaskAll(const bitCapInt& mask, real1* probsArray);
2539 
2546  virtual void ProbBitsAll(const std::vector<bitLenInt>& bits, real1* probsArray);
2547 
2554  virtual real1_f VarianceBitsAll(const std::vector<bitLenInt>& bits, const bitCapInt& offset = ZERO_BCI)
2555  {
2556  return ExpVarBitsAll(false, bits, offset);
2557  }
2558 
2566  bool roundRz, const std::vector<bitLenInt>& bits, const bitCapInt& offset = ZERO_BCI)
2567  {
2568  return VarianceBitsAll(bits, offset);
2569  }
2570 
2577  virtual real1_f VariancePauliAll(std::vector<bitLenInt> bits, std::vector<Pauli> paulis);
2578 
2586  const std::vector<bitLenInt>& bits, const std::vector<real1_f>& basisOps, std::vector<real1_f> eigenVals = {})
2587  {
2588  return ExpVarUnitaryAll(false, bits, basisOps, eigenVals);
2589  }
2590 
2597  virtual real1_f VarianceUnitaryAll(const std::vector<bitLenInt>& bits,
2598  const std::vector<std::shared_ptr<complex>>& basisOps, std::vector<real1_f> eigenVals = {})
2599  {
2600  return ExpVarUnitaryAll(false, bits, basisOps, eigenVals);
2601  }
2602 
2609  virtual real1_f VarianceFloatsFactorized(const std::vector<bitLenInt>& bits, const std::vector<real1_f>& weights);
2610 
2619  bool roundRz, const std::vector<bitLenInt>& bits, const std::vector<real1_f>& weights)
2620  {
2621  return VarianceFloatsFactorized(bits, weights);
2622  }
2623 
2631  const std::vector<bitLenInt>& bits, const std::vector<bitCapInt>& perms, const bitCapInt& offset = ZERO_BCI);
2632 
2640  virtual real1_f VarianceBitsFactorizedRdm(bool roundRz, const std::vector<bitLenInt>& bits,
2641  const std::vector<bitCapInt>& perms, const bitCapInt& offset = ZERO_BCI)
2642  {
2643  return VarianceBitsFactorized(bits, perms, offset);
2644  }
2645 
2652  virtual real1_f ExpectationBitsAll(const std::vector<bitLenInt>& bits, const bitCapInt& offset = ZERO_BCI)
2653  {
2654  return ExpVarBitsAll(true, bits, offset);
2655  }
2656 
2663  virtual real1_f ExpectationPauliAll(std::vector<bitLenInt> bits, std::vector<Pauli> paulis);
2664 
2671  virtual real1_f ExpectationUnitaryAll(const std::vector<bitLenInt>& bits,
2672  const std::vector<std::shared_ptr<complex>>& basisOps, std::vector<real1_f> eigenVals = {})
2673  {
2674  return ExpVarUnitaryAll(true, bits, basisOps, eigenVals);
2675  }
2676 
2684  const std::vector<bitLenInt>& bits, const std::vector<real1_f>& basisOps, std::vector<real1_f> eigenVals = {})
2685  {
2686  return ExpVarUnitaryAll(true, bits, basisOps, eigenVals);
2687  }
2688 
2696  const std::vector<bitLenInt>& bits, const std::vector<bitCapInt>& perms, const bitCapInt& offset = ZERO_BCI);
2697 
2705  virtual real1_f ExpectationBitsFactorizedRdm(bool roundRz, const std::vector<bitLenInt>& bits,
2706  const std::vector<bitCapInt>& perms, const bitCapInt& offset = ZERO_BCI)
2707  {
2708  return ExpectationBitsFactorized(bits, perms, offset);
2709  }
2710 
2718  const std::vector<bitLenInt>& bits, const std::vector<real1_f>& weights);
2719 
2728  bool roundRz, const std::vector<bitLenInt>& bits, const std::vector<real1_f>& weights)
2729  {
2730  return ExpectationFloatsFactorized(bits, weights);
2731  }
2732 
2737  virtual real1_f ProbRdm(bitLenInt qubit) { return Prob(qubit); }
2741  virtual real1_f ProbAllRdm(bool roundRz, const bitCapInt& fullRegister) { return ProbAll(fullRegister); }
2749  virtual real1_f ProbMaskRdm(bool roundRz, const bitCapInt& mask, const bitCapInt& permutation)
2750  {
2751  return ProbMask(mask, permutation);
2752  }
2760  bool roundRz, const std::vector<bitLenInt>& bits, const bitCapInt& offset = ZERO_BCI)
2761  {
2762  return ExpectationBitsAll(bits, offset);
2763  }
2764 
2777  virtual std::map<bitCapInt, int> MultiShotMeasureMask(const std::vector<bitCapInt>& qPowers, unsigned shots);
2778 
2784  virtual void MultiShotMeasureMask(
2785  const std::vector<bitCapInt>& qPowers, unsigned shots, unsigned long long* shotsArray);
2786 
2796  virtual void SetBit(bitLenInt qubit, bool value)
2797  {
2798  if (value != M(qubit)) {
2799  X(qubit);
2800  }
2801  }
2802 
2809  virtual bool ApproxCompare(QInterfacePtr toCompare, real1_f error_tol = TRYDECOMPOSE_EPSILON)
2810  {
2811  return SumSqrDiff(toCompare) <= error_tol;
2812  }
2813 
2819  virtual real1_f SumSqrDiff(QInterfacePtr toCompare) = 0;
2820 
2826  virtual bool TryDecompose(bitLenInt start, QInterfacePtr dest, real1_f error_tol = TRYDECOMPOSE_EPSILON);
2827 
2834  virtual void UpdateRunningNorm(real1_f norm_thresh = REAL1_DEFAULT_ARG) = 0;
2835 
2842  virtual void NormalizeState(
2843  real1_f nrm = REAL1_DEFAULT_ARG, real1_f norm_thresh = REAL1_DEFAULT_ARG, real1_f phaseArg = ZERO_R1_F) = 0;
2844 
2850  virtual void Finish() {}
2851 
2856  virtual bool isFinished() { return true; }
2857 
2862  virtual void Dump() {}
2863 
2868  virtual bool isBinaryDecisionTree() { return false; }
2869 
2874  virtual bool isClifford() { return false; }
2875 
2880  virtual bool isClifford(bitLenInt qubit) { return false; }
2881 
2885  virtual bool isOpenCL() { return false; }
2886 
2900  virtual bool TrySeparate(const std::vector<bitLenInt>& qubits, real1_f error_tol) { return false; }
2904  virtual bool TrySeparate(bitLenInt qubit) { return false; }
2908  virtual bool TrySeparate(bitLenInt qubit1, bitLenInt qubit2) { return false; }
2918  virtual double GetUnitaryFidelity() { return 1.0; }
2922  virtual void ResetUnitaryFidelity() {}
2926  virtual void SetSdrp(real1_f sdrp){};
2930  virtual void SetNcrp(real1_f ncrp){};
2938  virtual void SetReactiveSeparate(bool isAggSep) {}
2946  virtual bool GetReactiveSeparate() { return false; }
2954  virtual void SetTInjection(bool useGadget) {}
2962  virtual bool GetTInjection() { return false; }
2968  virtual void SetNoiseParameter(real1_f lambda) {}
2974  virtual real1_f GetNoiseParameter() { return ZERO_R1_F; }
2978  virtual void SetAceMaxQubits(bitLenInt qb) {}
2982  virtual void SetSparseAceMaxMb(size_t mb) {}
2983 
2987  virtual QInterfacePtr Clone() = 0;
2988 
2992  virtual QInterfacePtr Copy() { return Clone(); }
2993 
2997  virtual void SetDevice(int64_t dID){};
2998 
3002  virtual int64_t GetDevice() { return -1; }
3006  virtual void SetDeviceList(std::vector<int64_t> dIDs){};
3007 
3011  virtual std::vector<int64_t> GetDeviceList() { return std::vector<int64_t>(); }
3012 
3016  bitCapIntOcl GetMaxSize() { return pow2Ocl(sizeof(bitCapInt) * 8); };
3017 
3022  {
3023  complex amp;
3024  bitCapInt perm = ZERO_BCI;
3025  do {
3026  amp = GetAmplitude(perm);
3027  bi_increment(&perm, 1U);
3028  } while ((abs(amp) <= REAL1_EPSILON) && (perm < maxQPower));
3029 
3030  return (real1_f)std::arg(amp);
3031  }
3032 
3038  virtual void DepolarizingChannelWeak1Qb(bitLenInt qubit, real1_f lambda);
3039 
3041 };
3042 } // namespace Qrack
void bi_or_ip(BigInteger *left, const BigInteger &right)
Definition: big_integer.hpp:444
void bi_increment(BigInteger *pBigInt, const BIG_INTEGER_WORD &value)
Definition: big_integer.hpp:220
int bi_compare_0(const BigInteger &left)
Definition: big_integer.hpp:140
Definition: parallel_for.hpp:19
void SetConcurrencyLevel(unsigned num)
Definition: parallel_for.hpp:28
A "Qrack::QInterface" is an abstract interface exposing qubit permutation state vector with methods t...
Definition: qinterface.hpp:141
virtual void GetQuantumState(complex *outputState)=0
Get the pure quantum state representation.
bitCapInt maxQPower
Definition: qinterface.hpp:149
void SetRandomSeed(uint32_t seed)
Definition: qinterface.hpp:261
virtual void SetConcurrency(uint32_t threadsPerEngine)
Set the number of threads in parallel for loops, per component QEngine.
Definition: qinterface.hpp:275
virtual bitCapInt GetAmplitudeCount()
Count of amplitudes, which might be less than state vector if sparse or compressed.
Definition: qinterface.hpp:284
real1 amplitudeFloor
Definition: qinterface.hpp:148
void MACWrapper(const std::vector< bitLenInt > &controls, Fn fn)
Definition: qinterface.hpp:179
bool useRDRAND
Definition: qinterface.hpp:145
virtual bitLenInt Allocate(bitLenInt length)
Allocate new "length" count of |0> state qubits at end of qubit index position.
Definition: qinterface.hpp:477
virtual bitCapInt GetMaxQPower()
Get the maximum number of basis states, namely for qubits.
Definition: qinterface.hpp:281
virtual void Copy(QInterfacePtr orig)
Definition: qinterface.hpp:222
virtual void Dispose(bitLenInt start, bitLenInt length, const bitCapInt &disposedPerm)=0
Dispose a a contiguous set of qubits that are already in a permutation eigenstate.
std::shared_ptr< RdRandom > hardware_rand_generator
Definition: qinterface.hpp:152
virtual bitLenInt Compose(QInterfacePtr toCopy)
Combine another QInterface with this one, after the last bit index of this one.
Definition: qinterface.hpp:371
virtual void GetReducedDensityMatrix(const std::vector< bitLenInt > &qubits, complex *outputState)
Get a reduced density matrix on the list of qubits.
Definition: qinterface.cpp:853
virtual QInterfacePtr Decompose(bitLenInt start, bitLenInt length)=0
Schmidt decompose a length of qubits.
qrack_rand_gen_ptr rand_generator
Definition: qinterface.hpp:150
virtual bitLenInt ComposeNoClone(QInterfacePtr toCopy)
This is a variant of Compose() for a toCopy argument that will definitely not be reused once "Compose...
Definition: qinterface.hpp:376
bool randGlobalPhase
Definition: qinterface.hpp:144
virtual void SetPermutation(const bitCapInt &perm, const complex &phaseFac=CMPLX_DEFAULT_ARG)
Set to a specific permutation of all qubits.
Definition: qinterface.cpp:101
virtual void Decompose(bitLenInt start, QInterfacePtr dest)=0
Minimally decompose a set of contiguous bits from the separably composed unit, into "destination".
QInterface()
Default constructor, primarily for protected internal use.
Definition: qinterface.hpp:242
virtual void SetQubitCount(bitLenInt qb)
Definition: qinterface.hpp:268
std::uniform_real_distribution< real1_s > rand_distribution
Definition: qinterface.hpp:151
virtual void SetAmplitude(const bitCapInt &perm, const complex &amp)=0
Sets the representational amplitude of a full permutation.
virtual bitLenInt Allocate(bitLenInt start, bitLenInt length)=0
Allocate new "length" count of |0> state qubits at specified qubit index start position.
virtual void SetQuantumState(const complex *inputState)=0
Set an arbitrary pure quantum state representation.
virtual bitCapInt SampleClone(const std::vector< bitCapInt > &qPowers)
Definition: qinterface.hpp:191
static real1_f normHelper(const complex &c)
Definition: qinterface.hpp:156
static real1_f clampProb(real1_f toClamp)
Definition: qinterface.hpp:158
virtual real1_f ExpVarUnitaryAll(bool isExp, const std::vector< bitLenInt > &bits, const std::vector< std::shared_ptr< complex >> &basisOps, std::vector< real1_f > eigenVals={})
Definition: qinterface.cpp:476
bitLenInt qubitCount
Definition: qinterface.hpp:146
virtual bitLenInt GetQubitCount()
Get the count of bits in this register.
Definition: qinterface.hpp:278
uint32_t randomSeed
Definition: qinterface.hpp:147
real1_f Rand()
Generate a random real number between 0 and 1.
Definition: qinterface.hpp:289
virtual real1_f ExpVarBitsAll(bool isExp, const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Definition: qinterface.hpp:210
virtual void Dispose(bitLenInt start, bitLenInt length)=0
Minimally decompose a set of contiguous bits from the separably composed unit, and discard the separa...
virtual bool GetIsArbitraryGlobalPhase()
Definition: qinterface.hpp:286
bool doNormalize
Definition: qinterface.hpp:143
complex GetNonunitaryPhase()
Definition: qinterface.hpp:169
virtual ~QInterface()
Definition: qinterface.hpp:256
virtual void GetProbs(real1 *outputProbs)=0
Get the pure quantum state representation.
virtual complex GetAmplitude(const bitCapInt &perm)=0
Get the representational amplitude of a full permutation.
Half-precision floating-point type.
Definition: half.hpp:2222
virtual void MULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
Multiplication modulo N by integer, (out of place)
Definition: arithmetic.cpp:127
virtual void DECS(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
Subtract a classical integer from the register, with sign and without carry.
Definition: qinterface.hpp:2200
virtual void ASL(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift left, with last 2 bits as sign and carry.
Definition: qinterface.cpp:333
virtual void IFullAdd(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
Inverse of FullAdd.
Definition: qinterface.hpp:2244
virtual void INCDECC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Common driver method behind INCC and DECC.
Definition: arithmetic.cpp:53
virtual void CADC(const std::vector< bitLenInt > &controls, bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
Add a quantum integer to a quantum integer, with carry and with controls.
Definition: arithmetic.cpp:371
virtual void CINC(const bitCapInt &toAdd, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Add integer (without sign, with controls)
Definition: arithmetic.cpp:79
virtual void INCS(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt overflowIndex)
Add a classical integer to the register, with sign and without carry.
Definition: qinterface.hpp:2189
virtual void DECC(const bitCapInt &toSub, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Subtract classical integer (without sign, with carry)
Definition: qinterface.hpp:2163
virtual void ADC(bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
Add a quantum integer to a quantum integer, with carry.
Definition: arithmetic.cpp:330
virtual void DEC(const bitCapInt &toSub, bitLenInt start, bitLenInt length)
Subtract classical integer (without sign)
Definition: qinterface.hpp:2141
virtual void CFullAdd(const std::vector< bitLenInt > &controls, bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
Controlled quantum analog of classical "Full Adder" gate.
Definition: arithmetic.cpp:276
virtual void INC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length)
Add integer (without sign)
Definition: arithmetic.cpp:20
virtual void LSR(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift right, filling the extra bits with |0>
Definition: qinterface.cpp:384
virtual void FullAdd(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
Quantum analog of classical "Full Adder" gate.
Definition: qinterface.hpp:2227
virtual void IMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length)
Inverse of multiplication modulo N by integer, (out of place)
Definition: arithmetic.cpp:165
virtual void CIFullAdd(const std::vector< bitLenInt > &controls, bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt carryInSumOut, bitLenInt carryOut)
Inverse of CFullAdd.
Definition: arithmetic.cpp:302
virtual void CIADC(const std::vector< bitLenInt > &controls, bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
Inverse of CADC.
Definition: arithmetic.cpp:392
virtual void ROL(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift left - shift bits left, and carry last bits.
Definition: qinterface.cpp:295
virtual void CDEC(const bitCapInt &toSub, bitLenInt inOutStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Subtract classical integer (without sign, with controls)
Definition: qinterface.hpp:2181
virtual void INCC(const bitCapInt &toAdd, bitLenInt start, bitLenInt length, bitLenInt carryIndex)
Add integer (without sign, with carry)
Definition: qinterface.hpp:2151
virtual void IADC(bitLenInt input1, bitLenInt input2, bitLenInt output, bitLenInt length, bitLenInt carry)
Inverse of ADC.
Definition: arithmetic.cpp:350
virtual void CMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Controlled multiplication modulo N by integer, (out of place)
Definition: arithmetic.cpp:201
virtual void CIMULModNOut(const bitCapInt &toMul, const bitCapInt &modN, bitLenInt inStart, bitLenInt outStart, bitLenInt length, const std::vector< bitLenInt > &controls)
Inverse of controlled multiplication modulo N by integer, (out of place)
Definition: arithmetic.cpp:240
virtual void ROR(bitLenInt shift, bitLenInt start, bitLenInt length)
Circular shift right - shift bits right, and carry first bits.
Definition: qinterface.cpp:314
virtual void LSL(bitLenInt shift, bitLenInt start, bitLenInt length)
Logical shift left, filling the extra bits with |0>
Definition: qinterface.cpp:369
virtual void ASR(bitLenInt shift, bitLenInt start, bitLenInt length)
Arithmetic shift right, with last 2 bits as sign and carry.
Definition: qinterface.cpp:351
virtual void ZMask(const bitCapInt &mask)
Masked Z gate.
Definition: gates.cpp:144
virtual void CPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
Controlled "PhaseRootN" gate.
Definition: qinterface.hpp:1328
virtual void CIPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
Controlled inverse "PhaseRootN" gate.
Definition: qinterface.hpp:1360
virtual void AntiCIAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
(Anti-)Controlled inverse "Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:115
virtual void ISqrtX(bitLenInt qubit)
Inverse square root of X gate.
Definition: qinterface.hpp:1154
virtual void ISqrtY(bitLenInt qubit)
Inverse square root of Y gate.
Definition: qinterface.hpp:1184
virtual void CZ(bitLenInt control, bitLenInt target)
Controlled Z gate.
Definition: qinterface.hpp:785
virtual void CU(const std::vector< bitLenInt > &controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
Controlled general unitary gate.
Definition: rotational.cpp:29
virtual void SH(bitLenInt qubit)
Y-basis transformation gate.
Definition: qinterface.hpp:950
virtual void AntiCS(bitLenInt control, bitLenInt target)
(Anti-)controlled S gate
Definition: qinterface.hpp:1268
virtual void CCZ(bitLenInt control1, bitLenInt control2, bitLenInt target)
Doubly-Controlled Z gate.
Definition: qinterface.hpp:808
virtual void UCPhase(const std::vector< bitLenInt > &controls, const complex &topLeft, const complex &bottomRight, bitLenInt target, const bitCapInt &perm)
Apply a single bit transformation that only effects phase, with arbitrary control bits,...
Definition: qinterface.hpp:598
virtual void CS(bitLenInt control, bitLenInt target)
Controlled S gate.
Definition: qinterface.hpp:1256
virtual void CIS(bitLenInt control, bitLenInt target)
Controlled inverse S gate.
Definition: qinterface.hpp:1280
virtual void SqrtY(bitLenInt qubit)
Square root of Y gate.
Definition: qinterface.hpp:1169
virtual void CNOT(bitLenInt control, bitLenInt target)
Controlled NOT gate.
Definition: qinterface.hpp:716
virtual void TimeEvolve(Hamiltonian h, real1_f timeDiff)
To define a Hamiltonian, give a vector of controlled single bit gates ("HamiltonianOp" instances) tha...
Definition: gates.cpp:426
virtual void SqrtW(bitLenInt qubit)
Square root of W gate.
Definition: qinterface.hpp:1197
virtual void IS(bitLenInt qubit)
Inverse S gate.
Definition: qinterface.hpp:1041
virtual void MACMtrx(const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)
Apply an arbitrary single bit unitary transformation, with arbitrary (anti-)control bits.
Definition: qinterface.hpp:502
virtual void S(bitLenInt qubit)
S gate.
Definition: qinterface.hpp:1034
virtual void CT(bitLenInt control, bitLenInt target)
Controlled T gate.
Definition: qinterface.hpp:1304
virtual void UniformlyControlledSingleBit(const std::vector< bitLenInt > &controls, bitLenInt qubit, const complex *mtrxs)
Apply a "uniformly controlled" arbitrary single bit unitary transformation.
Definition: qinterface.hpp:634
virtual void Y(bitLenInt qubit)
Y gate.
Definition: qinterface.hpp:1108
virtual bool ForceM(bitLenInt qubit, bool result, bool doForce=true, bool doApply=true)=0
Act as if is a measurement was applied, except force the (usually random) result.
virtual void CY(bitLenInt control, bitLenInt target)
Controlled Y gate.
Definition: qinterface.hpp:739
virtual void AntiCIPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
(Anti-)controlled inverse "PhaseRootN" gate
Definition: qinterface.hpp:1376
virtual void CH(bitLenInt control, bitLenInt target)
Controlled H gate.
Definition: qinterface.hpp:1226
virtual void AntiCAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
(Anti-)Controlled "Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:103
virtual void H(bitLenInt qubit)
Hadamard gate.
Definition: qinterface.hpp:920
virtual void CIAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
Controlled inverse "Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:89
virtual void CSqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a square root of swap with arbitrary control bits.
Definition: gates.cpp:282
virtual void AntiCSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a swap with arbitrary (anti) control bits.
Definition: gates.cpp:270
virtual void AI(bitLenInt target, real1_f azimuth, real1_f inclination)
"Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:53
virtual void AntiCPhaseRootN(bitLenInt n, bitLenInt control, bitLenInt target)
(Anti-)controlled "PhaseRootN" gate
Definition: qinterface.hpp:1344
virtual void YMask(const bitCapInt &mask)
Masked Y gate.
Definition: gates.cpp:112
virtual void Mtrx(const complex *mtrx, bitLenInt qubit)=0
Apply an arbitrary single bit unitary transformation.
virtual void MACInvert(const std::vector< bitLenInt > &controls, const complex &topRight, const complex &bottomLeft, bitLenInt target)
Apply a single bit transformation that reverses bit probability and might effect phase,...
Definition: qinterface.hpp:586
virtual void UCMtrx(const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target, const bitCapInt &controlPerm)
Apply an arbitrary single bit unitary transformation, with arbitrary control bits,...
Definition: gates.cpp:23
virtual void HIS(bitLenInt qubit)
Y-basis (inverse) transformation gate.
Definition: qinterface.hpp:964
virtual void Phase(const complex &topLeft, const complex &bottomRight, bitLenInt qubit)
Apply a single bit transformation that only effects phase.
Definition: qinterface.hpp:523
virtual void Invert(const complex &topRight, const complex &bottomLeft, bitLenInt qubit)
Apply a single bit transformation that reverses bit probability and might effect phase.
Definition: qinterface.hpp:536
virtual void CAI(bitLenInt control, bitLenInt target, real1_f azimuth, real1_f inclination)
Controlled "Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:77
virtual void CCY(bitLenInt control1, bitLenInt control2, bitLenInt target)
Doubly-Controlled Y gate.
Definition: qinterface.hpp:762
virtual void AntiCZ(bitLenInt control, bitLenInt target)
Anti controlled Z gate.
Definition: qinterface.hpp:796
virtual void AntiCU(const std::vector< bitLenInt > &controls, bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
(Anti-)Controlled general unitary gate
Definition: rotational.cpp:41
virtual void CISqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply an inverse square root of swap with arbitrary control bits.
Definition: gates.cpp:331
virtual void X(bitLenInt qubit)
X gate.
Definition: qinterface.hpp:1091
virtual void MACPhase(const std::vector< bitLenInt > &controls, const complex &topLeft, const complex &bottomRight, bitLenInt target)
Apply a single bit transformation that only effects phase, with arbitrary (anti-)control bits.
Definition: qinterface.hpp:570
virtual void U2(bitLenInt target, real1_f phi, real1_f lambda)
2-parameter unitary gate
Definition: qinterface.hpp:838
virtual void Z(bitLenInt qubit)
Z gate.
Definition: qinterface.hpp:1124
virtual void AntiCNOT(bitLenInt control, bitLenInt target)
Anti controlled NOT gate.
Definition: qinterface.hpp:727
virtual void AntiCY(bitLenInt control, bitLenInt target)
Anti controlled Y gate.
Definition: qinterface.hpp:750
virtual void ISqrtW(bitLenInt qubit)
Inverse square root of W gate.
Definition: qinterface.hpp:1211
virtual void PhaseParity(real1_f radians, const bitCapInt &mask)
Parity phase gate.
Definition: gates.cpp:399
virtual void IAI(bitLenInt target, real1_f azimuth, real1_f inclination)
Invert "Azimuth, Inclination" (RY-RZ)
Definition: rotational.cpp:64
virtual void AntiCISqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply an inverse square root of swap with arbitrary (anti) control bits.
Definition: gates.cpp:387
virtual void PhaseRootN(bitLenInt n, bitLenInt qubit)
"PhaseRootN" gate
Definition: qinterface.hpp:1062
virtual void U(bitLenInt target, real1_f theta, real1_f phi, real1_f lambda)
General unitary gate.
Definition: rotational.cpp:18
virtual void AntiCIS(bitLenInt control, bitLenInt target)
(Anti-)controlled inverse S gate
Definition: qinterface.hpp:1292
virtual void SqrtX(bitLenInt qubit)
Square root of X gate.
Definition: qinterface.hpp:1140
virtual void IU2(bitLenInt target, real1_f phi, real1_f lambda)
Inverse 2-parameter unitary gate.
Definition: qinterface.hpp:845
virtual void AntiCCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
Anti doubly-controlled NOT gate.
Definition: qinterface.hpp:705
virtual void PhaseRootNMask(bitLenInt n, const bitCapInt &mask)
Masked PhaseRootN gate.
Definition: gates.cpp:155
virtual void SqrtH(bitLenInt qubit)
Square root of Hadamard gate.
Definition: qinterface.hpp:933
virtual void MCPhase(const std::vector< bitLenInt > &controls, const complex &topLeft, const complex &bottomRight, bitLenInt target)
Apply a single bit transformation that only effects phase, with arbitrary control bits.
Definition: qinterface.hpp:545
virtual void AntiCCY(bitLenInt control1, bitLenInt control2, bitLenInt target)
Anti doubly-controlled Y gate.
Definition: qinterface.hpp:773
virtual bool M(bitLenInt qubit)
Measurement gate.
Definition: qinterface.hpp:1020
virtual void MCInvert(const std::vector< bitLenInt > &controls, const complex &topRight, const complex &bottomLeft, bitLenInt target)
Apply a single bit transformation that reverses bit probability and might effect phase,...
Definition: qinterface.hpp:560
virtual void AntiCSqrtSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a square root of swap with arbitrary (anti) control bits.
Definition: gates.cpp:375
virtual void MCMtrx(const std::vector< bitLenInt > &controls, const complex *mtrx, bitLenInt target)=0
Apply an arbitrary single bit unitary transformation, with arbitrary control bits.
virtual void CIT(bitLenInt control, bitLenInt target)
Controlled inverse T gate.
Definition: qinterface.hpp:1316
virtual void IT(bitLenInt qubit)
Inverse T gate.
Definition: qinterface.hpp:1055
virtual void AntiCCZ(bitLenInt control1, bitLenInt control2, bitLenInt target)
Anti doubly-controlled Z gate.
Definition: qinterface.hpp:819
virtual void CSwap(const std::vector< bitLenInt > &controls, bitLenInt qubit1, bitLenInt qubit2)
Apply a swap with arbitrary control bits.
Definition: gates.cpp:247
virtual void T(bitLenInt qubit)
T gate.
Definition: qinterface.hpp:1048
virtual void CCNOT(bitLenInt control1, bitLenInt control2, bitLenInt target)
Doubly-controlled NOT gate.
Definition: qinterface.hpp:694
virtual void XMask(const bitCapInt &mask)
Masked X gate.
Definition: gates.cpp:101
virtual void AntiCH(bitLenInt control, bitLenInt target)
(Anti-)controlled H gate
Definition: qinterface.hpp:1241
virtual void UCInvert(const std::vector< bitLenInt > &controls, const complex &topRight, const complex &bottomLeft, bitLenInt target, const bitCapInt &perm)
Apply a single bit transformation that reverses bit probability and might effect phase,...
Definition: qinterface.hpp:613
virtual void IQFTR(const std::vector< bitLenInt > &qubits, bool trySeparate=false)
Inverse Quantum Fourier Transform (random access) - Apply the inverse quantum Fourier transform to th...
Definition: qinterface.cpp:174
virtual void Reverse(bitLenInt first, bitLenInt last)
Reverse all of the bits in a sequence.
Definition: qinterface.hpp:2438
virtual void ISqrtSwap(bitLenInt qubit1, bitLenInt qubit2)
Inverse square root of Swap gate.
Definition: gates.cpp:224
virtual bitCapInt ForceMReg(bitLenInt start, bitLenInt length, const bitCapInt &result, bool doForce=true, bool doApply=true)
Act as if is a measurement was applied, except force the (usually random) result.
Definition: qinterface.cpp:213
virtual void QFTR(const std::vector< bitLenInt > &qubits, bool trySeparate=false)
Quantum Fourier Transform (random access) - Apply the quantum Fourier transform to the register.
Definition: qinterface.cpp:154
virtual void IISwap(bitLenInt qubit1, bitLenInt qubit2)
Inverse ISwap - Swap values of two bits in register, and apply phase factor of -i if bits are differe...
Definition: gates.cpp:189
virtual void ISwap(bitLenInt qubit1, bitLenInt qubit2)
Swap values of two bits in register, and apply phase factor of i if bits are different.
Definition: gates.cpp:177
virtual bitCapInt MAll()
Measure permutation state of all coherent bits.
Definition: qinterface.hpp:2357
virtual void QFT(bitLenInt start, bitLenInt length, bool trySeparate=false)
Quantum Fourier Transform - Apply the quantum Fourier transform to the register.
Definition: qinterface.cpp:112
virtual void PhaseFlip()
Phase flip always - equivalent to Z X Z X on any bit in the QInterface.
Definition: qinterface.hpp:2348
virtual bitCapInt M(const std::vector< bitLenInt > &bits)
Measure bits with indices in array, and return a mask of the results.
Definition: qinterface.hpp:2368
virtual void SqrtSwap(bitLenInt qubit1, bitLenInt qubit2)
Square root of Swap gate.
Definition: gates.cpp:201
virtual void FSim(real1_f theta, real1_f phi, bitLenInt qubit1, bitLenInt qubit2)
The 2-qubit "fSim" gate, (useful in the simulation of particles with fermionic statistics)
Definition: qinterface.hpp:2389
virtual void Swap(bitLenInt qubit1, bitLenInt qubit2)
Swap values of two bits in register.
Definition: gates.cpp:166
virtual void ZeroPhaseFlip(bitLenInt start, bitLenInt length)
Reverse the phase of the state where the register equals zero.
Definition: gates.cpp:84
virtual void SetReg(bitLenInt start, bitLenInt length, const bitCapInt &value)
Set register bits to given permutation.
Definition: qinterface.cpp:193
virtual bitCapInt MReg(bitLenInt start, bitLenInt length)
Measure permutation state of a register.
Definition: qinterface.hpp:2354
virtual void IQFT(bitLenInt start, bitLenInt length, bool trySeparate=false)
Inverse Quantum Fourier Transform - Apply the inverse quantum Fourier transform to the register.
Definition: qinterface.cpp:134
virtual void XOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: logic.cpp:55
virtual void OR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: logic.cpp:36
virtual void XNOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "XNOR" gate.
Definition: logic.cpp:83
virtual void CLXNOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "XNOR" gate.
Definition: logic.cpp:129
virtual void CLNAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "NAND" gate.
Definition: logic.cpp:117
virtual void AND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "AND" gate.
Definition: logic.cpp:18
virtual void CLAND(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "AND" gate.
Definition: logic.cpp:89
virtual void CLOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "OR" gate.
Definition: logic.cpp:96
virtual void NAND(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "NAND" gate.
Definition: logic.cpp:71
virtual void CLNOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "NOR" gate.
Definition: logic.cpp:123
virtual void CLXOR(bitLenInt inputQBit, bool inputClassicalBit, bitLenInt outputBit)
Quantum analog of classical "XOR" gate.
Definition: logic.cpp:105
virtual void NOR(bitLenInt inputBit1, bitLenInt inputBit2, bitLenInt outputBit)
Quantum analog of classical "NOR" gate.
Definition: logic.cpp:77
virtual void X(bitLenInt start, bitLenInt length)
Bitwise Pauli X (or logical "NOT") operator.
Definition: qinterface.hpp:1715
virtual void H(bitLenInt start, bitLenInt length)
Bitwise Hadamard.
virtual void ExpZDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction Pauli Z exponentiation gate.
Definition: qinterface.cpp:1301
virtual void RZDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:1313
virtual void ExpX(real1_f radians, bitLenInt qubit)
Pauli X exponentiation gate.
Definition: rotational.cpp:248
virtual void CRTDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction "phase shift gate".
Definition: qinterface.cpp:1317
virtual void UniformlyControlledRZ(const std::vector< bitLenInt > &controls, bitLenInt qubit, const real1 *angles)
Apply a "uniformly controlled" rotation of a bit around the Pauli Z axis.
Definition: rotational.cpp:151
virtual void ExpDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction (identity) exponentiation gate.
Definition: qinterface.cpp:1283
virtual void CRZDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction Z axis rotation gate.
Definition: qinterface.cpp:1335
virtual void RX(real1_f radians, bitLenInt qubit)
X axis rotation gate.
Definition: rotational.cpp:177
virtual void CRZ(real1_f radians, bitLenInt control, bitLenInt target)
Controlled Z axis rotation gate.
Definition: rotational.cpp:204
virtual void RYDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction Y axis rotation gate.
Definition: qinterface.cpp:1310
virtual void UniformlyControlledRY(const std::vector< bitLenInt > &controls, bitLenInt qubit, const real1 *angles)
Apply a "uniformly controlled" rotation of a bit around the Pauli Y axis.
Definition: rotational.cpp:130
virtual void ExpY(real1_f radians, bitLenInt qubit)
Pauli Y exponentiation gate.
Definition: rotational.cpp:255
virtual void CRT(real1_f radians, bitLenInt control, bitLenInt target)
Controlled "phase shift gate".
Definition: rotational.cpp:269
virtual void CRY(real1_f radians, bitLenInt control, bitLenInt target)
Controlled Y axis rotation gate.
Definition: rotational.cpp:213
virtual void RY(real1_f radians, bitLenInt qubit)
Y axis rotation gate.
Definition: rotational.cpp:187
virtual void CRX(real1_f radians, bitLenInt control, bitLenInt target)
Controlled X axis rotation gate.
Definition: rotational.cpp:276
virtual void ExpYDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction Pauli Y exponentiation gate.
Definition: qinterface.cpp:1295
virtual void RTDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction phase shift gate.
Definition: qinterface.cpp:1280
virtual void RZ(real1_f radians, bitLenInt qubit)
Z axis rotation gate.
Definition: rotational.cpp:196
virtual void RT(real1_f radians, bitLenInt qubit)
Phase shift gate.
Definition: rotational.cpp:171
virtual void ExpZ(real1_f radians, bitLenInt qubit)
Pauli Z exponentiation gate.
Definition: rotational.cpp:262
virtual void CRYDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction y axis rotation gate.
Definition: qinterface.cpp:1329
virtual void RXDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:1307
virtual void ExpXDyad(int numerator, int denomPower, bitLenInt qubit)
Dyadic fraction Pauli X exponentiation gate.
Definition: qinterface.cpp:1289
virtual void Exp(real1_f radians, bitLenInt qubit)
(Identity) Exponentiation gate
Definition: rotational.cpp:225
virtual void CRXDyad(int numerator, int denomPower, bitLenInt control, bitLenInt target)
Controlled dyadic fraction X axis rotation gate.
Definition: qinterface.cpp:1323
virtual void Dump()
If asynchronous work is still running, let the simulator know that it can be aborted.
Definition: qinterface.hpp:2862
virtual bool isBinaryDecisionTree()
Returns "true" if current state representation is definitely a binary decision tree,...
Definition: qinterface.hpp:2868
virtual std::vector< int64_t > GetDeviceList()
Get the device index.
Definition: qinterface.hpp:3011
virtual void SetSparseAceMaxMb(size_t mb)
Set the (sparse-simulation) "automatic circuit elision" (ACE) maximum memory megabytes.
Definition: qinterface.hpp:2982
virtual real1_f VarianceBitsFactorized(const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, const bitCapInt &offset=ZERO_BCI)
Get expectation value of bits, given an array of qubit weights.
Definition: qinterface.cpp:577
virtual real1_f ProbAllRdm(bool roundRz, const bitCapInt &fullRegister)
Direct measure of full permutation probability, treating all ancillary qubits as post-selected T gate...
Definition: qinterface.hpp:2741
virtual bool ApproxCompare(QInterfacePtr toCompare, real1_f error_tol=TRYDECOMPOSE_EPSILON)
Compare state vectors approximately, to determine whether this state vector is the same as the target...
Definition: qinterface.hpp:2809
virtual real1_f ExpectationBitsFactorizedRdm(bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, const bitCapInt &offset=ZERO_BCI)
Get (reduced density matrix) expectation value of bits, given an array of qubit weights.
Definition: qinterface.hpp:2705
virtual bool isClifford(bitLenInt qubit)
Returns "true" if current qubit state is identifiably within the Clifford set, or "false" if it is no...
Definition: qinterface.hpp:2880
virtual real1_f VarianceUnitaryAll(const std::vector< bitLenInt > &bits, const std::vector< std::shared_ptr< complex >> &basisOps, std::vector< real1_f > eigenVals={})
Direct measure of variance of listed (2x2 operator) single-qubit tensor product probability.
Definition: qinterface.hpp:2597
virtual real1_f VarianceUnitaryAll(const std::vector< bitLenInt > &bits, const std::vector< real1_f > &basisOps, std::vector< real1_f > eigenVals={})
Direct measure of variance of listed (3-parameter) single-qubit tensor product probability.
Definition: qinterface.hpp:2585
virtual real1_f FirstNonzeroPhase()
Get phase of lowest permutation nonzero amplitude.
Definition: qinterface.hpp:3021
virtual real1_f VarianceFloatsFactorized(const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
Direct measure of variance of listed bit string probability.
Definition: qinterface.cpp:618
virtual real1_f VarianceBitsFactorizedRdm(bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, const bitCapInt &offset=ZERO_BCI)
Get (reduced density matrix) expectation value of bits, given an array of qubit weights.
Definition: qinterface.hpp:2640
virtual real1_f ExpectationUnitaryAll(const std::vector< bitLenInt > &bits, const std::vector< real1_f > &basisOps, std::vector< real1_f > eigenVals={})
Get single-qubit (3-parameter) tensor product (arbitrary real) observable.
Definition: qinterface.hpp:2683
virtual real1_f CProb(bitLenInt control, bitLenInt target)
Direct measure of bit probability to be in |1> state, if control bit is |1>.
Definition: qinterface.hpp:2462
virtual double GetUnitaryFidelity()
When "Schmidt-decomposition rounding parameter" ("SDRP") is being used, starting from initial 1....
Definition: qinterface.hpp:2918
virtual void SetSdrp(real1_f sdrp)
Set the "Schmidt decomposition rounding parameter" value, (between 0 and 1)
Definition: qinterface.hpp:2926
virtual bool TrySeparate(bitLenInt qubit1, bitLenInt qubit2)
Two-qubit TrySeparate()
Definition: qinterface.hpp:2908
virtual bool isClifford()
Returns "true" if current state is identifiably within the Clifford set, or "false" if it is not or c...
Definition: qinterface.hpp:2874
virtual real1_f ProbAll(const bitCapInt &fullRegister)
Direct measure of full permutation probability.
Definition: qinterface.hpp:2513
virtual void ProbMaskAll(const bitCapInt &mask, real1 *probsArray)
Direct measure of masked permutation probability.
Definition: qinterface.cpp:421
virtual QInterfacePtr Clone()=0
Clone this QInterface.
virtual real1_f ACProb(bitLenInt control, bitLenInt target)
Direct measure of bit probability to be in |1> state, if control bit is |0>.
Definition: qinterface.hpp:2473
virtual real1_f VariancePauliAll(std::vector< bitLenInt > bits, std::vector< Pauli > paulis)
Direct measure of variance of listed Pauli tensor product probability.
Definition: qinterface.cpp:657
virtual void Finish()
If asynchronous work is still running, block until it finishes.
Definition: qinterface.hpp:2850
virtual bool GetReactiveSeparate()
Get reactive separation option.
Definition: qinterface.hpp:2946
virtual QInterfacePtr Copy()
Copy this QInterface.
Definition: qinterface.hpp:2992
virtual real1_f ExpectationBitsAll(const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Get permutation expectation value of bits.
Definition: qinterface.hpp:2652
virtual real1_f Prob(bitLenInt qubit)=0
Direct measure of bit probability to be in |1> state.
virtual std::map< bitCapInt, int > MultiShotMeasureMask(const std::vector< bitCapInt > &qPowers, unsigned shots)
Statistical measure of masked permutation probability.
Definition: qinterface.cpp:805
virtual void SetTInjection(bool useGadget)
Set the option to use T-injection gadgets (off by default)
Definition: qinterface.hpp:2954
virtual real1_f VarianceFloatsFactorizedRdm(bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
Direct measure of (reduced density matrix) variance of bits, given an array of qubit weights.
Definition: qinterface.hpp:2618
virtual void ResetUnitaryFidelity()
Reset the internal fidelity calculation tracker to 1.0.
Definition: qinterface.hpp:2922
virtual bool TryDecompose(bitLenInt start, QInterfacePtr dest, real1_f error_tol=TRYDECOMPOSE_EPSILON)
Attempt to Decompose() a bit range.
Definition: qinterface.cpp:834
virtual real1_f GetNoiseParameter()
Get the noise level option (only for a noisy interface)
Definition: qinterface.hpp:2974
virtual void ProbBitsAll(const std::vector< bitLenInt > &bits, real1 *probsArray)
Direct measure of listed permutation probability.
Definition: qinterface.cpp:444
virtual real1_f ProbRdm(bitLenInt qubit)
Direct measure of bit probability to be in |1> state, treating all ancillary qubits as post-selected ...
Definition: qinterface.hpp:2737
bitCapIntOcl GetMaxSize()
Get maximum number of amplitudes that can be allocated on current device.
Definition: qinterface.hpp:3016
virtual bool GetTInjection()
Get the option to use T-injection gadgets.
Definition: qinterface.hpp:2962
virtual void SetDeviceList(std::vector< int64_t > dIDs)
Set the device index list, if more than one device is available.
Definition: qinterface.hpp:3006
virtual real1_f ProbMask(const bitCapInt &mask, const bitCapInt &permutation)
Direct measure of masked permutation probability.
Definition: qinterface.cpp:278
virtual real1_f ExpectationPauliAll(std::vector< bitLenInt > bits, std::vector< Pauli > paulis)
Get Pauli tensor product observable.
Definition: qinterface.cpp:713
virtual void SetReactiveSeparate(bool isAggSep)
Set reactive separation option (on by default if available)
Definition: qinterface.hpp:2938
virtual void UpdateRunningNorm(real1_f norm_thresh=REAL1_DEFAULT_ARG)=0
Force a calculation of the norm of the state vector, in order to make it unit length before the next ...
virtual real1_f VarianceBitsAll(const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Direct measure of variance of listed permutation probability.
Definition: qinterface.hpp:2554
virtual real1_f ExpectationBitsFactorized(const std::vector< bitLenInt > &bits, const std::vector< bitCapInt > &perms, const bitCapInt &offset=ZERO_BCI)
Get expectation value of bits, given an array of qubit weights.
Definition: qinterface.cpp:540
virtual real1_f ProbMaskRdm(bool roundRz, const bitCapInt &mask, const bitCapInt &permutation)
Direct measure of masked permutation probability, treating all ancillary qubits as post-selected T ga...
Definition: qinterface.hpp:2749
virtual void SetNcrp(real1_f ncrp)
Set the "Near-clifford rounding parameter" value, (between 0 and 1)
Definition: qinterface.hpp:2930
virtual void SetDevice(int64_t dID)
Set the device index, if more than one device is available.
Definition: qinterface.hpp:2997
virtual void DepolarizingChannelWeak1Qb(bitLenInt qubit, real1_f lambda)
Simulate a local qubit depolarizing noise channel, under a stochastic "weak simulation condition....
Definition: gates.cpp:487
virtual bool isOpenCL()
Returns "true" if current simulation is OpenCL-based.
Definition: qinterface.hpp:2885
virtual real1_f ExpectationFloatsFactorized(const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
Get expectation value of bits, given a (floating-point) array of qubit weights.
Definition: qinterface.cpp:769
virtual real1_f ProbReg(bitLenInt start, bitLenInt length, const bitCapInt &permutation)
Direct measure of register permutation probability.
Definition: qinterface.cpp:262
virtual int64_t GetDevice()
Get the device index.
Definition: qinterface.hpp:3002
virtual bool TrySeparate(const std::vector< bitLenInt > &qubits, real1_f error_tol)
Qrack::QUnit types maintain explicit separation of representations of qubits, which reduces memory us...
Definition: qinterface.hpp:2900
virtual void SetAceMaxQubits(bitLenInt qb)
Set the "automatic circuit elision" (ACE) maximum entangled subsystem qubit count.
Definition: qinterface.hpp:2978
virtual real1_f SumSqrDiff(QInterfacePtr toCompare)=0
Calculates (1 - <\psi_e|\psi_c>) between states |\psi_c> and |\psi_e>.
virtual void SetBit(bitLenInt qubit, bool value)
Set individual bit to pure |0> (false) or |1> (true) state.
Definition: qinterface.hpp:2796
virtual real1_f ExpectationBitsAllRdm(bool roundRz, const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Get permutation expectation value of bits, treating all ancillary qubits as post-selected T gate gadg...
Definition: qinterface.hpp:2759
virtual void NormalizeState(real1_f nrm=REAL1_DEFAULT_ARG, real1_f norm_thresh=REAL1_DEFAULT_ARG, real1_f phaseArg=ZERO_R1_F)=0
Apply the normalization factor found by UpdateRunningNorm() or on the fly by a single bit gate.
virtual real1_f ExpectationFloatsFactorizedRdm(bool roundRz, const std::vector< bitLenInt > &bits, const std::vector< real1_f > &weights)
Get (reduced density matrix) expectation value of bits, given a (floating-point) array of qubit weigh...
Definition: qinterface.hpp:2727
virtual real1_f VarianceBitsAllRdm(bool roundRz, const std::vector< bitLenInt > &bits, const bitCapInt &offset=ZERO_BCI)
Direct measure of (reduced density matrix) variance of listed permutation probability.
Definition: qinterface.hpp:2565
virtual bitCapInt HighestProbAll()
Get highest probability permutation.
Definition: qinterface.hpp:2485
virtual real1_f ExpectationUnitaryAll(const std::vector< bitLenInt > &bits, const std::vector< std::shared_ptr< complex >> &basisOps, std::vector< real1_f > eigenVals={})
Get single-qubit tensor product (arbitrary real) observable.
Definition: qinterface.hpp:2671
virtual bool TrySeparate(bitLenInt qubit)
Single-qubit TrySeparate()
Definition: qinterface.hpp:2904
virtual void SetNoiseParameter(real1_f lambda)
Set the noise level option (only for a noisy interface)
Definition: qinterface.hpp:2968
virtual bool isFinished()
Returns "false" if asynchronous work is still running, and "true" if all previously dispatched asynch...
Definition: qinterface.hpp:2856
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
bitCapInt bitRegMask(const bitLenInt &start, const bitLenInt &length)
Definition: qrack_functions.hpp:157
QRACK_CONST real1 SQRT1_2_R1
Definition: qrack_types.hpp:188
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:37
@ QINTERFACE_OPTIMAL_BASE
Definition: qinterface.hpp:124
@ QINTERFACE_QPAGER
Create a QPager, which breaks up the work of a QEngine into equally sized "pages.".
Definition: qinterface.hpp:82
@ QINTERFACE_OPTIMAL_SCHROEDINGER
Definition: qinterface.hpp:122
@ QINTERFACE_OPTIMAL_MULTI
Definition: qinterface.hpp:129
@ QINTERFACE_CUDA
Create a QEngineCUDA, leveraging CUDA hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:52
@ QINTERFACE_STABILIZER_HYBRID
Create a QStabilizerHybrid, switching between a QStabilizer and a QHybrid as efficient.
Definition: qinterface.hpp:77
@ QINTERFACE_HYBRID
Create a QHybrid, switching between QEngineCPU and QEngineOCL as efficient.
Definition: qinterface.hpp:57
@ QINTERFACE_OPTIMAL
Definition: qinterface.hpp:127
@ QINTERFACE_BDT_HYBRID
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:67
@ QINTERFACE_BDT
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:62
@ QINTERFACE_TENSOR_NETWORK
Circuit-simplification layer.
Definition: qinterface.hpp:107
@ QINTERFACE_NOISY
Noisy wrapper layer.
Definition: qinterface.hpp:112
@ QINTERFACE_QUNIT_CLIFFORD
Clifford-specialized QUnit.
Definition: qinterface.hpp:102
@ QINTERFACE_OPENCL
Create a QEngineOCL, leveraging OpenCL hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:47
@ QINTERFACE_STABILIZER
Create a QStabilizer, limited to Clifford/Pauli operations, but efficient.
Definition: qinterface.hpp:72
@ QINTERFACE_QUNIT
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that's needed ...
Definition: qinterface.hpp:91
@ QINTERFACE_QUNIT_MULTI
Create a QUnitMulti, which distributes the explicitly separated "shards" of a QUnit across available ...
Definition: qinterface.hpp:97
@ QINTERFACE_MAX
Definition: qinterface.hpp:131
@ QINTERFACE_CPU
Create a QEngineCPU leveraging only local CPU and memory resources.
Definition: qinterface.hpp:42
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:29
QRACK_CONST real1 SQRT2_R1
Definition: qrack_types.hpp:187
QRACK_CONST real1_f TRYDECOMPOSE_EPSILON
Definition: qrack_types.hpp:270
QRACK_CONST complex C_SQRT1_2_NEG
Definition: gates.cpp:21
void seed(quid sid, unsigned s)
"Seed" random number generator (if pseudo-random Mersenne twister is in use)
Definition: wasm_api.cpp:873
half_float::half real1
Definition: qrack_types.hpp:102
std::complex< real1 > complex
Definition: qrack_types.hpp:136
QRACK_CONST real1 FP_NORM_EPSILON
Definition: qrack_types.hpp:268
bitCapInt pow2(const bitLenInt &p)
Definition: qrack_functions.hpp:143
double norm(const complex2 &c)
Definition: complex16x2simd.hpp:122
QRACK_CONST real1 REAL1_EPSILON
Definition: qrack_types.hpp:208
QRACK_CONST complex ONE_CMPLX
Definition: qrack_types.hpp:262
QRACK_CONST real1 ONE_R1
Definition: qrack_types.hpp:193
std::vector< HamiltonianOpPtr > Hamiltonian
Definition: hamiltonian.hpp:120
QRACK_CONST real1 ZERO_R1
Definition: qrack_types.hpp:191
float real1_f
Definition: qrack_types.hpp:103
QRACK_CONST complex CMPLX_DEFAULT_ARG
Definition: qrack_types.hpp:267
QRACK_CONST complex I_CMPLX
Definition: qrack_types.hpp:264
QRACK_CONST complex C_SQRT1_2
Definition: gates.cpp:17
QRACK_CONST complex ZERO_CMPLX
Definition: qrack_types.hpp:263
QRACK_CONST real1 PI_R1
Definition: qrack_types.hpp:186
const bitCapInt ONE_BCI
Definition: qrack_types.hpp:137
const bitCapInt ZERO_BCI
Definition: qrack_types.hpp:138
bitCapIntOcl pow2Ocl(const bitLenInt &p)
Definition: qrack_functions.hpp:144
HALF_CONSTEXPR half abs(half arg)
Absolute value.
Definition: half.hpp:2975
half sin(half arg)
Sine function.
Definition: half.hpp:3885
half cos(half arg)
Cosine function.
Definition: half.hpp:3922
half pow(half x, half y)
Power function.
Definition: half.hpp:3738
half exp(half arg)
Exponential function.
Definition: half.hpp:3201
#define REAL1_DEFAULT_ARG
Definition: qrack_types.hpp:185
#define QRACK_CONST
Definition: qrack_types.hpp:182
#define bitLenInt
Definition: qrack_types.hpp:42
#define ZERO_R1_F
Definition: qrack_types.hpp:168
#define qrack_rand_gen_ptr
Definition: qrack_types.hpp:164
#define bitCapInt
Definition: qrack_types.hpp:66
#define bitCapIntOcl
Definition: qrack_types.hpp:54
#define ONE_R1_F
Definition: qrack_types.hpp:171
#define IS_NORM_0(c)
Definition: qrack_types.hpp:29
#define C_I_SQRT1_2
Definition: qunitclifford.cpp:412