Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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"
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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'
Beispiel #9
0
def test_bitstring_rejects_uncontracted():
    qubits = [gates.xgate(qu.create_qubit())]
    with pytest.raises(ValueError):
        out = qu.take_bitstring(qubits[0].node1)
Beispiel #10
0
def test_bitstring_rejects_edges():
    qubits = [qu.create_qubit()]
    with pytest.raises(ValueError):
        out = qu.take_bitstring(qubits)
Beispiel #11
0
def test_eval_probability_rejects_edges():
  q_0 = qu.create_qubit()
  with pytest.raises(ValueError):
    state = qu.eval_probability(q_0)
Beispiel #12
0
def test_qubit_init():
  q_0_edge = qu.create_qubit()
  assert q_0_edge.node1.shape[0] == 2
Beispiel #13
0
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)
Beispiel #14
0
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)
Beispiel #15
0
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)
Beispiel #16
0
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)
Beispiel #17
0
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)
Beispiel #18
0
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)
Beispiel #19
0
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)
Beispiel #20
0
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)
Beispiel #21
0
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)
Beispiel #22
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]))