12 #include "../../common/include/qgd_math.h" 16 if (kernel.rows != rows || kernel.cols != cols || kernel.stride != cols) {
17 kernel = MT(rows, cols);
25 template<
typename MT,
typename RT>
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;
35 template<
typename MT,
typename RT>
38 h_gate_kernel_to<MT, RT>(u3);
42 template<
typename MT,
typename RT>
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;
51 template<
typename MT,
typename RT>
54 x_gate_kernel_to<MT, RT>(u3);
58 template<
typename MT,
typename RT>
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;
67 template<
typename MT,
typename RT>
70 y_gate_kernel_to<MT, RT>(u3);
74 template<
typename MT,
typename RT>
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;
83 template<
typename MT,
typename RT>
86 z_gate_kernel_to<MT, RT>(u3);
90 template<
typename MT,
typename RT>
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;
99 template<
typename MT,
typename RT>
102 s_gate_kernel_to<MT, RT>(u3);
106 template<
typename MT,
typename RT>
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;
115 template<
typename MT,
typename RT>
118 sdg_gate_kernel_to<MT, RT>(u3);
122 template<
typename MT,
typename RT>
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;
132 template<
typename MT,
typename RT>
135 t_gate_kernel_to<MT, RT>(u3);
139 template<
typename MT,
typename RT>
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;
149 template<
typename MT,
typename RT>
152 tdg_gate_kernel_to<MT, RT>(u3);
156 template<
typename MT,
typename RT>
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;
165 template<
typename MT,
typename RT>
168 sx_gate_kernel_to<MT, RT>(u3);
172 template<
typename MT,
typename RT>
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;
181 template<
typename MT,
typename RT>
184 sxdg_gate_kernel_to<MT, RT>(u3);
192 template<
typename MT,
typename RT>
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;
201 template<
typename MT,
typename RT>
204 rx_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
208 template<
typename MT,
typename RT>
210 rx_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
213 template<
typename MT,
typename RT>
216 rx_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
220 template<
typename MT,
typename RT>
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;
229 template<
typename MT,
typename RT>
232 rx_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
236 template<
typename MT,
typename RT>
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;
245 template<
typename MT,
typename RT>
248 ry_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
252 template<
typename MT,
typename RT>
254 ry_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
257 template<
typename MT,
typename RT>
260 ry_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
264 template<
typename MT,
typename RT>
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;
273 template<
typename MT,
typename RT>
276 ry_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
280 template<
typename MT,
typename RT>
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;
289 template<
typename MT,
typename RT>
292 rz_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
296 template<
typename MT,
typename RT>
298 rz_gate_kernel_from_trig_to<MT, RT>(u3, -s, c);
301 template<
typename MT,
typename RT>
304 rz_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s, c);
308 template<
typename MT,
typename RT>
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;
317 template<
typename MT,
typename RT>
320 rz_derivative_kernel_from_trig_to<MT, RT>(u3, s, c);
324 template<
typename MT,
typename RT>
327 u3[0].real = (RT)c_theta;
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;
337 template<
typename MT,
typename RT>
340 r_gate_kernel_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
344 template<
typename MT,
typename RT>
346 r_gate_kernel_from_trig_to<MT, RT>(u3, -s_theta, c_theta, s_phi, c_phi);
349 template<
typename MT,
typename RT>
352 r_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
356 template<
typename MT,
typename RT>
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;
365 template<
typename MT,
typename RT>
368 r_derivative_kernel_theta_from_trig_to<MT, RT>(u3, s_theta, c_theta, s_phi, c_phi);
372 template<
typename MT,
typename RT>
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;
381 template<
typename MT,
typename RT>
384 r_derivative_kernel_phi_from_trig_to<MT, RT>(u3, s_theta, s_phi, c_phi);
388 template<
typename MT,
typename RT>
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;
397 template<
typename MT,
typename RT>
400 u1_gate_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
404 template<
typename MT,
typename RT>
406 u1_gate_kernel_from_trig_to<MT, RT>(u3, -s_lambda, c_lambda);
409 template<
typename MT,
typename RT>
412 u1_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
416 template<
typename MT,
typename RT>
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;
425 template<
typename MT,
typename RT>
428 u1_derivative_kernel_from_trig_to<MT, RT>(u3, s_lambda, c_lambda);
432 template<
typename MT,
typename RT>
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;
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;
444 template<
typename MT,
typename RT>
447 u2_gate_kernel_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
451 template<
typename MT,
typename RT>
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;
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;
463 template<
typename MT,
typename RT>
466 u2_inverse_gate_kernel_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
470 template<
typename MT,
typename RT>
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;
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;
482 template<
typename MT,
typename RT>
485 u2_derivative_kernel_phi_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
489 template<
typename MT,
typename RT>
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;
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;
501 template<
typename MT,
typename RT>
504 u2_derivative_kernel_lambda_from_trig_to<MT, RT>(u3, s_phi, c_phi, s_lambda, c_lambda);
508 template<
typename MT,
typename RT>
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;
514 u3[0].real = cos_theta;
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;
524 template<
typename MT,
typename RT>
527 calc_one_qubit_u3_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
531 template<
typename MT,
typename RT>
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;
537 u3[0].real = cos_theta;
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;
547 template<
typename MT,
typename RT>
550 calc_one_qubit_u3_inverse_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
554 template<
typename MT,
typename RT>
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;
566 template<
typename MT,
typename RT>
569 u3_derivative_kernel_theta_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
573 template<
typename MT,
typename RT>
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;
585 template<
typename MT,
typename RT>
588 u3_derivative_kernel_phi_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
592 template<
typename MT,
typename RT>
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;
604 template<
typename MT,
typename RT>
607 u3_derivative_kernel_lambda_from_trig_to<MT, RT>(u3, sin_theta, cos_theta, sin_phi, cos_phi, sin_lambda, cos_lambda);
611 template<
typename MT,
typename RT>
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;
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);
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) {
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);
634 template<
typename MT,
typename RT>
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);
640 template<
typename MT,
typename RT>
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);
647 template<
typename MT,
typename RT>
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;
658 template<
typename MT,
typename RT>
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);
670 template<
typename MT,
typename RT>
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;
680 template<
typename MT,
typename RT>
683 build_rxx_kernel_from_trig_to<MT, RT>(U, s, c);
687 template<
typename MT,
typename RT>
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;
697 template<
typename MT,
typename RT>
700 build_rxx_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
705 template<
typename MT,
typename RT>
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;
715 template<
typename MT,
typename RT>
718 build_ryy_kernel_from_trig_to<MT, RT>(U, s, c);
722 template<
typename MT,
typename RT>
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;
732 template<
typename MT,
typename RT>
735 build_ryy_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
740 template<
typename MT,
typename RT>
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;
750 template<
typename MT,
typename RT>
753 build_rzz_kernel_from_trig_to<MT, RT>(U, s, c);
757 template<
typename MT,
typename RT>
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;
767 template<
typename MT,
typename RT>
770 build_rzz_derivative_kernel_from_trig_to<MT, RT>(U, s, c);
778 template<
typename MT,
typename RT>
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;
789 calc_one_qubit_u3_from_trig_to<MT, RT>(
791 s_theta, c_theta, s_phi_m_pi2, c_phi_m_pi2, s_nphi_p_pi2, c_nphi_p_pi2
795 template<
typename MT,
typename RT>
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;
802 calc_one_qubit_u3_from_trig_to<MT, RT>(
804 -s_theta, c_theta, s_phi_m_pi2, c_phi_m_pi2, s_nphi_p_pi2, c_nphi_p_pi2
808 template<
typename MT,
typename RT>
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);
814 template<
typename MT,
typename RT>
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);
822 template<
typename MT,
typename RT>
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);
830 template<
typename MT,
typename RT>
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);
837 template<
typename MT,
typename RT>
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);
844 template<
typename MT,
typename RT>
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);
852 template<
typename MT,
typename RT>
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);
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;
865 template<
typename MT,
typename RT>
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;
872 template<
typename MT,
typename RT>
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;
879 template<
typename MT,
typename RT>
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);
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)
void r_inverse_gate_kernel_from_trig_to(MT &u3, RT s_theta, RT c_theta, RT s_phi, RT c_phi)
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 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)
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 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)
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 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)
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)
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)
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)