1717import tunits as tu
1818
1919import cirq
20+ import cirq_google as cg
2021from cirq_google .experimental .analog_experiments import analog_trajectory_util as atu
2122
2223
2324@pytest .fixture
2425def freq_map () -> atu .FrequencyMap :
2526 return atu .FrequencyMap (
2627 10 * tu .ns ,
27- {"q0_0" : 5 * tu .GHz , "q0_1" : 6 * tu .GHz , "q0_2" : sympy .Symbol ("f_q0_2" )},
28- {("q0_0" , "q0_1" ): 5 * tu .MHz , ("q0_1" , "q0_2" ): sympy .Symbol ("g_q0_1_q0_2" )},
28+ {cirq .q (0 , 0 ): 5 * tu .GHz , cirq .q (0 , 1 ): 6 * tu .GHz , cirq .q (0 , 2 ): sympy .Symbol ("f_q0_2" )},
29+ {
30+ cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 )): 5 * tu .MHz ,
31+ cg .Coupler (cirq .q (0 , 1 ), cirq .q (0 , 2 )): sympy .Symbol ("g_q0_1_q0_2" ),
32+ },
2933 False ,
3034 )
3135
@@ -41,59 +45,68 @@ def test_freq_map_resolve(freq_map: atu.FrequencyMap) -> None:
4145 )
4246 assert resolved_freq_map == atu .FrequencyMap (
4347 10 * tu .ns ,
44- {"q0_0" : 5 * tu .GHz , "q0_1" : 6 * tu .GHz , "q0_2" : 6 * tu .GHz },
45- {("q0_0" , "q0_1" ): 5 * tu .MHz , ("q0_1" , "q0_2" ): 7 * tu .MHz },
48+ {cirq .q (0 , 0 ): 5 * tu .GHz , cirq .q (0 , 1 ): 6 * tu .GHz , cirq .q (0 , 2 ): 6 * tu .GHz },
49+ {
50+ cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 )): 5 * tu .MHz ,
51+ cg .Coupler (cirq .q (0 , 1 ), cirq .q (0 , 2 )): 7 * tu .MHz ,
52+ },
4653 False ,
4754 )
4855
4956
50- FreqMapType = tuple [tu .Value , dict [str , tu .Value | None ], dict [tuple [ str , str ] , tu .Value ]]
57+ FreqMapType = tuple [tu .Value , dict [cirq . Qid , tu .Value | None ], dict [cg . Coupler , tu .Value ]]
5158
5259
5360@pytest .fixture
5461def sparse_trajectory () -> list [FreqMapType ]:
55- traj1 : FreqMapType = (20 * tu .ns , {"q0_1" : 5 * tu .GHz }, {})
56- traj2 : FreqMapType = (30 * tu .ns , {"q0_2" : 8 * tu .GHz }, {})
62+ traj1 : FreqMapType = (20 * tu .ns , {cirq . q ( 0 , 1 ) : 5 * tu .GHz }, {})
63+ traj2 : FreqMapType = (30 * tu .ns , {cirq . q ( 0 , 2 ) : 8 * tu .GHz }, {})
5764 traj3 : FreqMapType = (35 * tu .ns , {}, {})
5865 traj4 : FreqMapType = (
5966 40 * tu .ns ,
60- {"q0_0" : 8 * tu .GHz , "q0_1" : None , "q0_2" : None },
61- {("q0_0" , "q0_1" ): 5 * tu .MHz , ("q0_1" , "q0_2" ): 8 * tu .MHz },
67+ {cirq .q (0 , 0 ): 8 * tu .GHz , cirq .q (0 , 1 ): None , cirq .q (0 , 2 ): None },
68+ {
69+ cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 )): 5 * tu .MHz ,
70+ cg .Coupler (cirq .q (0 , 1 ), cirq .q (0 , 2 )): 8 * tu .MHz ,
71+ },
6272 )
6373 return [traj1 , traj2 , traj3 , traj4 ]
6474
6575
6676def test_full_traj (sparse_trajectory : list [FreqMapType ]) -> None :
6777 analog_traj = atu .AnalogTrajectory .from_sparse_trajectory (sparse_trajectory )
78+ coupler1 = cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 ))
79+ coupler2 = cg .Coupler (cirq .q (0 , 1 ), cirq .q (0 , 2 ))
80+
6881 assert len (analog_traj .full_trajectory ) == 5
6982 assert analog_traj .full_trajectory [0 ] == atu .FrequencyMap (
7083 0 * tu .ns ,
71- {"q0_0" : None , "q0_1" : None , "q0_2" : None },
72- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
84+ {cirq . q ( 0 , 0 ) : None , cirq . q ( 0 , 1 ) : None , cirq . q ( 0 , 2 ) : None },
85+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
7386 False ,
7487 )
7588 assert analog_traj .full_trajectory [1 ] == atu .FrequencyMap (
7689 20 * tu .ns ,
77- {"q0_0" : None , "q0_1" : 5 * tu .GHz , "q0_2" : None },
78- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
90+ {cirq . q ( 0 , 0 ) : None , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : None },
91+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
7992 False ,
8093 )
8194 assert analog_traj .full_trajectory [2 ] == atu .FrequencyMap (
8295 30 * tu .ns ,
83- {"q0_0" : None , "q0_1" : 5 * tu .GHz , "q0_2" : 8 * tu .GHz },
84- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
96+ {cirq . q ( 0 , 0 ) : None , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : 8 * tu .GHz },
97+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
8598 False ,
8699 )
87100 assert analog_traj .full_trajectory [3 ] == atu .FrequencyMap (
88101 35 * tu .ns ,
89- {"q0_0" : None , "q0_1" : 5 * tu .GHz , "q0_2" : 8 * tu .GHz },
90- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
102+ {cirq . q ( 0 , 0 ) : None , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : 8 * tu .GHz },
103+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
91104 True ,
92105 )
93106 assert analog_traj .full_trajectory [4 ] == atu .FrequencyMap (
94107 40 * tu .ns ,
95- {"q0_0" : 8 * tu .GHz , "q0_1" : None , "q0_2" : None },
96- {( "q0_0" , "q0_1" ) : 5 * tu .MHz , ( "q0_1" , "q0_2" ) : 8 * tu .MHz },
108+ {cirq . q ( 0 , 0 ) : 8 * tu .GHz , cirq . q ( 0 , 1 ) : None , cirq . q ( 0 , 2 ) : None },
109+ {coupler1 : 5 * tu .MHz , coupler2 : 8 * tu .MHz },
97110 False ,
98111 )
99112
@@ -102,53 +115,59 @@ def test_get_full_trajectory_with_resolved_idles(sparse_trajectory: list[FreqMap
102115
103116 analog_traj = atu .AnalogTrajectory .from_sparse_trajectory (sparse_trajectory )
104117 resolved_full_traj = analog_traj .get_full_trajectory_with_resolved_idles (
105- {"q0_0" : 5 * tu .GHz , "q0_1" : 6 * tu .GHz , "q0_2" : 7 * tu .GHz }
118+ {cirq . q ( 0 , 0 ) : 5 * tu .GHz , cirq . q ( 0 , 1 ) : 6 * tu .GHz , cirq . q ( 0 , 2 ) : 7 * tu .GHz }
106119 )
120+ coupler1 = cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 ))
121+ coupler2 = cg .Coupler (cirq .q (0 , 1 ), cirq .q (0 , 2 ))
107122
108123 assert len (resolved_full_traj ) == 5
109124 assert resolved_full_traj [0 ] == atu .FrequencyMap (
110125 0 * tu .ns ,
111- {"q0_0" : 5 * tu .GHz , "q0_1" : 6 * tu .GHz , "q0_2" : 7 * tu .GHz },
112- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
126+ {cirq . q ( 0 , 0 ) : 5 * tu .GHz , cirq . q ( 0 , 1 ) : 6 * tu .GHz , cirq . q ( 0 , 2 ) : 7 * tu .GHz },
127+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
113128 False ,
114129 )
115130 assert resolved_full_traj [1 ] == atu .FrequencyMap (
116131 20 * tu .ns ,
117- {"q0_0" : 5 * tu .GHz , "q0_1" : 5 * tu .GHz , "q0_2" : 7 * tu .GHz },
118- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
132+ {cirq . q ( 0 , 0 ) : 5 * tu .GHz , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : 7 * tu .GHz },
133+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
119134 False ,
120135 )
121136 assert resolved_full_traj [2 ] == atu .FrequencyMap (
122137 30 * tu .ns ,
123- {"q0_0" : 5 * tu .GHz , "q0_1" : 5 * tu .GHz , "q0_2" : 8 * tu .GHz },
124- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
138+ {cirq . q ( 0 , 0 ) : 5 * tu .GHz , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : 8 * tu .GHz },
139+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
125140 False ,
126141 )
127142 assert resolved_full_traj [3 ] == atu .FrequencyMap (
128143 35 * tu .ns ,
129- {"q0_0" : 5 * tu .GHz , "q0_1" : 5 * tu .GHz , "q0_2" : 8 * tu .GHz },
130- {( "q0_0" , "q0_1" ) : 0 * tu .MHz , ( "q0_1" , "q0_2" ) : 0 * tu .MHz },
144+ {cirq . q ( 0 , 0 ) : 5 * tu .GHz , cirq . q ( 0 , 1 ) : 5 * tu .GHz , cirq . q ( 0 , 2 ) : 8 * tu .GHz },
145+ {coupler1 : 0 * tu .MHz , coupler2 : 0 * tu .MHz },
131146 True ,
132147 )
133148 assert resolved_full_traj [4 ] == atu .FrequencyMap (
134149 40 * tu .ns ,
135- {"q0_0" : 8 * tu .GHz , "q0_1" : 6 * tu .GHz , "q0_2" : 7 * tu .GHz },
136- {( "q0_0" , "q0_1" ) : 5 * tu .MHz , ( "q0_1" , "q0_2" ) : 8 * tu .MHz },
150+ {cirq . q ( 0 , 0 ) : 8 * tu .GHz , cirq . q ( 0 , 1 ) : 6 * tu .GHz , cirq . q ( 0 , 2 ) : 7 * tu .GHz },
151+ {coupler1 : 5 * tu .MHz , coupler2 : 8 * tu .MHz },
137152 False ,
138153 )
139154
140155
141156def test_plot_with_unresolved_parameters () -> None :
142- traj1 : FreqMapType = (20 * tu .ns , {"q0_1" : sympy .Symbol ("qf" )}, {})
143- traj2 : FreqMapType = (sympy .Symbol ("t" ), {"q0_2" : 8 * tu .GHz }, {})
157+ traj1 : FreqMapType = (20 * tu .ns , {cirq . q ( 0 , 1 ) : sympy .Symbol ("qf" )}, {})
158+ traj2 : FreqMapType = (sympy .Symbol ("t" ), {cirq . q ( 0 , 2 ) : 8 * tu .GHz }, {})
144159 analog_traj = atu .AnalogTrajectory .from_sparse_trajectory ([traj1 , traj2 ])
145160
146161 with pytest .raises (ValueError ):
147162 analog_traj .plot ()
148163
149164
150165def test_analog_traj_plot () -> None :
151- traj1 : FreqMapType = (5 * tu .ns , {"q0_1" : sympy .Symbol ("qf" )}, {("q0_0" , "q0_1" ): 2 * tu .MHz })
152- traj2 : FreqMapType = (sympy .Symbol ("t" ), {"q0_2" : 8 * tu .GHz }, {})
166+ traj1 : FreqMapType = (
167+ 5 * tu .ns ,
168+ {cirq .q (0 , 1 ): sympy .Symbol ("qf" )},
169+ {cg .Coupler (cirq .q (0 , 0 ), cirq .q (0 , 1 )): 2 * tu .MHz },
170+ )
171+ traj2 : FreqMapType = (sympy .Symbol ("t" ), {cirq .q (0 , 2 ): 8 * tu .GHz }, {})
153172 analog_traj = atu .AnalogTrajectory .from_sparse_trajectory ([traj1 , traj2 ])
154173 analog_traj .plot (resolver = {"t" : 10 * tu .ns , "qf" : 5 * tu .GHz })
0 commit comments