Example #1
0
 def test_empty(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_depth() == 0
     circuit = Circuit(4)
     assert circuit.get_depth() == 0
     circuit = Circuit(4, [2, 3, 4, 5])
     assert circuit.get_depth() == 0
Example #2
0
 def test_inserting_gate(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_depth() == 0
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_depth() == 1
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_depth() == 2
     circuit.insert_gate(0, U3Gate(), [0])
     assert circuit.get_depth() == 3
Example #3
0
 def test_adding_gate(self) -> None:
     circuit = Circuit(1)
     assert circuit.get_depth() == 0
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_depth() == 1
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_depth() == 2
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_depth() == 3
Example #4
0
 def test_removing_gate1(self) -> None:
     circuit = Circuit(1)
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     circuit.append_gate(U3Gate(), [0])
     assert circuit.get_depth() == 3
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 2
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 1
     circuit.remove(U3Gate())
     assert circuit.get_depth() == 0
Example #5
0
    def test_correctness_3(self) -> None:
        circuit = Circuit(5)
        wide_gate = IdentityGate(3)
        circuit.append_gate(HGate(), [1])
        circuit.append_gate(CNOTGate(), [2, 3])
        circuit.append_gate(wide_gate, [1, 2, 3])
        circuit.append_gate(CNOTGate(), [1, 2])
        circuit.append_gate(HGate(), [3])
        circuit.append_gate(XGate(), [0])
        circuit.append_gate(XGate(), [0])
        circuit.append_gate(XGate(), [0])
        circuit.append_gate(XGate(), [4])
        circuit.append_gate(XGate(), [4])
        circuit.append_gate(XGate(), [4])
        utry = circuit.get_unitary()

        circuit.fold(circuit.get_region([(0, 2), (1, 1), (2, 1)]))
        assert circuit.get_num_operations() == 9
        assert circuit.get_depth() == 3
        assert circuit.count(HGate()) == 2
        assert circuit.count(XGate()) == 6
        assert isinstance(circuit[1, 1].gate, CircuitGate)
        test_gate: CircuitGate = circuit[1, 1].gate
        assert test_gate._circuit[0, 1].gate is CNOTGate()
        assert test_gate._circuit[0, 2].gate is CNOTGate()
        assert test_gate._circuit[1, 0].gate is wide_gate
        assert test_gate._circuit[1, 1].gate is wide_gate
        assert test_gate._circuit[1, 2].gate is wide_gate
        check_no_idle_cycles(circuit)
        assert np.allclose(utry.get_numpy(), circuit.get_unitary().get_numpy())
Example #6
0
    def run(self, circuit: Circuit, data: dict[str, Any]) -> None:
        """Perform the pass's operation, see BasePass for more info."""
        stats: dict[str, Any] = {}
        stats['cycles'] = circuit.get_num_cycles()
        stats['num_ops'] = circuit.get_num_operations()
        stats['cgraph'] = circuit.get_coupling_graph()
        stats['depth'] = circuit.get_depth()
        stats['gate_counts'] = {
            gate: circuit.count(gate)
            for gate in circuit.get_gate_set()
        }

        if self.key not in data:
            data[self.key] = []

        data[self.key].append(stats)
Example #7
0
    def run(self, circuit: Circuit, data: dict[str, Any]) -> None:
        """
        Perform the pass's operation, see BasePass for more info.

        Raises:
            ValueError: if a block file and the corresponding index in
                `structure.pickle` are differnt lengths.
        """
        # If the circuit is empty, just append blocks in order
        if circuit.get_depth() == 0:
            for block in self.block_list:
                # Get block
                block_num = int(findall(r'\d+', block)[0])
                with open(self.proj_dir + '/' + block) as f:
                    block_circ = OPENQASM2Language().decode(f.read())
                # Get location
                block_location = self.structure[block_num]
                if block_circ.get_size() != len(block_location):
                    raise ValueError(
                        f'{block} and `structure.pickle` locations are '
                        'different sizes.', )
                # Append to circuit
                circuit.append_circuit(block_circ, block_location)
Example #8
0
 def test_get_depth(self, simple_circuit: Circuit) -> None:
     assert simple_circuit.get_depth() == 4
Example #9
0
 def test_vs_cycles(self, r6_qudit_circuit: Circuit) -> None:
     assert (r6_qudit_circuit.get_depth() <=
             r6_qudit_circuit.get_num_cycles())
Example #10
0
 def test_value(self, r6_qudit_circuit: Circuit) -> None:
     assert r6_qudit_circuit.get_depth() >= 0
Example #11
0
 def test_type(self, r6_qudit_circuit: Circuit) -> None:
     assert isinstance(r6_qudit_circuit.get_depth(), int)
Example #12
0
 def test_get_depth(self, toffoli_circuit: Circuit) -> None:
     assert toffoli_circuit.get_depth() == 11
Example #13
0
 def test_get_depth(self, swap_circuit: Circuit) -> None:
     assert swap_circuit.get_depth() == 3
Example #14
0
    def test_correctness_1(self) -> None:
        circuit = Circuit(4)
        wide_gate = IdentityGate(4)
        circuit.append_gate(wide_gate, [0, 1, 2, 3])
        circuit.append_gate(wide_gate, [0, 1, 2, 3])
        circuit.append_gate(wide_gate, [0, 1, 2, 3])
        circuit.append_gate(wide_gate, [0, 1, 2, 3])
        assert circuit.get_num_operations() == 4
        assert circuit.get_depth() == 4
        utry = circuit.get_unitary()

        circuit.fold(circuit.get_region([(0, 0), (1, 0)]))
        assert circuit.get_num_operations() == 3
        assert circuit.get_depth() == 3
        check_no_idle_cycles(circuit)
        for q in range(4):
            assert isinstance(circuit[0, q].gate, CircuitGate)
        for c in range(1, 3, 1):
            for q in range(4):
                assert isinstance(circuit[c, q].gate, IdentityGate)
                assert isinstance(circuit[c, q].gate, IdentityGate)
        test_gate: CircuitGate = circuit[0, 0].gate  # type: ignore
        assert test_gate._circuit.get_num_operations() == 2
        assert test_gate._circuit.get_num_cycles() == 2
        for q in range(4):
            assert isinstance(test_gate._circuit[0, q].gate, IdentityGate)
            assert isinstance(test_gate._circuit[1, q].gate, IdentityGate)

        circuit.fold(circuit.get_region([(1, 0), (2, 0)]))
        assert circuit.get_num_operations() == 2
        assert circuit.get_depth() == 2
        check_no_idle_cycles(circuit)
        for c in range(2):
            for q in range(4):
                assert isinstance(circuit[c, q].gate, CircuitGate)
        test_gate: CircuitGate = circuit[0, 0].gate  # type: ignore
        assert test_gate._circuit.get_num_operations() == 2
        assert test_gate._circuit.get_num_cycles() == 2
        for q in range(4):
            assert isinstance(test_gate._circuit[0, q].gate, IdentityGate)
            assert isinstance(test_gate._circuit[1, q].gate, IdentityGate)
        test_gate: CircuitGate = circuit[1, 0].gate  # type: ignore
        assert test_gate._circuit.get_num_operations() == 2
        assert test_gate._circuit.get_num_cycles() == 2
        for q in range(4):
            assert isinstance(test_gate._circuit[0, q].gate, IdentityGate)
            assert isinstance(test_gate._circuit[1, q].gate, IdentityGate)

        circuit.fold(circuit.get_region([(0, 0), (1, 0)]))
        assert circuit.get_num_operations() == 1
        assert circuit.get_depth() == 1
        check_no_idle_cycles(circuit)
        for q in range(4):
            assert isinstance(circuit[0, q].gate, CircuitGate)
        test_gate: CircuitGate = circuit[0, 0].gate  # type: ignore
        assert test_gate._circuit.get_num_operations() == 2
        assert test_gate._circuit.get_num_cycles() == 2
        for q in range(4):
            assert isinstance(test_gate._circuit[0, q].gate, CircuitGate)
            assert isinstance(test_gate._circuit[1, q].gate, CircuitGate)
        inner_gate1: CircuitGate = test_gate._circuit[0,
                                                      0].gate  # type: ignore
        inner_gate2: CircuitGate = test_gate._circuit[1,
                                                      0].gate  # type: ignore
        assert inner_gate1._circuit.get_num_operations() == 2
        assert inner_gate1._circuit.get_num_cycles() == 2
        for q in range(4):
            assert isinstance(inner_gate1._circuit[0, q].gate, IdentityGate)
            assert isinstance(inner_gate1._circuit[1, q].gate, IdentityGate)
            assert isinstance(inner_gate2._circuit[0, q].gate, IdentityGate)
            assert isinstance(inner_gate2._circuit[1, q].gate, IdentityGate)

        check_no_idle_cycles(circuit)
        assert np.allclose(utry.get_numpy(), circuit.get_unitary().get_numpy())