def __init__(self, basis='id,u0,u1,u2,u3,x,y,z,h,s,sdg,t,tdg,rx,ry,rz,' 'cx,cy,cz,ch,crz,cu1,cu3,swap,ccx,cswap', scale=1.0, style=None): self._ast = None self._basis = basis self._scale = DEFAULT_SCALE * scale self._creg = [] self._qreg = [] self._ops = [] self._qreg_dict = collections.OrderedDict() self._creg_dict = collections.OrderedDict() self._cond = { 'n_lines': 0, 'xmax': 0, 'ymax': 0, } self._style = _qcstyle.QCStyle() if style: if isinstance(style, dict): self._style.set_style(style) elif isinstance(style, str): with open(style, 'r') as infile: dic = json.load(infile) self._style.set_style(dic) self.figure = plt.figure() self.figure.patch.set_facecolor(color=self._style.bg) self.ax = self.figure.add_subplot(111) self.ax.axis('off') self.ax.set_aspect('equal') self.ax.tick_params(labelbottom=False, labeltop=False, labelleft=False, labelright=False)
def __init__(self, basis='id,u0,u1,u2,u3,x,y,z,h,s,sdg,t,tdg,rx,ry,rz,' 'cx,cy,cz,ch,crz,cu1,cu3,swap,ccx,cswap', scale=1.0, style=None, plot_barriers=True, reverse_bits=False): if not HAS_MATPLOTLIB: raise ImportError('The class MatplotlibDrawer needs matplotlib. ' 'Run "pip install matplotlib" before.') self._ast = None self._basis = basis self._scale = DEFAULT_SCALE * scale self._creg = [] self._qreg = [] self._ops = [] self._qreg_dict = collections.OrderedDict() self._creg_dict = collections.OrderedDict() self._cond = { 'n_lines': 0, 'xmax': 0, 'ymax': 0, } self._style = _qcstyle.QCStyle() self.plot_barriers = plot_barriers self.reverse_bits = reverse_bits if style: if isinstance(style, dict): self._style.set_style(style) elif isinstance(style, str): with open(style, 'r') as infile: dic = json.load(infile) self._style.set_style(dic) self.figure = plt.figure() self.figure.patch.set_facecolor(color=self._style.bg) self.ax = self.figure.add_subplot(111) self.ax.axis('off') self.ax.set_aspect('equal') self.ax.tick_params(labelbottom=False, labeltop=False, labelleft=False, labelright=False)
def __init__(self, circuit, scale, style=None, plot_barriers=True, reverse_bits=False): """ Args: circuit (dict): compiled_circuit from qobj scale (float): image scaling style (dict or str): dictionary of style or file name of style file reverse_bits (bool): When set to True reverse the bit order inside registers for the output visualization. plot_barriers (bool): Enable/disable drawing barriers in the output circuit. Defaults to True. """ # style sheet self._style = _qcstyle.QCStyle() if style: if isinstance(style, dict): self._style.set_style(style) elif isinstance(style, str): with open(style, 'r') as infile: dic = json.load(infile) self._style.set_style(dic) # compiled qobj circuit self.circuit = circuit # image scaling self.scale = scale # Map of qregs to sizes self.qregs = {} # Map of cregs to sizes self.cregs = {} # List of qregs and cregs in order of appearance in code and image self.ordered_regs = [] # Map from registers to the list they appear in the image self.img_regs = {} # Array to hold the \\LaTeX commands to generate a circuit image. self._latex = [] # Variable to hold image depth (width) self.img_depth = 0 # Variable to hold image width (height) self.img_width = 0 # Variable to hold total circuit depth self.sum_column_widths = 0 # Variable to hold total circuit width self.sum_row_heights = 0 # em points of separation between circuit columns self.column_separation = 0.5 # em points of separation between circuit row self.row_separation = 0.0 # presence of "box" or "target" determines row spacing self.has_box = False self.has_target = False self.reverse_bits = reverse_bits self.plot_barriers = plot_barriers ################################# self.header = self.circuit['header'] self.qregs = collections.OrderedDict( _get_register_specs(self.header['qubit_labels'])) self.qubit_list = [] for qr in self.qregs: for i in range(self.qregs[qr]): self.qubit_list.append((qr, i)) self.cregs = collections.OrderedDict() if 'clbit_labels' in self.header: for item in self.header['clbit_labels']: self.cregs[item[0]] = item[1] self.clbit_list = [] cregs = self.cregs if self.reverse_bits: self.orig_cregs = self.cregs cregs = reversed(self.cregs) for cr in cregs: for i in range(self.cregs[cr]): self.clbit_list.append((cr, i)) self.ordered_regs = [(item[0], item[1]) for item in self.header['qubit_labels']] if self.reverse_bits: reg_size = [] reg_labels = [] new_ordered_regs = [] for regs in self.ordered_regs: if regs[0] in reg_labels: continue reg_labels.append(regs[0]) reg_size.append( len([x for x in self.ordered_regs if x[0] == regs[0]])) index = 0 for size in reg_size: new_index = index + size for i in range(new_index - 1, index - 1, -1): new_ordered_regs.append(self.ordered_regs[i]) index = new_index self.ordered_regs = new_ordered_regs if 'clbit_labels' in self.header: for clabel in self.header['clbit_labels']: if self.reverse_bits: for cind in reversed(range(clabel[1])): self.ordered_regs.append((clabel[0], cind)) else: for cind in range(clabel[1]): self.ordered_regs.append((clabel[0], cind)) self.img_regs = {bit: ind for ind, bit in enumerate(self.ordered_regs)} self.img_width = len(self.img_regs) self.wire_type = {} for key, value in self.ordered_regs: self.wire_type[(key, value)] = key in self.cregs.keys()
def __init__(self, qregs, cregs, ops, scale, style=None, plot_barriers=True, reverse_bits=False): """ Args: qregs (list): A list of tuples for the quantum registers cregs (list): A list of tuples for the classical registers ops (list): A list of dicts where each entry is a operation from the circuit. scale (float): image scaling style (dict or str): dictionary of style or file name of style file reverse_bits (bool): When set to True reverse the bit order inside registers for the output visualization. plot_barriers (bool): Enable/disable drawing barriers in the output circuit. Defaults to True. """ # style sheet self._style = _qcstyle.QCStyle() if style: if isinstance(style, dict): self._style.set_style(style) elif isinstance(style, str): with open(style, 'r') as infile: dic = json.load(infile) self._style.set_style(dic) # compiled qobj circuit self.ops = ops # image scaling self.scale = scale # Map of qregs to sizes self.qregs = {} # Map of cregs to sizes self.cregs = {} # List of qregs and cregs in order of appearance in code and image self.ordered_regs = [] # Map from registers to the list they appear in the image self.img_regs = {} # Array to hold the \\LaTeX commands to generate a circuit image. self._latex = [] # Variable to hold image depth (width) self.img_depth = 0 # Variable to hold image width (height) self.img_width = 0 # Variable to hold total circuit depth self.sum_column_widths = 0 # Variable to hold total circuit width self.sum_row_heights = 0 # em points of separation between circuit columns self.column_separation = 0.5 # em points of separation between circuit row self.row_separation = 0.0 # presence of "box" or "target" determines row spacing self.has_box = False self.has_target = False self.reverse_bits = reverse_bits self.plot_barriers = plot_barriers ################################# self.qregs = collections.OrderedDict(_get_register_specs(qregs)) self.qubit_list = qregs self.ordered_regs = qregs + cregs self.cregs = collections.OrderedDict(_get_register_specs(cregs)) self.clbit_list = cregs self.img_regs = {bit: ind for ind, bit in enumerate(self.ordered_regs)} self.img_width = len(self.img_regs) self.wire_type = {} for key, value in self.ordered_regs: self.wire_type[(key, value)] = key in self.cregs.keys()