|
25 | 25 | #include <mlir/Support/LogicalResult.h> |
26 | 26 | #include <string> |
27 | 27 |
|
28 | | -#include "b.h" |
| 28 | +#include "d.h" |
29 | 29 |
|
30 | 30 | namespace mqt::ir::opt { |
31 | 31 |
|
@@ -324,7 +324,7 @@ struct GateDecompositionPattern final |
324 | 324 |
|
325 | 325 | auto [U, S] = self_adjoint_evd(A); |
326 | 326 |
|
327 | | - return {U, S}; |
| 327 | + return std::make_pair(U, S); |
328 | 328 | } |
329 | 329 |
|
330 | 330 | static std::tuple<matrix2x2, matrix2x2, fp> |
@@ -564,6 +564,15 @@ struct GateDecompositionPattern final |
564 | 564 | llvm::errs() << "===== M2 =====\n"; |
565 | 565 | helpers::print(m2); |
566 | 566 |
|
| 567 | + arma::Mat<qfp> U(4, 4); |
| 568 | + for (int i = 0; i < 4; ++i) { |
| 569 | + for (int j = 0; j < 4; ++j) { |
| 570 | + U.at(j, i) = u_p[j * 4 + i]; |
| 571 | + } |
| 572 | + } |
| 573 | + auto x = U.st() * U; |
| 574 | + std::cerr << "ARMA\n" << U.t() << "\n\n" << U << "\n\n" << x << std::endl; |
| 575 | + |
567 | 576 | // M2 is a symmetric complex matrix. We need to decompose it as M2 = P D |
568 | 577 | // P^T where P ∈ SO(4), D is diagonal with unit-magnitude elements. |
569 | 578 | // |
@@ -603,7 +612,7 @@ struct GateDecompositionPattern final |
603 | 612 | llvm::transform(m2, m2_real.begin(), [&](const qfp& val) { |
604 | 613 | return rand_a * val.real() + rand_b * val.imag(); |
605 | 614 | }); |
606 | | - auto p_inner_real = self_adjoint_eigen_lower(m2_real).first; |
| 615 | + rmatrix4x4 p_inner_real = self_adjoint_eigen_lower(m2_real).first; |
607 | 616 | matrix4x4 p_inner; |
608 | 617 | llvm::transform(p_inner_real, p_inner.begin(), |
609 | 618 | [](auto&& x) { return qfp(x, 0.0); }); |
@@ -638,6 +647,7 @@ struct GateDecompositionPattern final |
638 | 647 | std::array<fp, d.size()> d_real; |
639 | 648 | llvm::transform(d, d_real.begin(), |
640 | 649 | [](auto&& x) { return -std::arg(x) / 2.0; }); |
| 650 | + helpers::print(d_real, "D_REAL"); |
641 | 651 | d_real[3] = -d_real[0] - d_real[1] - d_real[2]; |
642 | 652 | std::array<fp, 3> cs; |
643 | 653 | for (std::size_t i = 0; i < cs.size(); ++i) { |
@@ -680,6 +690,7 @@ struct GateDecompositionPattern final |
680 | 690 | temp[1 * 4 + 1] = std::exp(IM * d_real[1]); |
681 | 691 | temp[2 * 4 + 2] = std::exp(IM * d_real[2]); |
682 | 692 | temp[3 * 4 + 3] = std::exp(IM * d_real[3]); |
| 693 | + helpers::print(temp, "TEMP"); |
683 | 694 | auto k1 = magic_basis_transform(dot(dot(u_p, p), temp), |
684 | 695 | MagicBasisTransform::Into); |
685 | 696 | auto k2 = magic_basis_transform(transpose(p), MagicBasisTransform::Into); |
|
0 commit comments