@@ -772,204 +772,6 @@ template <class Config> class Package {
772
772
return e;
773
773
}
774
774
775
- mEdge makeSWAPDD (const std::size_t n, const qc::Controls& controls,
776
- const qc::Qubit target0, const qc::Qubit target1,
777
- const std::size_t start = 0 ) {
778
- auto c = controls;
779
- c.insert (qc::Control{target0});
780
- mEdge e = makeGateDD (X_MAT, n, c, target1, start);
781
- c.erase (qc::Control{target0});
782
- c.insert (qc::Control{target1});
783
- e = multiply (e, multiply (makeGateDD (X_MAT, n, c, target0, start), e));
784
- return e;
785
- }
786
-
787
- mEdge makePeresDD (const std::size_t n, const qc::Controls& controls,
788
- const qc::Qubit target0, const qc::Qubit target1,
789
- const std::size_t start = 0 ) {
790
- auto c = controls;
791
- c.insert (qc::Control{target0});
792
- mEdge e = makeGateDD (X_MAT, n, c, target1, start);
793
- e = multiply (makeGateDD (X_MAT, n, controls, target0, start), e);
794
- return e;
795
- }
796
-
797
- mEdge makePeresInvDD (const std::size_t n, const qc::Controls& controls,
798
- const qc::Qubit target0, const qc::Qubit target1,
799
- const std::size_t start = 0 ) {
800
- mEdge e = makeGateDD (X_MAT, n, controls, target0, start);
801
- auto c = controls;
802
- c.insert (qc::Control{target0});
803
- e = multiply (makeGateDD (X_MAT, n, c, target1, start), e);
804
- return e;
805
- }
806
-
807
- mEdge makeiSWAPDD (const std::size_t n, const qc::Controls& controls,
808
- const qc::Qubit target0, const qc::Qubit target1,
809
- const std::size_t start = 0 ) {
810
- mEdge e = makeGateDD (S_MAT, n, controls, target1, start); // S q[1]
811
- e = multiply (e, makeGateDD (S_MAT, n, controls, target0, start)); // S q[0]
812
- e = multiply (e, makeGateDD (H_MAT, n, controls, target0, start)); // H q[0]
813
- auto c = controls;
814
- c.insert (qc::Control{target0});
815
- e = multiply (e, makeGateDD (X_MAT, n, c, target1, start)); // CX q[0], q[1]
816
- c.erase (qc::Control{target0});
817
- c.insert (qc::Control{target1});
818
- e = multiply (e, makeGateDD (X_MAT, n, c, target0, start)); // CX q[1], q[0]
819
- e = multiply (e, makeGateDD (H_MAT, n, controls, target1, start)); // H q[1]
820
- return e;
821
- }
822
-
823
- mEdge makeiSWAPinvDD (const std::size_t n, const qc::Controls& controls,
824
- const qc::Qubit target0, const qc::Qubit target1,
825
- const std::size_t start = 0 ) {
826
- mEdge e = makeGateDD (H_MAT, n, controls, target1, start); // H q[1]
827
- auto c = controls;
828
- c.insert (qc::Control{target1});
829
- e = multiply (e, makeGateDD (X_MAT, n, c, target0, start)); // CX q[1], q[0]
830
- c.erase (qc::Control{target1});
831
- c.insert (qc::Control{target0});
832
- e = multiply (e, makeGateDD (X_MAT, n, c, target1, start)); // CX q[0], q[1]
833
- e = multiply (e, makeGateDD (H_MAT, n, controls, target0, start)); // H q[0]
834
- e = multiply (e,
835
- makeGateDD (SDG_MAT, n, controls, target0, start)); // Sdag q[0]
836
- e = multiply (e,
837
- makeGateDD (SDG_MAT, n, controls, target1, start)); // Sdag q[1]
838
- return e;
839
- }
840
-
841
- mEdge makeDCXDD (const std::size_t n, const qc::Controls& controls,
842
- const qc::Qubit target0, const qc::Qubit target1,
843
- const std::size_t start = 0 ) {
844
- auto c = controls;
845
- c.insert (qc::Control{target0});
846
- mEdge e = makeGateDD (X_MAT, n, c, target1, start);
847
- c.erase (qc::Control{target0});
848
- c.insert (qc::Control{target1});
849
- e = multiply (e, makeGateDD (X_MAT, n, c, target0, start));
850
- return e;
851
- }
852
-
853
- mEdge makeRZZDD (const std::size_t n, const qc::Controls& controls,
854
- const qc::Qubit target0, const qc::Qubit target1,
855
- const fp theta, const std::size_t start = 0 ) {
856
- auto c = controls;
857
- c.insert (qc::Control{target0});
858
- auto e = makeGateDD (X_MAT, n, c, target1, start);
859
- c.erase (qc::Control{target0});
860
- e = multiply (e, makeGateDD (rzMat (theta), n, c, target1, start));
861
- c.insert (qc::Control{target0});
862
- e = multiply (e, makeGateDD (X_MAT, n, c, target1, start));
863
- return e;
864
- }
865
-
866
- mEdge makeRYYDD (const std::size_t n, const qc::Controls& controls,
867
- const qc::Qubit target0, const qc::Qubit target1,
868
- const fp theta, const std::size_t start = 0 ) {
869
- // no controls are necessary on the RX gates since they cancel if the
870
- // controls are 0.
871
- auto e = makeGateDD (rxMat (PI_2), n, qc::Controls{}, target0, start);
872
- e = multiply (e, makeGateDD (rxMat (PI_2), n, qc::Controls{}, target1, start));
873
- e = multiply (e, makeTwoQubitGateDD (rzzMat (theta), n, controls, target0,
874
- target1, start));
875
- e = multiply (e,
876
- makeGateDD (rxMat (-PI_2), n, qc::Controls{}, target1, start));
877
- e = multiply (e,
878
- makeGateDD (rxMat (-PI_2), n, qc::Controls{}, target0, start));
879
- return e;
880
- }
881
-
882
- mEdge makeRXXDD (const std::size_t n, const qc::Controls& controls,
883
- const qc::Qubit target0, const qc::Qubit target1,
884
- const fp theta, const std::size_t start = 0 ) {
885
- // no controls are necessary on the H gates since they cancel if the
886
- // controls are 0.
887
- auto e = makeGateDD (H_MAT, n, qc::Controls{}, target0, start);
888
- e = multiply (e, makeGateDD (H_MAT, n, qc::Controls{}, target1, start));
889
- e = multiply (e, makeTwoQubitGateDD (rzzMat (theta), n, controls, target0,
890
- target1, start));
891
- e = multiply (e, makeGateDD (H_MAT, n, qc::Controls{}, target1, start));
892
- e = multiply (e, makeGateDD (H_MAT, n, qc::Controls{}, target0, start));
893
- return e;
894
- }
895
-
896
- mEdge makeRZXDD (const std::size_t n, const qc::Controls& controls,
897
- const qc::Qubit target0, const qc::Qubit target1,
898
- const fp theta, const std::size_t start = 0 ) {
899
- // no controls are necessary on the H gates since they cancel if the
900
- // controls are 0.
901
- auto e = makeGateDD (H_MAT, n, qc::Controls{}, target1, start);
902
- e = multiply (e, makeTwoQubitGateDD (rzzMat (theta), n, controls, target0,
903
- target1, start));
904
- e = multiply (e, makeGateDD (H_MAT, n, qc::Controls{}, target1, start));
905
- return e;
906
- }
907
-
908
- mEdge makeECRDD (const std::size_t n, const qc::Controls& controls,
909
- const qc::Qubit target0, const qc::Qubit target1,
910
- const std::size_t start = 0 ) {
911
- auto e =
912
- makeTwoQubitGateDD (rzxMat (-PI_4), n, controls, target0, target1, start);
913
- e = multiply (e, makeGateDD (X_MAT, n, controls, target0, start));
914
- e = multiply (e, makeTwoQubitGateDD (rzxMat (PI_4), n, controls, target0,
915
- target1, start));
916
- return e;
917
- }
918
-
919
- mEdge makeXXMinusYYDD (const std::size_t n, const qc::Controls& controls,
920
- const qc::Qubit target0, const qc::Qubit target1,
921
- const fp theta, const fp beta = 0 .,
922
- const std::size_t start = 0 ) {
923
- auto e = makeGateDD (rzMat (-beta), n, qc::Controls{}, target1, start);
924
- e = multiply (e,
925
- makeGateDD (rzMat (-PI_2), n, qc::Controls{}, target0, start));
926
- e = multiply (e, makeGateDD (SX_MAT, n, qc::Controls{}, target0, start));
927
- e = multiply (e, makeGateDD (rzMat (PI_2), n, qc::Controls{}, target0, start));
928
- e = multiply (e, makeGateDD (S_MAT, n, qc::Controls{}, target1, start));
929
- e = multiply (e, makeGateDD (X_MAT, n, qc::Control{target0}, target1, start));
930
- // only the following two gates need to be controlled by the controls since
931
- // the other gates cancel if the controls are 0.
932
- e = multiply (e,
933
- makeGateDD (ryMat (-theta / 2 .), n, controls, target0, start));
934
- e = multiply (e, makeGateDD (ryMat (theta / 2 .), n, controls, target1, start));
935
-
936
- e = multiply (e, makeGateDD (X_MAT, n, qc::Control{target0}, target1, start));
937
- e = multiply (e, makeGateDD (SDG_MAT, n, qc::Controls{}, target1, start));
938
- e = multiply (e,
939
- makeGateDD (rzMat (-PI_2), n, qc::Controls{}, target0, start));
940
- e = multiply (e, makeGateDD (SXDG_MAT, n, qc::Controls{}, target0, start));
941
- e = multiply (e, makeGateDD (rzMat (PI_2), n, qc::Controls{}, target0, start));
942
- e = multiply (e, makeGateDD (rzMat (beta), n, qc::Controls{}, target1, start));
943
- return e;
944
- }
945
-
946
- mEdge makeXXPlusYYDD (const std::size_t n, const qc::Controls& controls,
947
- const qc::Qubit target0, const qc::Qubit target1,
948
- const fp theta, const fp beta = 0 .,
949
- const std::size_t start = 0 ) {
950
- auto e = makeGateDD (rzMat (beta), n, qc::Controls{}, target1, start);
951
- e = multiply (e,
952
- makeGateDD (rzMat (-PI_2), n, qc::Controls{}, target0, start));
953
- e = multiply (e, makeGateDD (SX_MAT, n, qc::Controls{}, target0, start));
954
- e = multiply (e, makeGateDD (rzMat (PI_2), n, qc::Controls{}, target0, start));
955
- e = multiply (e, makeGateDD (S_MAT, n, qc::Controls{}, target1, start));
956
- e = multiply (e, makeGateDD (X_MAT, n, qc::Control{target0}, target1, start));
957
- // only the following two gates need to be controlled by the controls since
958
- // the other gates cancel if the controls are 0.
959
- e = multiply (e, makeGateDD (ryMat (theta / 2 .), n, controls, target0, start));
960
- e = multiply (e, makeGateDD (ryMat (theta / 2 .), n, controls, target1, start));
961
-
962
- e = multiply (e, makeGateDD (X_MAT, n, qc::Control{target0}, target1, start));
963
- e = multiply (e, makeGateDD (SDG_MAT, n, qc::Controls{}, target1, start));
964
- e = multiply (e,
965
- makeGateDD (rzMat (-PI_2), n, qc::Controls{}, target0, start));
966
- e = multiply (e, makeGateDD (SXDG_MAT, n, qc::Controls{}, target0, start));
967
- e = multiply (e, makeGateDD (rzMat (PI_2), n, qc::Controls{}, target0, start));
968
- e = multiply (e,
969
- makeGateDD (rzMat (-beta), n, qc::Controls{}, target1, start));
970
- return e;
971
- }
972
-
973
775
private:
974
776
// check whether node represents a symmetric matrix or the identity
975
777
void checkSpecialMatrices (mNode * p) {
0 commit comments