@@ -402,6 +402,81 @@ def test_measure_eigenstate(self):
402402 output = s .measure (qubit )
403403 self .assertEqual (output , expected )
404404
405+ def test_correlations (self ):
406+ tests = [ # stabilizers
407+ ["ZI" , "IZ" ],
408+ ["ZZ" , "XX" ],
409+ ["ZX" , "XZ" ],
410+ ["XXX" , "ZZI" , "IZZ" ],
411+ ["XIII" , "IXII" , "IIXI" , "IIIX" ],
412+ ["XZII" , "ZXZI" , "IZXZ" , "IIZX" ], # line graph
413+ ["XZIZ" , "ZXZI" , "IZXZ" , "ZIZX" ], # cycle graph
414+ ["XZZZ" , "ZXZZ" , "ZZXZ" , "ZZZX" ], # complete graph
415+ ["XZZZ" , "ZXII" , "ZIXI" , "ZIIX" ], # star graph
416+ ]
417+
418+ for stabilizers in tests :
419+ for stabilizer in stabilizers :
420+ for _ in range (10 ):
421+ with self .subTest (stabilizers = stabilizers , stabilizer = stabilizer ):
422+ s = StabilizerState (stabilizers )
423+ outcomes = []
424+ qubit = 0
425+ for pauli in stabilizer :
426+ if pauli == 'X' :
427+ s .apply_H (qubit )
428+ elif pauli == 'Y' :
429+ s .apply_K (qubit )
430+ elif pauli == 'Z' :
431+ pass
432+ else :
433+ qubit += 1
434+ continue
435+ outcomes .append (s .measure (qubit ))
436+ self .assertEqual (sum (outcomes ) % 2 , 0 )
437+
438+ def test_standard_form (self ):
439+ tests = [ # stabilizers
440+ ["ZI" , "IZ" ],
441+ ["ZZ" , "XX" ],
442+ ["ZX" , "XZ" ],
443+ ["XXX" , "ZZI" , "IZZ" ],
444+ ["XIII" , "IXII" , "IIXI" , "IIIX" ],
445+ ["XZII" , "ZXZI" , "IZXZ" , "IIZX" ], # line graph
446+ ["XZIZ" , "ZXZI" , "IZXZ" , "ZIZX" ], # cycle graph
447+ ["XZZZ" , "ZXZZ" , "ZZXZ" , "ZZZX" ], # complete graph
448+ ["XZZZ" , "ZXII" , "ZIXI" , "ZIIX" ], # star graph
449+ ]
450+
451+ for stabilizers in tests :
452+ with self .subTest (stabilizers = stabilizers ):
453+ state = StabilizerState (stabilizers )
454+ state .put_in_standard_form ()
455+ # Check that there are no X or Y in the first column except the first row
456+ for row in state ._group [1 :, :]:
457+ self .assertFalse (row [0 ])
458+
459+ def test_reduce_when_measuring (self ):
460+ tests = [ # stabilizers
461+ ["ZI" , "IZ" ],
462+ ["ZZ" , "XX" ],
463+ ["ZX" , "XZ" ],
464+ ["XXX" , "ZZI" , "IZZ" ],
465+ ["XIII" , "IXII" , "IIXI" , "IIIX" ],
466+ ["XZII" , "ZXZI" , "IZXZ" , "IIZX" ], # line graph
467+ ["XZIZ" , "ZXZI" , "IZXZ" , "ZIZX" ], # cycle graph
468+ ["XZZZ" , "ZXZZ" , "ZZXZ" , "ZZZX" ], # complete graph
469+ ["XZZZ" , "ZXII" , "ZIXI" , "ZIIX" ], # star graph
470+ ]
471+
472+ for stabilizers in tests :
473+ with self .subTest (stabilizers = stabilizers ):
474+ state = StabilizerState (stabilizers )
475+ n = len (state )
476+ for i in range (n ):
477+ state .measure (0 )
478+ self .assertEqual (len (state ), n - i - 1 )
479+
405480
406481if __name__ == "__main__" :
407482 unittest .main ()
0 commit comments