From 7da7f64c712cd2665d842060ec9b3a7525bf73b9 Mon Sep 17 00:00:00 2001 From: eliottrosenberg <61400172+eliottrosenberg@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:46:08 -0800 Subject: [PATCH 1/5] Add ParallelRandomizedBenchmarkingResult class (#6412) --- .../experiments/qubit_characterizations.py | 133 +++++++++++++++++- .../qubit_characterizations_test.py | 7 +- 2 files changed, 136 insertions(+), 4 deletions(-) diff --git a/cirq-core/cirq/experiments/qubit_characterizations.py b/cirq-core/cirq/experiments/qubit_characterizations.py index 65967154395..5d5a669ae8d 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations.py +++ b/cirq-core/cirq/experiments/qubit_characterizations.py @@ -32,10 +32,14 @@ from scipy.optimize import curve_fit from matplotlib import pyplot as plt +import cirq.vis.heatmap as cirq_heatmap +import cirq.vis.histogram as cirq_histogram # this is for older systems with matplotlib <3.2 otherwise 3d projections fail from mpl_toolkits import mplot3d from cirq import circuits, ops, protocols +from cirq.devices import grid_qubit + if TYPE_CHECKING: import cirq @@ -144,6 +148,127 @@ def _fit_exponential(self) -> Tuple[np.ndarray, np.ndarray]: ) +@dataclasses.dataclass(frozen=True) +class ParallelRandomizedBenchmarkingResult: + """Results from a parallel randomized benchmarking experiment.""" + + results_dictionary: Mapping['cirq.Qid', 'RandomizedBenchMarkResult'] + + def plot_single_qubit( + self, qubit: 'cirq.Qid', ax: Optional[plt.Axes] = None, **plot_kwargs: Any + ) -> plt.Axes: + """Plot the raw data for the specified qubit. + + Args: + qubit: Plot data for this qubit. + ax: the plt.Axes to plot on. If not given, a new figure is created, + plotted on, and shown. + **plot_kwargs: Arguments to be passed to 'plt.Axes.plot'. + Returns: + The plt.Axes containing the plot. + """ + + return self.results_dictionary[qubit].plot(ax, **plot_kwargs) + + def pauli_error(self) -> Mapping['cirq.Qid', float]: + """Return a dictionary of Pauli errors. + Returns: + A dictionary containing the Pauli errors for all qubits. + """ + + return { + qubit: self.results_dictionary[qubit].pauli_error() for qubit in self.results_dictionary + } + + def plot_heatmap( + self, + ax: Optional[plt.Axes] = None, + annotation_format: str = '0.1%', + title: str = 'Single-qubit Pauli error', + **plot_kwargs: Any, + ) -> plt.Axes: + """Plot a heatmap of the Pauli errors. If qubits are not cirq.GridQubits, throws an error. + + Args: + ax: the plt.Axes to plot on. If not given, a new figure is created, + plotted on, and shown. + annotation_format: The format string for the numbers in the heatmap. + title: The title printed above the heatmap. + **plot_kwargs: Arguments to be passed to 'cirq.Heatmap.plot()'. + Returns: + The plt.Axes containing the plot. + """ + + pauli_errors = self.pauli_error() + pauli_errors_with_grid_qubit_keys = {} + for qubit in pauli_errors: + assert type(qubit) == grid_qubit.GridQubit, "qubits must be cirq.GridQubits" + pauli_errors_with_grid_qubit_keys[qubit] = pauli_errors[qubit] # just for typecheck + + if ax is None: + _, ax = plt.subplots(dpi=200, facecolor='white') + + ax, _ = cirq_heatmap.Heatmap(pauli_errors_with_grid_qubit_keys).plot( + ax, annotation_format=annotation_format, title=title, **plot_kwargs + ) + return ax + + def plot_integrated_histogram( + self, + ax: Optional[plt.Axes] = None, + cdf_on_x: bool = False, + axis_label: str = 'Pauli error', + semilog: bool = True, + median_line: bool = True, + median_label: Optional[str] = 'median', + mean_line: bool = False, + mean_label: Optional[str] = 'mean', + show_zero: bool = False, + title: Optional[str] = None, + **kwargs, + ) -> plt.Axes: + """Plot the Pauli errors using cirq.integrated_histogram(). + + Args: + ax: The axis to plot on. If None, we generate one. + cdf_on_x: If True, flip the axes compared the above example. + axis_label: Label for x axis (y-axis if cdf_on_x is True). + semilog: If True, force the x-axis to be logarithmic. + median_line: If True, draw a vertical line on the median value. + median_label: If drawing median line, optional label for it. + mean_line: If True, draw a vertical line on the mean value. + mean_label: If drawing mean line, optional label for it. + title: Title of the plot. If None, we assign "N={len(data)}". + show_zero: If True, moves the step plot up by one unit by prepending 0 + to the data. + **kwargs: Kwargs to forward to `ax.step()`. Some examples are + color: Color of the line. + linestyle: Linestyle to use for the plot. + lw: linewidth for integrated histogram. + ms: marker size for a histogram trace. + label: An optional label which can be used in a legend. + Returns: + The axis that was plotted on. + """ + + ax = cirq_histogram.integrated_histogram( + data=self.pauli_error(), + ax=ax, + cdf_on_x=cdf_on_x, + axis_label=axis_label, + semilog=semilog, + median_line=median_line, + median_label=median_label, + mean_line=mean_line, + mean_label=mean_label, + show_zero=show_zero, + title=title, + **kwargs, + ) + ax.set_ylabel('Percentile') + return ax + + class TomographyResult: """Results from a state tomography experiment.""" @@ -265,7 +390,7 @@ def single_qubit_randomized_benchmarking( num_circuits=num_circuits, repetitions=repetitions, ) - return result[qubit] + return result.results_dictionary[qubit] def parallel_single_qubit_randomized_benchmarking( @@ -278,7 +403,7 @@ def parallel_single_qubit_randomized_benchmarking( ), num_circuits: int = 10, repetitions: int = 1000, -) -> Mapping['cirq.Qid', 'RandomizedBenchMarkResult']: +) -> 'ParallelRandomizedBenchmarkingResult': """Clifford-based randomized benchmarking (RB) single qubits in parallel. This is the same as `single_qubit_randomized_benchmarking` except on all @@ -321,7 +446,9 @@ def parallel_single_qubit_randomized_benchmarking( idx += 1 for qubit in qubits: gnd_probs[qubit].append(1.0 - np.mean(excited_probs[qubit])) - return {q: RandomizedBenchMarkResult(num_clifford_range, gnd_probs[q]) for q in qubits} + return ParallelRandomizedBenchmarkingResult( + {q: RandomizedBenchMarkResult(num_clifford_range, gnd_probs[q]) for q in qubits} + ) def two_qubit_randomized_benchmarking( diff --git a/cirq-core/cirq/experiments/qubit_characterizations_test.py b/cirq-core/cirq/experiments/qubit_characterizations_test.py index 36fc6a838d6..36d76606ade 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations_test.py +++ b/cirq-core/cirq/experiments/qubit_characterizations_test.py @@ -126,8 +126,13 @@ def test_parallel_single_qubit_randomized_benchmarking(): simulator, num_clifford_range=num_cfds, repetitions=100, qubits=qubits ) for qubit in qubits: - g_pops = np.asarray(results[qubit].data)[:, 1] + g_pops = np.asarray(results.results_dictionary[qubit].data)[:, 1] assert np.isclose(np.mean(g_pops), 1.0) + _ = results.plot_single_qubit(qubit) + pauli_errors = results.pauli_error() + assert len(pauli_errors) == len(qubits) + _ = results.plot_heatmap() + _ = results.plot_integrated_histogram() def test_two_qubit_randomized_benchmarking(): From a3eed6b97490556cf1dda82928a0aa9ea8798da1 Mon Sep 17 00:00:00 2001 From: Noureldin Date: Thu, 18 Jan 2024 23:54:22 +0000 Subject: [PATCH 2/5] convert SingleQubitCliffordGate to phasedXZ during serialization (#6419) --- .../cirq_google/serialization/circuit_serializer.py | 4 +++- .../serialization/circuit_serializer_test.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cirq-google/cirq_google/serialization/circuit_serializer.py b/cirq-google/cirq_google/serialization/circuit_serializer.py index 16fd0396755..ea4b52070a6 100644 --- a/cirq-google/cirq_google/serialization/circuit_serializer.py +++ b/cirq-google/cirq_google/serialization/circuit_serializer.py @@ -175,7 +175,9 @@ def _serialize_gate_op( out=msg.phasedxpowgate.exponent, arg_function_language=arg_function_language, ) - elif isinstance(gate, cirq.PhasedXZGate): + elif isinstance(gate, (cirq.PhasedXZGate, cirq.ops.SingleQubitCliffordGate)): + if isinstance(gate, cirq.ops.SingleQubitCliffordGate): + gate = gate.to_phased_xz_gate() arg_func_langs.float_arg_to_proto( gate.x_exponent, out=msg.phasedxzgate.x_exponent, diff --git a/cirq-google/cirq_google/serialization/circuit_serializer_test.py b/cirq-google/cirq_google/serialization/circuit_serializer_test.py index 107bf70004a..1e9a9e6d671 100644 --- a/cirq-google/cirq_google/serialization/circuit_serializer_test.py +++ b/cirq-google/cirq_google/serialization/circuit_serializer_test.py @@ -668,3 +668,16 @@ def test_measurement_gate_deserialize() -> None: msg = cg.CIRCUIT_SERIALIZER.serialize(circuit) assert cg.CIRCUIT_SERIALIZER.deserialize(msg) == circuit + + +def test_circuit_with_cliffords(): + q = cirq.NamedQubit('q') + circuit = cirq.Circuit( + g(q) for g in cirq.ops.SingleQubitCliffordGate.all_single_qubit_cliffords + ) + want = cirq.Circuit( + g.to_phased_xz_gate()(q) + for g in cirq.ops.SingleQubitCliffordGate.all_single_qubit_cliffords + ) + msg = cg.CIRCUIT_SERIALIZER.serialize(circuit) + assert cg.CIRCUIT_SERIALIZER.deserialize(msg) == want From 91c3f45a4b524785409f47eb26dd0596c442c4a1 Mon Sep 17 00:00:00 2001 From: Noureldin Date: Fri, 19 Jan 2024 17:33:37 +0000 Subject: [PATCH 3/5] convert cliffords to xz in qubit characterization (#6420) --- .../cirq/experiments/qubit_characterizations.py | 8 +++++--- .../cirq/experiments/qubit_characterizations_test.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cirq-core/cirq/experiments/qubit_characterizations.py b/cirq-core/cirq/experiments/qubit_characterizations.py index 5d5a669ae8d..985caee0c8c 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations.py +++ b/cirq-core/cirq/experiments/qubit_characterizations.py @@ -739,13 +739,15 @@ def _two_qubit_clifford_matrices( def _random_single_q_clifford( - qubit: 'cirq.Qid', num_cfds: int, cfds: Sequence[Sequence['cirq.Gate']] + qubit: 'cirq.Qid', num_cfds: int, cfds: Sequence[Sequence['cirq.ops.SingleQubitCliffordGate']] ) -> List['cirq.Operation']: clifford_group_size = 24 - operations = [[gate(qubit) for gate in gates] for gates in cfds] + operations = [[gate.to_phased_xz_gate()(qubit) for gate in gates] for gates in cfds] gate_ids = list(np.random.choice(clifford_group_size, num_cfds)) adjoint = _reduce_gate_seq([gate for gate_id in gate_ids for gate in cfds[gate_id]]) ** -1 - return [op for gate_id in gate_ids for op in operations[gate_id]] + [adjoint(qubit)] + return [op for gate_id in gate_ids for op in operations[gate_id]] + [ + adjoint.to_phased_xz_gate()(qubit) + ] def _random_two_q_clifford( diff --git a/cirq-core/cirq/experiments/qubit_characterizations_test.py b/cirq-core/cirq/experiments/qubit_characterizations_test.py index 36d76606ade..5ee9c46a6f7 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations_test.py +++ b/cirq-core/cirq/experiments/qubit_characterizations_test.py @@ -227,3 +227,15 @@ def test_tomography_plot_raises_for_incorrect_number_of_axes(): with pytest.raises(ValueError): _, axes = plt.subplots(1, 3) result.plot(axes) + + +def test_single_qubit_cliffords_gateset(): + qubit = GridQubit(0, 0) + clifford_group = cirq.experiments.qubit_characterizations._single_qubit_cliffords() + c = cirq.experiments.qubit_characterizations._create_parallel_rb_circuit( + (qubit,), 3, clifford_group.c1_in_xy + ) + device = cirq.testing.ValidatingTestDevice( + qubits=(qubit,), allowed_gates=(cirq.ops.PhasedXZGate, cirq.MeasurementGate) + ) + device.validate_circuit(c) From ba4c6aa51a0a51318d87c2d6cf84e82abdb23523 Mon Sep 17 00:00:00 2001 From: Noureldin Date: Fri, 19 Jan 2024 18:47:03 +0000 Subject: [PATCH 4/5] convert identity to phased xz in qubit characterization (#6421) --- cirq-core/cirq/experiments/qubit_characterizations.py | 4 +++- cirq-core/cirq/experiments/qubit_characterizations_test.py | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cirq-core/cirq/experiments/qubit_characterizations.py b/cirq-core/cirq/experiments/qubit_characterizations.py index 985caee0c8c..0eb5f6a4951 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations.py +++ b/cirq-core/cirq/experiments/qubit_characterizations.py @@ -693,7 +693,9 @@ def _create_parallel_rb_circuit( num_moments = max(len(sequence) for sequence in sequences_to_zip) for q, sequence in zip(qubits, sequences_to_zip): if (n := len(sequence)) < num_moments: - sequence.extend([ops.SingleQubitCliffordGate.I(q)] * (num_moments - n)) + sequence.extend( + [ops.SingleQubitCliffordGate.I.to_phased_xz_gate()(q)] * (num_moments - n) + ) moments = zip(*sequences_to_zip) return circuits.Circuit.from_moments(*moments, ops.measure_each(*qubits)) diff --git a/cirq-core/cirq/experiments/qubit_characterizations_test.py b/cirq-core/cirq/experiments/qubit_characterizations_test.py index 5ee9c46a6f7..f85b1bd3423 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations_test.py +++ b/cirq-core/cirq/experiments/qubit_characterizations_test.py @@ -230,12 +230,12 @@ def test_tomography_plot_raises_for_incorrect_number_of_axes(): def test_single_qubit_cliffords_gateset(): - qubit = GridQubit(0, 0) + qubits = [GridQubit(0, i) for i in range(4)] clifford_group = cirq.experiments.qubit_characterizations._single_qubit_cliffords() c = cirq.experiments.qubit_characterizations._create_parallel_rb_circuit( - (qubit,), 3, clifford_group.c1_in_xy + qubits, 5, clifford_group.c1_in_xy ) device = cirq.testing.ValidatingTestDevice( - qubits=(qubit,), allowed_gates=(cirq.ops.PhasedXZGate, cirq.MeasurementGate) + qubits=qubits, allowed_gates=(cirq.ops.PhasedXZGate, cirq.MeasurementGate) ) device.validate_circuit(c) From ee56c59856c596460921dc71348bfc415b3fd2b9 Mon Sep 17 00:00:00 2001 From: Seneca Meeks Date: Fri, 19 Jan 2024 11:01:03 -0800 Subject: [PATCH 5/5] Rm build_rtd_docs CI job and its dependencies (#6417) * Created using Colaboratory * remove rtd_docs job * rm ci job * rm references to rtd --------- Co-authored-by: Tanuj Khattar --- .dockerignore | 4 - .github/workflows/ci.yml | 14 ---- .gitignore | 4 - .readthedocs.yml | 9 --- README.rst | 4 - dev_tools/docs/build-rtd-docs.sh | 59 -------------- dev_tools/incremental_coverage.py | 1 - rtd_docs/.gitignore | 3 - rtd_docs/404.md | 7 -- rtd_docs/Cirq_logo_color.png | Bin 8896 -> 0 bytes rtd_docs/Cirq_logo_notext.png | Bin 9291 -> 0 bytes rtd_docs/Makefile | 20 ----- rtd_docs/__init__.py | 13 --- rtd_docs/_templates/autosummary/class.rst | 33 -------- rtd_docs/_templates/autosummary/module.rst | 41 ---------- rtd_docs/_templates/breadcrumbs.html | 3 - rtd_docs/_templates/layout.html | 6 -- rtd_docs/conf.py | 88 --------------------- rtd_docs/favicon.ico | Bin 2686 -> 0 bytes rtd_docs/index.md | 7 -- rtd_docs/requirements.txt | 5 -- 21 files changed, 321 deletions(-) delete mode 100644 .readthedocs.yml delete mode 100755 dev_tools/docs/build-rtd-docs.sh delete mode 100644 rtd_docs/.gitignore delete mode 100644 rtd_docs/404.md delete mode 100644 rtd_docs/Cirq_logo_color.png delete mode 100644 rtd_docs/Cirq_logo_notext.png delete mode 100644 rtd_docs/Makefile delete mode 100644 rtd_docs/__init__.py delete mode 100644 rtd_docs/_templates/autosummary/class.rst delete mode 100644 rtd_docs/_templates/autosummary/module.rst delete mode 100644 rtd_docs/_templates/breadcrumbs.html delete mode 100644 rtd_docs/_templates/layout.html delete mode 100644 rtd_docs/conf.py delete mode 100644 rtd_docs/favicon.ico delete mode 100644 rtd_docs/index.md delete mode 100644 rtd_docs/requirements.txt diff --git a/.dockerignore b/.dockerignore index 4632948fb46..fbdd8682a3d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,10 +19,6 @@ __pycache__ # packaging *.egg-info/ -# Sphinx -_build -rtd_docs/generated - # swap files *.swp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 012b20475d1..5a7e45c8fe7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -185,20 +185,6 @@ jobs: - name: Test dependencies with pip-compile run: | pip-compile --resolver=backtracking dev_tools/requirements/deps/cirq-all.txt -o- - build_docs: - name: Build docs - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: '3.9' - architecture: 'x64' - - name: Install requirements - run: | - pip install -r rtd_docs/requirements.txt - - name: Build docs - run: dev_tools/docs/build-rtd-docs.sh build_protos: name: Build protos runs-on: ubuntu-20.04 diff --git a/.gitignore b/.gitignore index 91874362c50..cc52e694c56 100644 --- a/.gitignore +++ b/.gitignore @@ -20,10 +20,6 @@ __pycache__ *.egg-info/ build/ -# Sphinx -_build -rtd_docs/generated - # API docs docs/api_docs diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 14fae040391..00000000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: 2 -build: - image: latest -python: - version: 3.9 - install: - - requirements: rtd_docs/requirements.txt -sphinx: - configuration: rtd_docs/conf.py \ No newline at end of file diff --git a/README.rst b/README.rst index 2d7d3a23c03..5576492564d 100644 --- a/README.rst +++ b/README.rst @@ -16,10 +16,6 @@ circuits and running them against quantum computers and simulators. .. image:: https://badge.fury.io/py/cirq.svg :target: https://badge.fury.io/py/cirq -.. image:: https://readthedocs.org/projects/cirq/badge/?version=latest - :target: https://readthedocs.org/projects/cirq/versions/ - :alt: Documentation Status - Installation and Documentation ------------------------------ diff --git a/dev_tools/docs/build-rtd-docs.sh b/dev_tools/docs/build-rtd-docs.sh deleted file mode 100755 index 93065b61719..00000000000 --- a/dev_tools/docs/build-rtd-docs.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2018 The Cirq Developers -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -################################################################################ -# Generates a local copy of Cirq's documentation, using Sphinx. -# -# Output currently goes into [REPO_ROOT]/rtd_docs/_build -# -# Temporary files generated by Sphinx (e.g. by the Napoleon extension -# translating google-style docstrings) are put into [REPO_ROOT]/docs/generated, -# which is cleared before and after this command runs. -# -# Usage: -# dev_tools/docs/build-rtd-docs.sh [fast] -# -# fast: sets the concurrency to the number of CPUs (not recommended on Github -# Actions as it sometimes makes the build hung) -################################################################################ - -set -e -trap "{ echo -e '\033[31mFAILED\033[0m'; }" ERR - -[[ $1 == 'fast' ]] && cpus=( -j auto ) || cpus=( ) - -# Get the working directory to the repo root. -cd "$(git rev-parse --show-toplevel)"/rtd_docs - -docs_conf_dir="." -out_dir="${docs_conf_dir}/_build" - -# Cleanup pre-existing temporary generated files. -rm -rf "${docs_conf_dir}/generated" - -# Cleanup previous output. -rm -rf "${out_dir}" - -# Regenerate docs. -sphinx-build -M html "${docs_conf_dir}" "${out_dir}" -W --keep-going "${cpus[@]}" - -# Cleanup newly generated temporary files. -rm -rf "${docs_conf_dir}/generated" - -echo -echo Index Page: -echo "file://${PWD}/${out_dir}/html/index.html" -echo diff --git a/dev_tools/incremental_coverage.py b/dev_tools/incremental_coverage.py index 71f2c53d1d9..044ac8e8411 100644 --- a/dev_tools/incremental_coverage.py +++ b/dev_tools/incremental_coverage.py @@ -21,7 +21,6 @@ IGNORED_FILE_PATTERNS = [ r'^dev_tools/.+', # Environment-heavy code. - r'^rtd_docs/.+', # Environment-heavy code. r'^.+_pb2(_grpc)?\.py$', # Auto-generated protobuf code. r'^(.+/)?setup\.py$', # Installation code. r'^(.+/)?_version\.py$', # Installation code. diff --git a/rtd_docs/.gitignore b/rtd_docs/.gitignore deleted file mode 100644 index a555631fec7..00000000000 --- a/rtd_docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -docs -generated -.benchmarks \ No newline at end of file diff --git a/rtd_docs/404.md b/rtd_docs/404.md deleted file mode 100644 index 2cd583625fd..00000000000 --- a/rtd_docs/404.md +++ /dev/null @@ -1,7 +0,0 @@ -![](./Cirq_logo_color.png) - -# Cirq - -We moved to a new site: [https://quantumai.google](https://quantumai.google). - -You will be automatically redirected shortly... \ No newline at end of file diff --git a/rtd_docs/Cirq_logo_color.png b/rtd_docs/Cirq_logo_color.png deleted file mode 100644 index 5547b739926c8971c8b76b8ad9226fb050034a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8896 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 diff --git a/rtd_docs/Cirq_logo_notext.png b/rtd_docs/Cirq_logo_notext.png deleted file mode 100644 index ad0fcb7c9cddf5fcf976c799b24a563f296e8108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9291 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 O0W?(L$~B5s;r|0LQ1 -{% endblock %} diff --git a/rtd_docs/conf.py b/rtd_docs/conf.py deleted file mode 100644 index b09e694ac8d..00000000000 --- a/rtd_docs/conf.py +++ /dev/null @@ -1,88 +0,0 @@ -# pragma: no cover - -# The content for all documentation lives in ../docs. That folder is -# following the structure for the Google Quantum site configured for the -# internal CMS, devsite. The readthedocs layer is a secondary, which generates -# the content using sphinx to readthedocs.io until we go live with the devsite. -# -# This is the configuration file for the Sphinx documentation builder. -# See http://www.sphinx-doc.org/en/master/config for help - -# -- Path setup -------------------------------------------------------------- - -# 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. -# - -import os -import sys - -cirq_root_path = os.path.dirname(os.path.dirname(__file__)) -sys.path.insert(0, cirq_root_path) - -# -- Project information ----------------------------------------------------- - -project = 'Cirq' -copyright = '2018-2024, The Cirq Developers' # pylint: disable=redefined-builtin -author = 'The Cirq Developers' - -# The short X.Y version -version = "" # '.'.join(release.split('.')[:2]) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['myst_parser', 'notfound.extension'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# Allow markdown includes. -# http://www.sphinx-doc.org/en/main/markdown.html -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -source_suffix = {'.rst': 'restructuredtext', '.md': 'markdown'} - -# The main toctree document. -root_doc = 'index' - -# 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' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path . -exclude_patterns = ['Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output --------------------------------------------- - -html_theme = 'sphinx_rtd_theme' -html_favicon = 'favicon.ico' -# html_theme_options = {} - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = 'Cirq_logo_notext.png' -html_css_files = ['tweak-style.css'] diff --git a/rtd_docs/favicon.ico b/rtd_docs/favicon.ico deleted file mode 100644 index 1c522795a3e13019f03fdc98d1a800398bb48a4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2686 zcmbtWL2KMb6n@ecwwSWnOG^)iRh3H-DRmJGW=XLBgV@WS0tuSMr<^n*6uj+0g8YfP zS-c7Z$t9PZg7OdY0}3_d5BL@(IGKKLMyu5-tliRQOEYiY``-KBjON)y4t|c0hj@QQ z^F5;Pi0DT=$9NWaczu_=eE17Je{h#xJiG^IP4pX{-!xv`8vZ%1P4&h^8{$$b^SoapjZc3DUb*CRAzCm zp860^6-l03yp$&lM?{;GT;KEkpqQryze*B?(uxddP=`GAJdY#929F(K{7P;Zg8)0& z{Hr8m{7PmPZ6f%H;PXtWXC^<#-_)yM^-(3uI=^Ti`WfQ8KNvgbkHToxHY@cf6EMR0 zQGa2z=6zP1>-=G3=uYbV-Q`BF>u>b#q^`fa+~~Ic|Cb-<-^A-q>iWCOjeb-9!k&NQ z-<{l8f5zuO?ZO(pz+H=?Yxv`~UyC>AkK3_BEdOYS72j7XPNvuFU%@wZxtm{+r?@EB z)R$*T`_uk{NGyfeY8D+2zNxtNyJR^jq)gIo!)h2~vP$wyrdt8Ho!JGnriqxNC2n0H zd{O8qEU<^FKub+q9G2Y9Y|ZD!Gr{#wnhRX_(tz=7M<_00ox$|dsXE(Zy9y(Az-Is# z6M+F}wcN#6m;h6V(YQ0Cn@)V@)(u2WaeRm%MZ)`J!i6)14iYdNvW_6odoc&~8KSQn z3>@%xg*kEys;L9*y8(k)Y=Bw89|FGBDK}A%Tx;a_xh=w?nL5x-dUmi8P&oe?=%U%d z6cK^Oc!uWIK{pW?jl$9VcxhW~;S(<0+fd*5AUWS7PF}apjm^w(Qd8xkdAsZ0*l}2L za@QrNv)-uK^&kk^g=?)pD!d@2lbdld=$VoBiN`Cd=oI6nQ_=|IMQ=g3F!Dboj@F;) z5Dx72$oUJ7m%XyrhvVBm?K|a2zZ$^dVstee(y#RWs5*}B$|E+%bAN_BNKd9sN>k(VP0_tW2bu)fg^f7|> z1#c$m81iPKz5yJ#KHj5C=kLlXZ(&RSxT5=xrf){Pop_FTdk^T*h`0NK_wmwsQ!=Ka s2MZfx9}cI8{WX~!B{?Q%MQmn9`-T%ogbK&fp6j~>AD`Cmza44)4{>#vU;qFB diff --git a/rtd_docs/index.md b/rtd_docs/index.md deleted file mode 100644 index 2cd583625fd..00000000000 --- a/rtd_docs/index.md +++ /dev/null @@ -1,7 +0,0 @@ -![](./Cirq_logo_color.png) - -# Cirq - -We moved to a new site: [https://quantumai.google](https://quantumai.google). - -You will be automatically redirected shortly... \ No newline at end of file diff --git a/rtd_docs/requirements.txt b/rtd_docs/requirements.txt deleted file mode 100644 index 37e0fef66f3..00000000000 --- a/rtd_docs/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# For generating documentation. -myst-parser -Sphinx==7.* -sphinx_rtd_theme -sphinx-notfound-page