Qrack  9.0
General classical-emulating-quantum development framework
qubitswapmap.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017-2023. All rights reserved.
4 //
5 // QubitSwapMap enables constant complexity SWAP gates, via qubit label swap.
6 //
7 // Licensed under the GNU Lesser General Public License V3.
8 // See LICENSE.md in the project root or https://www.gnu.org/licenses/lgpl-3.0.en.html
9 // for details.
10 
11 #pragma once
12 
13 #include "common/qrack_types.hpp"
14 
15 namespace Qrack {
16 
17 class QubitSwapMap {
18 protected:
19  std::vector<bitLenInt> swapMap;
20 
21 public:
23  {
24  // Intentionally left blank
25  }
26 
27  QubitSwapMap(bitLenInt qubitCount)
28  : swapMap(qubitCount)
29  {
30  for (bitLenInt i = 0U; i < qubitCount; ++i) {
31  swapMap[i] = i;
32  }
33  }
34 
35  typedef std::vector<bitLenInt>::iterator iterator;
36 
37  bitLenInt& operator[](const bitLenInt& i) { return swapMap[i]; }
38 
39  bitLenInt size() { return swapMap.size(); }
40 
41  void swap(bitLenInt qubit1, bitLenInt qubit2) { std::swap(swapMap[qubit1], swapMap[qubit2]); }
42 
44  {
45  bitCapInt toRet = 0U;
46  for (bitLenInt i = 0U; i < size(); ++i) {
47  if ((perm >> i) & 1U) {
48  toRet |= (ONE_BCI << swapMap[i]);
49  }
50  }
51  return toRet;
52  }
53 
55  {
56  bitCapInt toRet = 0U;
57  for (bitLenInt i = 0U; i < size(); ++i) {
58  if ((perm >> swapMap[i]) & 1U) {
59  toRet |= (ONE_BCI << i);
60  }
61  }
62  return toRet;
63  }
64 };
65 
66 } // namespace Qrack
Definition: qubitswapmap.hpp:17
void swap(bitLenInt qubit1, bitLenInt qubit2)
Definition: qubitswapmap.hpp:41
QubitSwapMap()
Definition: qubitswapmap.hpp:22
bitLenInt size()
Definition: qubitswapmap.hpp:39
std::vector< bitLenInt > swapMap
Definition: qubitswapmap.hpp:19
QubitSwapMap(bitLenInt qubitCount)
Definition: qubitswapmap.hpp:27
bitLenInt & operator[](const bitLenInt &i)
Definition: qubitswapmap.hpp:37
std::vector< bitLenInt >::iterator iterator
Definition: qubitswapmap.hpp:35
bitCapInt inverseMap(bitCapInt perm)
Definition: qubitswapmap.hpp:54
bitCapInt map(bitCapInt perm)
Definition: qubitswapmap.hpp:43
Definition: complex16x2simd.hpp:25
constexpr uint8_t ONE_BCI
Definition: qrack_types.hpp:90
MICROSOFT_QUANTUM_DECL void U(_In_ uintq sid, _In_ uintq q, _In_ double theta, _In_ double phi, _In_ double lambda)
(External API) 3-parameter unitary gate
Definition: pinvoke_api.cpp:1362
#define bitLenInt
Definition: qrack_types.hpp:44
#define bitCapInt
Definition: qrack_types.hpp:105