#!/usr/bin/env python3 # # PennyLane documentation build configuration file, created by # sphinx-quickstart on Tue Apr 17 11:43:51 2018. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import re import sys from docutils import nodes from datetime import datetime from sphinx.util import logging logger = logging.getLogger(__name__) # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath("..")) sys.path.insert(0, os.path.abspath("_ext")) sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(".")), "doc")) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = "8.1" # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named "sphinx.ext.*") or your custom # ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.autosummary", "sphinx.ext.todo", "sphinx.ext.coverage", "sphinx.ext.mathjax", "sphinx.ext.napoleon", "sphinx.ext.inheritance_diagram", "sphinx.ext.viewcode", "sphinxcontrib.bibtex", "sphinx.ext.graphviz", "sphinx.ext.intersphinx", "sphinx_automodapi.automodapi", "sphinx_copybutton", "sphinxext.opengraph", "m2r2", "sphinx_automodapi.smart_resolver", ] # Open Graph metadata ogp_social_cards = { "image": "_static/logo.png", "enable": True, "site_url": "https://docs.pennylane.ai/", "line_color": "#03b2ff", } ogp_image = "_static/opengraph.png" numpydoc_show_class_members = False # The base URL with a proper language and version. html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "/") # Tell Jinja2 templates the build is running on Read the Docs if os.environ.get("READTHEDOCS", "") == "True": html_context = {"READTHEDOCS": True} os.environ["SPHINX_BUILD"] = "1" autosummary_generate = True autosummary_imported_members = False automodapi_toctreedirnm = "code/api" automodapi_inheritance_diagram = False automodsumm_inherited_members = True # Hot fix for the error: 'You must configure the bibtex_bibfiles setting' bibtex_bibfiles = ["bibfile.bib"] copybutton_prompt_text = r">>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: " copybutton_prompt_is_regexp = True intersphinx_mapping = { "demo": ("https://pennylane.ai/qml", None), "catalyst": ("https://docs.pennylane.ai/projects/catalyst/en/stable", None), } mathjax_path = ( "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML" ) ignore_warnings = [("code/api/qml_transforms*", "no module named pennylane.transforms")] autodoc_mock_imports = ["torch"] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: source_suffix = ".rst" # The master toctree document. master_doc = "index" # General information about the project. project = "PennyLane" copyright = f"{datetime.now().year}, Xanadu Quantum Technologies" author = "Xanadu Inc." add_module_names = False # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. import pennylane pennylane.Hamiltonian = pennylane.ops.op_math.linear_combination.LinearCombination # The full version, including alpha/beta/rc tags. release = pennylane.__version__ # The short X.Y version. version = re.match(r"^(\d+\.\d+)", release).expand(r"\1") # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = "en" # today_fmt is used as the format for a strftime call. today_fmt = "%Y-%m-%d" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "releases/*.md"] # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. show_authors = True # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "nature" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = "_static/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. html_extra_path = ["robots.txt"] # If not "", a "Last updated on:" timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = "%b %d, %Y" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, must be a dictionary that maps document names # to template names. # html_sidebars = { # "**": [ # ] # } # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = "" # This is the file name suffix for HTML files (e.g., ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # "da", "de", "en", "es", "fi", "fr", "h", "it", "ja" # "nl", "no", "pt", "ro", "r", "sv", "tr" # html_search_language = "en" # A dictionary with options for the search language support, empty by default. # Now only "ja" uses this config value # html_search_options = {"type": "default"} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # html_search_scorer = "scorer.js" # Output file base name for HTML help builder. htmlhelp_basename = "PennyLanedoc" # -- Xanadu theme --------------------------------------------------------- html_theme = "pennylane" # Xanadu theme options (see theme.conf for more information). html_theme_options = { "extra_copyrights": [ "TensorFlow, the TensorFlow logo, and any related marks are trademarks " "of Google Inc." ], "google_analytics_tracking_id": "G-C480Z9JL0D", "search_on_pennylane_ai": True, } edit_on_github_project = "PennyLaneAI/pennylane" edit_on_github_branch = "master/doc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ("letterpaper" or "a4paper"). # # "papersize": "letterpaper", # The font size ("10pt", "11pt" or "12pt"). # # "pointsize": "10pt", # Additional stuff for the LaTeX preamble. # # "preamble": "", # Latex figure (float) alignment # # "figure_align": "htbp", } latex_additional_files = ["macros.tex"] # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, "PennyLane.tex", "PennyLane Documentation", "Xanadu Inc.", "manual"), ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "pennylane", "PennyLane Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "PennyLane", "PennyLane Documentation", author, "PennyLane", "Xanadu quantum machine learning library.", "Miscellaneous", ), ] # ============================================================ # the order in which autodoc lists the documented members autodoc_member_order = "bysource" # remove types from function signatures autodoc_typehints = "none" # inheritance_diagram graphviz attributes inheritance_node_attrs = dict(color="lightskyblue1", style="filled") # pylint: disable=unused-argument def add_noindex_to_estimator_stubs(app, docname, source): """Dynamically add :noindex: to estimator stubs during the build process.""" if not docname.startswith("code/api/"): return content = source[0] # Update the regex to match either ops or templates if not re.search(r"\bpennylane\.estimator\.(ops|templates)\b", content): return def _add_noindex_func(match): """Replacement function for re.sub to add :noindex: idempotently.""" directive_block = match.group(0) if ":noindex:" in directive_block: return directive_block return f"{match.group(1)}\n :noindex:{match.group(2)}" # TODO [sc-99226]: Replace with :no-index-entry: when support for sphinx >=8.2 is available. new_content, num_subs = re.subn( r"(^\s*\.\.\s+auto(?:class|function|method)::.*?)(\n\s*($|\S.*))", _add_noindex_func, content, flags=re.MULTILINE | re.DOTALL, ) if num_subs: source[0] = new_content logger.info(f"[add_noindex] Patched {docname} with :noindex: directive.") def add_links_to_estimator_table(app, doctree, fromdocname): """Replace literal names in automodsumm tables with links to stub HTML files.""" if "qml_estimator" not in fromdocname: return # Define the modules and their corresponding table indices modules = {3: "ops", 4: "templates"} for table_idx, module_name in modules.items(): table = doctree.traverse(nodes.table)[table_idx] for literal in table.traverse(nodes.literal): name = literal.astext() url = f"code/api/pennylane.estimator.{module_name}.{name}" refuri = app.builder.get_relative_uri(fromdocname, url) refnode = nodes.reference('', refuri=refuri) refnode += nodes.literal(text=name) literal.parent.replace(literal, refnode) logger.info( f"[add_noindex_links] Linked pennylane.estimator.{module_name}.{name} to {refuri}") def setup(app): """Sphinx entry point for this extension.""" app.connect('source-read', add_noindex_to_estimator_stubs) app.connect("doctree-resolved", add_links_to_estimator_table)