QNLP  v1.0
hamming.hpp
Go to the documentation of this file.
1 
9 #ifndef QNLP_HAMMING_ROTY
10 #define QNLP_HAMMING_ROTY
11 
12 #include <cassert>
13 #include <utility>
14 #include <memory>
15 #include <cmath>
16 #include<vector>
17 #include<complex>
18 
19 namespace QNLP{
25  template <class SimulatorType>
27  private:
28  //Take the 2x2 matrix type from the template SimulatorType
29  using Mat2x2Type = decltype(std::declval<SimulatorType>().getGateX());
30 
31  std::size_t len_bin_pattern;
32 
33  public:
38  HammingDistance() = delete;
39 
45  HammingDistance(const std::size_t len_bin_pattern_){
46  len_bin_pattern = len_bin_pattern_;
47  };
48 
54  };
55 
64  static void computeHammingDistanceRotY(SimulatorType& qSim,
65  const std::vector<std::size_t>& reg_memory,
66  const std::vector<std::size_t>& reg_auxiliary,
67  std::size_t len_bin_pattern){
68 
69  double theta = M_PI / (double) len_bin_pattern;
70  auto Ry = qSim.getGateI();
71 
72  Ry(0,0) = std::complex<double>( cos(theta/2), 0.);
73  Ry(0,1) = std::complex<double>(-sin(theta/2), 0.);
74  Ry(1,0) = std::complex<double>( sin(theta/2), 0.);
75  Ry(1,1) = std::complex<double>( cos(theta/2), 0.);
76 
77  qSim.addUToCache("RY", Ry);
78 
79  std::size_t len_reg_auxiliary;
81 
82  // Require length of auxiliary register to have n+2 qubits
83  assert(reg_memory.size() + 1 < len_reg_auxiliary);
84 
85  for(std::size_t i = 0; i < len_bin_pattern; i++){
86  qSim.applyGateNCU(Ry, std::vector<std::size_t> {reg_auxiliary[i], reg_memory[i]}, reg_auxiliary[len_reg_auxiliary-2], "RY");
87  qSim.applyGateX(reg_memory[i]);
88  qSim.applyGateX(reg_auxiliary[i]);
89  qSim.applyGateNCU(Ry, std::vector<std::size_t> {reg_auxiliary[i], reg_memory[i]}, reg_auxiliary[len_reg_auxiliary-2], "RY");
90  qSim.applyGateX(reg_memory[i]);
91  qSim.applyGateX(reg_auxiliary[i]);
92  }
93  }
94 
102  static void computeHammingDistanceOverwriteAux(SimulatorType& qSim,
103  const std::vector<std::size_t>& reg_memory,
104  const std::vector<std::size_t>& reg_auxiliary){
105 
106  // Require length of auxiliary register to have n+2 qubits
107  assert(reg_memory.size() + 1 < reg_auxiliary.size());
108 
109  for(std::size_t i = 0; i < reg_memory.size(); i++){
110  qSim.applyGateX(reg_auxiliary[i]);
111  qSim.applyGateCCX(reg_memory[i], reg_auxiliary[i], *(reg_auxiliary.end()-2) );
112  qSim.applyGateX(reg_auxiliary[i]);
113  qSim.applyGateCSwap(reg_memory[i], reg_auxiliary[i], *(reg_auxiliary.end()-2) );
114  }
115  }
116 
117 
118  };
119 
120 };
121 #endif
~HammingDistance()
Destroy the Hamming Distance Rot Y object.
Definition: hamming.hpp:53
HammingDistance(const std::size_t len_bin_pattern_)
Construct a new Hamming Distance Rot Y object.
Definition: hamming.hpp:45
Class definition for implementing the Hamming distance routine along with controlled Y rotations to e...
Definition: hamming.hpp:26
decltype(std::declval< SimulatorType >().getGateX()) Mat2x2Type
Definition: hamming.hpp:29
static void computeHammingDistanceRotY(SimulatorType &qSim, const std::vector< std::size_t > &reg_memory, const std::vector< std::size_t > &reg_auxiliary, std::size_t len_bin_pattern)
Computes Hamming Distance; adjusts each state's amplitude proportional to the Hamming distance betwee...
Definition: hamming.hpp:64
HammingDistance()=delete
Construct a new Hamming Distance Rot Y object (disabled)
static void computeHammingDistanceOverwriteAux(SimulatorType &qSim, const std::vector< std::size_t > &reg_memory, const std::vector< std::size_t > &reg_auxiliary)
Computes Hamming Distance; Overwrites the pattern in reg_auxiliary to track bit differences from reg_...
Definition: hamming.hpp:102
std::size_t len_bin_pattern
Definition: hamming.hpp:31