| #!/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 | |
| # "<project> v<release> 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 <link> 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) | |