qiskit/visualization/latex.py
def _build_latex_array(self, aliases=None):
        """Returns an array of strings containing \\LaTeX for this circuit.

        If aliases is not None, aliases contains a dict mapping
        the current qubits in the circuit to new qubit names.
        We will deduce the register names and sizes from aliases.
        """
        columns = 1

        # Rename qregs if necessary
        if aliases:
            qregdata = {}
            for q in aliases.values():
                if q[0] not in qregdata:
                    qregdata[q[0]] = q[1] + 1
                elif qregdata[q[0]] < q[1] + 1:
                    qregdata[q[0]] = q[1] + 1
        else:
            qregdata = self.qregs

        for column, layer in enumerate(self.ops, 1):
            for op in layer:
                if op.condition:
                    mask = self._get_mask(op.condition[0])
                    cl_reg = self.clbit_list[self._ffs(mask)]
                    if_reg = cl_reg[0]
                    pos_2 = self.img_regs[cl_reg]
                    if_value = format(op.condition[1],
                                      'b').zfill(self.cregs[if_reg])[::-1]
                if op.name not in ['measure', 'barrier', 'snapshot', 'load',
                                   'save', 'noise']:
                    nm = op.name
                    qarglist = op.qargs
                    if aliases is not None:
                        qarglist = map(lambda x: aliases[x], qarglist)
                    if len(qarglist) == 1:
                        pos_1 = self.img_regs[(qarglist[0][0],
                                               qarglist[0][1])]

                        if op.condition:
                            mask = self._get_mask(op.condition[0])
                            cl_reg = self.clbit_list[self._ffs(mask)]
                            if_reg = cl_reg[0]
                            pos_2 = self.img_regs[cl_reg]

                            if nm == "x":
                                self._latex[pos_1][column] = "\\gate{X}"
                            elif nm == "y":
                                self._latex[pos_1][column] = "\\gate{Y}"
                            elif nm == "z":
                                self._latex[pos_1][column] = "\\gate{Z}"
                            elif nm == "h":
                                self._latex[pos_1][column] = "\\gate{H}"
                            elif nm == "s":
                                self._latex[pos_1][column] = "\\gate{S}"
                            elif nm == "sdg":
                                self._latex[pos_1][column] = "\\gate{S^\\dag}"
                            elif nm == "t":
                                self._latex[pos_1][column] = "\\gate{T}"
                            elif nm == "tdg":
                                self._latex[pos_1][column] = "\\gate{T^\\dag}"
                            elif nm == "u0":
                                self._latex[pos_1][column] = "\\gate{U_0(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u1":
                                self._latex[pos_1][column] = "\\gate{U_1(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u2":
                                self._latex[pos_1][column] = \
                                    "\\gate{U_2\\left(%s,%s\\right)}" % (
                                        op.op.params[0], op.op.params[1])
                            elif nm == "u3":
                                self._latex[pos_1][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            elif nm == "rx":
                                self._latex[pos_1][column] = "\\gate{R_x(%s)}" % (
                                    op.op.params[0])
                            elif nm == "ry":
                                self._latex[pos_1][column] = "\\gate{R_y(%s)}" % (
                                    op.op.params[0])
                            elif nm == "rz":
                                self._latex[pos_1][column] = "\\gate{R_z(%s)}" % (
                                    op.op.params[0])
                            else:
                                self._latex[pos_1][columns] = "\\gate{%s}" % nm

                            gap = pos_2 - pos_1
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_2 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_2 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                        else:
                            if nm == "x":
                                self._latex[pos_1][column] = "\\gate{X}"
                            elif nm == "y":
                                self._latex[pos_1][column] = "\\gate{Y}"
                            elif nm == "z":
                                self._latex[pos_1][column] = "\\gate{Z}"
                            elif nm == "h":
                                self._latex[pos_1][column] = "\\gate{H}"
                            elif nm == "s":
                                self._latex[pos_1][column] = "\\gate{S}"
                            elif nm == "sdg":
                                self._latex[pos_1][column] = "\\gate{S^\\dag}"
                            elif nm == "t":
                                self._latex[pos_1][column] = "\\gate{T}"
                            elif nm == "tdg":
                                self._latex[pos_1][column] = "\\gate{T^\\dag}"
                            elif nm == "u0":
                                self._latex[pos_1][column] = "\\gate{U_0(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u1":
                                self._latex[pos_1][column] = "\\gate{U_1(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u2":
                                self._latex[pos_1][column] = \
                                    "\\gate{U_2\\left(%s,%s\\right)}" % (
                                        op.op.params[0], op.op.params[1])
                            elif nm == "u3":
                                self._latex[pos_1][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            elif nm == "rx":
                                self._latex[pos_1][column] = "\\gate{R_x(%s)}" % (
                                    op.op.params[0])
                            elif nm == "ry":
                                self._latex[pos_1][column] = "\\gate{R_y(%s)}" % (
                                    op.op.params[0])
                            elif nm == "rz":
                                self._latex[pos_1][column] = "\\gate{R_z(%s)}" % (
                                    op.op.params[0])
                            elif nm == "reset":
                                self._latex[pos_1][column] = (
                                    "\\push{\\rule{.6em}{0em}\\ket{0}\\"
                                    "rule{.2em}{0em}} \\qw")
                            else:
                                self._latex[pos_1][columns] = "\\gate{%s}" % nm

                    elif len(qarglist) == 2:
                        pos_1 = self.img_regs[(qarglist[0][0], qarglist[0][1])]
                        pos_2 = self.img_regs[(qarglist[1][0], qarglist[1][1])]

                        if op.condition:
                            pos_3 = self.img_regs[(if_reg, 0)]
                            temp = [pos_1, pos_2, pos_3]
                            temp.sort(key=int)
                            bottom = temp[1]

                            gap = pos_3 - bottom
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_3 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_3 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                            if nm == "cx":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\targ"
                            elif nm == "cz":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\control\\qw"
                            elif nm == "cy":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{Y}"
                            elif nm == "ch":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{H}"
                            elif nm == "swap":
                                self._latex[pos_1][column] = "\\qswap"
                                self._latex[pos_2][column] = \
                                    "\\qswap \\qwx[" + str(pos_1 - pos_2) + "]"
                            elif nm == "crz":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{R_z(%s)}" % (op.op.params[0])
                            elif nm == "cu1":
                                self._latex[pos_1][column - 1] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column - 1] = "\\control\\qw"
                                self._latex[min(pos_1, pos_2)][column] = \
                                    "\\dstick{%s}\\qw" % (op.op.params[0])
                                self._latex[max(pos_1, pos_2)][column] = "\\qw"
                            elif nm == "cu3":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{U_3(%s,%s,%s)}" % (op.op.params[0],
                                                               op.op.params[1],
                                                               op.op.params[2])
                        else:
                            temp = [pos_1, pos_2]
                            temp.sort(key=int)

                            if nm == "cx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\targ"
                            elif nm == "cz":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\control\\qw"
                            elif nm == "cy":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{Y}"
                            elif nm == "ch":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{H}"
                            elif nm == "swap":
                                self._latex[pos_1][column] = "\\qswap"
                                self._latex[pos_2][column] = \
                                    "\\qswap \\qwx[" + str(pos_1 - pos_2) + "]"
                            elif nm == "crz":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{R_z(%s)}" % (op.op.params[0])
                            elif nm == "cu1":
                                self._latex[pos_1][column - 1] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column - 1] = "\\control\\qw"
                                self._latex[min(pos_1, pos_2)][column] = \
                                    "\\dstick{%s}\\qw" % (op.op.params[0])
                                self._latex[max(pos_1, pos_2)][column] = "\\qw"
                            elif nm == "cu3":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            else:
                                start_pos = min([pos_1, pos_2])
                                stop_pos = max([pos_1, pos_2])
                                if stop_pos - start_pos >= 2:
                                    delta = stop_pos - start_pos
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{%s}{%s}" % (delta, nm))
                                    for i_pos in range(start_pos + 1, stop_pos + 1):
                                        self._latex[i_pos][columns] = "\\ghost{%s}" % nm
                                else:
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{1}{%s}" % nm)
                                    self._latex[stop_pos][columns] = "\\ghost{%s}" % nm

                    elif len(qarglist) == 3:
                        pos_1 = self.img_regs[(qarglist[0][0], qarglist[0][1])]
                        pos_2 = self.img_regs[(qarglist[1][0], qarglist[1][1])]
                        pos_3 = self.img_regs[(qarglist[2][0], qarglist[2][1])]

                        if op.condition:
                            pos_4 = self.img_regs[(if_reg, 0)]

                            temp = [pos_1, pos_2, pos_3, pos_4]
                            temp.sort(key=int)
                            bottom = temp[2]

                            prev_column = [x[column - 1] for x in self._latex]
                            for item, prev_entry in enumerate(prev_column):
                                if 'barrier' in prev_entry:
                                    span = re.search('barrier{(.*)}', prev_entry)
                                    if span and any(i in temp for i in range(
                                            item, int(span.group(1)))):
                                        self._latex[item][column - 1] = \
                                            prev_entry.replace(
                                                '\\barrier{',
                                                '\\barrier[-0.65em]{')

                            gap = pos_4 - bottom
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_4 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_4 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                            if nm == "ccx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\ctrl{" + str(
                                    pos_3 - pos_2) + "}"
                                self._latex[pos_3][column] = "\\targ"

                            if nm == "cswap":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\qswap"
                                self._latex[pos_3][column] = \
                                    "\\qswap \\qwx[" + str(pos_2 - pos_3) + "]"
                        else:
                            temp = [pos_1, pos_2, pos_3]
                            temp.sort(key=int)

                            prev_column = [x[column - 1] for x in self._latex]
                            for item, prev_entry in enumerate(prev_column):
                                if 'barrier' in prev_entry:
                                    span = re.search('barrier{(.*)}', prev_entry)
                                    if span and any(i in temp for i in range(
                                            item, int(span.group(1)))):
                                        self._latex[item][column - 1] = \
                                            prev_entry.replace(
                                                '\\barrier{',
                                                '\\barrier[-0.65em]{')

                            if nm == "ccx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\ctrl{" + str(
                                    pos_3 - pos_2) + "}"
                                self._latex[pos_3][column] = "\\targ"

                            elif nm == "cswap":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\qswap"
                                self._latex[pos_3][column] = \
                                    "\\qswap \\qwx[" + str(pos_2 - pos_3) + "]"
                            else:
                                start_pos = min([pos_1, pos_2, pos_3])
                                stop_pos = max([pos_1, pos_2, pos_3])
                                if stop_pos - start_pos >= 3:
                                    delta = stop_pos - start_pos
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{%s}{%s}" % (delta, nm))
                                    for i_pos in range(start_pos + 1, stop_pos + 1):
                                        self._latex[i_pos][columns] = "\\ghost{%s}" % nm
                                else:
                                    self._latex[pos_1][columns] = (
                                        "\\multigate{2}{%s}" % nm)
                                    self._latex[pos_2][columns] = "\\ghost{%s}" % nm
                                    self._latex[pos_3][columns] = "\\ghost{%s}" % nm

                    elif len(qarglist) > 3:
                        nbits = len(qarglist)
                        pos_array = [self.img_regs[(qarglist[0][0],
                                                    qarglist[0][1])]]
                        for i in range(1, nbits):
                            pos_array.append(self.img_regs[(qarglist[i][0],
                                                            qarglist[i][1])])
                        pos_start = min(pos_array)
                        pos_stop = max(pos_array)
                        delta = pos_stop - pos_start
                        self._latex[pos_start][columns] = (
                            "\\multigate{%s}{%s}" % (nbits - 1, nm))
                        for pos in range(pos_start + 1, pos_stop + 1):
                            self._latex[pos][columns] = "\\ghost{%s}" % nm

                elif op.name == "measure":
                    if (len(op.cargs) != 1
                            or len(op.qargs) != 1
                            or op.op.params):
                        raise exceptions.VisualizationError("bad operation record")

                    if op.condition:
                        raise exceptions.VisualizationError(
                            "If controlled measures currently not supported.")

                    qname, qindex = op.qargs[0]
                    cname, cindex = op.cargs[0]
                    if aliases:
                        newq = aliases[(qname, qindex)]
                        qname = newq[0]
                        qindex = newq[1]

                    pos_1 = self.img_regs[(qname, qindex)]
                    pos_2 = self.img_regs[(cname, cindex)]

                    try:
                        self._latex[pos_1][column] = "\\meter"
                        prev_column = [x[column - 1] for x in self._latex]
                        for item, prev_entry in enumerate(prev_column):
                            if 'barrier' in prev_entry:
                                span = re.search('barrier{(.*)}', prev_entry)
                                if span and (
                                        item + int(span.group(1))) - pos_1 >= 0:
                                    self._latex[item][column - 1] = \
                                        prev_entry.replace(
                                            '\\barrier{',
                                            '\\barrier[-1.15em]{')

                        self._latex[pos_2][column] = \
                            "\\cw \\cwx[-" + str(pos_2 - pos_1) + "]"
                    except Exception as e:
                        raise exceptions.VisualizationError(
                            'Error during Latex building: %s' % str(e))

                elif op.name in ['barrier', 'snapshot', 'load', 'save',
                                 'noise']:
                    if self.plot_barriers:
                        qarglist = op.qargs
                        indexes = [self._get_qubit_index(x) for x in qarglist]
                        start_bit = self.qubit_list[min(indexes)]
                        if aliases is not None:
                            qarglist = map(lambda x: aliases[x], qarglist)
                        start = self.img_regs[start_bit]
                        span = len(op.qargs) - 1

                        self._latex[start][column] = "\\qw \\barrier{" + str(
                            span) + "}"
                else:
                    raise exceptions.VisualizationError("bad node data")
def _build_latex_array(self, aliases=None):
        """Returns an array of strings containing \\LaTeX for this circuit.

        If aliases is not None, aliases contains a dict mapping
        the current qubits in the circuit to new qubit names.
        We will deduce the register names and sizes from aliases.
        """
        columns = 1

        # Rename qregs if necessary
        if aliases:
            qregdata = {}
            for q in aliases.values():
                if q[0] not in qregdata:
                    qregdata[q[0]] = q[1] + 1
                elif qregdata[q[0]] < q[1] + 1:
                    qregdata[q[0]] = q[1] + 1
        else:
            qregdata = self.qregs

        for column, layer in enumerate(self.ops, 1):
            for op in layer:
                if op.condition:
                    mask = self._get_mask(op.condition[0])
                    cl_reg = self.clbit_list[self._ffs(mask)]
                    if_reg = cl_reg[0]
                    pos_2 = self.img_regs[cl_reg]
                    if_value = format(op.condition[1],
                                      'b').zfill(self.cregs[if_reg])[::-1]
                if op.name not in ['measure', 'barrier', 'snapshot', 'load',
                                   'save', 'noise']:
                    nm = op.name
                    qarglist = op.qargs
                    if aliases is not None:
                        qarglist = map(lambda x: aliases[x], qarglist)
                    if len(qarglist) == 1:
                        pos_1 = self.img_regs[(qarglist[0][0],
                                               qarglist[0][1])]

                        if op.condition:
                            mask = self._get_mask(op.condition[0])
                            cl_reg = self.clbit_list[self._ffs(mask)]
                            if_reg = cl_reg[0]
                            pos_2 = self.img_regs[cl_reg]

                            if nm == "x":
                                self._latex[pos_1][column] = "\\gate{X}"
                            elif nm == "y":
                                self._latex[pos_1][column] = "\\gate{Y}"
                            elif nm == "z":
                                self._latex[pos_1][column] = "\\gate{Z}"
                            elif nm == "h":
                                self._latex[pos_1][column] = "\\gate{H}"
                            elif nm == "s":
                                self._latex[pos_1][column] = "\\gate{S}"
                            elif nm == "sdg":
                                self._latex[pos_1][column] = "\\gate{S^\\dag}"
                            elif nm == "t":
                                self._latex[pos_1][column] = "\\gate{T}"
                            elif nm == "tdg":
                                self._latex[pos_1][column] = "\\gate{T^\\dag}"
                            elif nm == "u0":
                                self._latex[pos_1][column] = "\\gate{U_0(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u1":
                                self._latex[pos_1][column] = "\\gate{U_1(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u2":
                                self._latex[pos_1][column] = \
                                    "\\gate{U_2\\left(%s,%s\\right)}" % (
                                        op.op.params[0], op.op.params[1])
                            elif nm == "u3":
                                self._latex[pos_1][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            elif nm == "rx":
                                self._latex[pos_1][column] = "\\gate{R_x(%s)}" % (
                                    op.op.params[0])
                            elif nm == "ry":
                                self._latex[pos_1][column] = "\\gate{R_y(%s)}" % (
                                    op.op.params[0])
                            elif nm == "rz":
                                self._latex[pos_1][column] = "\\gate{R_z(%s)}" % (
                                    op.op.params[0])
                            else:
                                self._latex[pos_1][columns] = "\\gate{%s}" % nm

                            gap = pos_2 - pos_1
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_2 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_2 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                        else:
                            if nm == "x":
                                self._latex[pos_1][column] = "\\gate{X}"
                            elif nm == "y":
                                self._latex[pos_1][column] = "\\gate{Y}"
                            elif nm == "z":
                                self._latex[pos_1][column] = "\\gate{Z}"
                            elif nm == "h":
                                self._latex[pos_1][column] = "\\gate{H}"
                            elif nm == "s":
                                self._latex[pos_1][column] = "\\gate{S}"
                            elif nm == "sdg":
                                self._latex[pos_1][column] = "\\gate{S^\\dag}"
                            elif nm == "t":
                                self._latex[pos_1][column] = "\\gate{T}"
                            elif nm == "tdg":
                                self._latex[pos_1][column] = "\\gate{T^\\dag}"
                            elif nm == "u0":
                                self._latex[pos_1][column] = "\\gate{U_0(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u1":
                                self._latex[pos_1][column] = "\\gate{U_1(%s)}" % (
                                    op.op.params[0])
                            elif nm == "u2":
                                self._latex[pos_1][column] = \
                                    "\\gate{U_2\\left(%s,%s\\right)}" % (
                                        op.op.params[0], op.op.params[1])
                            elif nm == "u3":
                                self._latex[pos_1][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            elif nm == "rx":
                                self._latex[pos_1][column] = "\\gate{R_x(%s)}" % (
                                    op.op.params[0])
                            elif nm == "ry":
                                self._latex[pos_1][column] = "\\gate{R_y(%s)}" % (
                                    op.op.params[0])
                            elif nm == "rz":
                                self._latex[pos_1][column] = "\\gate{R_z(%s)}" % (
                                    op.op.params[0])
                            elif nm == "reset":
                                self._latex[pos_1][column] = (
                                    "\\push{\\rule{.6em}{0em}\\ket{0}\\"
                                    "rule{.2em}{0em}} \\qw")
                            else:
                                self._latex[pos_1][columns] = "\\gate{%s}" % nm

                    elif len(qarglist) == 2:
                        pos_1 = self.img_regs[(qarglist[0][0], qarglist[0][1])]
                        pos_2 = self.img_regs[(qarglist[1][0], qarglist[1][1])]

                        if op.condition:
                            pos_3 = self.img_regs[(if_reg, 0)]
                            temp = [pos_1, pos_2, pos_3]
                            temp.sort(key=int)
                            bottom = temp[1]

                            gap = pos_3 - bottom
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_3 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_3 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                            if nm == "cx":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\targ"
                            elif nm == "cz":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\control\\qw"
                            elif nm == "cy":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{Y}"
                            elif nm == "ch":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{H}"
                            elif nm == "swap":
                                self._latex[pos_1][column] = "\\qswap"
                                self._latex[pos_2][column] = \
                                    "\\qswap \\qwx[" + str(pos_1 - pos_2) + "]"
                            elif nm == "crz":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{R_z(%s)}" % (op.op.params[0])
                            elif nm == "cu1":
                                self._latex[pos_1][column - 1] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column - 1] = "\\control\\qw"
                                self._latex[min(pos_1, pos_2)][column] = \
                                    "\\dstick{%s}\\qw" % (op.op.params[0])
                                self._latex[max(pos_1, pos_2)][column] = "\\qw"
                            elif nm == "cu3":
                                self._latex[pos_1][column] = \
                                    "\\ctrl{" + str(pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{U_3(%s,%s,%s)}" % (op.op.params[0],
                                                               op.op.params[1],
                                                               op.op.params[2])
                        else:
                            temp = [pos_1, pos_2]
                            temp.sort(key=int)

                            if nm == "cx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\targ"
                            elif nm == "cz":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\control\\qw"
                            elif nm == "cy":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{Y}"
                            elif nm == "ch":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\gate{H}"
                            elif nm == "swap":
                                self._latex[pos_1][column] = "\\qswap"
                                self._latex[pos_2][column] = \
                                    "\\qswap \\qwx[" + str(pos_1 - pos_2) + "]"
                            elif nm == "crz":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = \
                                    "\\gate{R_z(%s)}" % (op.op.params[0])
                            elif nm == "cu1":
                                self._latex[pos_1][column - 1] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column - 1] = "\\control\\qw"
                                self._latex[min(pos_1, pos_2)][column] = \
                                    "\\dstick{%s}\\qw" % (op.op.params[0])
                                self._latex[max(pos_1, pos_2)][column] = "\\qw"
                            elif nm == "cu3":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = ("\\gate{U_3(%s,%s,%s)}" % (
                                    op.op.params[0],
                                    op.op.params[1],
                                    op.op.params[2]))
                            else:
                                start_pos = min([pos_1, pos_2])
                                stop_pos = max([pos_1, pos_2])
                                if stop_pos - start_pos >= 2:
                                    delta = stop_pos - start_pos
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{%s}{%s}" % (delta, nm))
                                    for i_pos in range(start_pos + 1, stop_pos + 1):
                                        self._latex[i_pos][columns] = "\\ghost{%s}" % nm
                                else:
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{1}{%s}" % nm)
                                    self._latex[stop_pos][columns] = "\\ghost{%s}" % nm

                    elif len(qarglist) == 3:
                        pos_1 = self.img_regs[(qarglist[0][0], qarglist[0][1])]
                        pos_2 = self.img_regs[(qarglist[1][0], qarglist[1][1])]
                        pos_3 = self.img_regs[(qarglist[2][0], qarglist[2][1])]

                        if op.condition:
                            pos_4 = self.img_regs[(if_reg, 0)]

                            temp = [pos_1, pos_2, pos_3, pos_4]
                            temp.sort(key=int)
                            bottom = temp[2]

                            prev_column = [x[column - 1] for x in self._latex]
                            for item, prev_entry in enumerate(prev_column):
                                if 'barrier' in prev_entry:
                                    span = re.search('barrier{(.*)}', prev_entry)
                                    if span and any(i in temp for i in range(
                                            item, int(span.group(1)))):
                                        self._latex[item][column - 1] = \
                                            prev_entry.replace(
                                                '\\barrier{',
                                                '\\barrier[-0.65em]{')

                            gap = pos_4 - bottom
                            for i in range(self.cregs[if_reg]):
                                if if_value[i] == '1':
                                    self._latex[pos_4 + i][column] = \
                                        "\\control \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1
                                else:
                                    self._latex[pos_4 + i][column] = \
                                        "\\controlo \\cw \\cwx[-" + str(gap) + "]"
                                    gap = 1

                            if nm == "ccx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\ctrl{" + str(
                                    pos_3 - pos_2) + "}"
                                self._latex[pos_3][column] = "\\targ"

                            if nm == "cswap":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\qswap"
                                self._latex[pos_3][column] = \
                                    "\\qswap \\qwx[" + str(pos_2 - pos_3) + "]"
                        else:
                            temp = [pos_1, pos_2, pos_3]
                            temp.sort(key=int)

                            prev_column = [x[column - 1] for x in self._latex]
                            for item, prev_entry in enumerate(prev_column):
                                if 'barrier' in prev_entry:
                                    span = re.search('barrier{(.*)}', prev_entry)
                                    if span and any(i in temp for i in range(
                                            item, int(span.group(1)))):
                                        self._latex[item][column - 1] = \
                                            prev_entry.replace(
                                                '\\barrier{',
                                                '\\barrier[-0.65em]{')

                            if nm == "ccx":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\ctrl{" + str(
                                    pos_3 - pos_2) + "}"
                                self._latex[pos_3][column] = "\\targ"

                            elif nm == "cswap":
                                self._latex[pos_1][column] = "\\ctrl{" + str(
                                    pos_2 - pos_1) + "}"
                                self._latex[pos_2][column] = "\\qswap"
                                self._latex[pos_3][column] = \
                                    "\\qswap \\qwx[" + str(pos_2 - pos_3) + "]"
                            else:
                                start_pos = min([pos_1, pos_2, pos_3])
                                stop_pos = max([pos_1, pos_2, pos_3])
                                if stop_pos - start_pos >= 3:
                                    delta = stop_pos - start_pos
                                    self._latex[start_pos][columns] = (
                                        "\\multigate{%s}{%s}" % (delta, nm))
                                    for i_pos in range(start_pos + 1, stop_pos + 1):
                                        self._latex[i_pos][columns] = "\\ghost{%s}" % nm
                                else:
                                    self._latex[pos_1][columns] = (
                                        "\\multigate{2}{%s}" % nm)
                                    self._latex[pos_2][columns] = "\\ghost{%s}" % nm
                                    self._latex[pos_3][columns] = "\\ghost{%s}" % nm

                    elif len(qarglist) > 3:
                        nbits = len(qarglist)
                        pos_array = [self.img_regs[(qarglist[0][0],
                                                    qarglist[0][1])]]
                        for i in range(1, nbits):
                            pos_array.append(self.img_regs[(qarglist[i][0],
                                                            qarglist[i][1])])
                        pos_start = min(pos_array)
                        pos_stop = max(pos_array)
                        delta = pos_stop - pos_start
                        self._latex[pos_start][columns] = (
                            "\\multigate{%s}{%s}" % (nbits - 1, nm))
                        for pos in range(pos_start + 1, pos_stop + 1):
                            self._latex[pos][columns] = "\\ghost{%s}" % nm

                elif op.name == "measure":
                    if (len(op.cargs) != 1
                            or len(op.qargs) != 1
                            or op.op.params):
                        raise exceptions.VisualizationError("bad operation record")

                    if op.condition:
                        raise exceptions.VisualizationError(
                            "If controlled measures currently not supported.")

                    qname, qindex = op.qargs[0]
                    cname, cindex = op.cargs[0]
                    if aliases:
                        newq = aliases[(qname, qindex)]
                        qname = newq[0]
                        qindex = newq[1]

                    pos_1 = self.img_regs[(qname, qindex)]
                    pos_2 = self.img_regs[(cname, cindex)]

                    try:
                        self._latex[pos_1][column] = "\\meter"
                        prev_column = [x[column - 1] for x in self._latex]
                        for item, prev_entry in enumerate(prev_column):
                            if 'barrier' in prev_entry:
                                span = re.search('barrier{(.*)}', prev_entry)
                                if span and (
                                        item + int(span.group(1))) - pos_1 >= 0:
                                    self._latex[item][column - 1] = \
                                        prev_entry.replace(
                                            '\\barrier{',
                                            '\\barrier[-1.15em]{')

                        self._latex[pos_2][column] = \
                            "\\cw \\cwx[-" + str(pos_2 - pos_1) + "]"
                    except Exception as e:
                        raise exceptions.VisualizationError(
                            'Error during Latex building: %s' % str(e))

                elif op.name in ['barrier', 'snapshot', 'load', 'save',
                                 'noise']:
                    if self.plot_barriers:
                        qarglist = op.qargs
                        indexes = [self._get_qubit_index(x) for x in qarglist]
                        start_bit = self.qubit_list[min(indexes)]
                        if aliases is not None:
                            qarglist = map(lambda x: aliases[x], qarglist)
                        start = self.img_regs[start_bit]
                        span = len(op.qargs) - 1

                        self._latex[start][column] = "\\qw \\barrier{" + str(
                            span) + "}"
                else:
                    raise exceptions.VisualizationError("bad node data")
def _build_latex_array ( self , aliases = None ) : columns = 1 # Rename qregs if necessary if aliases : qregdata = { } for q in aliases . values ( ) : if q [ 0 ] not in qregdata : qregdata [ q [ 0 ] ] = q [ 1 ] + 1 elif qregdata [ q [ 0 ] ] < q [ 1 ] + 1 : qregdata [ q [ 0 ] ] = q [ 1 ] + 1 else : qregdata = self . qregs for column , layer in enumerate ( self . ops , 1 ) : for op in layer : if op . condition : mask = self . _get_mask ( op . condition [ 0 ] ) cl_reg = self . clbit_list [ self . _ffs ( mask ) ] if_reg = cl_reg [ 0 ] pos_2 = self . img_regs [ cl_reg ] if_value = format ( op . condition [ 1 ] , 'b' ) . zfill ( self . cregs [ if_reg ] ) [ : : - 1 ] if op . name not in [ 'measure' , 'barrier' , 'snapshot' , 'load' , 'save' , 'noise' ] : nm = op . name qarglist = op . qargs if aliases is not None : qarglist = map ( lambda x : aliases [ x ] , qarglist ) if len ( qarglist ) == 1 : pos_1 = self . img_regs [ ( qarglist [ 0 ] [ 0 ] , qarglist [ 0 ] [ 1 ] ) ] if op . condition : mask = self . _get_mask ( op . condition [ 0 ] ) cl_reg = self . clbit_list [ self . _ffs ( mask ) ] if_reg = cl_reg [ 0 ] pos_2 = self . img_regs [ cl_reg ] if nm == "x" : self . _latex [ pos_1 ] [ column ] = "\\gate{X}" elif nm == "y" : self . _latex [ pos_1 ] [ column ] = "\\gate{Y}" elif nm == "z" : self . _latex [ pos_1 ] [ column ] = "\\gate{Z}" elif nm == "h" : self . _latex [ pos_1 ] [ column ] = "\\gate{H}" elif nm == "s" : self . _latex [ pos_1 ] [ column ] = "\\gate{S}" elif nm == "sdg" : self . _latex [ pos_1 ] [ column ] = "\\gate{S^\\dag}" elif nm == "t" : self . _latex [ pos_1 ] [ column ] = "\\gate{T}" elif nm == "tdg" : self . _latex [ pos_1 ] [ column ] = "\\gate{T^\\dag}" elif nm == "u0" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_0(%s)}" % ( op . op . params [ 0 ] ) elif nm == "u1" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_1(%s)}" % ( op . op . params [ 0 ] ) elif nm == "u2" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_2\\left(%s,%s\\right)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] ) elif nm == "u3" : self . _latex [ pos_1 ] [ column ] = ( "\\gate{U_3(%s,%s,%s)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] , op . op . params [ 2 ] ) ) elif nm == "rx" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_x(%s)}" % ( op . op . params [ 0 ] ) elif nm == "ry" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_y(%s)}" % ( op . op . params [ 0 ] ) elif nm == "rz" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_z(%s)}" % ( op . op . params [ 0 ] ) else : self . _latex [ pos_1 ] [ columns ] = "\\gate{%s}" % nm gap = pos_2 - pos_1 for i in range ( self . cregs [ if_reg ] ) : if if_value [ i ] == '1' : self . _latex [ pos_2 + i ] [ column ] = "\\control \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 else : self . _latex [ pos_2 + i ] [ column ] = "\\controlo \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 else : if nm == "x" : self . _latex [ pos_1 ] [ column ] = "\\gate{X}" elif nm == "y" : self . _latex [ pos_1 ] [ column ] = "\\gate{Y}" elif nm == "z" : self . _latex [ pos_1 ] [ column ] = "\\gate{Z}" elif nm == "h" : self . _latex [ pos_1 ] [ column ] = "\\gate{H}" elif nm == "s" : self . _latex [ pos_1 ] [ column ] = "\\gate{S}" elif nm == "sdg" : self . _latex [ pos_1 ] [ column ] = "\\gate{S^\\dag}" elif nm == "t" : self . _latex [ pos_1 ] [ column ] = "\\gate{T}" elif nm == "tdg" : self . _latex [ pos_1 ] [ column ] = "\\gate{T^\\dag}" elif nm == "u0" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_0(%s)}" % ( op . op . params [ 0 ] ) elif nm == "u1" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_1(%s)}" % ( op . op . params [ 0 ] ) elif nm == "u2" : self . _latex [ pos_1 ] [ column ] = "\\gate{U_2\\left(%s,%s\\right)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] ) elif nm == "u3" : self . _latex [ pos_1 ] [ column ] = ( "\\gate{U_3(%s,%s,%s)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] , op . op . params [ 2 ] ) ) elif nm == "rx" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_x(%s)}" % ( op . op . params [ 0 ] ) elif nm == "ry" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_y(%s)}" % ( op . op . params [ 0 ] ) elif nm == "rz" : self . _latex [ pos_1 ] [ column ] = "\\gate{R_z(%s)}" % ( op . op . params [ 0 ] ) elif nm == "reset" : self . _latex [ pos_1 ] [ column ] = ( "\\push{\\rule{.6em}{0em}\\ket{0}\\" "rule{.2em}{0em}} \\qw" ) else : self . _latex [ pos_1 ] [ columns ] = "\\gate{%s}" % nm elif len ( qarglist ) == 2 : pos_1 = self . img_regs [ ( qarglist [ 0 ] [ 0 ] , qarglist [ 0 ] [ 1 ] ) ] pos_2 = self . img_regs [ ( qarglist [ 1 ] [ 0 ] , qarglist [ 1 ] [ 1 ] ) ] if op . condition : pos_3 = self . img_regs [ ( if_reg , 0 ) ] temp = [ pos_1 , pos_2 , pos_3 ] temp . sort ( key = int ) bottom = temp [ 1 ] gap = pos_3 - bottom for i in range ( self . cregs [ if_reg ] ) : if if_value [ i ] == '1' : self . _latex [ pos_3 + i ] [ column ] = "\\control \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 else : self . _latex [ pos_3 + i ] [ column ] = "\\controlo \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 if nm == "cx" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\targ" elif nm == "cz" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\control\\qw" elif nm == "cy" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{Y}" elif nm == "ch" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{H}" elif nm == "swap" : self . _latex [ pos_1 ] [ column ] = "\\qswap" self . _latex [ pos_2 ] [ column ] = "\\qswap \\qwx[" + str ( pos_1 - pos_2 ) + "]" elif nm == "crz" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{R_z(%s)}" % ( op . op . params [ 0 ] ) elif nm == "cu1" : self . _latex [ pos_1 ] [ column - 1 ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column - 1 ] = "\\control\\qw" self . _latex [ min ( pos_1 , pos_2 ) ] [ column ] = "\\dstick{%s}\\qw" % ( op . op . params [ 0 ] ) self . _latex [ max ( pos_1 , pos_2 ) ] [ column ] = "\\qw" elif nm == "cu3" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{U_3(%s,%s,%s)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] , op . op . params [ 2 ] ) else : temp = [ pos_1 , pos_2 ] temp . sort ( key = int ) if nm == "cx" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\targ" elif nm == "cz" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\control\\qw" elif nm == "cy" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{Y}" elif nm == "ch" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{H}" elif nm == "swap" : self . _latex [ pos_1 ] [ column ] = "\\qswap" self . _latex [ pos_2 ] [ column ] = "\\qswap \\qwx[" + str ( pos_1 - pos_2 ) + "]" elif nm == "crz" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\gate{R_z(%s)}" % ( op . op . params [ 0 ] ) elif nm == "cu1" : self . _latex [ pos_1 ] [ column - 1 ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column - 1 ] = "\\control\\qw" self . _latex [ min ( pos_1 , pos_2 ) ] [ column ] = "\\dstick{%s}\\qw" % ( op . op . params [ 0 ] ) self . _latex [ max ( pos_1 , pos_2 ) ] [ column ] = "\\qw" elif nm == "cu3" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = ( "\\gate{U_3(%s,%s,%s)}" % ( op . op . params [ 0 ] , op . op . params [ 1 ] , op . op . params [ 2 ] ) ) else : start_pos = min ( [ pos_1 , pos_2 ] ) stop_pos = max ( [ pos_1 , pos_2 ] ) if stop_pos - start_pos >= 2 : delta = stop_pos - start_pos self . _latex [ start_pos ] [ columns ] = ( "\\multigate{%s}{%s}" % ( delta , nm ) ) for i_pos in range ( start_pos + 1 , stop_pos + 1 ) : self . _latex [ i_pos ] [ columns ] = "\\ghost{%s}" % nm else : self . _latex [ start_pos ] [ columns ] = ( "\\multigate{1}{%s}" % nm ) self . _latex [ stop_pos ] [ columns ] = "\\ghost{%s}" % nm elif len ( qarglist ) == 3 : pos_1 = self . img_regs [ ( qarglist [ 0 ] [ 0 ] , qarglist [ 0 ] [ 1 ] ) ] pos_2 = self . img_regs [ ( qarglist [ 1 ] [ 0 ] , qarglist [ 1 ] [ 1 ] ) ] pos_3 = self . img_regs [ ( qarglist [ 2 ] [ 0 ] , qarglist [ 2 ] [ 1 ] ) ] if op . condition : pos_4 = self . img_regs [ ( if_reg , 0 ) ] temp = [ pos_1 , pos_2 , pos_3 , pos_4 ] temp . sort ( key = int ) bottom = temp [ 2 ] prev_column = [ x [ column - 1 ] for x in self . _latex ] for item , prev_entry in enumerate ( prev_column ) : if 'barrier' in prev_entry : span = re . search ( 'barrier{(.*)}' , prev_entry ) if span and any ( i in temp for i in range ( item , int ( span . group ( 1 ) ) ) ) : self . _latex [ item ] [ column - 1 ] = prev_entry . replace ( '\\barrier{' , '\\barrier[-0.65em]{' ) gap = pos_4 - bottom for i in range ( self . cregs [ if_reg ] ) : if if_value [ i ] == '1' : self . _latex [ pos_4 + i ] [ column ] = "\\control \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 else : self . _latex [ pos_4 + i ] [ column ] = "\\controlo \\cw \\cwx[-" + str ( gap ) + "]" gap = 1 if nm == "ccx" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\ctrl{" + str ( pos_3 - pos_2 ) + "}" self . _latex [ pos_3 ] [ column ] = "\\targ" if nm == "cswap" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\qswap" self . _latex [ pos_3 ] [ column ] = "\\qswap \\qwx[" + str ( pos_2 - pos_3 ) + "]" else : temp = [ pos_1 , pos_2 , pos_3 ] temp . sort ( key = int ) prev_column = [ x [ column - 1 ] for x in self . _latex ] for item , prev_entry in enumerate ( prev_column ) : if 'barrier' in prev_entry : span = re . search ( 'barrier{(.*)}' , prev_entry ) if span and any ( i in temp for i in range ( item , int ( span . group ( 1 ) ) ) ) : self . _latex [ item ] [ column - 1 ] = prev_entry . replace ( '\\barrier{' , '\\barrier[-0.65em]{' ) if nm == "ccx" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\ctrl{" + str ( pos_3 - pos_2 ) + "}" self . _latex [ pos_3 ] [ column ] = "\\targ" elif nm == "cswap" : self . _latex [ pos_1 ] [ column ] = "\\ctrl{" + str ( pos_2 - pos_1 ) + "}" self . _latex [ pos_2 ] [ column ] = "\\qswap" self . _latex [ pos_3 ] [ column ] = "\\qswap \\qwx[" + str ( pos_2 - pos_3 ) + "]" else : start_pos = min ( [ pos_1 , pos_2 , pos_3 ] ) stop_pos = max ( [ pos_1 , pos_2 , pos_3 ] ) if stop_pos - start_pos >= 3 : delta = stop_pos - start_pos self . _latex [ start_pos ] [ columns ] = ( "\\multigate{%s}{%s}" % ( delta , nm ) ) for i_pos in range ( start_pos + 1 , stop_pos + 1 ) : self . _latex [ i_pos ] [ columns ] = "\\ghost{%s}" % nm else : self . _latex [ pos_1 ] [ columns ] = ( "\\multigate{2}{%s}" % nm ) self . _latex [ pos_2 ] [ columns ] = "\\ghost{%s}" % nm self . _latex [ pos_3 ] [ columns ] = "\\ghost{%s}" % nm elif len ( qarglist ) > 3 : nbits = len ( qarglist ) pos_array = [ self . img_regs [ ( qarglist [ 0 ] [ 0 ] , qarglist [ 0 ] [ 1 ] ) ] ] for i in range ( 1 , nbits ) : pos_array . append ( self . img_regs [ ( qarglist [ i ] [ 0 ] , qarglist [ i ] [ 1 ] ) ] ) pos_start = min ( pos_array ) pos_stop = max ( pos_array ) delta = pos_stop - pos_start self . _latex [ pos_start ] [ columns ] = ( "\\multigate{%s}{%s}" % ( nbits - 1 , nm ) ) for pos in range ( pos_start + 1 , pos_stop + 1 ) : self . _latex [ pos ] [ columns ] = "\\ghost{%s}" % nm elif op . name == "measure" : if ( len ( op . cargs ) != 1 or len ( op . qargs ) != 1 or op . op . params ) : raise exceptions . VisualizationError ( "bad operation record" ) if op . condition : raise exceptions . VisualizationError ( "If controlled measures currently not supported." ) qname , qindex = op . qargs [ 0 ] cname , cindex = op . cargs [ 0 ] if aliases : newq = aliases [ ( qname , qindex ) ] qname = newq [ 0 ] qindex = newq [ 1 ] pos_1 = self . img_regs [ ( qname , qindex ) ] pos_2 = self . img_regs [ ( cname , cindex ) ] try : self . _latex [ pos_1 ] [ column ] = "\\meter" prev_column = [ x [ column - 1 ] for x in self . _latex ] for item , prev_entry in enumerate ( prev_column ) : if 'barrier' in prev_entry : span = re . search ( 'barrier{(.*)}' , prev_entry ) if span and ( item + int ( span . group ( 1 ) ) ) - pos_1 >= 0 : self . _latex [ item ] [ column - 1 ] = prev_entry . replace ( '\\barrier{' , '\\barrier[-1.15em]{' ) self . _latex [ pos_2 ] [ column ] = "\\cw \\cwx[-" + str ( pos_2 - pos_1 ) + "]" except Exception as e : raise exceptions . VisualizationError ( 'Error during Latex building: %s' % str ( e ) ) elif op . name in [ 'barrier' , 'snapshot' , 'load' , 'save' , 'noise' ] : if self . plot_barriers : qarglist = op . qargs indexes = [ self . _get_qubit_index ( x ) for x in qarglist ] start_bit = self . qubit_list [ min ( indexes ) ] if aliases is not None : qarglist = map ( lambda x : aliases [ x ] , qarglist ) start = self . img_regs [ start_bit ] span = len ( op . qargs ) - 1 self . _latex [ start ] [ column ] = "\\qw \\barrier{" + str ( span ) + "}" else : raise exceptions . VisualizationError ( "bad node data" )
Returns an array of strings containing \\LaTeX for this circuit.

        If aliases is not None, aliases contains a dict mapping
        the current qubits in the circuit to new qubit names.
        We will deduce the register names and sizes from aliases.
Returns an array of strings containing \\ LaTeX for this circuit .