@@ -363,77 +363,93 @@ def test_aux_operators_list(self):
363
363
"""Test list-based aux_operators."""
364
364
vqe = VQE (Estimator (), self .ry_wavefunction , SLSQP (maxiter = 300 ))
365
365
366
- # Start with an empty list
367
- result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = [])
368
- self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
369
- self .assertIsNone (result .aux_operator_eigenvalues )
370
-
371
- # Go again with two auxiliary operators
372
- aux_op1 = PauliSumOp .from_list ([("II" , 2.0 )])
373
- aux_op2 = PauliSumOp .from_list ([("II" , 0.5 ), ("ZZ" , 0.5 ), ("YY" , 0.5 ), ("XX" , - 0.5 )])
374
- aux_ops = [aux_op1 , aux_op2 ]
375
- result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = aux_ops )
376
- self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
377
- self .assertEqual (len (result .aux_operator_eigenvalues ), 2 )
378
- # expectation values
379
- self .assertAlmostEqual (result .aux_operator_eigenvalues [0 ][0 ], 2 , places = 6 )
380
- self .assertAlmostEqual (result .aux_operator_eigenvalues [1 ][0 ], 0 , places = 6 )
381
- # standard deviations
382
- self .assertAlmostEqual (result .aux_operator_eigenvalues [0 ][1 ], 0.0 )
383
- self .assertAlmostEqual (result .aux_operator_eigenvalues [1 ][1 ], 0.0 )
384
-
385
- # Go again with additional zero operator
386
- # TODO waiting for eval_operators to be ported.
387
- # extra_ops = [*aux_ops, 0]
388
- # result = vqe.compute_minimum_eigenvalue(self.h2_op, aux_operators=extra_ops)
389
- # self.assertAlmostEqual(result.eigenvalue.real, self.h2_energy, places=6)
390
- # self.assertEqual(len(result.aux_operator_eigenvalues), 3)
391
- # # # expectation values
392
- # self.assertAlmostEqual(result.aux_operator_eigenvalues[0][0], 2, places=6)
393
- # self.assertAlmostEqual(result.aux_operator_eigenvalues[1][0], 0, places=6)
394
- # self.assertEqual(result.aux_operator_eigenvalues[2][0], 0.0)
395
- # # # standard deviations
396
- # self.assertAlmostEqual(result.aux_operator_eigenvalues[0][1], 0.0)
397
- # self.assertAlmostEqual(result.aux_operator_eigenvalues[1][1], 0.0)
398
- # self.assertAlmostEqual(result.aux_operator_eigenvalues[2][1], 0.0)
366
+ with self .subTest ("Test with an empty list." ):
367
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = [])
368
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
369
+ self .assertIsInstance (result .aux_operator_eigenvalues , list )
370
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 0 )
371
+
372
+ with self .subTest ("Test with two auxiliary operators." ):
373
+ aux_op1 = PauliSumOp .from_list ([("II" , 2.0 )])
374
+ aux_op2 = PauliSumOp .from_list ([("II" , 0.5 ), ("ZZ" , 0.5 ), ("YY" , 0.5 ), ("XX" , - 0.5 )])
375
+ aux_ops = [aux_op1 , aux_op2 ]
376
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = aux_ops )
377
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
378
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 2 )
379
+ # expectation values
380
+ self .assertAlmostEqual (result .aux_operator_eigenvalues [0 ][0 ], 2.0 , places = 6 )
381
+ self .assertAlmostEqual (result .aux_operator_eigenvalues [1 ][0 ], 0.0 , places = 6 )
382
+ # variances
383
+ self .assertEqual (result .aux_operator_eigenvalues [0 ][1 ][0 ], 0.0 )
384
+ self .assertEqual (result .aux_operator_eigenvalues [1 ][1 ][0 ], 0.0 )
385
+ # shots
386
+ self .assertEqual (result .aux_operator_eigenvalues [0 ][1 ][1 ], 0 )
387
+ self .assertEqual (result .aux_operator_eigenvalues [1 ][1 ][1 ], 0 )
388
+
389
+ with self .subTest ("Test with additional zero operator." ):
390
+ extra_ops = [* aux_ops , 0 ]
391
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = extra_ops )
392
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
393
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 3 )
394
+ # expectation values
395
+ self .assertAlmostEqual (result .aux_operator_eigenvalues [0 ][0 ], 2.0 , places = 6 )
396
+ self .assertAlmostEqual (result .aux_operator_eigenvalues [1 ][0 ], 0.0 , places = 6 )
397
+ self .assertAlmostEqual (result .aux_operator_eigenvalues [2 ][0 ], 0.0 )
398
+ # variances
399
+ self .assertEqual (result .aux_operator_eigenvalues [0 ][1 ][0 ], 0.0 )
400
+ self .assertEqual (result .aux_operator_eigenvalues [1 ][1 ][0 ], 0.0 )
401
+ self .assertEqual (result .aux_operator_eigenvalues [2 ][1 ][0 ], 0.0 )
402
+ # shots
403
+ self .assertEqual (result .aux_operator_eigenvalues [0 ][1 ][1 ], 0 )
404
+ self .assertEqual (result .aux_operator_eigenvalues [1 ][1 ][1 ], 0 )
405
+ self .assertEqual (result .aux_operator_eigenvalues [2 ][1 ][1 ], 0 )
399
406
400
407
def test_aux_operators_dict (self ):
401
408
"""Test dictionary compatibility of aux_operators"""
402
409
vqe = VQE (Estimator (), self .ry_wavefunction , SLSQP (maxiter = 300 ))
403
410
404
- # Start with an empty dictionary
405
- result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = {})
406
- self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
407
- self .assertIsNone (result .aux_operator_eigenvalues )
408
-
409
- # Go again with two auxiliary operators
410
- aux_op1 = PauliSumOp .from_list ([("II" , 2.0 )])
411
- aux_op2 = PauliSumOp .from_list ([("II" , 0.5 ), ("ZZ" , 0.5 ), ("YY" , 0.5 ), ("XX" , - 0.5 )])
412
- aux_ops = {"aux_op1" : aux_op1 , "aux_op2" : aux_op2 }
413
- result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = aux_ops )
414
- self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
415
- self .assertEqual (len (result .aux_operator_eigenvalues ), 2 )
416
- # expectation values
417
- self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op1" ][0 ], 2 , places = 5 )
418
- self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op2" ][0 ], 0 , places = 5 )
419
- # standard deviations
420
- self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op1" ][1 ], 0.0 )
421
- self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op2" ][1 ], 0.0 )
422
-
423
- # TODO waiting for eval_operators to be ported.
424
- # Go again with additional zero operator
425
- # extra_ops = {**aux_ops, "zero_operator": 0}
426
- # result = vqe.compute_minimum_eigenvalue(self.h2_op, aux_operators=extra_ops)
427
- # self.assertAlmostEqual(result.eigenvalue.real, self.h2_energy, places=6)
428
- # self.assertEqual(len(result.aux_operator_eigenvalues), 3)
429
- # # expectation values
430
- # self.assertAlmostEqual(result.aux_operator_eigenvalues["aux_op1"][0], 2, places=5)
431
- # self.assertAlmostEqual(result.aux_operator_eigenvalues["aux_op2"][0], 0, places=5)
432
- # self.assertEqual(result.aux_operator_eigenvalues["zero_operator"][0], 0.0)
433
- # # standard deviations
434
- # self.assertAlmostEqual(result.aux_operator_eigenvalues["aux_op1"][1], 0.0)
435
- # self.assertAlmostEqual(result.aux_operator_eigenvalues["aux_op2"][1], 0.0)
436
- # self.assertAlmostEqual(result.aux_operator_eigenvalues["zero_operator"][1], 0.0)
411
+ with self .subTest ("Test with an empty dictionary." ):
412
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = {})
413
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
414
+ # self.assertIsNone(result.aux_operator_eigenvalues)
415
+ self .assertIsInstance (result .aux_operator_eigenvalues , dict )
416
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 0 )
417
+
418
+ with self .subTest ("Test with two auxiliary operators." ):
419
+ aux_op1 = PauliSumOp .from_list ([("II" , 2.0 )])
420
+ aux_op2 = PauliSumOp .from_list ([("II" , 0.5 ), ("ZZ" , 0.5 ), ("YY" , 0.5 ), ("XX" , - 0.5 )])
421
+ aux_ops = {"aux_op1" : aux_op1 , "aux_op2" : aux_op2 }
422
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = aux_ops )
423
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
424
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 2 )
425
+
426
+ # expectation values
427
+ self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op1" ][0 ], 2 , places = 5 )
428
+ self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op2" ][0 ], 0 , places = 5 )
429
+ # variances
430
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op1" ][1 ][0 ], 0.0 )
431
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op2" ][1 ][0 ], 0.0 )
432
+ # shots
433
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op1" ][1 ][1 ], 0 )
434
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op2" ][1 ][1 ], 0 )
435
+
436
+ with self .subTest ("Test with additional zero operator." ):
437
+ extra_ops = {** aux_ops , "zero_operator" : 0 }
438
+ result = vqe .compute_minimum_eigenvalue (self .h2_op , aux_operators = extra_ops )
439
+ self .assertAlmostEqual (result .eigenvalue .real , self .h2_energy , places = 6 )
440
+ self .assertEqual (len (result .aux_operator_eigenvalues ), 3 )
441
+ # expectation values
442
+ self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op1" ][0 ], 2 , places = 5 )
443
+ self .assertAlmostEqual (result .aux_operator_eigenvalues ["aux_op2" ][0 ], 0 , places = 5 )
444
+ self .assertAlmostEqual (result .aux_operator_eigenvalues ["zero_operator" ][0 ], 0.0 )
445
+ # variances
446
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op1" ][1 ][0 ], 0.0 )
447
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op2" ][1 ][0 ], 0.0 )
448
+ self .assertEqual (result .aux_operator_eigenvalues ["zero_operator" ][1 ][0 ], 0.0 )
449
+ # shots
450
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op1" ][1 ][1 ], 0 )
451
+ self .assertEqual (result .aux_operator_eigenvalues ["aux_op2" ][1 ][1 ], 0 )
452
+ self .assertEqual (result .aux_operator_eigenvalues ["zero_operator" ][1 ][1 ], 0 )
437
453
438
454
439
455
if __name__ == "__main__" :
0 commit comments