Sequential Quantum Gate Decomposer  v1.9.3
Powerful decomposition of general unitarias into one- and two-qubit gates gates
RZ_P.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 "RZ_P.h"
24 
25 
26 
27 //static tbb::spin_mutex my_mutex;
32 
33  // A string labeling the gate operation
34  name = "RZ_P";
35 
36  // number of qubits spanning the matrix of the gate
37  qbit_num = -1;
38  // the size of the matrix
39  matrix_size = -1;
40  // A string describing the type of the gate
42 
43  // The index of the qubit on which the gate acts (target_qbit >= 0)
44  target_qbit = -1;
45  // The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled gates
46  control_qbit = -1;
47 
48 
49  parameter_num = 0;
50 
51 }
52 
53 
54 
63 RZ_P::RZ_P(int qbit_num_in, int target_qbit_in) {
64 
65  // A string labeling the gate operation
66  name = "RZ_P";
67 
68  //The stringstream input to store the output messages.
69  std::stringstream sstream;
70 
71  //Integer value to set the verbosity level of the output messages.
72  int verbose_level;
73 
74  // number of qubits spanning the matrix of the gate
75  qbit_num = qbit_num_in;
76  // the size of the matrix
78  // A string describing the type of the gate
80 
81 
82  if (target_qbit_in >= qbit_num) {
83  verbose_level=1;
84  sstream << "The index of the target qubit is larger than the number of qubits" << std::endl;
85  print(sstream,verbose_level);
86 
87  throw "The index of the target qubit is larger than the number of qubits";
88  }
89 
90  // The index of the qubit on which the gate acts (target_qbit >= 0)
91  target_qbit = target_qbit_in;
92  // The index of the qubit which acts as a control qubit (control_qbit >= 0) in controlled gates
93  control_qbit = -1;
94 
95  parameter_num = 1;
96 
97 }
98 
99 
104 
105 
106 }
107 
108 
109 
110 
117 void
118 RZ_P::apply_to( Matrix_real& parameters, Matrix& input, int parallel ) {
119 
120 
121  if (input.rows != matrix_size ) {
122  std::string err("RZ_P::apply_to: Wrong input size in RZ_P gate apply.");
123  throw err;
124  }
125 
126 
127  double ThetaOver2, Phi, Lambda;
128 
129  Phi = parameters[0];
130  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
131 
132  // get the U3 gate of one qubit
133  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
134 
135  apply_kernel_to( u3_1qbit, input, false, parallel );
136 
137 
138 }
139 
140 
141 
147 void
149 
150 
151  if (input.cols != matrix_size ) {
152  std::string err("Wrong matrix size in RZ_P apply_from_right");
153  throw err;
154  }
155 
156  double ThetaOver2, Phi, Lambda;
157 
158  Phi = parameters[0];
159  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
160 
161  // get the U3 gate of one qubit
162  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
163 
164 
165  apply_kernel_from_right(u3_1qbit, input);
166 
167 
168 
169 }
170 
171 
172 
179 std::vector<Matrix>
180 RZ_P::apply_derivate_to( Matrix_real& parameters_mtx, Matrix& input, int parallel ) {
181 
182  if (input.rows != matrix_size ) {
183  std::string err("Wrong matrix size in RZ_P apply_derivate_to");
184  throw err;
185  }
186 
187  std::vector<Matrix> ret;
188 
189  double ThetaOver2, Phi, Lambda;
190 
191  Phi = parameters_mtx[0] + M_PI/2;
192  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
193 
194 
195  // get the U3 gate of one qubit
196  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda);
197  u3_1qbit[0].real = 0.0;
198  u3_1qbit[0].imag = 0.0;
199 
200  Matrix&& res_mtx = input.copy();
201  apply_kernel_to( u3_1qbit, res_mtx, true, parallel );
202  ret.push_back(res_mtx);
203 
204 
205  return ret;
206 
207 
208 }
209 
210 
218 void
219 RZ_P::parameters_for_calc_one_qubit( double& ThetaOver2, double& Phi, double& Lambda){
220 
221  ThetaOver2 = 0;
222  Lambda = 0;
223 }
224 
230 
231  RZ_P* ret = new RZ_P(qbit_num, target_qbit);
232 
234  ret->set_parents( parents );
235  ret->set_children( children );
236 
237 
238  return ret;
239 
240 }
241 
242 
std::vector< Gate * > parents
list of parent gates to be applied in the circuit prior to this current gate
Definition: Gate.h:95
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
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: RZ_P.cpp:180
void apply_to(Matrix_real &parameters, Matrix &input, int parallel)
Call to apply the gate on the input array/matrix by U3*input.
Definition: RZ_P.cpp:118
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
A class representing a RZ + global phase gate.
Definition: RZ_P.h:36
Header file for a class representing a rotation gate around the Z axis.
~RZ_P()
Destructor of the class.
Definition: RZ_P.cpp:103
int matrix_size
The size N of the NxN matrix associated with the operations.
Definition: Gate.h:89
void apply_from_right(Matrix_real &parameters, Matrix &input)
Call to apply the gate on the input array/matrix by input*U3.
Definition: RZ_P.cpp:148
RZ_P * clone()
Call to create a clone of the present class.
Definition: RZ_P.cpp:229
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
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: RZ_P.cpp:219
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
int parameter_num
the number of free parameters of the operation
Definition: Gate.h:91
RZ_P()
NullaRZ constructor of the class.
Definition: RZ_P.cpp:31
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
int qbit_num
number of qubits spanning the matrix of the operation
Definition: Gate.h:81
Class to store data of complex arrays and its properties.
Definition: matrix_real.h:39