Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
gate_kernel_templates.h
Go to the documentation of this file.
1 
8 #pragma once
9 
10 #include <math.h>
11 #include <utility>
12 #include "../../common/include/qgd_math.h"
13 
14 template<typename MT>
15 inline void ensure_kernel_storage(MT& kernel, int rows, int cols) {
16  if (kernel.rows != rows || kernel.cols != cols || kernel.stride != cols) {
17  kernel = MT(rows, cols);
18  }
19 }
20 
21 // ---------------------------------------------------------------------------
22 // Zero-parameter gates
23 // ---------------------------------------------------------------------------
24 
25 template<typename MT, typename RT>
26 inline void h_gate_kernel_to(MT& u3) {
27  ensure_kernel_storage(u3, 2, 2);
28  const RT sq = (RT)M_SQRT1_2;
29  u3[0].real = sq; u3[0].imag = (RT)0;
30  u3[1].real = sq; u3[1].imag = (RT)0;
31  u3[2].real = sq; u3[2].imag = (RT)0;
32  u3[3].real = -sq; u3[3].imag = (RT)0;
33 }
34 
35 template<typename MT, typename RT>
36 inline MT h_gate_kernel() {
37  MT u3(2, 2);
38  h_gate_kernel_to<MT, RT>(u3);
39  return u3;
40 }
41 
42 template<typename MT, typename RT>
43 inline void x_gate_kernel_to(MT& u3) {
44  ensure_kernel_storage(u3, 2, 2);
45  u3[0].real = (RT)0; u3[0].imag = (RT)0;
46  u3[1].real = (RT)1; u3[1].imag = (RT)0;
47  u3[2].real = (RT)1; u3[2].imag = (RT)0;
48  u3[3].real = (RT)0; u3[3].imag = (RT)0;
49 }
50 
51 template<typename MT, typename RT>
52 inline MT x_gate_kernel() {
53  MT u3(2, 2);
54  x_gate_kernel_to<MT, RT>(u3);
55  return u3;
56 }
57 
58 template<typename MT, typename RT>
59 inline void y_gate_kernel_to(MT& u3) {
60  ensure_kernel_storage(u3, 2, 2);
61  u3[0].real = (RT)0; u3[0].imag = (RT)0;
62  u3[1].real = (RT)0; u3[1].imag = -(RT)1;
63  u3[2].real = (RT)0; u3[2].imag = (RT)1;
64  u3[3].real = (RT)0; u3[3].imag = (RT)0;
65 }
66 
67 template<typename MT, typename RT>
68 inline MT y_gate_kernel() {
69  MT u3(2, 2);
70  y_gate_kernel_to<MT, RT>(u3);
71  return u3;
72 }
73 
74 template<typename MT, typename RT>
75 inline void z_gate_kernel_to(MT& u3) {
76  ensure_kernel_storage(u3, 2, 2);
77  u3[0].real = (RT)1; u3[0].imag = (RT)0;
78  u3[1].real = (RT)0; u3[1].imag = (RT)0;
79  u3[2].real = (RT)0; u3[2].imag = (RT)0;
80  u3[3].real = -(RT)1; u3[3].imag = (RT)0;
81 }
82 
83 template<typename MT, typename RT>
84 inline MT z_gate_kernel() {
85  MT u3(2, 2);
86  z_gate_kernel_to<MT, RT>(u3);
87  return u3;
88 }
89 
90 template<typename MT, typename RT>
91 inline void s_gate_kernel_to(MT& u3) {
92  ensure_kernel_storage(u3, 2, 2);
93  u3[0].real = (RT)1; u3[0].imag = (RT)0;
94  u3[1].real = (RT)0; u3[1].imag = (RT)0;
95  u3[2].real = (RT)0; u3[2].imag = (RT)0;
96  u3[3].real = (RT)0; u3[3].imag = (RT)1;
97 }
98 
99 template<typename MT, typename RT>
100 inline MT s_gate_kernel() {
101  MT u3(2, 2);
102  s_gate_kernel_to<MT, RT>(u3);
103  return u3;
104 }
105 
106 template<typename MT, typename RT>
107 inline void sdg_gate_kernel_to(MT& u3) {
108  ensure_kernel_storage(u3, 2, 2);
109  u3[0].real = (RT)1; u3[0].imag = (RT)0;
110  u3[1].real = (RT)0; u3[1].imag = (RT)0;
111  u3[2].real = (RT)0; u3[2].imag = (RT)0;
112  u3[3].real = (RT)0; u3[3].imag = -(RT)1;
113 }
114 
115 template<typename MT, typename RT>
116 inline MT sdg_gate_kernel() {
117  MT u3(2, 2);
118  sdg_gate_kernel_to<MT, RT>(u3);
119  return u3;
120 }
121 
122 template<typename MT, typename RT>
123 inline void t_gate_kernel_to(MT& u3) {
124  ensure_kernel_storage(u3, 2, 2);
125  const RT sq = (RT)M_SQRT1_2;
126  u3[0].real = (RT)1; u3[0].imag = (RT)0;
127  u3[1].real = (RT)0; u3[1].imag = (RT)0;
128  u3[2].real = (RT)0; u3[2].imag = (RT)0;
129  u3[3].real = sq; u3[3].imag = sq;
130 }
131 
132 template<typename MT, typename RT>
133 inline MT t_gate_kernel() {
134  MT u3(2, 2);
135  t_gate_kernel_to<MT, RT>(u3);
136  return u3;
137 }
138 
139 template<typename MT, typename RT>
140 inline void tdg_gate_kernel_to(MT& u3) {
141  ensure_kernel_storage(u3, 2, 2);
142  const RT sq = (RT)M_SQRT1_2;
143  u3[0].real = (RT)1; u3[0].imag = (RT)0;
144  u3[1].real = (RT)0; u3[1].imag = (RT)0;
145  u3[2].real = (RT)0; u3[2].imag = (RT)0;
146  u3[3].real = sq; u3[3].imag = -sq;
147 }
148 
149 template<typename MT, typename RT>
150 inline MT tdg_gate_kernel() {
151  MT u3(2, 2);
152  tdg_gate_kernel_to<MT, RT>(u3);
153  return u3;
154 }
155 
156 template<typename MT, typename RT>
157 inline void sx_gate_kernel_to(MT& u3) {
158  ensure_kernel_storage(u3, 2, 2);
159  u3[0].real = (RT)0.5; u3[0].imag = (RT)0.5;
160  u3[1].real = (RT)0.5; u3[1].imag = -(RT)0.5;
161  u3[2].real = (RT)0.5; u3[2].imag = -(RT)0.5;
162  u3[3].real = (RT)0.5; u3[3].imag = (RT)0.5;
163 }
164 
165 template<typename MT, typename RT>
166 inline MT sx_gate_kernel() {
167  MT u3(2, 2);
168  sx_gate_kernel_to<MT, RT>(u3);
169  return u3;
170 }
171 
172 template<typename MT, typename RT>
173 inline void sxdg_gate_kernel_to(MT& u3) {
174  ensure_kernel_storage(u3, 2, 2);
175  u3[0].real = (RT)0.5; u3[0].imag = -(RT)0.5;
176  u3[1].real = (RT)0.5; u3[1].imag = (RT)0.5;
177  u3[2].real = (RT)0.5; u3[2].imag = (RT)0.5;
178  u3[3].real = (RT)0.5; u3[3].imag = -(RT)0.5;
179 }
180 
181 template<typename MT, typename RT>
182 inline MT sxdg_gate_kernel() {
183  MT u3(2, 2);
184  sxdg_gate_kernel_to<MT, RT>(u3);
185  return u3;
186 }
187 
188 // ---------------------------------------------------------------------------
189 // Parametric gates
190 // ---------------------------------------------------------------------------
191 
192 template<typename MT, typename RT>
193 inline void rx_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
194  ensure_kernel_storage(u3, 2, 2);
195  u3[0].real = (RT)c; u3[0].imag = (RT)0;
196  u3[1].real = (RT)0; u3[1].imag = -(RT)s;
197  u3[2].real = (RT)0; u3[2].imag = -(RT)s;
198  u3[3].real = (RT)c; u3[3].imag = (RT)0;
199 }
200 
201 template<typename MT, typename RT>
202 inline MT rx_gate_kernel_from_trig(RT s, RT c) {
203  MT u3(2, 2);
204  rx_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
205  return u3;
206 }
207 
208 template<typename MT, typename RT>
209 inline void rx_inverse_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
210  rx_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
211 }
212 
213 template<typename MT, typename RT>
214 inline MT rx_inverse_gate_kernel_from_trig(RT s, RT c) {
215  MT u3(2, 2);
216  rx_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
217  return u3;
218 }
219 
220 template<typename MT, typename RT>
221 inline void rx_derivative_kernel_from_trig_to(MT& u3, RT s, RT c) {
222  ensure_kernel_storage(u3, 2, 2);
223  u3[0].real = -(RT)s; u3[0].imag = (RT)0;
224  u3[1].real = (RT)0; u3[1].imag = -(RT)c;
225  u3[2].real = (RT)0; u3[2].imag = -(RT)c;
226  u3[3].real = -(RT)s; u3[3].imag = (RT)0;
227 }
228 
229 template<typename MT, typename RT>
230 inline MT rx_derivative_kernel_from_trig(RT s, RT c) {
231  MT u3(2, 2);
232  rx_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
233  return u3;
234 }
235 
236 template<typename MT, typename RT>
237 inline void ry_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
238  ensure_kernel_storage(u3, 2, 2);
239  u3[0].real = (RT)c; u3[0].imag = (RT)0;
240  u3[1].real = -(RT)s; u3[1].imag = (RT)0;
241  u3[2].real = (RT)s; u3[2].imag = (RT)0;
242  u3[3].real = (RT)c; u3[3].imag = (RT)0;
243 }
244 
245 template<typename MT, typename RT>
246 inline MT ry_gate_kernel_from_trig(RT s, RT c) {
247  MT u3(2, 2);
248  ry_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
249  return u3;
250 }
251 
252 template<typename MT, typename RT>
253 inline void ry_inverse_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
254  ry_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
255 }
256 
257 template<typename MT, typename RT>
258 inline MT ry_inverse_gate_kernel_from_trig(RT s, RT c) {
259  MT u3(2, 2);
260  ry_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
261  return u3;
262 }
263 
264 template<typename MT, typename RT>
265 inline void ry_derivative_kernel_from_trig_to(MT& u3, RT s, RT c) {
266  ensure_kernel_storage(u3, 2, 2);
267  u3[0].real = -(RT)s; u3[0].imag = (RT)0;
268  u3[1].real = -(RT)c; u3[1].imag = (RT)0;
269  u3[2].real = (RT)c; u3[2].imag = (RT)0;
270  u3[3].real = -(RT)s; u3[3].imag = (RT)0;
271 }
272 
273 template<typename MT, typename RT>
274 inline MT ry_derivative_kernel_from_trig(RT s, RT c) {
275  MT u3(2, 2);
276  ry_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
277  return u3;
278 }
279 
280 template<typename MT, typename RT>
281 inline void rz_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
282  ensure_kernel_storage(u3, 2, 2);
283  u3[0].real = (RT)c; u3[0].imag = -(RT)s;
284  u3[1].real = (RT)0; u3[1].imag = (RT)0;
285  u3[2].real = (RT)0; u3[2].imag = (RT)0;
286  u3[3].real = (RT)c; u3[3].imag = (RT)s;
287 }
288 
289 template<typename MT, typename RT>
290 inline MT rz_gate_kernel_from_trig(RT s, RT c) {
291  MT u3(2, 2);
292  rz_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
293  return u3;
294 }
295 
296 template<typename MT, typename RT>
297 inline void rz_inverse_gate_kernel_from_trig_to(MT& u3, RT s, RT c) {
298  rz_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
299 }
300 
301 template<typename MT, typename RT>
302 inline MT rz_inverse_gate_kernel_from_trig(RT s, RT c) {
303  MT u3(2, 2);
304  rz_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
305  return u3;
306 }
307 
308 template<typename MT, typename RT>
309 inline void rz_derivative_kernel_from_trig_to(MT& u3, RT s, RT c) {
310  ensure_kernel_storage(u3, 2, 2);
311  u3[0].real = -(RT)s; u3[0].imag = -(RT)c;
312  u3[1].real = (RT)0; u3[1].imag = (RT)0;
313  u3[2].real = (RT)0; u3[2].imag = (RT)0;
314  u3[3].real = -(RT)s; u3[3].imag = (RT)c;
315 }
316 
317 template<typename MT, typename RT>
318 inline MT rz_derivative_kernel_from_trig(RT s, RT c) {
319  MT u3(2, 2);
320  rz_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
321  return u3;
322 }
323 
324 template<typename MT, typename RT>
325 inline void r_gate_kernel_from_trig_to(MT& u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
326  ensure_kernel_storage(u3, 2, 2);
327  u3[0].real = (RT)c_theta;
328  u3[0].imag = (RT)0;
329  u3[1].real = -(RT)s_theta * s_phi;
330  u3[1].imag = -(RT)s_theta * c_phi;
331  u3[2].real = (RT)s_theta * s_phi;
332  u3[2].imag = -(RT)s_theta * c_phi;
333  u3[3].real = (RT)c_theta;
334  u3[3].imag = (RT)0;
335 }
336 
337 template<typename MT, typename RT>
338 inline MT r_gate_kernel_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
339  MT u3(2, 2);
340  r_gate_kernel_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
341  return u3;
342 }
343 
344 template<typename MT, typename RT>
345 inline void r_inverse_gate_kernel_from_trig_to(MT& u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
346  r_gate_kernel_from_trig_to<MT, RT>(u3, -s_theta, c_theta, s_phi, c_phi);
347 }
348 
349 template<typename MT, typename RT>
350 inline MT r_inverse_gate_kernel_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
351  MT u3(2, 2);
352  r_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
353  return u3;
354 }
355 
356 template<typename MT, typename RT>
357 inline void r_derivative_kernel_theta_from_trig_to(MT& u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
358  ensure_kernel_storage(u3, 2, 2);
359  u3[0].real = -(RT)s_theta; u3[0].imag = (RT)0;
360  u3[1].real = -(RT)c_theta * s_phi; u3[1].imag = -(RT)c_theta * c_phi;
361  u3[2].real = (RT)c_theta * s_phi; u3[2].imag = -(RT)c_theta * c_phi;
362  u3[3].real = -(RT)s_theta; u3[3].imag = (RT)0;
363 }
364 
365 template<typename MT, typename RT>
366 inline MT r_derivative_kernel_theta_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
367  MT u3(2, 2);
368  r_derivative_kernel_theta_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
369  return u3;
370 }
371 
372 template<typename MT, typename RT>
373 inline void r_derivative_kernel_phi_from_trig_to(MT& u3, RT s_theta, RT s_phi, RT c_phi) {
374  ensure_kernel_storage(u3, 2, 2);
375  u3[0].real = (RT)0; u3[0].imag = (RT)0;
376  u3[1].real = -(RT)s_theta * c_phi; u3[1].imag = (RT)s_theta * s_phi;
377  u3[2].real = (RT)s_theta * c_phi; u3[2].imag = (RT)s_theta * s_phi;
378  u3[3].real = (RT)0; u3[3].imag = (RT)0;
379 }
380 
381 template<typename MT, typename RT>
382 inline MT r_derivative_kernel_phi_from_trig(RT s_theta, RT s_phi, RT c_phi) {
383  MT u3(2, 2);
384  r_derivative_kernel_phi_from_trig_to<MT, RT>(u3, s_theta, s_phi, c_phi);
385  return u3;
386 }
387 
388 template<typename MT, typename RT>
389 inline void u1_gate_kernel_from_trig_to(MT& u3, RT s_lambda, RT c_lambda) {
390  ensure_kernel_storage(u3, 2, 2);
391  u3[0].real = (RT)1; u3[0].imag = (RT)0;
392  u3[1].real = (RT)0; u3[1].imag = (RT)0;
393  u3[2].real = (RT)0; u3[2].imag = (RT)0;
394  u3[3].real = (RT)c_lambda; u3[3].imag = (RT)s_lambda;
395 }
396 
397 template<typename MT, typename RT>
398 inline MT u1_gate_kernel_from_trig(RT s_lambda, RT c_lambda) {
399  MT u3(2, 2);
400  u1_gate_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
401  return u3;
402 }
403 
404 template<typename MT, typename RT>
405 inline void u1_inverse_gate_kernel_from_trig_to(MT& u3, RT s_lambda, RT c_lambda) {
406  u1_gate_kernel_from_trig_to<MT, RT>(u3, -s_lambda, c_lambda);
407 }
408 
409 template<typename MT, typename RT>
410 inline MT u1_inverse_gate_kernel_from_trig(RT s_lambda, RT c_lambda) {
411  MT u3(2, 2);
412  u1_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
413  return u3;
414 }
415 
416 template<typename MT, typename RT>
417 inline void u1_derivative_kernel_from_trig_to(MT& u3, RT s_lambda, RT c_lambda) {
418  ensure_kernel_storage(u3, 2, 2);
419  u3[0].real = (RT)0; u3[0].imag = (RT)0;
420  u3[1].real = (RT)0; u3[1].imag = (RT)0;
421  u3[2].real = (RT)0; u3[2].imag = (RT)0;
422  u3[3].real = -(RT)s_lambda; u3[3].imag = (RT)c_lambda;
423 }
424 
425 template<typename MT, typename RT>
426 inline MT u1_derivative_kernel_from_trig(RT s_lambda, RT c_lambda) {
427  MT u3(2, 2);
428  u1_derivative_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
429  return u3;
430 }
431 
432 template<typename MT, typename RT>
433 inline void u2_gate_kernel_from_trig_to(MT& u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
434  ensure_kernel_storage(u3, 2, 2);
435  const RT s_pl = s_phi * c_lambda + c_phi * s_lambda;
436  const RT c_pl = c_phi * c_lambda - s_phi * s_lambda;
437  const RT sq = (RT)M_SQRT1_2;
438  u3[0].real = sq; u3[0].imag = (RT)0;
439  u3[1].real = -sq * c_lambda; u3[1].imag = -sq * s_lambda;
440  u3[2].real = sq * c_phi; u3[2].imag = sq * s_phi;
441  u3[3].real = sq * c_pl; u3[3].imag = sq * s_pl;
442 }
443 
444 template<typename MT, typename RT>
445 inline MT u2_gate_kernel_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
446  MT u3(2, 2);
447  u2_gate_kernel_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
448  return u3;
449 }
450 
451 template<typename MT, typename RT>
452 inline void u2_inverse_gate_kernel_from_trig_to(MT& u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
453  ensure_kernel_storage(u3, 2, 2);
454  const RT s_pl = s_phi * c_lambda + c_phi * s_lambda;
455  const RT c_pl = c_phi * c_lambda - s_phi * s_lambda;
456  const RT sq = (RT)M_SQRT1_2;
457  u3[0].real = sq; u3[0].imag = (RT)0;
458  u3[1].real = sq * c_phi; u3[1].imag = -sq * s_phi;
459  u3[2].real = -sq * c_lambda; u3[2].imag = sq * s_lambda;
460  u3[3].real = sq * c_pl; u3[3].imag = -sq * s_pl;
461 }
462 
463 template<typename MT, typename RT>
464 inline MT u2_inverse_gate_kernel_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
465  MT u3(2, 2);
466  u2_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
467  return u3;
468 }
469 
470 template<typename MT, typename RT>
471 inline void u2_derivative_kernel_phi_from_trig_to(MT& u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
472  ensure_kernel_storage(u3, 2, 2);
473  const RT s_pl = s_phi * c_lambda + c_phi * s_lambda;
474  const RT c_pl = c_phi * c_lambda - s_phi * s_lambda;
475  const RT sq = (RT)M_SQRT1_2;
476  u3[0].real = (RT)0; u3[0].imag = (RT)0;
477  u3[1].real = (RT)0; u3[1].imag = (RT)0;
478  u3[2].real = -sq * s_phi; u3[2].imag = sq * c_phi;
479  u3[3].real = -sq * s_pl; u3[3].imag = sq * c_pl;
480 }
481 
482 template<typename MT, typename RT>
483 inline MT u2_derivative_kernel_phi_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
484  MT u3(2, 2);
485  u2_derivative_kernel_phi_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
486  return u3;
487 }
488 
489 template<typename MT, typename RT>
490 inline void u2_derivative_kernel_lambda_from_trig_to(MT& u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
491  ensure_kernel_storage(u3, 2, 2);
492  const RT s_pl = s_phi * c_lambda + c_phi * s_lambda;
493  const RT c_pl = c_phi * c_lambda - s_phi * s_lambda;
494  const RT sq = (RT)M_SQRT1_2;
495  u3[0].real = (RT)0; u3[0].imag = (RT)0;
496  u3[1].real = sq * s_lambda; u3[1].imag = -sq * c_lambda;
497  u3[2].real = (RT)0; u3[2].imag = (RT)0;
498  u3[3].real = -sq * s_pl; u3[3].imag = sq * c_pl;
499 }
500 
501 template<typename MT, typename RT>
502 inline MT u2_derivative_kernel_lambda_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda) {
503  MT u3(2, 2);
504  u2_derivative_kernel_lambda_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
505  return u3;
506 }
507 
508 template<typename MT, typename RT>
509 inline void calc_one_qubit_u3_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
510  ensure_kernel_storage(u3, 2, 2);
511  const RT sin_phi_lambda = sin_phi * cos_lambda + cos_phi * sin_lambda;
512  const RT cos_phi_lambda = cos_phi * cos_lambda - sin_phi * sin_lambda;
513 
514  u3[0].real = cos_theta;
515  u3[0].imag = 0;
516  u3[1].real = -sin_theta * cos_lambda;
517  u3[1].imag = -sin_theta * sin_lambda;
518  u3[2].real = sin_theta * cos_phi;
519  u3[2].imag = sin_theta * sin_phi;
520  u3[3].real = cos_theta * cos_phi_lambda;
521  u3[3].imag = cos_theta * sin_phi_lambda;
522 }
523 
524 template<typename MT, typename RT>
525 inline MT calc_one_qubit_u3_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
526  MT u3(2, 2);
527  calc_one_qubit_u3_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
528  return u3;
529 }
530 
531 template<typename MT, typename RT>
532 inline void calc_one_qubit_u3_inverse_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
533  ensure_kernel_storage(u3, 2, 2);
534  const RT sin_phi_lambda = sin_phi * cos_lambda + cos_phi * sin_lambda;
535  const RT cos_phi_lambda = cos_phi * cos_lambda - sin_phi * sin_lambda;
536 
537  u3[0].real = cos_theta;
538  u3[0].imag = (RT)0;
539  u3[1].real = sin_theta * cos_phi;
540  u3[1].imag = -sin_theta * sin_phi;
541  u3[2].real = -sin_theta * cos_lambda;
542  u3[2].imag = sin_theta * sin_lambda;
543  u3[3].real = cos_theta * cos_phi_lambda;
544  u3[3].imag = -cos_theta * sin_phi_lambda;
545 }
546 
547 template<typename MT, typename RT>
548 inline MT calc_one_qubit_u3_inverse_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
549  MT u3(2, 2);
550  calc_one_qubit_u3_inverse_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
551  return u3;
552 }
553 
554 template<typename MT, typename RT>
555 inline void u3_derivative_kernel_theta_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
556  ensure_kernel_storage(u3, 2, 2);
557  const RT sin_phi_lambda = sin_phi * cos_lambda + cos_phi * sin_lambda;
558  const RT cos_phi_lambda = cos_phi * cos_lambda - sin_phi * sin_lambda;
559  u3[0].real = -sin_theta; u3[0].imag = (RT)0;
560  u3[1].real = -cos_theta * cos_lambda; u3[1].imag = -cos_theta * sin_lambda;
561  u3[2].real = cos_theta * cos_phi; u3[2].imag = cos_theta * sin_phi;
562  u3[3].real = -sin_theta * cos_phi_lambda;
563  u3[3].imag = -sin_theta * sin_phi_lambda;
564 }
565 
566 template<typename MT, typename RT>
567 inline MT u3_derivative_kernel_theta_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
568  MT u3(2, 2);
569  u3_derivative_kernel_theta_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
570  return u3;
571 }
572 
573 template<typename MT, typename RT>
574 inline void u3_derivative_kernel_phi_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
575  ensure_kernel_storage(u3, 2, 2);
576  const RT sin_phi_lambda = sin_phi * cos_lambda + cos_phi * sin_lambda;
577  const RT cos_phi_lambda = cos_phi * cos_lambda - sin_phi * sin_lambda;
578  u3[0].real = (RT)0; u3[0].imag = (RT)0;
579  u3[1].real = (RT)0; u3[1].imag = (RT)0;
580  u3[2].real = -sin_theta * sin_phi; u3[2].imag = sin_theta * cos_phi;
581  u3[3].real = -cos_theta * sin_phi_lambda;
582  u3[3].imag = cos_theta * cos_phi_lambda;
583 }
584 
585 template<typename MT, typename RT>
586 inline MT u3_derivative_kernel_phi_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
587  MT u3(2, 2);
588  u3_derivative_kernel_phi_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
589  return u3;
590 }
591 
592 template<typename MT, typename RT>
593 inline void u3_derivative_kernel_lambda_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
594  ensure_kernel_storage(u3, 2, 2);
595  const RT sin_phi_lambda = sin_phi * cos_lambda + cos_phi * sin_lambda;
596  const RT cos_phi_lambda = cos_phi * cos_lambda - sin_phi * sin_lambda;
597  u3[0].real = (RT)0; u3[0].imag = (RT)0;
598  u3[1].real = sin_theta * sin_lambda; u3[1].imag = -sin_theta * cos_lambda;
599  u3[2].real = (RT)0; u3[2].imag = (RT)0;
600  u3[3].real = -cos_theta * sin_phi_lambda;
601  u3[3].imag = cos_theta * cos_phi_lambda;
602 }
603 
604 template<typename MT, typename RT>
605 inline MT u3_derivative_kernel_lambda_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda) {
606  MT u3(2, 2);
607  u3_derivative_kernel_lambda_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
608  return u3;
609 }
610 
611 template<typename MT, typename RT>
612 inline void multiply_2x2_by_phase(MT& u3, RT sin_gamma, RT cos_gamma) {
613  for (int k = 0; k < 4; ++k) {
614  const RT real = u3[k].real;
615  const RT imag = u3[k].imag;
616  u3[k].real = real * cos_gamma - imag * sin_gamma;
617  u3[k].imag = real * sin_gamma + imag * cos_gamma;
618  }
619 }
620 
621 template<typename MT, typename RT>
622 inline void cu_gate_kernel_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
623  calc_one_qubit_u3_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
624  multiply_2x2_by_phase<MT, RT>(u3, sin_gamma, cos_gamma);
625 }
626 
627 template<typename MT, typename RT>
628 inline MT cu_gate_kernel_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
629  MT u3(2, 2);
630  cu_gate_kernel_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda, sin_gamma, cos_gamma);
631  return u3;
632 }
633 
634 template<typename MT, typename RT>
635 inline void cu_inverse_gate_kernel_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
636  calc_one_qubit_u3_inverse_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
637  multiply_2x2_by_phase<MT, RT>(u3, -sin_gamma, cos_gamma);
638 }
639 
640 template<typename MT, typename RT>
641 inline MT cu_inverse_gate_kernel_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
642  MT u3(2, 2);
643  cu_inverse_gate_kernel_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda, sin_gamma, cos_gamma);
644  return u3;
645 }
646 
647 template<typename MT, typename RT>
648 inline void cu_derivative_kernel_gamma_from_trig_to(MT& u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
649  cu_gate_kernel_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda, sin_gamma, cos_gamma);
650  for (int k = 0; k < 4; ++k) {
651  const RT real = u3[k].real;
652  const RT imag = u3[k].imag;
653  u3[k].real = -imag;
654  u3[k].imag = real;
655  }
656 }
657 
658 template<typename MT, typename RT>
659 inline MT cu_derivative_kernel_gamma_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma) {
660  MT u3(2, 2);
661  cu_derivative_kernel_gamma_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda, sin_gamma, cos_gamma);
662  return u3;
663 }
664 
665 // ---------------------------------------------------------------------------
666 // Two-qubit parametric gate kernels (4x4)
667 // ---------------------------------------------------------------------------
668 
670 template<typename MT, typename RT>
671 inline void build_rxx_kernel_from_trig_to(MT& U, RT s, RT c) {
672  ensure_kernel_storage(U, 4, 4);
673  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
674  U[0].real = c; U[3].imag = -s;
675  U[5].real = c; U[6].imag = -s;
676  U[10].real = c; U[9].imag = -s;
677  U[15].real = c; U[12].imag = -s;
678 }
679 
680 template<typename MT, typename RT>
681 inline MT build_rxx_kernel_from_trig(RT s, RT c) {
682  MT U(4, 4);
683  build_rxx_kernel_from_trig_to<MT, RT>(U, s, c);
684  return U;
685 }
686 
687 template<typename MT, typename RT>
688 inline void build_rxx_derivative_kernel_from_trig_to(MT& U, RT s, RT c) {
689  ensure_kernel_storage(U, 4, 4);
690  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
691  U[0].real = -s; U[3].imag = -c;
692  U[5].real = -s; U[6].imag = -c;
693  U[10].real = -s; U[9].imag = -c;
694  U[15].real = -s; U[12].imag = -c;
695 }
696 
697 template<typename MT, typename RT>
699  MT U(4, 4);
700  build_rxx_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
701  return U;
702 }
703 
705 template<typename MT, typename RT>
706 inline void build_ryy_kernel_from_trig_to(MT& U, RT s, RT c) {
707  ensure_kernel_storage(U, 4, 4);
708  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
709  U[0].real = c; U[3].imag = +s;
710  U[5].real = c; U[6].imag = -s;
711  U[10].real = c; U[9].imag = -s;
712  U[15].real = c; U[12].imag = +s;
713 }
714 
715 template<typename MT, typename RT>
716 inline MT build_ryy_kernel_from_trig(RT s, RT c) {
717  MT U(4, 4);
718  build_ryy_kernel_from_trig_to<MT, RT>(U, s, c);
719  return U;
720 }
721 
722 template<typename MT, typename RT>
723 inline void build_ryy_derivative_kernel_from_trig_to(MT& U, RT s, RT c) {
724  ensure_kernel_storage(U, 4, 4);
725  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
726  U[0].real = -s; U[3].imag = +c;
727  U[5].real = -s; U[6].imag = -c;
728  U[10].real = -s; U[9].imag = -c;
729  U[15].real = -s; U[12].imag = +c;
730 }
731 
732 template<typename MT, typename RT>
734  MT U(4, 4);
735  build_ryy_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
736  return U;
737 }
738 
740 template<typename MT, typename RT>
741 inline void build_rzz_kernel_from_trig_to(MT& U, RT s, RT c) {
742  ensure_kernel_storage(U, 4, 4);
743  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
744  U[0].real = c; U[0].imag = -s;
745  U[5].real = c; U[5].imag = +s;
746  U[10].real = c; U[10].imag = +s;
747  U[15].real = c; U[15].imag = -s;
748 }
749 
750 template<typename MT, typename RT>
751 inline MT build_rzz_kernel_from_trig(RT s, RT c) {
752  MT U(4, 4);
753  build_rzz_kernel_from_trig_to<MT, RT>(U, s, c);
754  return U;
755 }
756 
757 template<typename MT, typename RT>
758 inline void build_rzz_derivative_kernel_from_trig_to(MT& U, RT s, RT c) {
759  ensure_kernel_storage(U, 4, 4);
760  for (int i = 0; i < 16; ++i) { U[i].real = RT(0); U[i].imag = RT(0); }
761  U[0].real = -s; U[0].imag = -c;
762  U[5].real = -s; U[5].imag = +c;
763  U[10].real = -s; U[10].imag = +c;
764  U[15].real = -s; U[15].imag = -c;
765 }
766 
767 template<typename MT, typename RT>
769  MT U(4, 4);
770  build_rzz_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
771  return U;
772 }
773 
774 // ---------------------------------------------------------------------------
775 // CROT helper kernels (two 2x2 branches)
776 // ---------------------------------------------------------------------------
777 
778 template<typename MT, typename RT>
779 inline void build_crot_gate_kernel_from_trig_to(MT& forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
780  // CROT uses U3(theta, phi-pi/2, -phi+pi/2) on one branch and U3(-theta, ...) on the other.
781  // Convert shifted angles directly from sin(phi), cos(phi):
782  // sin(phi-pi/2)=-cos(phi), cos(phi-pi/2)=sin(phi)
783  // sin(-phi+pi/2)= cos(phi), cos(-phi+pi/2)=sin(phi)
784  const RT s_phi_m_pi2 = -c_phi;
785  const RT c_phi_m_pi2 = s_phi;
786  const RT s_nphi_p_pi2 = c_phi;
787  const RT c_nphi_p_pi2 = s_phi;
788 
789  calc_one_qubit_u3_from_trig_to<MT, RT>(
790  forward,
791  s_theta, c_theta, s_phi_m_pi2, c_phi_m_pi2, s_nphi_p_pi2, c_nphi_p_pi2
792  );
793 }
794 
795 template<typename MT, typename RT>
796 inline void build_crot_inverse_gate_kernel_from_trig_to(MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
797  const RT s_phi_m_pi2 = -c_phi;
798  const RT c_phi_m_pi2 = s_phi;
799  const RT s_nphi_p_pi2 = c_phi;
800  const RT c_nphi_p_pi2 = s_phi;
801 
802  calc_one_qubit_u3_from_trig_to<MT, RT>(
803  inverse,
804  -s_theta, c_theta, s_phi_m_pi2, c_phi_m_pi2, s_nphi_p_pi2, c_nphi_p_pi2
805  );
806 }
807 
808 template<typename MT, typename RT>
809 inline void build_crot_gate_kernels_from_trig_to(MT& forward, MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
810  build_crot_gate_kernel_from_trig_to<MT, RT>(forward, s_theta, c_theta, s_phi, c_phi);
811  build_crot_inverse_gate_kernel_from_trig_to<MT, RT>(inverse, s_theta, c_theta, s_phi, c_phi);
812 }
813 
814 template<typename MT, typename RT>
815 inline std::pair<MT, MT> build_crot_gate_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
816  MT forward(2, 2);
817  MT inverse(2, 2);
818  build_crot_gate_kernels_from_trig_to<MT, RT>(forward, inverse, s_theta, c_theta, s_phi, c_phi);
819  return std::make_pair(forward, inverse);
820 }
821 
822 template<typename MT, typename RT>
823 inline void build_crot_theta_derivative_kernels_from_trig_to(MT& forward, MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
824  // d/dtheta implemented via phase shift theta -> theta + pi/2 on both branches.
825  const RT s_theta_shift = c_theta;
826  const RT c_theta_shift = -s_theta;
827  build_crot_gate_kernels_from_trig_to<MT, RT>(forward, inverse, s_theta_shift, c_theta_shift, s_phi, c_phi);
828 }
829 
830 template<typename MT, typename RT>
831 inline void build_crot_theta_derivative_kernel_from_trig_to(MT& forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
832  const RT s_theta_shift = c_theta;
833  const RT c_theta_shift = -s_theta;
834  build_crot_gate_kernel_from_trig_to<MT, RT>(forward, s_theta_shift, c_theta_shift, s_phi, c_phi);
835 }
836 
837 template<typename MT, typename RT>
838 inline void build_crot_theta_derivative_aux_kernel_from_trig_to(MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
839  const RT s_theta_shift = c_theta;
840  const RT c_theta_shift = -s_theta;
841  build_crot_inverse_gate_kernel_from_trig_to<MT, RT>(inverse, s_theta_shift, c_theta_shift, s_phi, c_phi);
842 }
843 
844 template<typename MT, typename RT>
845 inline std::pair<MT, MT> build_crot_theta_derivative_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
846  MT forward(2, 2);
847  MT inverse(2, 2);
848  build_crot_theta_derivative_kernels_from_trig_to<MT, RT>(forward, inverse, s_theta, c_theta, s_phi, c_phi);
849  return std::make_pair(forward, inverse);
850 }
851 
852 template<typename MT, typename RT>
853 inline void build_crot_phi_derivative_kernels_from_trig_to(MT& forward, MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
854  // Matches legacy implementation: U3(theta, phi, -phi) and U3(-theta, phi, -phi)
855  // with zeroed diagonal entries.
856  calc_one_qubit_u3_from_trig_to<MT, RT>(forward, s_theta, c_theta, s_phi, c_phi, -s_phi, c_phi);
857  calc_one_qubit_u3_from_trig_to<MT, RT>(inverse, -s_theta, c_theta, s_phi, c_phi, -s_phi, c_phi);
858 
859  forward[0].real = (RT)0; forward[0].imag = (RT)0;
860  forward[3].real = (RT)0; forward[3].imag = (RT)0;
861  inverse[0].real = (RT)0; inverse[0].imag = (RT)0;
862  inverse[3].real = (RT)0; inverse[3].imag = (RT)0;
863 }
864 
865 template<typename MT, typename RT>
866 inline void build_crot_phi_derivative_kernel_from_trig_to(MT& forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
867  calc_one_qubit_u3_from_trig_to<MT, RT>(forward, s_theta, c_theta, s_phi, c_phi, -s_phi, c_phi);
868  forward[0].real = (RT)0; forward[0].imag = (RT)0;
869  forward[3].real = (RT)0; forward[3].imag = (RT)0;
870 }
871 
872 template<typename MT, typename RT>
873 inline void build_crot_phi_derivative_aux_kernel_from_trig_to(MT& inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
874  calc_one_qubit_u3_from_trig_to<MT, RT>(inverse, -s_theta, c_theta, s_phi, c_phi, -s_phi, c_phi);
875  inverse[0].real = (RT)0; inverse[0].imag = (RT)0;
876  inverse[3].real = (RT)0; inverse[3].imag = (RT)0;
877 }
878 
879 template<typename MT, typename RT>
880 inline std::pair<MT, MT> build_crot_phi_derivative_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi) {
881  MT forward(2, 2);
882  MT inverse(2, 2);
883  build_crot_phi_derivative_kernels_from_trig_to<MT, RT>(forward, inverse, s_theta, c_theta, s_phi, c_phi);
884  return std::make_pair(forward, inverse);
885 }
void cu_inverse_gate_kernel_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
MT u2_inverse_gate_kernel_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
void u3_derivative_kernel_phi_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
MT u2_gate_kernel_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
void u2_derivative_kernel_phi_from_trig_to(MT &u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
void build_crot_theta_derivative_kernel_from_trig_to(MT &forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT rz_gate_kernel_from_trig(RT s, RT c)
void s_gate_kernel_to(MT &u3)
std::pair< MT, MT > build_crot_gate_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void build_crot_phi_derivative_aux_kernel_from_trig_to(MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT r_derivative_kernel_phi_from_trig(RT s_theta, RT s_phi, RT c_phi)
void u3_derivative_kernel_lambda_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void x_gate_kernel_to(MT &u3)
void r_derivative_kernel_phi_from_trig_to(MT &u3, RT s_theta, RT s_phi, RT c_phi)
MT t_gate_kernel()
void r_inverse_gate_kernel_from_trig_to(MT &u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT h_gate_kernel()
MT u1_derivative_kernel_from_trig(RT s_lambda, RT c_lambda)
void rz_inverse_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
MT sdg_gate_kernel()
MT u1_inverse_gate_kernel_from_trig(RT s_lambda, RT c_lambda)
std::pair< MT, MT > build_crot_theta_derivative_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void calc_one_qubit_u3_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void sx_gate_kernel_to(MT &u3)
MT z_gate_kernel()
void ensure_kernel_storage(MT &kernel, int rows, int cols)
Shared inline templates for single-qubit gate kernel matrices.
void ry_inverse_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
void build_crot_gate_kernel_from_trig_to(MT &forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void rx_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
MT u1_gate_kernel_from_trig(RT s_lambda, RT c_lambda)
MT build_ryy_kernel_from_trig(RT s, RT c)
MT rx_inverse_gate_kernel_from_trig(RT s, RT c)
void sxdg_gate_kernel_to(MT &u3)
MT r_derivative_kernel_theta_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT u3_derivative_kernel_phi_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void h_gate_kernel_to(MT &u3)
void build_rzz_kernel_from_trig_to(MT &U, RT s, RT c)
RZZ(theta): exp(-i * theta/2 * ZZ)
MT rx_derivative_kernel_from_trig(RT s, RT c)
MT u3_derivative_kernel_theta_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void u2_gate_kernel_from_trig_to(MT &u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
MT build_rzz_derivative_kernel_from_trig(RT s, RT c)
void t_gate_kernel_to(MT &u3)
void build_crot_phi_derivative_kernels_from_trig_to(MT &forward, MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void z_gate_kernel_to(MT &u3)
MT r_gate_kernel_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void calc_one_qubit_u3_inverse_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void build_rxx_derivative_kernel_from_trig_to(MT &U, RT s, RT c)
void rz_derivative_kernel_from_trig_to(MT &u3, RT s, RT c)
void multiply_2x2_by_phase(MT &u3, RT sin_gamma, RT cos_gamma)
void y_gate_kernel_to(MT &u3)
void u1_inverse_gate_kernel_from_trig_to(MT &u3, RT s_lambda, RT c_lambda)
void build_crot_inverse_gate_kernel_from_trig_to(MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void rx_inverse_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
void build_crot_theta_derivative_aux_kernel_from_trig_to(MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT s_gate_kernel()
MT x_gate_kernel()
MT cu_derivative_kernel_gamma_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
void u1_gate_kernel_from_trig_to(MT &u3, RT s_lambda, RT c_lambda)
void build_crot_theta_derivative_kernels_from_trig_to(MT &forward, MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
#define M_SQRT1_2
Definition: qgd_math.h:70
void build_ryy_derivative_kernel_from_trig_to(MT &U, RT s, RT c)
MT ry_inverse_gate_kernel_from_trig(RT s, RT c)
std::pair< MT, MT > build_crot_phi_derivative_kernels_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT sx_gate_kernel()
MT rz_derivative_kernel_from_trig(RT s, RT c)
MT calc_one_qubit_u3_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void u1_derivative_kernel_from_trig_to(MT &u3, RT s_lambda, RT c_lambda)
void ry_derivative_kernel_from_trig_to(MT &u3, RT s, RT c)
MT u2_derivative_kernel_lambda_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
MT cu_inverse_gate_kernel_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
void sdg_gate_kernel_to(MT &u3)
void u2_derivative_kernel_lambda_from_trig_to(MT &u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
MT rz_inverse_gate_kernel_from_trig(RT s, RT c)
void cu_derivative_kernel_gamma_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
void rz_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
MT build_ryy_derivative_kernel_from_trig(RT s, RT c)
MT calc_one_qubit_u3_inverse_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
void build_ryy_kernel_from_trig_to(MT &U, RT s, RT c)
RYY(theta): exp(-i * theta/2 * YY)
MT ry_gate_kernel_from_trig(RT s, RT c)
MT build_rxx_kernel_from_trig(RT s, RT c)
void r_gate_kernel_from_trig_to(MT &u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT build_rxx_derivative_kernel_from_trig(RT s, RT c)
MT r_inverse_gate_kernel_from_trig(RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT build_rzz_kernel_from_trig(RT s, RT c)
void build_rzz_derivative_kernel_from_trig_to(MT &U, RT s, RT c)
void u3_derivative_kernel_theta_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
MT u3_derivative_kernel_lambda_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda)
MT tdg_gate_kernel()
void r_derivative_kernel_theta_from_trig_to(MT &u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
void u2_inverse_gate_kernel_from_trig_to(MT &u3, RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
void tdg_gate_kernel_to(MT &u3)
MT ry_derivative_kernel_from_trig(RT s, RT c)
MT rx_gate_kernel_from_trig(RT s, RT c)
void build_rxx_kernel_from_trig_to(MT &U, RT s, RT c)
RXX(theta): exp(-i * theta/2 * XX)
void build_crot_gate_kernels_from_trig_to(MT &forward, MT &inverse, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
MT y_gate_kernel()
void cu_gate_kernel_from_trig_to(MT &u3, RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
void rx_derivative_kernel_from_trig_to(MT &u3, RT s, RT c)
MT sxdg_gate_kernel()
void ry_gate_kernel_from_trig_to(MT &u3, RT s, RT c)
MT u2_derivative_kernel_phi_from_trig(RT s_phi, RT c_phi, RT s_lambda, RT c_lambda)
MT cu_gate_kernel_from_trig(RT sin_theta, RT cos_theta, RT sin_phi, RT cos_phi, RT sin_lambda, RT cos_lambda, RT sin_gamma, RT cos_gamma)
void build_crot_phi_derivative_kernel_from_trig_to(MT &forward, RT s_theta, RT c_theta, RT s_phi, RT c_phi)