import os
import shutil
import tempfile
from typing import Optional, Union
import matplotlib # NOQA
from PIL import Image
from qulacs import QuantumCircuit
from qulacsvis.utils.latex import _LatexCompiler, _PDFtoImage
from ..qulacs.circuit import to_model
from .latex import LatexSourceGenerator
from .matplotlib import MPLCircuitlDrawer
from .text import TextCircuitDrawer
[docs]def circuit_drawer(
circuit: QuantumCircuit,
output_method: Optional[str] = None,
*,
verbose: bool = False,
filename: Optional[str] = None,
dot: str = "large",
ppi: int = 150,
dpi: int = 72,
scale: float = 0.6,
) -> Union[str, Image.Image, matplotlib.figure.Figure]:
"""
Draws a circuit diagram of a circuit.
Parameters
----------
circuit : qulacs.QuantumCircuit
The quantum circuit to be drawn.
output_method : Optional[str], optional
Set the output method for the drawn circuit.
If None, the output method is set to 'text'.
verbose : bool optional default=False
(output_method='text')
If True, a number will be added to the gate.
Gates are numbered in the order in which they are added to the circuit.
filename : Optional[str] optional default=None
(output_method='mpl' or 'latex')
File name to save the drawing image
dot: str optional default='large'
(output_method='text')
Dot style to mean control qubit(default="large")
ppi : int optional default=150
(output_method='latex')
The pixels per inch of the output image.
dpi : int optional default=72
(output_method='mpl')
The dots per inch of the output image.
scale : float optional default=0.6
(output_method='mpl')
The scale of the output image.
Returns
-------
Union[str, Image.Image, None]
The output of the circuit drawer.
If output_method is 'text', the output is a None. Circuit is output to stdout.
If output_method is 'latex', the output is an Image.Image object.
If output_method is 'latex_source', the output is a string.
If output_method is 'mpl', the output is a None.
Circuit is drawn to a matplotlib figure.
Raises
------
ValueError
If output_method is not 'text', 'latex', 'latex_source', or 'mpl'.
Examples
--------
>>> from qulacs import QuantumCircuit
>>> from qulacsvis.visualization import circuit_drawer
>>> circuit = QuantumCircuit(3)
>>> circuit.add_X_gate(0)
>>> circuit.add_Y_gate(1)
>>> circuit.add_Z_gate(2)
>>> circuit.add_dense_matrix_gate(
>>> [0, 1], [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]]
>>> )
>>> circuit.add_CNOT_gate(2, 0)
>>> circuit.add_X_gate(2)
>>> circuit_drawer(circuit, output_method='text')
___ ___ ___
| X | |DeM| |CX |
--| |---| |---| |----------
|___| | | |___|
___ | | |
| Y | | | |
--| |---| |-----|------------
|___| |___| |
___ | ___
| Z | | | X |
--| |-------------●-----| |--
|___| |___|
"""
if output_method is None:
output_method = "text"
if output_method == "text":
text_drawer = TextCircuitDrawer(circuit, dot=dot)
text_drawer.draw(verbose=verbose)
return None
elif output_method == "latex":
with tempfile.TemporaryDirectory() as tmpdir:
generator = LatexSourceGenerator(to_model(circuit))
latex_source = generator.generate()
latex = _LatexCompiler()
pdftoimage = _PDFtoImage()
latex.compile(latex_source, tmpdir, "circuit_drawer")
pdftoimage.convert(os.path.join(tmpdir, "circuit_drawer"), ppi=ppi)
if filename:
shutil.copyfile(os.path.join(tmpdir, "circuit_drawer.png"), filename)
image = Image.open(os.path.join(tmpdir, "circuit_drawer.png"))
return image
elif output_method == "latex_source":
generator = LatexSourceGenerator(to_model(circuit))
latex_source = generator.generate()
return latex_source
elif output_method == "mpl":
mpl_drawer = MPLCircuitlDrawer(to_model(circuit), dpi=dpi, scale=scale)
return mpl_drawer.draw(filename=filename)
else:
raise ValueError(
"Invalid output_method. Valid options are: 'text', 'latex', 'latex_source', 'mpl'."
)