@@ -330,6 +330,133 @@ def test_pauli_sum_collector_collect(self):
330330 self .assertAlmostEqual (collector .estimated_energy (),
331331 expected_energy )
332332
333+ def test_pauli_sum_collector_next_job (self ):
334+ """Test the next_job method of TFQPauliSumCollector."""
335+ qubit0 = cirq .GridQubit (0 , 0 )
336+ qubit1 = cirq .GridQubit (0 , 1 )
337+ circuit = cirq .Circuit (cirq .X (qubit0 ))
338+ observable = (3.0 * cirq .Z (qubit0 ) + 2.0 * cirq .X (qubit1 ) +
339+ 5.0 * cirq .I (qubit0 ))
340+
341+ collector = batch_util .TFQPauliSumCollector (circuit ,
342+ observable ,
343+ samples_per_term = 25 ,
344+ max_samples_per_job = 10 )
345+
346+ job1 = collector .next_job ()
347+ self .assertIsNotNone (job1 )
348+ self .assertEqual (job1 .repetitions , 10 )
349+ self .assertEqual (job1 .tag , cirq .PauliString (cirq .Z (qubit0 )))
350+ self .assertEqual (job1 .tag .coefficient , 1.0 )
351+
352+ job2 = collector .next_job ()
353+ self .assertIsNotNone (job2 )
354+ self .assertEqual (job2 .repetitions , 10 )
355+ self .assertEqual (job2 .tag , cirq .PauliString (cirq .Z (qubit0 )))
356+
357+ job3 = collector .next_job ()
358+ self .assertIsNotNone (job3 )
359+ self .assertEqual (job3 .repetitions , 5 )
360+ self .assertEqual (job3 .tag , cirq .PauliString (cirq .Z (qubit0 )))
361+
362+ job4 = collector .next_job ()
363+ self .assertIsNotNone (job4 )
364+ self .assertEqual (job4 .repetitions , 10 )
365+ self .assertEqual (job4 .tag , cirq .PauliString (cirq .X (qubit1 )))
366+ self .assertEqual (job4 .tag .coefficient , 1.0 )
367+
368+ job5 = collector .next_job ()
369+ self .assertIsNotNone (job5 )
370+ self .assertEqual (job5 .repetitions , 10 )
371+ self .assertEqual (job5 .tag , cirq .PauliString (cirq .X (qubit1 )))
372+
373+ job6 = collector .next_job ()
374+ self .assertIsNotNone (job6 )
375+ self .assertEqual (job6 .repetitions , 5 )
376+ self .assertEqual (job6 .tag , cirq .PauliString (cirq .X (qubit1 )))
377+
378+ job7 = collector .next_job ()
379+ self .assertIsNone (job7 )
380+
381+ obs_ident = 4.0 * cirq .I (qubit0 )
382+ collector_ident = batch_util .TFQPauliSumCollector (circuit ,
383+ obs_ident ,
384+ samples_per_term = 10 )
385+ self .assertIsNone (collector_ident .next_job ())
386+
387+ def test_pauli_sum_collector_on_job_result (self ):
388+ """Test the on_job_result method of TFQPauliSumCollector."""
389+ qubit0 = cirq .GridQubit (0 , 0 )
390+ qubit1 = cirq .GridQubit (0 , 1 )
391+ circuit = cirq .Circuit (cirq .X (qubit0 ), cirq .H (qubit1 ))
392+ observable = cirq .Z (qubit0 ) * cirq .Z (qubit1 )
393+
394+ collector = batch_util .TFQPauliSumCollector (circuit ,
395+ observable ,
396+ samples_per_term = 10 ,
397+ max_samples_per_job = 5 )
398+
399+ job1 = collector .next_job ()
400+ res1 = cirq .ResultDict (
401+ params = cirq .ParamResolver ({}),
402+ measurements = {
403+ 'out' :
404+ np .array ([[0 , 0 ], [1 , 1 ], [0 , 1 ], [1 , 0 ], [1 , 0 ]],
405+ dtype = np .int8 )
406+ })
407+ collector .on_job_result (job1 , res1 )
408+
409+ job_id = job1 .tag
410+ self .assertEqual (collector ._zeros [job_id ], 2 )
411+ self .assertEqual (collector ._ones [job_id ], 3 )
412+
413+ job2 = collector .next_job ()
414+ res2 = cirq .ResultDict (
415+ params = cirq .ParamResolver ({}),
416+ measurements = {
417+ 'out' :
418+ np .array ([[0 , 0 ], [0 , 0 ], [0 , 0 ], [0 , 1 ], [1 , 1 ]],
419+ dtype = np .int8 )
420+ })
421+ collector .on_job_result (job2 , res2 )
422+
423+ self .assertEqual (collector ._zeros [job_id ], 6 )
424+ self .assertEqual (collector ._ones [job_id ], 4 )
425+
426+ def test_pauli_sum_collector_estimated_energy (self ):
427+ """Test the estimated_energy method of TFQPauliSumCollector."""
428+ qubit0 = cirq .GridQubit (0 , 0 )
429+ qubit1 = cirq .GridQubit (0 , 1 )
430+ circuit = cirq .Circuit (cirq .X (qubit0 ))
431+ observable = (3.0 * cirq .Z (qubit0 ) - 2.0 * cirq .X (qubit1 ) +
432+ 1.5 * cirq .I (qubit0 ))
433+
434+ collector = batch_util .TFQPauliSumCollector (circuit ,
435+ observable ,
436+ samples_per_term = 5 )
437+
438+ self .assertAlmostEqual (collector .estimated_energy (), 1.5 )
439+
440+ job1 = collector .next_job ()
441+ res1 = cirq .ResultDict (params = cirq .ParamResolver ({}),
442+ measurements = {
443+ 'out' :
444+ np .array ([[0 ], [0 ], [1 ], [1 ], [1 ]],
445+ dtype = np .int8 )
446+ })
447+ collector .on_job_result (job1 , res1 )
448+ self .assertAlmostEqual (collector .estimated_energy (), 0.9 )
449+
450+ job2 = collector .next_job ()
451+ res2 = cirq .ResultDict (params = cirq .ParamResolver ({}),
452+ measurements = {
453+ 'out' :
454+ np .array ([[0 ], [0 ], [0 ], [0 ], [1 ]],
455+ dtype = np .int8 )
456+ })
457+ collector .on_job_result (job2 , res2 )
458+ self .assertAlmostEqual (collector .estimated_energy (), - 0.3 )
459+
333460
334461if __name__ == '__main__' :
335462 tf .test .main ()
0 commit comments