Skip to content

Commit 8916d19

Browse files
authored
Add test cases for untested ops/batch_util.py functions (#1092)
This is a straightforward addition of a few unit test cases to increase test coverage. It adds three unit tests to `BatchUtilTest` in batch_util.py to cover `TFQPauliSumCollector.next_job`, `TFQPauliSumCollector.on_job_result`, and `TFQPauliSumCollector.estimated_energy`.
1 parent 38a2ac6 commit 8916d19

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

‎tensorflow_quantum/core/ops/batch_util_test.py‎

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

334461
if __name__ == '__main__':
335462
tf.test.main()

0 commit comments

Comments
 (0)