Sequential Quantum Gate Decomposer  v1.9.3
Powerful decomposition of general unitarias into one- and two-qubit gates gates
RY.cpp
Go to the documentation of this file.
1 /*
2 Created on Fri Jun 26 14:13:26 2020
3 Copyright 2020 Peter Rakyta, Ph.D.
4 
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16 
17 @author: Peter Rakyta, Ph.D.
18 */
23 #include "RY.h"
24 
25 
26 
27 
28 //static tbb::spin_mutex my_mutex;
32 RY::RY() {
33 
34  // A string labeling the gate operation
35  name = "RY";
36 
37  // number of qubits spanning the matrix of the gate
38  qbit_num = -1;
39  // the size of the matrix
40  matrix_size = -1;
41  // A string describing the type of the gate
43 
44  // The index of the qubit on which the gate acts (target_qbit >= 0)
45  target_qbit = -1;
46  // The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled gates
47  control_qbit = -1;
48 
49  parameter_num = 0;
50 
51 }
52 
53 
54 
63 RY::RY(int qbit_num_in, int target_qbit_in) {
64 
65  // A string labeling the gate operation
66  name = "RY";
67  // number of qubits spanning the matrix of the gate
68  qbit_num = qbit_num_in;
69  // the size of the matrix
71  // A string describing the type of the gate
73 
74 
75  if (target_qbit_in >= qbit_num) {
76  std::stringstream sstream;
77  sstream << "The index of the target qubit is larger than the number of qubits" << std::endl;
78  print(sstream, 0);
79  throw "The index of the target qubit is larger than the number of qubits";
80  }
81 
82  // The index of the qubit on which the gate acts (target_qbit >= 0)
83  target_qbit = target_qbit_in;
84  // The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled gates
85  control_qbit = -1;
86 
87  parameter_num = 1;
88 
89 }
90 
91 
96 
97 }
98 
99 
100 
101 
109 void
110 RY::apply_to( Matrix_real& parameters, Matrix& input, int parallel ) {
111 
112 
113  if (input.rows != matrix_size ) {
114  std::string err("RY::apply_to: Wrong input size in RY gate apply.");
115  throw err;
116  }
117 
118 
119  double ThetaOver2, Phi, Lambda;
120 
121  ThetaOver2 = parameters[0];
122  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
123 
124  // get the U3 gate of one qubit
125  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
126 
127 
128  apply_kernel_to( u3_1qbit, input, false, parallel );
129 
130 
131 }
132 
133 
134 
140 void
142 
143  if (input.cols != matrix_size ) {
144  std::stringstream sstream;
145  sstream << "Wrong matrix size in U3 apply_from_right" << std::endl;
146  print(sstream, 0);
147  exit(-1);
148  }
149 
150  double ThetaOver2, Phi, Lambda;
151 
152  ThetaOver2 = parameters[0];
153  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
154 
155  // get the U3 gate of one qubit
156  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
157 
158 
159  apply_kernel_from_right(u3_1qbit, input);
160 
161 
162 
163 }
164 
165 
166 
173 std::vector<Matrix>
174 RY::apply_derivate_to( Matrix_real& parameters_mtx, Matrix& input, int parallel ) {
175 
176  if (input.rows != matrix_size ) {
177  std::stringstream sstream;
178  sstream << "Wrong matrix size in RY apply_derivate_to" << std::endl;
179  print(sstream, 0);
180  exit(-1);
181  }
182 
183  std::vector<Matrix> ret;
184 
185  Matrix_real parameters_tmp(1,1);
186 
187  parameters_tmp[0] = parameters_mtx[0] + M_PI/2;
188  Matrix res_mtx = input.copy();
189  apply_to(parameters_tmp, res_mtx, parallel);
190  ret.push_back(res_mtx);
191 
192 
193 
194  return ret;
195 
196 
197 }
198 
199 
207 void
208 RY::parameters_for_calc_one_qubit( double& ThetaOver2, double& Phi, double& Lambda){
209 
210  Phi = 0;
211  Lambda = 0;
212 }
213 
219 
220  RY* ret = new RY(qbit_num, target_qbit);
221 
223  ret->set_parents( parents );
224  ret->set_children( children );
225 
226  return ret;
227 
228 }
229 
230 
231 
239 
240  if ( get_parameter_start_idx() + get_parameter_num() > parameters.size() ) {
241  std::string err("RY::extract_parameters: Cant extract parameters, since the dinput arary has not enough elements.");
242  throw err;
243  }
244 
245  Matrix_real extracted_parameters(1,1);
246 
247  extracted_parameters[0] = std::fmod( 2*parameters[ get_parameter_start_idx() ], 4*M_PI);
248 
249  return extracted_parameters;
250 
251 }
std::vector< Gate * > parents
list of parent gates to be applied in the circuit prior to this current gate
Definition: Gate.h:95
virtual void apply_from_right(Matrix_real &parameters, Matrix &input)
Call to apply the gate on the input array/matrix by input*U3.
Definition: RY.cpp:141
void parameters_for_calc_one_qubit(double &ThetaOver2, double &Phi, double &Lambda)
Calculate the matrix of a U3 gate gate corresponding to the given parameters acting on a single qbit ...
Definition: RY.cpp:208
void print(const std::stringstream &sstream, int verbose_level=1) const
Call to print output messages in the function of the verbosity level.
Definition: logging.cpp:55
int control_qbit
The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled operations...
Definition: Gate.h:87
void set_children(std::vector< Gate *> &children_)
Call to set the children of the current gate.
Definition: Gate.cpp:802
int target_qbit
The index of the qubit on which the operation acts (target_qbit >= 0)
Definition: Gate.h:85
void apply_kernel_from_right(Matrix &u3_1qbit, Matrix &input)
Call to apply the gate kernel on the input state or unitary from right (no AVX support) ...
Definition: Gate.cpp:613
virtual void apply_to(Matrix_real &parameters, Matrix &input, int parallel)
Call to retrieve the gate matrix.
Definition: RY.cpp:110
int matrix_size
The size N of the NxN matrix associated with the operations.
Definition: Gate.h:89
RY()
Nullary constructor of the class.
Definition: RY.cpp:32
gate_type type
The type of the operation (see enumeration gate_type)
Definition: Gate.h:83
int rows
The number of rows.
Definition: matrix_base.hpp:42
int cols
The number of columns.
Definition: matrix_base.hpp:44
void set_parameter_start_idx(int start_idx)
Call to set the starting index of the parameters in the parameter array corresponding to the circuit ...
Definition: Gate.cpp:779
int get_parameter_start_idx()
Call to get the starting index of the parameters in the parameter array corresponding to the circuit ...
Definition: Gate.cpp:814
virtual Matrix calc_one_qubit_u3()
Calculate the matrix of the constans gates.
Definition: Gate.cpp:750
int Power_of_2(int n)
Calculates the n-th power of 2.
Definition: common.cpp:117
Class to store data of complex arrays and its properties.
Definition: matrix.h:38
A class representing a U3 gate.
Definition: RY.h:36
int size() const
Call to get the number of the allocated elements.
int get_parameter_num()
Call to get the number of free parameters.
Definition: Gate.cpp:486
std::string name
A string labeling the gate operation.
Definition: Gate.h:79
std::vector< Gate * > children
list of child gates to be applied after this current gate
Definition: Gate.h:97
void apply_kernel_to(Matrix &u3_1qbit, Matrix &input, bool deriv=false, int parallel=0)
Call to apply the gate kernel on the input state or unitary with optional AVX support.
Definition: Gate.cpp:537
Header file for a class representing a rotation gate around the Y axis.
int parameter_num
the number of free parameters of the operation
Definition: Gate.h:91
void set_parents(std::vector< Gate *> &parents_)
Call to set the parents of the current gate.
Definition: Gate.cpp:790
Matrix copy()
Call to create a copy of the matrix.
Definition: matrix.cpp:105
virtual std::vector< Matrix > apply_derivate_to(Matrix_real &parameters, Matrix &input, int parallel)
Call to evaluate the derivate of the circuit on an inout with respect to all of the free parameters...
Definition: RY.cpp:174
int qbit_num
number of qubits spanning the matrix of the operation
Definition: Gate.h:81
virtual ~RY()
Destructor of the class.
Definition: RY.cpp:95
virtual Matrix_real extract_parameters(Matrix_real &parameters)
Call to extract parameters from the parameter array corresponding to the circuit, in which the gate i...
Definition: RY.cpp:238
Class to store data of complex arrays and its properties.
Definition: matrix_real.h:39
virtual RY * clone()
Call to create a clone of the present class.
Definition: RY.cpp:218