def test_controlled_x_gate_3(): # |10> controlled_x qubits = [qu.create_qubit() for _ in range(2)] qubits[0] = qu.xgate(qu.create_qubit()) qubits[0], qubits[1] = qu.controlled_xgate(qubits[0], qubits[1]) out = qu.contract_network(qubits).get_tensor() reference = np.array([[0+0j, 0+0j], [0+0j, 1+0j]]) np.testing.assert_allclose(out, reference)
def test_controlled_h_gate_4(): # |11> controlled_h qubits = [qu.create_qubit() for _ in range(2)] qubits[0] = qu.xgate(qu.create_qubit()) qubits[1] = qu.xgate(qu.create_qubit()) qubits[0], qubits[1] = qu.controlled_hgate(qubits[0], qubits[1]) out = qu.contract_network(qubits).get_tensor() reference = np.array([[0+0j, 0.70711+0j], [0+0j, -0.70711+0j]]) np.testing.assert_allclose(out, reference, atol=3.21881345e-06)
def test_multi_apply_gate(): # |00> controlled_x qubits = [qu.create_qubit() for _ in range(2)] qu.apply_gate(qubits, qu.controlled_xgate, 0, 1) out = qu.contract_network(qubits).get_tensor() reference = np.array([[1+0j, 0+0j], [0+0j, 0+0j]]) np.testing.assert_allclose(out, reference)
def test_take_multi_qubit_bitstring(): qubits = [qu.create_qubit() for _ in range(3)] qubits[0], qubits[1] = gates.controlled_xgate(gates.xgate(qubits[0]), qubits[1]) qubits[1], qubits[2] = gates.controlled_xgate(qubits[1], qubits[2]) contracted = qu.contract_network(qubits) out = qu.take_bitstring(contracted) assert out == "111"
def test_random_2(): # import pudb # pudb.set_trace() qubits = [qu.create_qubit() for _ in range(3)] qubits[2] = gates.ygate(qubits[2]) c, t = gates.controlled_ygate(qubits[2], qubits[0]) qubits[2], qubits[0] = c, t out = qu.contract_network(qubits) result = qu.eval_probability(out).ravel() ref = np.array( [0 + 0j, 0 + 0j, 0 + 0j, 0 + 0j, 0 + 0j, -1 + 0j, 0 + 0j, 0 + 0j]) np.testing.assert_allclose(result, ref)
def test_3_qubit_connections(): # |0> -X-.--- # | # |0> ---*-.- # | # |0> -----*- qubits = [qu.create_qubit() for _ in range(3)] qubits[0], qubits[1] = gates.controlled_xgate(gates.xgate(qubits[0]), qubits[1]) qubits[1], qubits[2] = gates.controlled_xgate(qubits[1], qubits[2]) reference = [[[0 + 0j, 0 + 0j], [0 + 0j, 0 + 0j]], [[0 + 0j, 0 + 0j], [0 + 0j, 1 + 0j]]] out = qu.contract_network(qubits).get_tensor() np.testing.assert_allclose(out, reference)
def test_random_circuits(): # import pudb # pudb.set_trace() simulator = cirq.Simulator() for _ in range(1): ref = "" cirq_circuit = cirq.Circuit() num_qubits = random.randint(1, 6) num_gates = random.randint(0, 6) ref += "random circuit with " + str(num_qubits) + \ " qubits and " + str(num_gates) + " gates" # qubits for each library quantn_qubits = [qu.create_qubit() for _ in range(num_qubits)] cirq_qubits = [cirq.GridQubit(0, j) for j in range(num_qubits)] # assemble random operations for i in range(num_gates): op = random.randint(0, len(ops) - 1) q_0 = random.randint(0, num_qubits - 1) # single qubit operation if ops[op][1] == 1: ref += "\nattaching gate: " + ops[op][0] + " to qubit " + str( q_0) target = ops[op][3](quantn_qubits[q_0]) quantn_qubits[q_0] = target cirq_circuit.append(ops[op][2](cirq_qubits[q_0])) # two qubit operation else: q_1 = None while q_1 == None or q_0 == q_1: q_1 = random.randint(0, num_qubits - 1) ref += "\nattaching gate: " + ops[op][0] + " to qubits " + str( q_0) + str(q_1) control, target = ops[op][3](quantn_qubits[q_0], quantn_qubits[q_1]) quantn_qubits[q_0] = control quantn_qubits[q_1] = target cirq_circuit.append(ops[op][2](cirq_qubits[q_0], cirq_qubits[q_1])) # assemble cirq circuit cirq_result = simulator.simulate(cirq_circuit, qubit_order=cirq_qubits) # execute quantn circuit quantn_circuit = qu.contract_network(quantn_qubits) quantn_result = qu.eval_probability(quantn_circuit) # compare if not np.allclose(quantn_result, cirq_result.final_state): with fullprint(): print(ref, "\nmine:\n", quantn_result, "ref:\n", cirq_result.final_state) np.testing.assert_allclose(quantn_result, cirq_result.final_state)
def test_take_single_qubit_bitstring(): qubits = [gates.xgate(qu.create_qubit())] contracted = qu.contract_network(qubits) out = qu.take_bitstring(contracted) assert out == '1'
def test_bitstring_rejects_uncontracted(): qubits = [gates.xgate(qu.create_qubit())] with pytest.raises(ValueError): out = qu.take_bitstring(qubits[0].node1)
def test_bitstring_rejects_edges(): qubits = [qu.create_qubit()] with pytest.raises(ValueError): out = qu.take_bitstring(qubits)
def test_eval_probability_rejects_edges(): q_0 = qu.create_qubit() with pytest.raises(ValueError): state = qu.eval_probability(q_0)
def test_qubit_init(): q_0_edge = qu.create_qubit() assert q_0_edge.node1.shape[0] == 2
def test_eval_probability_returns_probability_amplitude(): q_0 = qu.create_qubit() reference = np.array([1, 0]) state = qu.eval_probability(q_0.node1) np.testing.assert_allclose(state, reference)
def test_single_apply_gate(): qubits = [qu.create_qubit()] qu.apply_gate(qubits, qu.xgate, 0) edge = qu.contract_network(qubits) reference = np.array([0+0j, 1+0j]) np.testing.assert_allclose(edge.get_tensor(), reference)
def test_pauli_xgate_1(): qubits = [qu.xgate(qu.create_qubit())] edge = qu.contract_network(qubits) reference = np.array([0+0j, 1+0j]) np.testing.assert_allclose(edge.get_tensor(), reference)
def test_tgate_2(): qubits = [qu.tgate(qu.xgate(qu.create_qubit()))] target = qu.contract_network(qubits).get_tensor() reference = np.array([0, exp((1j * pi) / 4)]) np.testing.assert_allclose(target, reference)
def test_tgate_1(): qubits = [qu.tgate(qu.create_qubit())] target = qu.contract_network(qubits).get_tensor() reference = np.array([1, 0]) np.testing.assert_allclose(target, reference)
def test_hadamard_gate_2(): qubits = [qu.hgate(qu.xgate(qu.create_qubit()))] target = qu.contract_network(qubits).get_tensor() reference = np.array([1, -1])/sqrt(2) np.testing.assert_allclose(target, reference)
def test_pauli_zgate_2(): qubits = [qu.zgate(qu.xgate(qu.create_qubit()))] target = qu.contract_network(qubits).get_tensor() reference = np.array([0, -1]) np.testing.assert_allclose(target, reference)
def test_pauli_ygate_2(): qubits = [qu.ygate(qu.xgate(qu.create_qubit()))] target = qu.contract_network(qubits) reference = np.array([0-1j, 0+0j]) np.testing.assert_allclose(target.get_tensor(), reference)
def test_eval_probability_rejects_uncontracted(): q_0 = qu.create_qubit() gate = gates.xgate(q_0) with pytest.raises(ValueError): state = qu.eval_probability(q_0)
def test_pauli_xgate_2(): qubits = [qu.xgate(qu.xgate(qu.create_qubit()))] target = qu.contract_network(qubits) np.testing.assert_allclose(target.get_tensor(), np.array([1+0j, 0+0j]))