def test_evolve(self, num_qubits): """Test evolve method.""" for _ in range(self.samples): cliff1 = random_clifford(num_qubits, seed=self.rng) cliff2 = random_clifford(num_qubits, seed=self.rng) stab1 = StabilizerState(cliff1) stab2 = StabilizerState(cliff2) target = StabilizerState(cliff1.compose(cliff2)) state = stab1.evolve(stab2) self.assertEqual(state, target)
def test_expand(self): """Test expand method.""" for _ in range(self.samples): cliff1 = random_clifford(2, seed=self.rng) cliff2 = random_clifford(3, seed=self.rng) stab1 = StabilizerState(cliff1) stab2 = StabilizerState(cliff2) target = StabilizerState(cliff1.expand(cliff2)) state = stab1.expand(stab2) self.assertEqual(state, target)
def test_evolve_subsystem(self, num_qubits_1, num_qubits_2): """Test subsystem evolve method.""" for _ in range(self.samples): cliff1 = random_clifford(num_qubits_1, seed=self.rng) cliff2 = random_clifford(num_qubits_2, seed=self.rng) stab1 = StabilizerState(cliff1) stab2 = StabilizerState(cliff2) qargs = sorted( np.random.choice(range(num_qubits_1), num_qubits_2, replace=False)) target = StabilizerState(cliff1.compose(cliff2, qargs)) state = stab1.evolve(stab2, qargs) self.assertEqual(state, target)
def test_conjugate(self, num_qubits): """Test conjugate method.""" for _ in range(self.samples): cliff = random_clifford(num_qubits, seed=self.rng) target = StabilizerState(cliff.conjugate()) state = StabilizerState(cliff).conjugate() self.assertEqual(state, target)
def test_valid(self, num_qubits): """Test random_clifford {num_qubits}-qubits.""" value = random_clifford(num_qubits) with self.subTest(msg='Test type'): self.assertIsInstance(value, Clifford) with self.subTest(msg='Test num_qubits'): self.assertEqual(value.num_qubits, num_qubits)
def random(self, num_qubits, rand_seed=None): """Generate a random group element""" self._num_qubits = num_qubits if self._group_gates_type: return random_cnotdihedral(num_qubits, seed=rand_seed) else: return random_clifford(num_qubits, seed=rand_seed)
def test_to_operator(self, num_qubits): """Test to_operator method for returning projector.""" for _ in range(self.samples): stab = StabilizerState(random_clifford(num_qubits, seed=self.rng)) target = Operator(stab) op = StabilizerState(stab).to_operator() self.assertEqual(op, target)
def random(self, num_qubits, rand_seed=None): """Generate a random group element""" self._num_qubits = num_qubits if self._group_gates_type: assert num_qubits <= 2, "num_qubits for CNOT-Dihedral RB should be 1 or 2" return random_cnotdihedral(num_qubits, seed=rand_seed) else: return random_clifford(num_qubits, seed=rand_seed)
def test_valid(self, num_qubits): """Test random_clifford {num_qubits}-qubits.""" seed = 213 value = random_clifford(num_qubits, seed=seed) with self.subTest(msg="Test type"): self.assertIsInstance(value, Clifford) with self.subTest(msg="Test num_qubits"): self.assertEqual(value.num_qubits, num_qubits)
def test_evolve_clifford_qargs(self): """Test evolve method for random Clifford""" cliff = random_clifford(3, seed=10) op = Operator(cliff) pauli = random_pauli(5, seed=10) qargs = [3, 0, 1] value = Operator(pauli.evolve(cliff, qargs=qargs)) target = Operator(pauli).compose(op.adjoint(), qargs=qargs).dot(op, qargs=qargs) self.assertEqual(value, target)
def test_expval_random(self, num_qubits): """Test expectation_value method of random Cliffords""" for _ in range(self.samples): cliff = random_clifford(num_qubits, seed=self.rng) op = random_pauli(num_qubits, seed=self.rng) qc = cliff.to_circuit() stab = StabilizerState(cliff) exp_val = stab.expectation_value(op) target = Statevector(qc).expectation_value(op) self.assertAlmostEqual(exp_val, target)
def test_expval_random_subsystem(self, num_qubits): """Test expectation_value method of random Cliffords and a subsystem""" for _ in range(self.samples): cliff = random_clifford(num_qubits, seed=self.rng) op = random_pauli(2, seed=self.rng) qargs = np.random.choice(num_qubits, size=2, replace=False) qc = cliff.to_circuit() stab = StabilizerState(cliff) exp_val = stab.expectation_value(op, qargs) target = Statevector(qc).expectation_value(op, qargs) self.assertAlmostEqual(exp_val, target)
def test_probs_random_subsystem(self, num_qubits): """Test probabilities and probabilities_dict methods of random cliffords for a subsystem of qubits""" for _ in range(self.samples): for subsystem_size in range(1, num_qubits): cliff = random_clifford(num_qubits, seed=self.rng) qargs = np.random.choice(num_qubits, size=subsystem_size, replace=False) qc = cliff.to_circuit() stab = StabilizerState(cliff) probs = stab.probabilities(qargs) probs_dict = stab.probabilities_dict(qargs) target = Statevector(qc).probabilities(qargs) target_dict = Statevector(qc).probabilities_dict(qargs) self.assertTrue(np.allclose(probs, target)) self.assertDictAlmostEqual(probs_dict, target_dict)
def test_fixed_seed(self): """Test fixing seed fixes output""" seed = 1532 value1 = random_clifford(4, seed=seed) value2 = random_clifford(4, seed=seed) self.assertEqual(value1, value2)
def test_init_clifford(self, num_qubits): """Test initialization from Clifford.""" stab1 = StabilizerState(random_clifford(num_qubits, seed=self.rng)) stab2 = StabilizerState(stab1) self.assertEqual(stab1, stab2)
def test_random_clifford_valid(self, seed, num_qubits): """Test random_clifford.""" value = random_clifford(num_qubits, seed=seed) self.assertValidClifford(value, num_qubits=num_qubits)
def test_init_instruction(self, num_qubits): """Test initialization from a Clifford instruction.""" cliff = random_clifford(num_qubits, seed=self.rng) stab1 = StabilizerState(cliff.to_instruction()) stab2 = StabilizerState(cliff) self.assertEqual(stab1, stab2)
def test_purity(self, num_qubits): """Test purity methods""" stab = StabilizerState(random_clifford(num_qubits, seed=self.rng)) purity = stab.purity() self.assertEqual(purity, 1.0)
def test_trace(self, num_qubits): """Test trace methods""" stab = StabilizerState(random_clifford(num_qubits, seed=self.rng)) trace = stab.trace() self.assertEqual(trace, 1.0)