Source code for pyquil.quantum_processor.graph

from typing import Any, Tuple

from pyquil.quantum_processor._base import AbstractQuantumProcessor
from pyquil.quantum_processor.transformers import graph_to_compiler_isa
from typing import List, Optional
from pyquil.external.rpcq import CompilerISA

import networkx as nx


[docs]class NxQuantumProcessor(AbstractQuantumProcessor): """ An AbstractQuantumProcessor initialized with a user constructed NetworkX graph topology. Notably, this class is able to serialize a ``CompilerISA`` based on the graph topology and the configured 1Q and 2Q gates. """ def __init__( self, topology: nx.Graph, gates_1q: Optional[List[str]] = None, gates_2q: Optional[List[str]] = None, ) -> None: """ Initialize a new NxQuantumProcessor. :param topology: The graph topology of the quantum_processor. :param gates_1q: A list of 1Q gate names supported by all qubits in the quantum_processor. :param gates_2q: A list of 2Q gate names supported all edges in the quantum_processor. """ self.topology = topology self.gates_1q = gates_1q self.gates_2q = gates_2q
[docs] def qubit_topology(self) -> nx.Graph: return self.topology
[docs] def to_compiler_isa(self) -> CompilerISA: """ Generate a ``CompilerISA`` object based on a NetworkX graph and the ``gates_1q`` and ``gates_2q`` with which the quantum_processor was initialized. May raise ``GraphGateError`` if the specified gates are not supported. """ return graph_to_compiler_isa(self.topology, gates_1q=self.gates_1q, gates_2q=self.gates_2q)
[docs] def qubits(self) -> List[int]: return sorted(self.topology.nodes)
[docs] def edges(self) -> List[Tuple[Any, ...]]: return sorted(tuple(sorted(pair)) for pair in self.topology.edges)