Sequential Quantum Gate Decomposer  v1.9.3
Powerful decomposition of general unitarias into one- and two-qubit gates gates
RX.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 "RX.h"
24 
25 
26 
27 //static tbb::spin_mutex my_mutex;
31 RX::RX() {
32 
33  // A string labeling the gate operation
34  name = "RX";
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  parameter_num = 0;
49 
50 }
51 
52 
53 
62 RX::RX(int qbit_num_in, int target_qbit_in) {
63 
64  // A string labeling the gate operation
65  name = "RX";
66 
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 
108 void
109 RX::apply_to( Matrix_real& parameters, Matrix& input, int parallel ) {
110 
111  if (input.rows != matrix_size ) {
112  std::string err("RX::apply_to: Wrong input size in RX gate apply.");
113  throw err;
114  }
115 
116 
117  double ThetaOver2, Phi, Lambda;
118 
119  ThetaOver2 = parameters[0];
120  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
121 
122  // get the U3 gate of one qubit
123  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
124 
125 
126  apply_kernel_to( u3_1qbit, input, false, parallel );
127 
128 
129 }
130 
131 
132 
138 void
140 
141  if (input.cols != matrix_size ) {
142  std::stringstream sstream;
143  sstream << "Wrong matrix size in U3 apply_from_right" << std::endl;
144  print(sstream, 0);
145  exit(-1);
146  }
147 
148 
149  double ThetaOver2, Phi, Lambda;
150 
151  ThetaOver2 = parameters[0];
152  parameters_for_calc_one_qubit(ThetaOver2, Phi, Lambda);
153 
154  // get the U3 gate of one qubit
155  Matrix u3_1qbit = calc_one_qubit_u3(ThetaOver2, Phi, Lambda );
156 
157 
158  apply_kernel_from_right(u3_1qbit, input);
159 
160 
161 }
162 
163 
164 
171 std::vector<Matrix>
172 RX::apply_derivate_to( Matrix_real& parameters_mtx, Matrix& input, int parallel ) {
173 
174  if (input.rows != matrix_size ) {
175  std::stringstream sstream;
176  sstream << "Wrong matrix size in RX apply_derivate_to" << std::endl;
177  print(sstream, 0);
178  exit(-1);
179  }
180 
181 
182  std::vector<Matrix> ret;
183 
184  Matrix_real parameters_tmp(1,1);
185 
186  parameters_tmp[0] = parameters_mtx[0] + M_PI/2;
187  Matrix res_mtx = input.copy();
188  apply_to(parameters_tmp, res_mtx, parallel );
189  ret.push_back(res_mtx);
190 
191 
192 
193  return ret;
194 
195 
196 }
197 
198 
206 void
207 RX::parameters_for_calc_one_qubit( double& ThetaOver2, double& Phi, double& Lambda){
208 
209  Phi = -M_PI/2;
210  Lambda = M_PI/2;
211 }
212 
218 
219  RX* ret = new RX(qbit_num, target_qbit);
220 
222  ret->set_parents( parents );
223  ret->set_children( children );
224 
225 
226  return ret;
227 
228 }
229 
230 
231 
232 
240 
241  if ( get_parameter_start_idx() + get_parameter_num() > parameters.size() ) {
242  std::string err("RX::extract_parameters: Cant extract parameters, since the dinput arary has not enough elements.");
243  throw err;
244  }
245 
246  Matrix_real extracted_parameters(1,1);
247 
248  extracted_parameters[0] = std::fmod( 2*parameters[ get_parameter_start_idx() ], 4*M_PI);
249 
250  return extracted_parameters;
251 
252 }
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
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
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: RX.cpp:207
int target_qbit
The index of the qubit on which the operation acts (target_qbit >= 0)
Definition: Gate.h:85
~RX()
Destructor of the class.
Definition: RX.cpp:95
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: RX.cpp:172
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
int matrix_size
The size N of the NxN matrix associated with the operations.
Definition: Gate.h:89
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
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
Header file for a class representing a rotation gate around the X axis.
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
RX()
Nullary constructor of the class.
Definition: RX.cpp:31
void apply_from_right(Matrix_real &parameters, Matrix &input)
Call to apply the gate on the input array/matrix by input*U3.
Definition: RX.cpp:139
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
A class representing a U3 gate.
Definition: RX.h:36
void apply_to(Matrix_real &parameters, Matrix &input, int parallel)
Call to apply the gate on the input array/matrix by RX*input.
Definition: RX.cpp:109
Class to store data of complex arrays and its properties.
Definition: matrix_real.h:39
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: RX.cpp:239
RX * clone()
Call to create a clone of the present class.
Definition: RX.cpp:217