def test_opt_basis_two_qubit_2d(self): op = lib2.cnot() # Classical input basis -> classical output basis # Possible flip in control bit b = bases.general(2) b0 = b.subbasis([0]) b01 = b.subbasis([0, 1]) b_in = (b01, b0) op_c = op.compile(bases_in=b_in) assert op_c.bases_in[0] == b01 assert op_c.bases_in[1] == b0 assert op_c.bases_out[0] == b01 assert op_c.bases_out[1] == b01 # Classical control bit is not violated b = bases.general(2) b0 = b.subbasis([0]) b_in = (b0, b) op_c = op.compile(bases_in=b_in) assert op_c.bases_in[0] == b0 assert op_c.bases_in[1] == b assert op_c.bases_out[0] == b0 assert op_c.bases_out[1] == b # Classical target bit will become quantum for quantum control bit, # input should not be violated b = bases.general(2) b0 = b.subbasis([0]) b_in = (b, b0) op_c = op.compile(bases_in=b_in) assert op_c.bases_in[0] == b assert op_c.bases_in[1] == b0 assert op_c.bases_out[0] == b assert op_c.bases_out[1] == b
def test_compile_two_qubit_2d(self): b = bases.general(2) b0 = b.subbasis([0]) b01 = b.computational_subbasis() op = lib2.cnot() assert op.shape == (4, 4, 4, 4) op_full = op.compile(bases_in=(b, b)) assert op_full.shape == (4, 4, 4, 4) op_cl = op.compile(bases_in=(b01, b01)) assert op_cl.shape == (2, 2, 2, 2) op_cl = op.compile(bases_in=(b0, b)) assert op_cl.shape == (1, 4, 1, 4)
def test_chain_create(self): op1 = lib2.rotate_x() op2 = lib2.rotate_y() op3 = lib2.cnot() op_qutrit = lib3.rotate_x() circuit = Operation.from_sequence(op1.at(0), op2.at(0)) assert circuit.num_qubits == 1 assert len(circuit.operations) == 2 circuit = Operation.from_sequence(op1.at(1), op2.at(0)) assert circuit.num_qubits == 2 assert len(circuit.operations) == 2 with pytest.raises(ValueError, match=".* must form an ordered set .*"): Operation.from_sequence(op1.at(2), op2.at(0)) with pytest.raises(ValueError, match=".* must form an ordered set .*"): Operation.from_sequence(op1.at(1), op2.at(2)) with pytest.raises(ValueError, match="Hilbert dimensionality of op.*"): Operation.from_sequence(op1.at(0), op_qutrit.at(0)) circuit3q = Operation.from_sequence(op1.at(0), op2.at(1), op3.at(0, 1), op1.at(1), op2.at(0), op3.at(0, 2)) assert circuit3q.num_qubits == 3 assert len(circuit3q.operations) == 6 with pytest.raises(ValueError, match="Number of indices is not .*"): Operation.from_sequence(op1.at(0), op3.at(0)) with pytest.raises(ValueError, match="Number of indices is not .*"): circuit3q.at(0, 1) circuit4q = Operation.from_sequence(op3.at(0, 2), circuit3q.at(1, 2, 3)) assert len(circuit4q.operations) == 7 assert circuit4q.operations[0].indices == (0, 2) for o1, o2 in zip(circuit4q.operations[1:], circuit3q.operations): assert np.all(np.array(o1.indices) == np.array(o2.indices) + 1) circuit4q = Operation.from_sequence(circuit3q.at(2, 0, 3), op3.at(0, 1), op2.at(1)) assert len(circuit4q.operations) == 8 assert circuit4q.operations[0].indices == (2, ) assert circuit4q.operations[1].indices == (0, ) assert circuit4q.operations[2].indices == (2, 0) Operation.from_sequence(circuit3q.at(0, 1, 2), Operation.from_sequence(op1, op2).at(1))
def test_chain_create(self): op1 = lib2.rotate_x() op2 = lib2.rotate_y() op3 = lib2.cnot() op_qutrit = lib3.rotate_x() circuit = Operation.from_sequence(op1.at(0), op2.at(0)) assert circuit.num_qubits == 1 assert len(circuit.operations) == 2 circuit = Operation.from_sequence(op1.at(1), op2.at(0)) assert circuit.num_qubits == 2 assert len(circuit.operations) == 2 with pytest.raises(ValueError, match=".* must form an ordered set .*"): Operation.from_sequence(op1.at(2), op2.at(0)) with pytest.raises(ValueError, match=".* must form an ordered set .*"): Operation.from_sequence(op1.at(1), op2.at(2)) with pytest.raises(ValueError, match="Hilbert dimensionality of op.*"): Operation.from_sequence(op1.at(0), op_qutrit.at(0)) circuit3q = Operation.from_sequence(op1.at(0), op2.at(1), op3.at(0, 1), op1.at(1), op2.at(0), op3.at(0, 2)) assert circuit3q.num_qubits == 3 assert len(circuit3q.operations) == 6 with pytest.raises(ValueError, match="Number of indices is not .*"): Operation.from_sequence(op1.at(0), op3.at(0)) with pytest.raises(ValueError, match="Number of indices is not .*"): circuit3q.at(0, 1) circuit4q = Operation.from_sequence(op3.at(0, 2), circuit3q.at(1, 2, 3)) assert len(circuit4q.operations) == 7 assert circuit4q.operations[0].indices == (0, 2) for o1, o2 in zip(circuit4q.operations[1:], circuit3q.operations): assert np.all(np.array(o1.indices) == np.array(o2.indices) + 1) circuit4q = Operation.from_sequence( circuit3q.at(2, 0, 3), op3.at(0, 1), op2.at(1)) assert len(circuit4q.operations) == 8 assert circuit4q.operations[0].indices == (2,) assert circuit4q.operations[1].indices == (0,) assert circuit4q.operations[2].indices == (2, 0)
def test_cnot(self): cnot = lib.cnot() qubit_bases = (bases.general(2), bases.general(2), bases.general(2)) dm = np.diag([0.25, 0, 0.75, 0, 0, 0, 0, 0]) s = PauliVector.from_dm(dm, qubit_bases) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (1, 0)) cnot(s, 0, 1) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (1, 0)) cnot(s, 1, 2) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (0.25, 0.75))
def test_cnot(self): cnot = lib.cnot() qubit_bases = (bases.general(2), bases.general(2), bases.general(2)) dm = np.diag([0.25, 0, 0.75, 0, 0, 0, 0, 0]) s = State.from_dm(dm, qubit_bases) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (1, 0)) cnot(s, 0, 1) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (1, 0)) cnot(s, 1, 2) assert np.allclose(s.meas_prob(0), (1, 0)) assert np.allclose(s.meas_prob(1), (0.25, 0.75)) assert np.allclose(s.meas_prob(2), (0.25, 0.75))