diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 442b91c37..000000000 --- a/.clang-format +++ /dev/null @@ -1,3 +0,0 @@ -# Run manually to reformat a file: -# clang-format -i --style=file -BasedOnStyle: Google diff --git a/.editorconfig b/.editorconfig index 7b82d946e..7b8470b10 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,10 +15,11 @@ root = true -# We follow TF's style: https://tensorflow.org/community/contribute/code_style +# We follow the TensorFlow coding style +# https://www.tensorflow.org/community/contribute/code_style -# IMPORTANT: some of the other config files (e.g., .pylintrc) also have settings -# for the same properties & need to be updated if changes are made to this file. +# IMPORTANT: some of the other config files (.clang-format, etc.) also have +# the same settings and need to be updated if changes are made to this file. [*] charset = utf-8 indent_style = space @@ -27,10 +28,7 @@ spelling_language = en-US trim_trailing_whitespace = true max_line_length = 80 -[{BUILD,*.bzl,*.bazel,.bazelrc,WORKSPACE}] -indent_size = 4 - -[Dockerfile] +[{BUILD,*.BUILD,*.bzl,*.bazel,.bazelrc,WORKSPACE}] indent_size = 4 [{*.cc,*.h}] diff --git a/.gemini/config.yaml b/.gemini/config.yaml deleted file mode 100644 index 8789d62ac..000000000 --- a/.gemini/config.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors -# -# 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. - -# Summary: configure Gemini Code Assist (https://codeassist.google/). -# See https://github.com/marketplace/gemini-code-assist for more info. - -have_fun: false -code_review: - disable: false - comment_severity_threshold: HIGH - max_review_comments: -1 - pull_request_opened: - help: false - summary: false - code_review: true - include_drafts: false -ignore_patterns: [] diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml deleted file mode 100644 index 9bcde8455..000000000 --- a/.github/dependabot.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors -# -# 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. -# ============================================================================ - -version: 2 -updates: - - package-ecosystem: "pip" - directory: "/" - exclude-paths: - - "third_party/**" - schedule: - interval: "monthly" - versioning-strategy: "increase-if-necessary" - labels: - - "area/dependencies" - - "area/python" - - "area/health" - - - package-ecosystem: "github-actions" - # The "github-actions" code explicitly looks in /.github/workflows if the - # value "/" is given for the directory attribute. Yes, that's confusing. - directory: "/" - schedule: - interval: "monthly" - groups: - # Ideally, we would group all monthly updates together into 1 group, - # but Dependabot does not support that. The best we can do is 2 groups. - actions-version-updates: - applies-to: "version-updates" - patterns: - - "*" - actions-security-updates: - applies-to: "security-updates" - patterns: - - "*" - labels: - - "area/devops" - - "area/health" - - "kind/chore" diff --git a/.github/problem-matchers/README.md b/.github/problem-matchers/README.md new file mode 100644 index 000000000..60ede5cbb --- /dev/null +++ b/.github/problem-matchers/README.md @@ -0,0 +1,10 @@ +# Problem Matchers + +GitHub [Problem Matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md) are a mechanism that enable workflow steps to scan the outputs of GitHub Actions for regex patterns and automatically write annotations in the workflow summary page. Using Problem Matchers allows information to be displayed more prominently in the GitHub user interface. + +This directory contains Problem Matchers used by the GitHub Actions workflows in the [`workflows`](./workflows) subdirectory. + +The following problem matcher JSON files found in this directory were copied from the [Home Assistant](https://github.com/home-assistant/core) project on GitHub. The Home Assistant project is licensed under the Apache 2.0 open-source license. The version of the files at the time they were copied was 2025.1.2. + +- [`pylint.json`](https://github.com/home-assistant/core/blob/dev/.github/workflows/matchers/pylint.json) +- [`yamllint.json`](https://github.com/home-assistant/core/blob/dev/.github/workflows/matchers/yamllint.json) diff --git a/.github/problem-matchers/clang-format.json b/.github/problem-matchers/clang-format.json new file mode 100644 index 000000000..29cd03f37 --- /dev/null +++ b/.github/problem-matchers/clang-format.json @@ -0,0 +1,30 @@ +{ + "problemMatcher": [ + { + "owner": "clang-format-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.*?)\\((\\d+),(\\d*)\\):\\s+(?:fatal\\s+)?error:\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4 + } + ] + }, + { + "owner": "clang-format-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.*?)\\((\\d+),(\\d*)\\):\\s+(?:fatal\\s+)?warning:\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4 + } + ] + } + ] +} diff --git a/.github/problem-matchers/pylint.json b/.github/problem-matchers/pylint.json new file mode 100644 index 000000000..5624ca695 --- /dev/null +++ b/.github/problem-matchers/pylint.json @@ -0,0 +1,32 @@ +{ + "problemMatcher": [ + { + "owner": "pylint-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + }, + { + "owner": "pylint-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + } + ] +} diff --git a/.github/problem-matchers/yamllint.json b/.github/problem-matchers/yamllint.json new file mode 100644 index 000000000..ab9449dd7 --- /dev/null +++ b/.github/problem-matchers/yamllint.json @@ -0,0 +1,22 @@ +{ + "problemMatcher": [ + { + "owner": "yamllint", + "pattern": [ + { + "regexp": "^(.*\\.ya?ml)$", + "file": 1 + }, + { + "regexp": "^\\s{2}(\\d+):(\\d+)\\s+(error|warning)\\s+(.*?)\\s+\\((.*)\\)$", + "line": 1, + "column": 2, + "severity": 3, + "message": 4, + "code": 5, + "loop": true + } + ] + } + ] +} diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci-build-checks.yaml similarity index 67% rename from .github/workflows/ci.yaml rename to .github/workflows/ci-build-checks.yaml index ccc4043b6..b7ff4461b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci-build-checks.yaml @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# yamllint disable rule:line-length - name: 'CI: build & test' run-name: Continuous integration build and test @@ -26,10 +24,6 @@ on: types: - checks_requested -env: - # Python version to use for actions/setup-python. - python-version: '3.11' - concurrency: cancel-in-progress: true group: ${{github.workflow}}-${{github.event.pull_request.number||github.ref}} @@ -37,52 +31,22 @@ concurrency: permissions: read-all jobs: - format-and-lint-checks: - name: File format & lint checks - runs-on: ubuntu-22.04 - timeout-minutes: 30 - steps: - - name: Check out a copy of the TFQ git repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: ${{env.python-version}} - cache: pip - cache-dependency-path: requirements.txt - - - name: Install Python dependencies - run: | - pip install --upgrade pip - pip install -r requirements.txt - - - name: Check code formatting - run: ./scripts/format_check.sh - - - name: Check code lint - run: ./scripts/lint_all.sh - wheel-build: name: Wheel test runs-on: ubuntu-22.04 timeout-minutes: 60 + steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v5 with: - python-version: ${{env.python-version}} + python-version: '3.10' + architecture: 'x64' cache: pip - cache-dependency-path: requirements.txt - - name: Install Bazel on CI run: ./scripts/ci_install.sh - - name: Build Wheel Test run: ./scripts/build_pip_package_test.sh - - name: Test Wheel run: ./scripts/run_example.sh @@ -92,6 +56,7 @@ jobs: container: image: us-docker.pkg.dev/ml-oss-artifacts-published/ml-public-container/ml-build:infrastructure-public-image-82c7ac59ba4b timeout-minutes: 60 + steps: - name: Adjust the ml-build runner to our needs run: | @@ -99,19 +64,16 @@ jobs: sudo apt-get update && sudo apt-get install -y lsb-release # This file, though it's empty, hangs the Bazel install step. rm -f /etc/bazel.bazelrc - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v5 with: - python-version: ${{env.python-version}} + python-version: '3.10' + architecture: 'x64' cache: pip - cache-dependency-path: requirements.txt - - name: Install Bazel on CI run: ./scripts/ci_install.sh - - name: Configure CI TF run: echo "Y\n" | ./configure.sh - - name: Full Library Test run: ./scripts/test_all.sh @@ -143,6 +105,7 @@ jobs: container: image: us-docker.pkg.dev/ml-oss-artifacts-published/ml-public-container/ml-build:infrastructure-public-image-82c7ac59ba4b timeout-minutes: 60 + steps: - name: Adjust the ml-build runner to our needs run: | @@ -150,21 +113,17 @@ jobs: sudo apt-get update && sudo apt-get install -y lsb-release # This file, though it's empty, hangs the Bazel install step. rm -f /etc/bazel.bazelrc - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v5 with: - python-version: ${{env.python-version}} + python-version: '3.10' + architecture: 'x64' cache: pip - cache-dependency-path: requirements.txt - - - name: Upgrade pip - run: pip install --upgrade pip - + - name: Install notebook dependencies + run: pip install --upgrade pip seaborn==0.10.0 - name: Install Bazel on CI run: ./scripts/ci_install.sh - - name: Build Wheel run: ./scripts/build_pip_package_test.sh - - name: Test Notebooks run: ./scripts/ci_validate_tutorials.sh diff --git a/.github/workflows/ci-file-checks.yaml b/.github/workflows/ci-file-checks.yaml new file mode 100644 index 000000000..166af5c90 --- /dev/null +++ b/.github/workflows/ci-file-checks.yaml @@ -0,0 +1,383 @@ +# Copyright 2025 The TensorFlow Quantum Authors +# +# 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. + +# Summary: TFQ continuous integration workflow for static code analysis. +# +# This workflow runs linters and code format/style checkers on certain events +# such as pull requests and merge-queue merges. It tries to be as efficient as +# possible by only running jobs when specific types of files were affected by +# a PR, and by caching the Python installation so that it doesn't have to be +# re-installed on every run. It reads the requirements.txt file to find out +# the required versions of some program like pylint and yapf, to adhere to DRY +# principles. It uses GitHub "problem matchers" to write error outputs to the +# workflow summary to make it easier to learn the outcome. Finally, It can be +# invoked manually using the "Run workflow" button on the page at +# https://github.com/tensorflow/quantum/actions/workflows/ci-file-checks.yaml + +name: 'CI: lint & check formating' +run-name: Continuous integration lint and format checks + +on: + pull_request: + types: [opened, synchronize] + branches: + - master + + merge_group: + types: + - checks_requested + + push: + branches: + - master + + # Allow manual invocation, with options that can be useful for debugging. + workflow_dispatch: + inputs: + sha: + description: 'SHA of commit to run against:' + type: string + required: true + + python_ver: + description: 'Python version:' + type: string + + pylint_ver: + description: 'Pylint version:' + type: string + + yapf_ver: + description: 'Yapf version:' + type: string + + clang_format_ver: + description: 'clang-format version:' + type: string + + remake_python_cache: + description: 'Delete & remake the Python cache' + type: boolean + default: false + +env: + # Default Python version to use. + python_ver: '3.10' + # Note: as of 2025-01-16, clang-format v. 18 is the latest available on + # GitHub, and you have to use Ubuntu 24 to get it. + clang_format_ver: '18' + +concurrency: + # Cancel any previously-started but still active runs on the same branch. + cancel-in-progress: true + group: ${{github.workflow}}-${{github.event.pull_request.number||github.ref}} + +permissions: read-all + +jobs: + Changes: + runs-on: ubuntu-24.04 + timeout-minutes: 5 + outputs: + python: ${{steps.filter.outputs.python}} + python_files: ${{steps.filter.outputs.python_files}} + cc: ${{steps.filter.outputs.cc}} + cc_files: ${{steps.filter.outputs.cc_files}} + yaml: ${{steps.filter.outputs.yaml}} + yaml_files: ${{steps.filter.outputs.yaml_files}} + steps: + # When invoked manually, use the given SHA to figure out the change list. + - if: github.event_name == 'workflow_dispatch' + name: Use the user-provided SHA as the basis for comparison + env: + GH_TOKEN: ${{github.token}} + run: | + set -x +e + url="repos/${{github.repository}}/commits/${{inputs.sha}}" + full_sha="$(gh api $url -q '.sha')" + exit_code=$? + if [[ "$exit_code" == "0" ]]; then + echo "base=$full_sha" >> "$GITHUB_ENV" + else + { + echo "### :x: Workflow error" + echo "The SHA provided to _Run Workflow_ does not exist:" + echo "${{inputs.sha}}" + } >> "$GITHUB_STEP_SUMMARY" + exit 1 + fi + + - if: github.event_name != 'workflow_dispatch' + name: Use ref ${{github.ref_name}} as the basis for comparison + run: | + echo base=${{github.ref_name}} >> "$GITHUB_ENV" + + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Determine files changed by this ${{github.event_name}} event + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 + id: filter + with: + base: ${{env.base}} + list-files: 'shell' + # The outputs will be variables named "foo_files" for a filter "foo". + filters: | + python: + - added|modified: + - '**/*.py' + cc: + - added|modified: + - '**/*.cc' + - '**/*.h' + - '**/*.proto' + yaml: + - added|modified: + - '**/*.yaml' + - '**/*.yml' + + Setup: + if: needs.Changes.outputs.python == 'true' + needs: Changes + runs-on: ubuntu-22.04 + timeout-minutes: 10 + outputs: + cache_key: ${{steps.parameters.outputs.cache_key}} + cache_paths: ${{steps.parameters.outputs.cache_paths}} + steps: + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + # Note: setup-python has a cache facility, but we don't use it here + # because we want to cache more Python things than setup-python does. + - name: Set up Python ${{inputs.python_ver || env.python_ver}} + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 + with: + python-version: ${{inputs.python_ver || env.python_ver}} + + - name: Set cache keys and other parameters + id: parameters + run: | + key="${{github.workflow_ref}}-${{hashFiles('requirements.txt')}}" + echo "cache_key=$key" >> "$GITHUB_OUTPUT" + # The paths used for actions/cache need to be on separate lines. + # Constructing a multiline value for an output variable is awkward. + # shellcheck disable=SC2005 + { + echo "cache_paths<> "$GITHUB_OUTPUT" + + - name: Test if the cache already exists + uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 + id: check_cache + with: + lookup-only: true + key: ${{steps.parameters.outputs.cache_key}} + path: ${{steps.parameters.outputs.cache_paths}} + + - if: >- + steps.check_cache.outputs.cache-hit == 'true' && + inputs.remake_python_cache == 'true' + name: Clear the Python cache + continue-on-error: true + env: + GH_TOKEN: ${{secrets.GITHUB_TOKEN}} + run: | + key="${{steps.parameters.outputs.cache_key}}" + gh extension install actions/gh-actions-cache + gh actions-cache delete "$key" --confirm + + - if: >- + steps.check_cache.outputs.cache-hit != 'true' || + inputs.remake_python_cache == 'true' + name: Set up the Python cache + uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 + id: restore_cache + with: + key: ${{steps.parameters.outputs.cache_key}} + path: ${{steps.parameters.outputs.cache_paths}} + + - if: >- + steps.check_cache.outputs.cache-hit != 'true' || + inputs.remake_python_cache == 'true' + name: Install TFQ dependencies + # Need to install all requirements b/c Pylint needs to load modules. + run: | + pip install -r requirements.txt + + - if: ${{inputs.pylint_ver != ''}} + name: Install requested version ${{inputs.pylint_ver}} of Pylint + # Override version of Pylint installed from requirements.txt + run: | + set -x + pip install pylint==${{inputs.pylint_ver}} + + - if: ${{inputs.yapf_ver != ''}} + name: Install requested version ${{inputs.yapf_ver}} of Yapf + # Override version of Yapf installed from requirements.txt + run: | + set -x + pip install yapf==${{inputs.yapf_ver}} + + Cplusplus-format: + if: needs.Changes.outputs.cc == 'true' + name: Check C++ and Protobuf coding style + needs: Changes + runs-on: ubuntu-24.04 + env: + changed_files: ${{needs.Changes.outputs.cc_files}} + steps: + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Set up clang-format output problem matcher + run: echo '::add-matcher::.github/problem-matchers/clang-format.json' + + - name: Run clang-format on C++ and Protobuf files + run: | + set -x +e -o pipefail + version=${{inputs.clang_format_ver || env.clang_format_ver}} + clang-format-$version --verbose -Werror --style google --dry-run \ + ${{env.changed_files}} > diff.out 2>&1 + exit_code=$? + if [[ "$exit_code" != "0" ]]; then + # Write output both here and to the job summary. + bo=$'\e[1m'; bl=$'\e[38;5;117m'; rs=$'\e[0m'; hi='👋🏻' + u="https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}" + echo "$hi ${bl}Visit $bo$u${rs}$bl for formatted diff output$rs $hi" + echo '::group::clang-format output' + cat diff.out + echo '::endgroup::' + # shellcheck disable=SC2006 + { + echo "### Output from clang-format version $version" + echo '```diff' + echo "$(< diff.out)" + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + fi + exit $exit_code + + Python-lint: + if: needs.Changes.outputs.python == 'true' + name: Check Python lint + needs: [Changes, Setup] + runs-on: ubuntu-22.04 + steps: + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Set up Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 + with: + python-version: ${{inputs.python_ver || env.python_ver}} + + - name: Restore the Python cache + uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 + with: + key: ${{needs.Setup.outputs.cache_key}} + path: ${{needs.Setup.outputs.cache_paths}} + fail-on-cache-miss: true + + - name: Set up Pylint output problem matcher + run: echo '::add-matcher::.github/problem-matchers/pylint.json' + + - name: Lint the changed Python files + run: | + set +e -o pipefail + pylint -v ${{needs.Changes.outputs.python_files}} |& tee ./pylint.out + exit_code=$? + if [[ "$exit_code" != "0" ]]; then + { + echo '### Output from pylint' + echo '' + echo '```' + echo "$(< ./pylint.out)" + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + fi + exit $exit_code + + Python-format: + if: needs.Changes.outputs.python == 'true' + name: Check Python coding style + needs: [Changes, Setup] + runs-on: ubuntu-22.04 + steps: + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Set up Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 + with: + python-version: ${{inputs.python_ver || env.python_ver}} + + - name: Restore the Python cache + uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 + with: + key: ${{needs.Setup.outputs.cache_key}} + path: ${{needs.Setup.outputs.cache_paths}} + fail-on-cache-miss: true + + - name: Run Yapf on the Python changed files + run: | + set +e + yapf --parallel --diff --style=google \ + ${{needs.Changes.outputs.python_files}} > diff.out 2>&1 + exit_code=$? + if [[ -s ./diff.out ]]; then + # Write output both here and to the job summary. + bo=$'\e[1m'; bl=$'\e[38;5;117m'; rs=$'\e[0m'; hi='👋🏻' + u="https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}" + echo "$hi ${bl}Visit $bo$u${rs}$bl for formatted diff output$rs $hi" + echo '::group::Yapf output' + cat diff.out + echo '::endgroup::' + # shellcheck disable=SC2006 + { + echo '### Output from yapf' + echo '' + echo '```diff' + echo "$(< diff.out)" + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + fi + exit $exit_code + + Yaml-lint: + if: needs.Changes.outputs.yaml == 'true' + name: YAML lint + needs: Changes + runs-on: ubuntu-24.04 + steps: + - name: Check out a copy of the TFQ git repository + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4 + + - name: Set up yamllint output problem matcher + run: echo '::add-matcher::.github/problem-matchers/yamllint.json' + + - name: Find out the yamllint version + id: yamllint + run: | + version=$(yamllint --version) + echo "version=${version#yamllint }" >> "$GITHUB_OUTPUT" + + - name: Run yamllint ${{steps.yamllint.outputs.version}} + run: | + set -x + # shellcheck disable=SC2086 + yamllint --format github ${{needs.Changes.outputs.yaml_files}} diff --git a/.github/workflows/ci-nightly-build-test.yaml b/.github/workflows/ci-nightly-build-test.yaml index 124907c2c..60729172d 100644 --- a/.github/workflows/ci-nightly-build-test.yaml +++ b/.github/workflows/ci-nightly-build-test.yaml @@ -82,7 +82,7 @@ jobs: run: ${{steps.commits.outputs.count > 0}} steps: - name: Check out a sparse copy of the git repo for TFQ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: sparse-checkout: . @@ -101,15 +101,15 @@ jobs: runs-on: linux-x86-n2-32 steps: - name: Check out a copy of the TFQ git repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python ${{inputs.py_version || env.py_version}} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 with: python-version: ${{inputs.py_version || env.py_version}} - name: Set up Bazel - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + uses: bazel-contrib/setup-bazel@f3f50ea6791b9b0f4c4eeabba4507422426462f5 # 0.9.1 with: bazelrc: ${{env.bazelrc_additions}} @@ -143,7 +143,7 @@ jobs: - if: failure() || inputs.save_artifacts == 'true' name: Make artifacts downloadable - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4 with: name: test-artifacts retention-days: 7 diff --git a/.github/workflows/ci-nightly-cirq-test.yaml b/.github/workflows/ci-nightly-cirq-test.yaml index 36b9843f8..f322d4ceb 100644 --- a/.github/workflows/ci-nightly-cirq-test.yaml +++ b/.github/workflows/ci-nightly-cirq-test.yaml @@ -91,11 +91,11 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Check out a copy of the TFQ git repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Set up Python ${{inputs.py_version || env.py_version}} id: python - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 with: python-version: ${{inputs.py_version || env.py_version}} architecture: ${{inputs.arch || env.arch}} @@ -131,7 +131,7 @@ jobs: - name: Set up Bazel with caching if: env.use_bazel_disk_cache == 'true' - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + uses: bazel-contrib/setup-bazel@529dbc2648ea79358c64f2bfa5f3ec98f07859e4 # 0.12.1 env: USE_BAZEL_VERSION: ${{inputs.bazel_version || env.bazel_version}} with: @@ -145,7 +145,7 @@ jobs: - name: Set up Bazel without caching if: env.use_bazel_disk_cache == 'false' - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + uses: bazel-contrib/setup-bazel@529dbc2648ea79358c64f2bfa5f3ec98f07859e4 # 0.12.1 env: USE_BAZEL_VERSION: ${{inputs.bazel_version || env.bazel_version}} with: @@ -177,7 +177,7 @@ jobs: if: >- github.event.inputs.save_artifacts == 'true' && (failure() || github.event_name == 'workflow_dispatch') - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4 with: name: bazel-out retention-days: 7 diff --git a/.markdownlintrc b/.markdownlintrc deleted file mode 100644 index 7f8b6a32b..000000000 --- a/.markdownlintrc +++ /dev/null @@ -1,147 +0,0 @@ -{ // -*- jsonc -*- - // - // Copyright 2026 The TensorFlow Authors. All Rights Reserved. - // - // 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. - - // Summary: config "markdownlint" to approximate TensorFlow's style (which in - // turn is close to https://google.github.io/styleguide/docguide/style.html). - // Note: there are multiple programs named "markdownlint" ; we use - // https://github.com/igorshubovych/markdownlint-cli/. - - "$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json", - - // Require ATX-style headings. - // https://google.github.io/styleguide/docguide/style.html#atx-style-headings - "headings": { - "style": "atx" - }, - - // Google style does not require that the first line of a file is a heading - // for the title; it only states that the first heading should be a level 1. - // https://google.github.io/styleguide/docguide/style.html#document-layout - "first-line-heading": false, - - // The Google style does not define what to do about trailing punctuation in - // headings. The markdownlint default disallows exclamation points, which - // seems likely to be more annoying than useful – I have definitely seen - // people use exclamation points in headings in README files on GitHub. - // This setting removes exclamation point from the banned characters. - "no-trailing-punctuation": { - "punctuation": ".,;:。,;:" - }, - - // No trailing spaces. - // https://google.github.io/styleguide/docguide/style.html#trailing-whitespace - "whitespace": { - "br_spaces": 0 - }, - - // Google style exempts some constructs from the line-length limit. - "line-length": { - "line_length": 80, - "code_block_line_length": 80, - "heading_line_length": 80, - "code_blocks": false, - "headings": false, - "tables": false - }, - - // Google Markdown style specifies 2 spaces after item numbers, 3 spaces - // after bullets, so that the text itself is consistently indented 4 spaces. - // https://google.github.io/styleguide/docguide/style.html#nested-list-spacing - "list-marker-space": { - "ol_multi": 2, - "ol_single": 2, - "ul_multi": 3, - "ul_single": 3 - }, - - "ul-indent": { - "indent": 4 - }, - - // Bare URLs are allowed in GitHub-flavored Markdown and in Google’s style. - "no-bare-urls": false, - - // Basic Markdown allows raw HTML. Both GitHub & PyPI support subsets of - // HTML, though it's unclear what subset PyPI supports. Google's style guide - // recommends against using raw HTML, but does allow it. (C.f. the bottom of - // https://google.github.io/styleguide/docguide/style.html) Google's in-house - // documentation system allows many inline and block-level tags, but strips - // others that can pose security risks (e.g., and standalone ). - // The list below tries to capture the intersection of what GitHub allows - // (c.f. https://github.com/github/markup/issues/245#issuecomment-682231577), - // what PyPI seems to allow, what Google allows, and what seems likely to be - // most useful in situations where someone needs to reach for HTML. - "html": { - "allowed_elements": [ - "a", - "abbr", - "b", - "blockquote", - "br", - "caption", - "cite", - "code", - "dd", - "del", - "details", - "dfn", - "div", - "dl", - "dt", - "em", - "figcaption", - "figure", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "hr", - "i", - "img", - "ins", - "kbd", - "li", - "mark", - "ol", - "p", - "picture", - "pre", - "q", - "s", - "samp", - "small", - "span", - "strong", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "tfoot", - "th", - "thead", - "time", - "tr", - "tt", - "ul", - "var", - "wbr" - ] - } -} diff --git a/.style.yapf b/.style.yapf deleted file mode 100644 index 0e9640c29..000000000 --- a/.style.yapf +++ /dev/null @@ -1,2 +0,0 @@ -[style] -based_on_style = google diff --git a/BUILD b/BUILD index ca5bd9daf..1cc330ea4 100644 --- a/BUILD +++ b/BUILD @@ -1,16 +1,2 @@ -# Copyright 2020 The TensorFlow Quantum Authors -# -# 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 -# -# http://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. - -# Export for the release package. -exports_files(["README.md"]) +# Top-level Bazel BUILD file for TensorFlow Quantum. +# This file is intentionally empty. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 528fc8959..3d5b67e7e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,274 +1,62 @@ -# Contributing to TensorFlow Quantum +# Contributing -Thank you for your interest in contributing to this project! We look forward to -working with you. Here are some guidelines to get you started. +## Contributor License Agreements -## Before you begin +We'd love to accept your patches! Before we can take them, we have to jump a +couple of legal hurdles. -### Summary +Please fill out either the individual or corporate Contributor License Agreement +(CLA). -* Read and sign the [Contributor License Agreement] -* Read the [code of conduct]. -* Follow the [development process]. +* If you are an individual writing original source code and you're sure you + own the intellectual property, then you'll need to sign an + [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html). +* If you work for a company that wants to allow you to contribute your work, + then you'll need to sign a + [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html). -[Contributor License Agreement]: https://cla.developers.google.com/ -[code of conduct]: CODE_OF_CONDUCT.md -[development process]: #development-process +Follow either of the two links above to access the appropriate CLA and +instructions for how to sign and return it. Once we receive it, we'll be able to +accept your pull requests. -### Sign our Contributor License Agreement +NOTE: Only original source code from you and other people that have signed the +CLA can be accepted into the main repository. -Contributions to this project must be accompanied by a [Contributor License -Agreement] (CLA). You or your employer retain the copyright to your -contribution; the CLA simply gives us permission to use and redistribute your -contributions as part of the project. If you or your current employer have -already signed the Google CLA (even if it was for a different project), you -probably don't need to do it again. Visit -to see your current agreements or to sign a new one. +## Code Reviews -Only original work from you and other people who have signed the CLA can be -incorporated into the project. By signing the Contributor License Agreement, you -agree that your contributions are an original work of authorship. +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests and the +[TensorFlow Community Guidelines](https://www.tensorflow.org/community/contribute) +for more information on contributor best practices. -### Review our community guidelines +Before making any changes, we recommend opening an issue (if it doesn't already +exist) and discussing your proposed changes. This will let us give you advice +on the proposed changes. If the changes are minor, then feel free to make +them without discussion. -In the interest of fostering an open and welcoming environment, contributors and -maintainers pledge to make participation in our project and our community a -harassment-free experience for everyone. Our community aspires to treat everyone -equally, and to value all contributions. Please review our [code of conduct] for -more information. +## Code Standards -## Code base conventions +We have some standards in place to ensure that incoming code is the highest +quality it can be. Before a code review can happen you should make sure that +the following tests are passing locally: -TensorFlow Quantum (TFQ) is a Python framework for quantum machine learning -(QML) implemented as an add-on to [TensorFlow]. Documentation for TFQ is -available on the [TensorFlow Quantum documentation site]. The TFQ project -generally follows TensorFlow development practices, and the [TensorFlow -contribution guide] is essential reading if you want to get involved with TFQ. +1. `./scripts/test_all.sh` passes. We use TensorFlow's testing suite for our +testing and be sure that any code you add follows the structure they have +[outlined](https://www.tensorflow.org/api_docs/python/tf/test). -[TensorFlow]: https://tensorflow.org -[TensorFlow Quantum documentation site]: https://tensorflow.org/quantum -[TensorFlow contribution guide]: https://www.tensorflow.org/community/contribute +2. `./scripts/lint_all.sh` passes. We use [pylint](https://www.pylint.org/) +to ensure that code has proper formatting and is lint free. -### Getting oriented +3. `./scripts/format_check.sh` passes. We use +[yapf](https://github.com/google/yapf) along with +[clang format](https://clang.llvm.org/docs/ClangFormat.html) to ensure we have +consistent formatting everywhere. -Here is a summary of the main subdirectories in the TFQ source tree: +### Adding Modules -* `benchmarks/`: Code for performance benchmarking -* `docs/`: Documentation source files -* `release/`: Scripts and configurations for building TFQ releases -* `scripts/`: Utilities for running tests and doing other tasks -* `tensorflow_quantum/`: The core source code for TensorFlow Quantum -* `third_party/`: External dependencies and third-party integrations -* `.github/`: GitHub-specific configurations and workflows +If you are adding new modules, be sure to properly expose them to the user +using `__init__.py` files and update the `/scripts/import_test.py` file +to ensure that you are exposing them properly. -Some of the important files found at the top level include the following: - -* `README.md`: General introduction to the project -* `configure.sh`: TFQ build configuration script -* `requirements.txt`: Python dependencies - -### Coding style - -This project follows the [TensorFlow style], which in turn follows these Google -style guides: - -* [C++ Style Guide](https://google.github.io/styleguide/cppguide.html) -* [Python Style Guide](https://google.github.io/styleguide/pyguide.html) -* [Markdown Style Guide](https://google.github.io/styleguide/docguide/style.html) -* [Shell Style Guide](https://google.github.io/styleguide/shellguide.html) - -Software tool configurations can be found in the following files at the top -level of the source tree: - -* `.clang-format`: formatting C++ files using [clang-format] -* `.editorconfig`: basic code editor configuration -* `.pylintrc`: linting Python files using [Pylint] -* `.style.yapf`: formatting Python files using [YAPF] -* `.yamllint.yaml`: linting YAML files using [yamllint] - -All source code files longer than a few lines must begin with a header comment -with the copyright and license. We use the [Apache 2.0 license](./LICENSE). - -[clang-format]: https://releases.llvm.org/18.1.6/tools/clang/docs/ClangFormat.html -[Pylint]: https://www.pylint.org -[TensorFlow style]: https://www.tensorflow.org/community/contribute/code_style -[yamllint]: https://github.com/adrienverge/yamllint -[YAPF]: https://github.com/google/yapf - -### Git conventions - -Git commits should be small and focused. Granular commits make changes easier -and faster to understand and evaluate, allow more effective use of tools like -`git bisect` for debugging, and allow easier management of changes with tools -like `git cherry-pick` and `git rebase`. - -Each commit should: - -* Represent a single, self-contained change, such as a specific bug fix or the - addition of a specific feature. - -* Not combine unrelated changes. Reverting a commit should not affect - unrelated parts of the overall code. - -* Have an easily understood, concise title written in the imperative: "Fix bug - ABC" and not "Fixed bug ABC" or "Fixes bug ABC". - -* Include a description, unless the change is exceptionally small or obvious. - -## Development process - -TFQ development takes place on GitHub using a GitHub-centric workflow. - -### Past issues - -First, search the [issue tracker](https://github.com/tensorflow/quantum/issues) -to check if your idea or bug has been discussed before. - -Before beginning on any substantial changes, we recommend opening a new issue on -GitHub (if one doesn't already exist for the topic) to describe your proposed -changes. This will allow the maintainers to provide feedback. - -### Repository forks and branches - -The preferred approach to working on TensorFlow Quantum is to first create a -[fork](https://docs.github.com/articles/fork-a-repo) of the repository in your -GitHub account, then clone that fork to your local computing environment. Keep -your fork regularly synchronized with the upstream TFQ repository. Create a -separate [git branch](https://docs.github.com/articles/about-branches) for your -work on individual issues or topics. - -### Environment setup - -Follow the instructions in [docs/install.md](docs/install.md) for setting up a -development environment. After doing that, you should end up with: - -* The correct version of Bazel (6.5.0) -* A Python virtual environment with a Python version between 3.10 and 3.12 -* The TFQ Python requirements installed in that Python virtual environment -* The TFQ build configured by running `./configure.sh` - -### Adding modules - -If you are adding new modules, be sure to properly expose them to the user using -`__init__.py` files and update the `scripts/import_test.py` file to ensure that -you are exposing them properly. - -### Linting and formatting - -Code should meet common style standards for Python and be free of error-prone -constructs. Use the following commands regularly to lint and reformat your code -according to project conventions: - -```shell -scripts/format_check.sh -scripts/lint_all.sh -``` - -If the format check reports problems, you can correct them automatically using - -```shell -scripts/format_all.sh -``` - -### Building TFQ - -For relatively "quick" builds of TFQ during development, you can use the -following command, which builds everything needed for a release and thus acts as -a good indicator that changes in one part of the code do not break other parts: - -```shell -bazel build release:build_pip_package -``` - -(The first time you run the command above, it will take a long time, but -subsequent invocations will be much faster because Bazel is smart about what it -rebuilds.) - -### Running tests - -When new functions, classes, and files are introduced, they should also have -corresponding tests. Bug fixes also generally require new unit tests, because -the presence of bugs usually indicates insufficient test coverage. Existing -tests must continue to pass (or be updated) when changes are introduced. - -We use TensorFlow's testing suite for our testing. Tests must follow the -[TensorFlow test guidelines](https://www.tensorflow.org/api_docs/python/tf/test) -in order to work correctly. To run the full TFQ test suite, run this command: - -```shell -scripts/test_all.sh -``` - -During development, it is often useful to run tests on just one file, which you -can do using a command of this form: - -```shell -bazel test //tensorflow_quantum/SUBDIRECTORY:TARGET -``` - -where _SUBDIRECTORY_ is a subdirectory under `tensorflow_quantum/` and `TARGET` -is a test. Here is a full example: - -```shell -bazel test //tensorflow_quantum/python/differentiators:adjoint_test -``` - -### Contributing code - -All submissions require review. We use GitHub's tools for code reviews on -[pull requests](https://docs.github.com/articles/about-pull-requests). - -#### Final checks - -Before opening a pull request (PR) and requesting a code review, you should make -sure that the following tests are passing locally: - -```shell -scripts/format_check.sh -scripts/lint_all.sh -scripts/test_all.sh -``` - -#### Draft pull requests - -When getting ready to submit your work, first create a _draft_ pull request from -your branch on GitHub to the main project repository. (Consult GitHub's -[docs](https://docs.github.com/articles/creating-a-pull-request-from-a-fork) for -help on creating draft pull requests.) - -When writing the PR title and description, please include the following: - -* A concise but descriptive title -* A summary of what the PR is about -* How you tested and validated the changes -* Any important notes, such as assumptions, edge cases, etc. - -The pull request will trigger continuous integration (CI) checks and other -automation on GitHub. Monitor the checks; if any tests fail, continue -development and testing to resolve the problems. - -#### Continuous integration (CI) - -Every time a PR is opened or updated on GitHub, automated workflows run checks -on the files in the PR. These workflows run the format, lint, and test scripts -mentioned above; they also do additional verification, such as checking that all -authors on the PR have signed the [Contributor License Agreement]. The outcomes -of the checks (success, or failures and error messages) will be shown on the -pull request page on GitHub. - -#### Code review - -Once all the CI checks pass and you are ready to submit the PR for -consideration, [mark the PR as ready for review]. A reviewer from the TFQ team -will comment on your code and may ask for changes. You can perform the necessary -changes locally, commit them to your branch as usual, and then push changes to -your fork on GitHub following the same process as above. When you do that, -GitHub will update the code in the pull request automatically. - -[mark the PR as ready for review]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request - -#### Closure - -After code review is finished, requested changes (if any) are made, and the PR -is approved, the project maintainers will merge the PR into the code base. At -that point, the work on the PR will be completed. diff --git a/README.md b/README.md index e518cf11a..d0af7fb23 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@
TensorFlow Quantum logo +src="docs/images/logo/tf_quantum1.svg"> High-performance Python framework for hybrid quantum-classical machine learning @@ -16,6 +16,7 @@ PyPI](https://img.shields.io/pypi/v/TensorFlow_Quantum.svg?logo=python&logoColor [Features](#features) – [Installation](#installation) – [Quick Start](#quick-start) – +[Documentation](#documentation) – [Getting help](#getting-help) – [Citing TFQ](#citing-tensorflow-quantum) – [Contact](#contact) @@ -26,9 +27,10 @@ PyPI](https://img.shields.io/pypi/v/TensorFlow_Quantum.svg?logo=python&logoColor [TensorFlow Quantum](https://www.tensorflow.org/quantum) (TFQ) is a Python framework for hybrid quantum-classical machine learning focused on modeling -quantum data. It provides users with the tools they need to interleave quantum -algorithms and logic designed in Cirq with the powerful and performant ML tools -from [TensorFlow](https://tensorflow.org). Here are some of TFQ's features: +quantum data. It enables quantum algorithms researchers and machine learning +applications researchers to explore computing workflows that leverage Google’s +quantum computing offerings – all from within the powerful +[TensorFlow](https://tensorflow.org) ecosystem. * Integrates with [Cirq](https://github.com/quantumlib/Cirq) for writing quantum circuit definitions @@ -45,11 +47,17 @@ from [TensorFlow](https://tensorflow.org). Here are some of TFQ's features: * Harnesses TensorFlow’s computational machinery to provide exceptional performance and scalability -TensorFlow Quantum empowers quantum algorithms and machine learning researchers -to pursue questions whose answers can only be obtained through fast simulation -of many millions of moderately-sized circuits. It has already been instrumental -in enabling ground-breaking research in QML by providing a seamless workflow for -leveraging Google’s quantum computing offerings. +## Motivation + +TensorFlow Quantum provides users with the tools they need to interleave quantum +algorithms and logic designed in Cirq with the powerful and performant ML tools +from TensorFlow. With this connection, we hope to unlock new and exciting paths +for quantum computing research that would not have otherwise been possible. + +Thanks to its power and scalability, TensorFlow Quantum has already been +instrumental in enabling ground-breaking research in QML. It empowers +researchers to pursue questions whose answers can only be obtained through fast +simulation of many millions of moderately-sized circuits. ## Installation @@ -60,8 +68,8 @@ _Compatibility_: At this time, TensorFlow Quantum is built and tested on Linux with the following systems and software: * Python 3.10–3.12 -* TensorFlow 2.18.1 -* TF-Keras 2.18.0 +* TensorFlow 2.19.1 +* TF-Keras 2.19.0 * NumPy 2.0 * Cirq 1.5.0 @@ -130,7 +138,6 @@ Copyright 2020 Google LLC.
Google Quantum AI - + src="docs/images/quantum-ai-vertical.svg">
diff --git a/WORKSPACE b/WORKSPACE index 39d6ebb29..61036a48d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -26,24 +26,23 @@ load("@rules_python//python:repositories.bzl", "py_repositories") py_repositories() -load("//third_party:python_configure.bzl", "python_configure") - -python_configure() - -load("@local_config_python//:defs.bzl", "interpreter") +local_repository( + name = "python", + path = "third_party/python_legacy", +) -register_toolchains("@local_config_python//:py_toolchain") +load("@python//:defs.bzl", "interpreter") load("@rules_python//python:pip.bzl", "pip_parse") pip_parse( name = "pypi", + requirements_lock = "//:requirements.txt", + python_interpreter = interpreter, extra_pip_args = [ "--index-url", "https://pypi.org/simple/", ], - python_interpreter = interpreter, - requirements_lock = "//:requirements.txt", ) load("@pypi//:requirements.bzl", "install_deps") @@ -85,9 +84,25 @@ http_archive( http_archive( name = "org_tensorflow", - sha256 = "f73e6d838b388c7b4d1ef88d1422a35bb5532644117a472fb0fee28a2215176c", - strip_prefix = "tensorflow-2.18.1", - urls = ["https://github.com/tensorflow/tensorflow/archive/refs/tags/v2.18.1.zip"], + sha256 = "d146daad660c38c5ee0591e7d7ce0fb6c2f92ca247149d5768fa341e6617d563", + strip_prefix = "tensorflow-2.19.1", + urls = ["https://github.com/tensorflow/tensorflow/archive/refs/tags/v2.19.1.zip"], +) + +load("@org_tensorflow//third_party/py:python_repo.bzl", "python_repository") + +# TensorFlow 2.19 expects @python_version_repo to exist even when TFQ manages +# its own pip_parse setup. Reuse the single lockfile across the supported +# interpreter versions. +python_repository( + name = "python_version_repo", + default_python_version = "system", + requirements_versions = ["3.10", "3.11", "3.12"], + requirements_locks = [ + "//:requirements_lock_3_10.txt", + "//:requirements_lock_3_11.txt", + "//:requirements_lock_3_12.txt", + ], ) diff --git a/benchmarks/README.md b/benchmarks/README.md index 5ecbbfd23..4e71f8de2 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -24,7 +24,7 @@ Some notes on benchmark configuration: For example, to benchmark a dense depth-10 Clifford circuit over 5 qubits call: ``` -bazel run -c opt --cxxopt="-msse2" \ +bazel run -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" \ --cxxopt="-msse3" --cxxopt="-msse4" \ benchmarks/scripts:benchmark_clifford_circuit -- \ --n_moments 5 --n_qubits 4 \ @@ -39,10 +39,11 @@ benchmarks/scripts/reports/CliffordBenchmarks.benchmark_clifford_circuit_4_5_1 To benchmark the parameter shift differentiation method on a random depth-10 4-qubit circuit with 10 parameters call, where the circuit will be differentiated over 50 trials, each time over a batch of 10 circuits. ``` -bazel run -c opt --cxxopt="-msse2" \ +bazel run -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" \ --cxxopt="-msse3" --cxxopt="-msse4" \ benchmarks/scripts:benchmark_op_gradients -- \ --n_moments 10 --n_qubits 4 --n_symbols 10 \ --n_runs 50 --batch_size 10 \ --benchmarks=benchmark_parameter_shift ``` + diff --git a/benchmarks/scripts/BUILD b/benchmarks/scripts/BUILD index 0b965b389..f5693b352 100644 --- a/benchmarks/scripts/BUILD +++ b/benchmarks/scripts/BUILD @@ -19,19 +19,11 @@ licenses(["notice"]) # Export for the PIP package. exports_files(["__init__.py"]) -py_library( - name = "benchmark_flags", - srcs = ["flags.py"], -) - py_test( name = "benchmark_clifford_circuit", srcs = ["benchmark_clifford_circuit.py"], python_version = "PY3", deps = [ - ":benchmark_flags", - ":benchmark_util", - "//benchmarks/scripts/models:random_clifford_circuit", "//tensorflow_quantum/core/ops:tfq_simulate_ops_py", "//tensorflow_quantum/core/serialize:serializer", "@local_config_tf//:test_log_pb2", @@ -43,8 +35,6 @@ py_test( srcs = ["benchmark_random_circuit.py"], python_version = "PY3", deps = [ - ":benchmark_flags", - ":benchmark_util", "//tensorflow_quantum/core/ops:tfq_simulate_ops_py", "//tensorflow_quantum/core/serialize:serializer", "@local_config_tf//:test_log_pb2", @@ -56,8 +46,6 @@ py_test( srcs = ["benchmark_op_gradients.py"], python_version = "PY3", deps = [ - ":benchmark_flags", - ":benchmark_util", "//tensorflow_quantum/core/ops:batch_util", "//tensorflow_quantum/core/ops:cirq_ops", "//tensorflow_quantum/core/ops:tfq_simulate_ops_py", diff --git a/benchmarks/scripts/benchmark_op_gradients.py b/benchmarks/scripts/benchmark_op_gradients.py index 50f42400f..d90d57c83 100644 --- a/benchmarks/scripts/benchmark_op_gradients.py +++ b/benchmarks/scripts/benchmark_op_gradients.py @@ -127,7 +127,7 @@ def setup(self): for resolver in resolver_batch], dtype=np.float32) - self.symbol_names_tensor = tf.convert_to_tensor(symbol_names) + self.symbol_names = symbol_names self.symbol_values_tensor = tf.convert_to_tensor(symbol_values_array) self.programs = util.convert_to_tensor(circuit_batch) self.psums = util.convert_to_tensor([psums]) @@ -140,15 +140,15 @@ def _benchmark_tfq_differentiator(self, differentiator, params): analytic_op=tfq_simulate_ops.tfq_simulate_expectation) for _ in range(params.n_burn): - op(self.programs, self.symbol_names_tensor, - self.symbol_values_tensor, self.psums) + op(self.programs, self.symbol_names, self.symbol_values_tensor, + self.psums) deltas = [None] * params.n_runs for i in range(params.n_runs): start = time.perf_counter() with tf.GradientTape() as g: g.watch(self.symbol_values_tensor) - expectations = op(self.programs, self.symbol_names_tensor, + expectations = op(self.programs, self.symbol_names, self.symbol_values_tensor, self.psums) g.gradient(expectations, self.symbol_values_tensor) deltas[i] = time.perf_counter() - start diff --git a/benchmarks/scripts/benchmark_random_circuit.py b/benchmarks/scripts/benchmark_random_circuit.py index 6a68818f4..6dee586b7 100644 --- a/benchmarks/scripts/benchmark_random_circuit.py +++ b/benchmarks/scripts/benchmark_random_circuit.py @@ -1,233 +1,148 @@ -# Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# -# 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 -# -# http://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. -# ============================================================================== -"""Benchmark simulators against classically intractable 'supremacy' circuits.""" -import os -import random -import time -from typing import Callable, Iterable, Sequence, TypeVar, cast - -import numpy as np -from absl.testing import parameterized -import cirq -import tensorflow as tf - -from tensorflow_quantum.core.ops import tfq_simulate_ops -from tensorflow_quantum.core.serialize.serializer import serialize_circuit -from benchmarks.scripts import flags -from benchmarks.scripts import benchmark_util - -SEED = 63536323 -SRC = os.path.dirname(os.path.realpath(__file__)) -os.environ['TEST_REPORT_FILE_PREFIX'] = os.path.join(SRC, 'reports/') -TEST_PARAMS_1 = flags.test_flags(n_rows=3, n_cols=5, n_moments=5) -TEST_PARAMS_2 = flags.test_flags(n_rows=4, n_cols=4, n_moments=20) - -T = TypeVar('T') - - -def _choice(rand_gen: Callable[[], float], sequence: Sequence[T]) -> T: - """Choose a pseudo-random element from a non-empty sequence.""" - # Keep ReCirq's float-based selection to preserve seeded circuit generation. - return sequence[int(rand_gen() * len(sequence))] - - -def _make_cz_layer(qubits: Iterable[cirq.GridQubit], layer_index: int): - """Yield a CZ interaction pattern for the given layer index.""" - offset = layer_index % 8 - for q in qubits: - for q2 in [ - cirq.GridQubit(q.row + 1, q.col), - cirq.GridQubit(q.row, q.col + 1) - ]: - if q2 in qubits and ((q.row + q.col + offset) % 2 == 0): - yield cirq.CZ(q, q2) - - -def _add_cz_layer(layer_index: int, qubits: Sequence[cirq.GridQubit], - circuit: cirq.Circuit) -> int: - """Add the next non-empty CZ layer and return the updated layer index.""" - cz_layer = None - while not cz_layer: - cz_layer = list(_make_cz_layer(qubits, layer_index)) - layer_index += 1 - - circuit.append(cz_layer, strategy=cirq.InsertStrategy.NEW_THEN_INLINE) - return layer_index - - -def generate_boixo_2018_beyond_classical_v2_grid(n_rows: int, n_cols: int, - cz_depth: int, - seed: int) -> cirq.Circuit: - """Local copy of ReCirq's v2 beyond-classical grid circuit generator. - - Source reference: - https://github.com/quantumlib/ReCirq/blob/main/recirq/beyond_classical/google_v2_beyond_classical.py - - Note: - We intentionally keep this local copy to avoid introducing broader - dependency migration. A future cleanup can switch to direct - ReCirq dependency once repository constraints are aligned. - """ - qubits = [ - cirq.GridQubit(i, j) for i in range(n_rows) for j in range(n_cols) - ] - non_diagonal_gates = [cirq.X**(1 / 2), cirq.Y**(1 / 2)] - rand_gen = random.Random(seed).random - - circuit = cirq.Circuit() - circuit.append(cirq.H(qubit) for qubit in qubits) - - layer_index = 0 - if cz_depth: - layer_index = _add_cz_layer(layer_index, qubits, circuit) - for qubit in qubits: - if not circuit.operation_at(qubit, 1): - circuit.append(cirq.T(qubit), - strategy=cirq.InsertStrategy.EARLIEST) - - for moment_index in range(2, cz_depth + 1): - layer_index = _add_cz_layer(layer_index, qubits, circuit) - for qubit in qubits: - if not circuit.operation_at(qubit, moment_index): - last_op = circuit.operation_at(qubit, moment_index - 1) - if last_op: - gate = cast(cirq.GateOperation, last_op).gate - if gate == cirq.CZ: - circuit.append(_choice(rand_gen, - non_diagonal_gates).on(qubit), - strategy=cirq.InsertStrategy.EARLIEST) - elif gate != cirq.T: - circuit.append(cirq.T(qubit), - strategy=cirq.InsertStrategy.EARLIEST) - - circuit.append([cirq.H(qubit) for qubit in qubits], - strategy=cirq.InsertStrategy.NEW_THEN_INLINE) - return circuit - - -def make_random_circuit(n_rows, n_cols, depth): - """Generate a random unparameterized circuit of fixed depth.""" - circuit = generate_boixo_2018_beyond_classical_v2_grid( - n_rows=n_rows, - n_cols=n_cols, - cz_depth=max(0, depth - 2), # Account for initial/final Hadamards. - seed=SEED) - return cirq.Circuit(circuit[:depth]) - - -class RandomCircuitBenchmarksTest(tf.test.TestCase, parameterized.TestCase): - """Test the random circuit benchmarking class.""" - - @parameterized.named_parameters( - ("params_1", TEST_PARAMS_1), - ("params_2", TEST_PARAMS_2), - ) - def test_benchmark_random_circuit(self, params): - """Test that Op constructs and runs correctly.""" - proto_file_path = os.path.join( - SRC, "reports/", "RandomCircuitBenchmarks.benchmark_random_circuit_" - f"{params.n_rows}_{params.n_cols}_{params.n_moments}") - self.addCleanup(os.remove, proto_file_path) - - bench = RandomCircuitBenchmarks(params=params) - bench.benchmark_random_circuit() - - res = benchmark_util.read_benchmark_entry(proto_file_path) - self.assertEqual( - res.name, "RandomCircuitBenchmarks.benchmark_random_circuit_" - f"{params.n_rows}_{params.n_cols}_{params.n_moments}") - self.assertEqual(res.extras.get("n_rows").double_value, params.n_rows) - self.assertEqual(res.extras.get("n_cols").double_value, params.n_cols) - self.assertEqual( - res.extras.get("n_moments").double_value, params.n_moments) - - assert hasattr(res, 'iters') - assert hasattr(res, 'wall_time') - - @parameterized.named_parameters( - ("params_1", TEST_PARAMS_1), - ("params_2", TEST_PARAMS_2), - ) - def test_random_circuit_params(self, params): - """Ensure that the random circuits are structured as advertised.""" - circuit = make_random_circuit(params.n_rows, params.n_cols, - params.n_moments) - self.assertEqual(len(circuit), params.n_moments) - self.assertEqual(len(circuit.all_qubits()), - params.n_rows * params.n_cols) - - -class RandomCircuitBenchmarks(tf.test.Benchmark): - """Benchmark simulators against random 'supremacy' circuits. - - Flags: - --n_rows --n_cols --n_moments --batch_size --n_runs --n_burn - """ - - def __init__(self, params=None): - """Pull in command line flags or use provided flags.""" - super().__init__() - # Allow input params for testing purposes. - self.params = params if params else flags.FLAGS - - def _simulate_circuit(self, circuit, params): - # TODO: implement backend switch - return tfq_simulate_ops.tfq_simulate_state( - [str(serialize_circuit(circuit))] * params.batch_size, ["None"], - [[0]] * params.batch_size) - - def benchmark_random_circuit(self): - """Benchmark simulator performance on - a classically intractable circuit.""" - - circuit = make_random_circuit(self.params.n_rows, self.params.n_cols, - self.params.n_moments) - for _ in range(self.params.n_burn): - _ = self._simulate_circuit(circuit, self.params) - - deltas = [None] * self.params.n_runs - for i in range(self.params.n_runs): - start = time.perf_counter() - _ = self._simulate_circuit(circuit, self.params) - deltas[i] = time.perf_counter() - start - - extras = { - 'n_rows': self.params.n_rows, - 'n_cols': self.params.n_cols, - 'n_qubits': len(circuit.all_qubits()), - 'n_moments': self.params.n_moments, - 'batch_size': self.params.batch_size, - "min_time": min(deltas), - } - - name = (f"benchmark_random_circuit_{self.params.n_rows}_" - f"{self.params.n_cols}_{self.params.n_moments}") - full_path = os.path.join(os.environ['TEST_REPORT_FILE_PREFIX'], - f"{self.__class__.__name__}.{name}") - if os.path.exists(full_path): - os.remove(full_path) - - benchmark_values = { - "iters": self.params.n_runs, - "wall_time": np.median(deltas), - "extras": extras, - "name": name, - } - self.report_benchmark(**benchmark_values) - return benchmark_values - - -if __name__ == "__main__": - tf.test.main() +# Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. +# +# 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 +# +# http://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. +# ============================================================================== +"""Benchmark simulators against classically intractable 'supremacy' circuits.""" +import os +import time + +from absl.testing import parameterized +import cirq +import tensorflow as tf +import numpy as np + +from tensorflow_quantum.core.ops import tfq_simulate_ops +from tensorflow_quantum.core.serialize.serializer import serialize_circuit +from benchmarks.scripts import flags +from benchmarks.scripts import benchmark_util + +SEED = 63536323 +SRC = os.path.dirname(os.path.realpath(__file__)) +os.environ['TEST_REPORT_FILE_PREFIX'] = os.path.join(SRC, 'reports/') +TEST_PARAMS_1 = flags.test_flags(n_rows=3, n_cols=5, n_moments=5) +TEST_PARAMS_2 = flags.test_flags(n_rows=4, n_cols=4, n_moments=20) + + +def make_random_circuit(n_rows, n_cols, depth): + """Generate a random unparameterized circuit of fixed depth.""" + return cirq.experiments.generate_boixo_2018_supremacy_circuits_v2_grid( + n_rows=n_rows, + n_cols=n_cols, + cz_depth=depth - 2, # Account for beginning/ending Hadamard layers + seed=SEED) + + +class RandomCircuitBenchmarksTest(tf.test.TestCase, parameterized.TestCase): + """Test the random circuit benchmarking class.""" + + @parameterized.named_parameters( + ("params_1", TEST_PARAMS_1), + ("params_2", TEST_PARAMS_2), + ) + def test_benchmark_random_circuit(self, params): + """Test that Op constructs and runs correctly.""" + proto_file_path = os.path.join( + SRC, "reports/", "RandomCircuitBenchmarks.benchmark_random_circuit_" + f"{params.n_rows}_{params.n_cols}_{params.n_moments}") + self.addCleanup(os.remove, proto_file_path) + + bench = RandomCircuitBenchmarks(params=params) + bench.benchmark_random_circuit() + + res = benchmark_util.read_benchmark_entry(proto_file_path) + self.assertEqual( + res.name, "RandomCircuitBenchmarks.benchmark_random_circuit_" + f"{params.n_rows}_{params.n_cols}_{params.n_moments}") + self.assertEqual(res.extras.get("n_rows").double_value, params.n_rows) + self.assertEqual(res.extras.get("n_cols").double_value, params.n_cols) + self.assertEqual( + res.extras.get("n_moments").double_value, params.n_moments) + + assert hasattr(res, 'iters') + assert hasattr(res, 'wall_time') + + @parameterized.named_parameters( + ("params_1", TEST_PARAMS_1), + ("params_2", TEST_PARAMS_2), + ) + def test_random_circuit_params(self, params): + """Ensure that the random circuits are structured as advertised.""" + circuit = make_random_circuit(params.n_rows, params.n_cols, + params.n_moments) + self.assertEqual(len(circuit), params.n_moments) + self.assertEqual(len(circuit.all_qubits()), + params.n_rows * params.n_cols) + + +class RandomCircuitBenchmarks(tf.test.Benchmark): + """Benchmark simulators against random 'supremacy' circuits. + + Flags: + --n_rows --n_cols --n_moments --batch_size --n_runs --n_burn + """ + + def __init__(self, params=None): + """Pull in command line flags or use provided flags.""" + super().__init__() + # Allow input params for testing purposes. + self.params = params if params else flags.FLAGS + + def _simulate_circuit(self, circuit, params): + # TODO: implement backend switch + return tfq_simulate_ops.tfq_simulate_state( + [str(serialize_circuit(circuit))] * params.batch_size, ["None"], + [[0]] * params.batch_size) + + def benchmark_random_circuit(self): + """Benchmark simulator performance on + a classically intractable circuit.""" + + circuit = make_random_circuit(self.params.n_rows, self.params.n_cols, + self.params.n_moments) + for _ in range(self.params.n_burn): + _ = self._simulate_circuit(circuit, self.params) + + deltas = [None] * self.params.n_runs + for i in range(self.params.n_runs): + start = time.perf_counter() + _ = self._simulate_circuit(circuit, self.params) + deltas[i] = time.perf_counter() - start + + extras = { + 'n_rows': self.params.n_rows, + 'n_cols': self.params.n_cols, + 'n_qubits': len(circuit.all_qubits()), + 'n_moments': self.params.n_moments, + 'batch_size': self.params.batch_size, + "min_time": min(deltas), + } + + name = (f"benchmark_random_circuit_{self.params.n_rows}_" + f"{self.params.n_cols}_{self.params.n_moments}") + full_path = os.path.join(os.environ['TEST_REPORT_FILE_PREFIX'], + f"{self.__class__.__name__}.{name}") + if os.path.exists(full_path): + os.remove(full_path) + + benchmark_values = { + "iters": self.params.n_runs, + "wall_time": np.median(deltas), + "extras": extras, + "name": name, + } + self.report_benchmark(**benchmark_values) + return benchmark_values + + +if __name__ == "__main__": + tf.test.main() diff --git a/benchmarks/scripts/models/BUILD b/benchmarks/scripts/models/BUILD index 3bcf8a031..4036827f4 100644 --- a/benchmarks/scripts/models/BUILD +++ b/benchmarks/scripts/models/BUILD @@ -19,9 +19,10 @@ licenses(["notice"]) # Export for the PIP package. exports_files(["__init__.py"]) -py_library( +py_binary( name = "random_clifford_circuit", srcs = ["random_clifford_circuit.py"], + python_version = "PY3", ) py_test( diff --git a/configure.sh b/configure.sh index 2ed76a617..b1b138543 100755 --- a/configure.sh +++ b/configure.sh @@ -51,6 +51,38 @@ function inside_docker() { fi } +function write_legacy_python_repo() { + mkdir -p third_party/python_legacy + + # empty WORKSPACE + cat > third_party/python_legacy/WORKSPACE <<'EOF' +# AUTOGENERATED by configure.sh. +# This file is intentionally empty. +EOF + + # simple BUILD that exports defs.bzl + cat > third_party/python_legacy/BUILD <<'EOF' +# AUTOGENERATED by configure.sh. + +package(default_visibility = ["//visibility:public"]) +exports_files(["defs.bzl"]) +EOF + + # defs.bzl MUST define 'interpreter' as a string, not a function. + # We also export py_runtime to satisfy older loads. + cat > third_party/python_legacy/defs.bzl <
   pip install --upgrade pip
-  pip install tensorflow==2.18.1
+  pip install tensorflow==2.19.1 tf-keras==2.19.0
+  export TF_USE_LEGACY_KERAS=1
 
@@ -86,7 +87,7 @@ As noted in the TensorFlow guide, the Bazel build system will be required. -Our latest source builds use TensorFlow 2.18.1. To ensure compatibility we use +Our latest source builds use TensorFlow 2.19.1. To ensure compatibility we use the same version of `bazel`, 6.5.0. To remove any existing version of Bazel:
@@ -123,17 +124,17 @@ Finally, confirm installation of the correct `bazel` version:
 
 ### 4. Build TensorFlow from source
 
-TensorFlow Quantum is compatible with TensorFlow version 2.18.1. To build
+TensorFlow Quantum is compatible with TensorFlow version 2.19.1. To build
 TensorFlow from sources, download the TensorFlow
-source code by cloning the git repository, then switch to the `r2.18`
+source code by cloning the git repository, then switch to the `r2.19`
 branch:
 
 
 
   git clone https://github.com/tensorflow/tensorflow.git
   cd tensorflow
-  git checkout r2.18
+  git checkout r2.19
 
Be sure the virtual environment you created in step 2 is activated, then follow @@ -184,21 +185,6 @@ build:
-The `configure.sh` script detects your Python interpreter and sets up a Bazel -toolchain. If you need to manually specify a Python interpreter, you can do so -by passing the `--python` flag or by setting the `PYTHON_BIN_PATH` environment -variable: - - -
-  ./configure.sh --python=/path/to/python
-
- - -> [!TIP] -> You can also bypass manual configuration by passing the Python path directly -> to Bazel using `--repo_env=PYTHON_BIN_PATH=/path/to/python`. - Now build TensorFlow Quantum: @@ -207,6 +193,10 @@ Now build TensorFlow Quantum: +Before importing `tensorflow` or `tensorflow_quantum`, make sure the +`TF_USE_LEGACY_KERAS=1` environment variable is set so TensorFlow uses the +`tf-keras` package instead of Keras 3. + After the build is complete, run the next two commands to create a Python package for TensorFlow Quantum and write it to a temporary directory (we use `/tmp/tfquantum/` in this example), then install it using pip: diff --git a/docs/tutorials/barren_plateaus.ipynb b/docs/tutorials/barren_plateaus.ipynb index c8738a3af..a1d939886 100644 --- a/docs/tutorials/barren_plateaus.ipynb +++ b/docs/tutorials/barren_plateaus.ipynb @@ -101,7 +101,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/gradients.ipynb b/docs/tutorials/gradients.ipynb index 5bc5829b8..aa0e2afea 100644 --- a/docs/tutorials/gradients.ipynb +++ b/docs/tutorials/gradients.ipynb @@ -103,7 +103,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/hello_many_worlds.ipynb b/docs/tutorials/hello_many_worlds.ipynb index 80b6f0e33..5ce0e4168 100644 --- a/docs/tutorials/hello_many_worlds.ipynb +++ b/docs/tutorials/hello_many_worlds.ipynb @@ -101,7 +101,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/mnist.ipynb b/docs/tutorials/mnist.ipynb index c0ad5984c..4d37c9b1f 100644 --- a/docs/tutorials/mnist.ipynb +++ b/docs/tutorials/mnist.ipynb @@ -101,7 +101,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/noise.ipynb b/docs/tutorials/noise.ipynb index 1a4e71d74..14240e859 100644 --- a/docs/tutorials/noise.ipynb +++ b/docs/tutorials/noise.ipynb @@ -89,7 +89,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/qcnn.ipynb b/docs/tutorials/qcnn.ipynb index d53493953..359d1770e 100644 --- a/docs/tutorials/qcnn.ipynb +++ b/docs/tutorials/qcnn.ipynb @@ -106,7 +106,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/quantum_data.ipynb b/docs/tutorials/quantum_data.ipynb index 7288e1e08..7c6cb90b5 100644 --- a/docs/tutorials/quantum_data.ipynb +++ b/docs/tutorials/quantum_data.ipynb @@ -103,7 +103,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/quantum_reinforcement_learning.ipynb b/docs/tutorials/quantum_reinforcement_learning.ipynb index 09caf5aca..353df0a31 100644 --- a/docs/tutorials/quantum_reinforcement_learning.ipynb +++ b/docs/tutorials/quantum_reinforcement_learning.ipynb @@ -120,7 +120,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/docs/tutorials/research_tools.ipynb b/docs/tutorials/research_tools.ipynb index 7aa665e2e..7c7ce3b46 100644 --- a/docs/tutorials/research_tools.ipynb +++ b/docs/tutorials/research_tools.ipynb @@ -96,7 +96,7 @@ "outputs": [], "source": [ "# In Colab, you will be asked to restart the session after this finishes.\n", - "!pip install tensorflow==2.18.1 tensorflow-quantum==0.7.6" + "!pip install tensorflow==2.19.1 tensorflow-quantum==0.7.7" ] }, { diff --git a/release/BUILD b/release/BUILD index abe9557c3..f23d8528f 100644 --- a/release/BUILD +++ b/release/BUILD @@ -44,9 +44,7 @@ sh_binary( "//tensorflow_quantum/datasets:__init__.py", # Dependencies to run PIP package creation. - # Use the repository root README.md for PyPI long_description. "MANIFEST.in", - "//:README.md", "setup.py", # Dependencies that the PIP package will import. diff --git a/release/README.md b/release/README.md index 94b61b8ce..6bfecc6fa 100644 --- a/release/README.md +++ b/release/README.md @@ -1,311 +1,170 @@ -# Making releases of TensorFlow Quantum +# Tools for building releases of TensorFlow Quantum -[TensorFlow Quantum](https://tensorflow.org/quantum) (TFQ) is implemented as a -Python library that integrates static C++ objects. Those C++ objects for TFQ are -linked with the [TensorFlow](https://tensorflow.org) library. The -process of building and linking C++ objects is complex, so TFQ is distributed in -binary Python [wheel](https://peps.python.org/pep-0427/) format for certain -combinations of operating systems and hardware architectures. This page -documents the process used by the TensorFlow Quantum maintainers to build and -release the packages for public TensorFlow Quantum distributions. +This directory contains configurations and scripts that the TensorFlow Quantum +maintainers use to create Python packages for software releases. The process of +making a TFQ release is complex and has not been fully automated. The scripts +in this directory help automate some steps and are a way of capturing the +process more precisely, but there are still manual steps involved. -At present, binary distributions in the form of Python wheel files are made -available only for Linux systems. +## Background: how TensorFlow Quantum is linked with TensorFlow -## Version numbering policy - -TensorFlow Quantum's version numbering follows the _major.minor.patch_ syntax -from [semver](https://semver.org/) (e.g., `0.7.6`). The version number for -TensorFlow Quantum is not tied to TensorFlow's version numbering. - -## Building a binary distribution of TFQ +TFQ is implemented as a Python library that integrates static C++ objects. Those +C++ objects are linked with TensorFlow static objects when both TFQ and +TensorFlow are installed on your system. Unlike a pure Python library, the +result is platform-dependent: the Python code itself remains portable, but the +underlying C++ objects need to be compiled specifically for each target +environment (operating system and CPU architecture). TensorFlow does not provide ABI stability guarantees between versions of -TensorFlow. Consequently, each release of TFQ must be pinned to a specific -version of TensorFlow, which also means that TFQ releases will not work with -any other version of TensorFlow than the one they are pinned to. +TensorFlow. In order to avoid the need for users to compile the TFQ source code +themselves when they want to install TFQ, each release of TFQ must be pinned to +a specific version of TensorFlow. As a consequence, TFQ releases will not work +with any other version of TensorFlow than the one they are pinned to. Python wheels for TFQ are produced by compiling them with a toolchain that -matches the toolchain used to build the TensorFlow version being targeted. A -number of factors affect whether the whole process succeeds and the resulting -wheel is portable to environments other than the specific computer TFQ is built -on, including: - -* The version of Python and the local Python environment. -* The version of TensorFlow. -* The TensorFlow build container used. -* The Crosstool configuration used. +matches that used to build the version of TensorFlow being targeted by a given +version of TFQ. A number of elements affect whether the whole process succeeds +and the resulting wheel is portable to environments other than the specific +computer TFQ is built on, including: + +* The version of Python and the local Python environment +* The version of TensorFlow +* The TensorFlow build container used +* The Crosstool configuration used +* Whether CUDA is being used, and its version * The dependency requirements implied by Cirq, TF-Keras, NumPy, Protobuf, and - other Python packages that TFQ and TF depend on. - -The following subsections describe the steps necessary to build binary -distributions in Python wheel format using scripts in TFQ's `scripts/` -and `release/` subdirectories. + other Python packages -### Before you start +## Procedure -Make sure that your development branch is up-to-date with the upstream -repository on GitHub, and all the code has been formatted, linted, and tested as -described in [../CONTRIBUTING.md](../CONTRIBUTING.md). The following scripts -should all succeed in your development environment: - -```shell -scripts/format_all.sh -scripts/lint_all.sh -scripts/test_all.sh -``` - -If the formatters made any changes, or the linter or tests revealed any -problems, open PRs to fix them in GitHub, get the PRs reviewed, and merge them -into the upstream repository before proceeding further. +Building a TensorFlow Quantum release for Linux involves some additional steps +beyond just building TFQ and producing an initial Python wheel. The procedure +uses `auditwheel` to "repair" the resulting wheel; this improves the +compatibility of the wheel so that it can run on a wider range of Linux +distributions, even if those distributions have different versions of system +libraries. ### Preliminary steps -1. Make sure you have `docker`, `pyenv`, `pip`, and `jq` installed on your - system. +1. Make sure you have `pyenv`, `pip`, and `jq` installed on your system. 2. Git clone the TensorFlow Quantum repo to a directory on your computer. -3. `cd` into that directory in a Bash shell. - -### Rebuild the `requirements.txt` file - -1. Create a Python virtual environment using the lowest version of Python - supported by TFQ. (Currently this is Python 3.10.) - -2. Run these commands in your shell: - - ```shell - pip install pip-tools - ./scripts/generate_requirements.sh - ``` - - This will update the dependency versions in the file `requirements.txt` to - the latest versions based on `requirements.in`. If this process fails, you - may have to iterate on adjusting the contraints in `requirements.in` - followed by running `generate_requirements.sh` again until it succeeds. - -3. If any changes were made to `requirements.in`, check the requirements listed - inside `release/setup.py` and make corresponding changes if the changes to - `requirements.in` involved packages needed to run TFQ. - -### Build the Python wheels - -For each Python version _X.Y.Z_ that will be supported in the TFQ release, do -the following: - -1. Run `./release/build_release.sh X.Y.Z`. - -2. If the previous step fails, resolve the error. - - * Important: if solving the problem requires changes to the versions of - dependency packages, make sure to update both `requirements.in` and - `release/setup.py` (if applicable), and then **go back to the previous - subsection on rebuilding `requirements.txt`** and do it over. - -3. If `build_release.sh` succeeds without error, it should leave a new `.whl` - file in the subdirectory `wheelhouse/`. Verify that it is there. - -If all went well, proceed to test the wheels. - -### Test the wheels - -The tests below are ordered from simplest/quickest to more complex/slower, -so that basic problems (if they exist) can be discovered sooner. - -#### Simple test in a local Python virtual environment - -Iterate on the following steps for each Python version used for the builds -above: - -1. Create a fresh Python virtual environment for the version of Python - corresponding to the wheel to be tested. - -2. Run `pip install wheelhouse/WHEELFILE`, where `WHEELFILE` is the file - name of the wheel for the version of Python being tested. - -3. Run `./scripts/run_example.sh`. Ignore any warnings or errors related to - CUDA or warnings related to optimizations, such as AVX/FMA instruction - sets. (These originate from TensorFlow.) This test will not print any - output if it succeeds, but if it fails, debug whatever error is shown in - the Python traceback. - -#### Docker tests - -The scripts and instructions in `release/docker/README.md` describe how to -build Docker images for different combinations of Ubuntu and Python versions. -Build those images if you have not done so already. (They do not need to be -rebuilt if you made them for previous releases.) - -1. Start a Docker container that has the version of Python matching the - version of Python needed by the TFQ wheel being tested. This example - assumes Python 3.12: - - ```shell - docker run -it --rm --network host -v .:/tfq ubuntu24-cp312 - ``` - - The command above starts a Bash shell prompt inside a basic Ubuntu 24.04 - environment with Python 3.12 preinstalled and your local TensorFlow Quantum - source directory accessible at `/tfq` from inside the container. - -2. Run `pip install /tfq/wheelhouse/WHEELFILE`, where `WHEELFILE` is the file - name of the wheel being tested. - -3. Run `/tfq/scripts/run_example.sh`. Ignore any warnings or errors related to - TensorFlow's use of CUDA or optimizations such as AVX/FMA instruction sets. - This test will not print any output if it succeeds, but if it fails, debug - whatever error is shown in the Python traceback. - -#### Colab tests - -This test can only be done for one of the wheels, namely the wheel built for -the version of Python running in Colab. Before proceeding, determine the -version of Python running in your Colab environment. (Currently for public -Colab it is Python 3.12.) - -1. Open a copy of a TFQ tutorial notebook in Colab. One way to do this is as - follows: - - 1. Navigate to TFQ's `docs/tutorials` directory in your browser (i.e., - https://github.com/tensorflow/quantum/tree/master/docs/tutorials). - - 2. Click on a tutorial file, e.g., `hello_many_worlds.ipynb`. - - 3. Look for a link titled _Run in Google Colab_ near the top of the - tutorial document, and click the link. This should open a browser tab - or window in Google Colab with the tutorial notebook file loaded and - ready to use. - -2. Using Colab's file explorer, upload a TFQ wheel that matches the version of - Python running in Colab. - -3. When the upload finishes, right-click on the file name in the Colab - file explorer and copy the path to the file. - -4. Find the notebook cell that contains the `!pip install` command for - TensorFlow Quantum. **Replace that command** with the following, - pasting in the path that you copied in the previous step: - - ```python - !pip install /paste/the/path/to/the/wheel/file/here - ``` - -5. Run the notebook. - -If the notebook executes all the way through without error, congratulations! If -it fails, analyze the cause, adjust TFQ or the TFQ build accordingly, then run -the tests again. +3. `cd` into your local clone directory in a Bash shell. -Repeat steps 1-5 for the other TFQ tutorials. +### Build the release -## Releasing a new version of TFQ +1. Run `./release/build_release.sh X.Y.Z`, where _X.Y.Z_ is a Python version + for which you want to build a TFQ release. -After all changes planned for the release have been merged into the working -version of TensorFlow Quantum on GitHub, all the builds succeed, and tutorials -run in all versions of Python and platforms supported, a release can be made. -Follow the steps in the order given below, even if you are accustomed to using -a different process for other projects, because certain components in TFQ -depend on other components being in place. +2. If the previous step completes successfully, proceed to the next section + below and test the wheel. -### 1. Release wheels on test.pypi.org +3. Repeat steps 1–2 above for other Python versions. -After successfully building and testing the wheels for a new version, the next -step is to create a test release. +### Testing the release -1. Upload the wheels to test.pypi.org using `twine`. (TFQ maintainers have - access to the necessary account credentials.) +Testing is currently not automated to the degree that building a release is. +The following is the current process. -2. Repeat a subset of the tests in the section _Test the wheels_, but instead - of installing TFQ from a wheel file, tell pip to install from test.pypi.org: +1. First, perform a quick local test. - ```shell - pip install --index-url https://test.pypi.org/simple/ \ - --extra-index-url https://pypi.org/simple/ \ - tensorflow-quantum==X.Y.Z - ``` + 1. `cd` out of the TFQ source directory. This is essential, because + importing TFQ into a Python interpreter when the current directory is + the TFQ source tree will result in baffling errors (usually something + about `pauli_sum_pb2` not found). - where _X.Y.Z_ is the version number of the new TFQ release. Also test the - tutorials in Colab, this time modifying the `!pip install` command to - reference test.pypi.org to use the `--index-url` and `--extra-index-url` - arguments shown above. + 1. Create a fresh Python virtual environment. -### 2. Release wheels on pypi.org + 1. Run `pip install /path/to/wheel`, where `/path/to/wheel` is the path to + the wheel file you built in the previous section corresponding to the + version of Python in your Python virtual environment. -1. If the test.pypi.org release and subsequent tests do not reveal problems, - upload the wheels to PyPI. Note: **this step is irrevocable**, so be - absolutely certain that everything is working and you are really ready to - do the release. If a problem is found after this step and wheels need to - be rebuilt, you will have to bump the TFQ version number and start over - because PyPI by design does not allow releases to be modified. + 1. (Currently required because TFQ requires the legacy version of Keras.) + Set the environment variable `TF_USE_LEGACY_KERAS` to `1` before + loading any TensorFlow or TensorFlow Quantum code. You can set it in + your shell before starting Python; alternatively, you can execute the + following Python code before any `import tensorflow` or `import + tensorflow_quantum` statements: -2. Once the wheels are on PyPI, repeat the Colab tests, this time modifying - the `!pip install` command to be simply the following: + ```python + import os + os.environ["TF_USE_LEGACY_KERAS"] = "1" + ``` - ```shell - !pip install tensorflow-quantum==X.Y.Z - ``` + 1. Run some example TFQ code. If it runs without problems, go on to the + next step; if it fails, debug the error. -### 3. Update tutorials and other documentation on GitHub +2. Second, test in Colab. -If all went well so far and the wheels are on PyPI: + 1. Go to a remotely hosted Colab and make a copy of the [Hello Many Worlds + tutorial notebook]( + https://www.tensorflow.org/quantum/tutorials/hello_many_worlds). -1. Update all the tutorials to refer to the new version of TFQ, update the - top-level `README.md` file, and update any other documentation files that - mention the TFQ version number, the Python version, and any Python package - versions (such as the Cirq version supported). + 1. Using the Colab file explorer, upload a TFQ wheel you created matching + the version of Python running in Colab. (At the time of this writing, + Colab uses Python 3.12.) -2. Open a PR for these changes and ask for a review. + 1. When the upload finishes, right-click on the file name in the Colab file + explorer and copy the path to the file in Colab. -3. Merge the PR after it has been reviewed and accepted. + 1. Find the notebook cell that contains the `!pip install` command for + TensorFlow Quantum. **Replace that command** with the following, pasting + in the path that you copied in the previous step: -Note that this step is purposefully done _after_ the release is uploaded to -PyPI. When a PR is merged on GitHub, Google's documentation pipeline for -https://tensorflow.org/quantum runs automatically to update the tutorial pages, -and since the tutorials contain a `pip install` command with the current TFQ -version number, the version on PyPI needs to exist so that the documentation -builds successfully. (Documentation and tutorial files are not part of the -binary wheel distribution; updates to documentation will not change the -wheels.) + ```python + !pip install /here/paste/the/path/to/the/wheel/file + ``` -### 4. Verify the documentation has been updated on tensorflow.org + 1. Run the notebook step by step. If Colab asks you to restart the session, + do so, and after it finishes restarting, continue with the remaining + cells in the notebook. -Verify that the TensorFlow Quantum API and tutorial pages on tensorflow.org -have been updated by the TensorFlow documentation pipeline. Particularly check -that all the tutorials ran without errors. If any errors occurred, debug and -resolve them. It is possible that this may require changes to TFQ (such as -changes to versions of TFQ dependencies); in extreme cases, the changes may -require bumping the TFQ version number and redoing the build and release steps -up to this point, before the release is finalized on GitHub. + 1. If the notebook executes all the way through without error, + congratulations! If something fails, proceed to debug the problem. -### 5. Release the new version on GitHub +## More information -Once you have verified that the documentation has been updated on -https://tensorflow.org/quantum: +"TensorFlow SIG Build" is a community group dedicated to the TensorFlow build +process. This repository is a showcase of resources, guides, tools, and builds +contributed by the community, for the community. The following resources may be +useful when trying to figure out how to make this all work. -1. Write release notes and create a draft release on GitHub. +* [The "TF SIG Build Dockerfiles" README file]( + https://github.com/tensorflow/build/tree/ff4320fee2cf48568ebd2f476d7714438bfa0bee/tf_sig_build_dockerfiles#readme) -2. Attach to this draft release the wheel files that were uploaded to PyPI. +* Other info in the SIG Build repo: https://github.com/tensorflow/build -3. Have someone review the release notes and draft release. +The script `build_release.sh` relies on other scripts to do the main work. +Those steps can be run manually, and sometimes it is useful to do so when +debugging problems. The steps are: -4. Publish the release on GitHub. +1. `cd` to the top level of your git clone of the TensorFlow Quantum repo. -The GitHub release system will automatically tag the files in the repository -with the release tag you specify (e.g., `v0.7.6`), as well as create an archive -of all the source files and attach it to the release. +1. Create a Python virtual environment for one of the supported versions of + Python. (The maintainers currently use `pyenv` but Python's built-in + `venv` should work too.) -### 6. Bump the TFQ version number in GitHub +1. Run `pip install -r requirements.txt` -1. Update the version number in `tensorflow_quantum/__init__.py` and - `release/setup.py` in the repository on GitHub +1. Run `./release/build_distribution.sh` -2. Open a PR for these changes and ask for a review. +1. If the above succeeds, it will leave the wheel in `/tmp/tensorflow_quantum/` + on your system. Take note of the name of the wheel file that + `build_distribution.sh` prints when it finishes. -3. Merge the PR after it has been reviewed and accepted. +1. Run `./release/clean_distribution.sh /tmp/tensorflow_quantum/WHEEL_FILE`, + where `WHEEL_FILE` is the file noted in the previous step. If this works, it + will create a new wheel file in a subdirectory named `wheelhouse`. If an + error occurs, it will hopefully report the problem. If the error is a Python + platform tag mismatch, run `./release/clean_distribution.sh -s + /tmp/tensorflow_quantum/WHEEL_FILE`; this will run `auditwheel show` on the + wheel file to indicate what version of `manylinux` this wheel can be made to + run on if you use `auditwheel` to repair it. With that information, you may + be able to edit the `build_distribution.sh` script to experiment with + different values for the Crosstool and/or the Docker images used. -### 7. Announce the release +1. If the previous step succeeded, go to testing the release. -Announce the release on the TFQ developer's mailing list, as well as via a -banner on GitHub, the next Cirq Cynq, and any other venues where TFQ releases -are normally announced. +1. If the tests succeed, repeat the `build_distribution.sh` and + `clean_distribution.sh` steps for different versions of Python. diff --git a/release/build_distribution.sh b/release/build_distribution.sh index 8918773be..0955a86ba 100755 --- a/release/build_distribution.sh +++ b/release/build_distribution.sh @@ -14,11 +14,11 @@ # limitations under the License. # ============================================================================= -# Summary: build a wheel for TFQ using a TensorFlow build container. +# Summary: build a wheel for TFQ using a TensorFlow SIG Build container. # Run this script with the option "-h" to get a usage summary. # # To ensure binary compatibility with TensorFlow, TFQ distributions are built -# using TensorFlow's build containers and crosstool C++ toolchain. This +# using TensorFlow's SIG Build containers and Crosstool C++ toolchain. This # script encapsulates the process. The basic steps this script performs are: # # 1. Write to a file a small shell script that does the following: @@ -32,7 +32,9 @@ # 2. Start Docker with image tensorflow/build:${tf_version}-python${py_version} # and run the script written in step 1. # -# 3. Exit. +# 3. Do some basic tests on the wheel using standard Python utilities. +# +# 4. Exit. set -eu -o pipefail @@ -47,79 +49,75 @@ repo_dir=$(git -C "${thisdir}" rev-parse --show-toplevel 2> /dev/null) || \ quit "This script must be run from inside the TFQ git tree." # Default values for variables that can be changed via command line flags. +tf_version="2.19" py_version=$(python3 --version | cut -d' ' -f2 | cut -d. -f1,2) -extra_bazel_options="" +cuda_version="12" cleanup="true" usage="Usage: ${0} [OPTIONS] -Build a Python wheel for a distribution of TensorFlow Quantum. -Options: - -b "options" Additional options to pass to Bazel build - -p X.Y Use Python version X.Y (default: ${py_version}) - -e Don't run bazel clean at the end (default: do) - -h Show this help message and exit" - -while getopts "b:ehp:" opt; do +Build a distribution wheel for TensorFlow Quantum. + +Configuration options: + -c X.Y Use CUDA version X.Y (default: ${cuda_version}) + -p X.Y Use Python version X.Y (default: ${py_version}) + -t X.Y Use TensorFlow version X.Y (default: ${tf_version}) + +General options: + -e Don't run bazel clean at the end (default: do) + -n Dry run: print commands but don't execute them + -h Show this help message and exit" + +dry_run="false" +while getopts "c:ehnp:t:" opt; do case "${opt}" in - b) extra_bazel_options="${OPTARG}" ;; + c) cuda_version="${OPTARG}" ;; e) cleanup="false" ;; h) echo "${usage}"; exit 0 ;; + n) dry_run="true" ;; p) py_version=$(echo "${OPTARG}" | cut -d. -f1,2) ;; + t) tf_version="${OPTARG}" ;; *) quit "${usage}" ;; esac done shift $((OPTIND -1)) # See https://hub.docker.com/r/tensorflow/build/tags for available containers. -docker_image="tensorflow/build:2.18-python${py_version}" +docker_image="tensorflow/build:${tf_version}-python${py_version}" -# The next values must match what is used by the TF release being targeted. Look -# in the TF .bazelrc file for the Linux CPU builds, specifically rbe_linux_cpu. -tf_compiler="/usr/lib/llvm-18/bin/clang" -tf_sysroot="/dt9" -tf_crosstool="@local_config_cuda//crosstool:toolchain" +# This should match what TensorFlow's .bazelrc file uses. +crosstool="@sigbuild-r${tf_version}-clang_config_cuda//crosstool:toolchain" + +# Note: configure.sh is run inside the container, and it creates a .bazelrc +# file that adds other cxxopt flags. They don't need to be repeated here. +BUILD_OPTIONS="--cxxopt=-O3 --cxxopt=-msse2 --cxxopt=-msse3 --cxxopt=-msse4" # Create a script to be run by the shell inside the Docker container. build_script=$(mktemp /tmp/tfq_build.XXXXXX) trap 'rm -f "${build_script}" || true' EXIT # The printf'ed section dividers are to make it easier to search the output. -cat < "${build_script}" +cat <<'EOF' > "${build_script}" #!/bin/bash set -o errexit cd /tfq -exec > >(sed "s/^/[DOCKER] /") -exec 2> >(sed "s/^/[DOCKER] /" >&2) - -printf ":::::::: Configuring Python environment ::::::::\n\n" +PREFIX='[DOCKER] ' +exec > >(sed "s/^/${PREFIX} /") +exec 2> >(sed "s/^/${PREFIX} /" >&2) +printf ":::::::: Build configuration inside Docker container ::::::::\n" +printf " Docker image: ${docker_image}\n" +printf " Crosstool: ${crosstool}\n" +printf " TF version: ${tf_version}\n" +printf " Python version: ${py_version}\n" +printf " CUDA version: ${cuda_version}\n" +printf " vCPUs available: $(nproc)\n" +printf "\n\n:::::::: Configuring Python environment ::::::::\n\n" python3 -m pip install --upgrade pip --root-user-action ignore -python3 -m pip install -r requirements.txt --root-user-action ignore - -printf "\n\n:::::::: Configuring TFQ build ::::::::\n\n" +pip install -r requirements.txt --root-user-action ignore printf "Y\n" | ./configure.sh - -printf "\n\n:::::::: Build configuration inside Docker container ::::::::\n" -printf " Docker image: ${docker_image}\n" -printf " Crosstool: ${tf_crosstool}\n" -printf " Compiler: ${tf_compiler}\n" -printf " TF_SYSROOT: ${tf_sysroot}\n" -printf " Python version: " -python3 --version | cut -d' ' -f2 - printf "\n:::::::: Starting Bazel build ::::::::\n\n" -bazel build \ - --cxxopt=-O3 --cxxopt=-msse2 --cxxopt=-msse3 --cxxopt=-msse4 \ - ${extra_bazel_options} \ - --crosstool_top="${tf_crosstool}" \ - --host_crosstool_top="${tf_crosstool}" \ - --extra_toolchains="${tf_crosstool}-linux-x86_64" \ - --repo_env=CC="${tf_compiler}" \ - --repo_env=TF_SYSROOT="${tf_sysroot}" \ - release:build_pip_package - +bazel build ${build_flags} release:build_pip_package printf "\n:::::::: Creating Python wheel ::::::::\n\n" bazel-bin/release/build_pip_package /build_output/ - if [[ "${cleanup}" == "true" ]]; then printf "\n:::::::: Cleaning up ::::::::\n\n" bazel clean --async @@ -128,15 +126,31 @@ EOF chmod +x "${build_script}" -echo "Spinning up a Docker container with ${docker_image} …" -docker run -it --rm --network host \ +# Use 'set --' to build the command in the positional parameters ($1, $2, ...) +set -- docker run -it --rm --network host \ -w /tfq \ -v "${repo_dir}":/tfq \ -v /tmp/tensorflow_quantum:/build_output \ -v "${build_script}:/tmp/build_script.sh" \ -e HOST_PERMS="$(id -u):$(id -g)" \ + -e build_flags="--crosstool_top=${crosstool} ${BUILD_OPTIONS}" \ + -e cuda_version="${cuda_version}" \ + -e py_version="${py_version}" \ + -e tf_version="${tf_version}" \ + -e docker_image="${docker_image}" \ + -e crosstool="${crosstool}" \ + -e cleanup="${cleanup}" \ "${docker_image}" \ /tmp/build_script.sh -echo "Done. Look for wheel in /tmp/tensorflow_quantum/." -ls -l /tmp/tensorflow_quantum/ +if [[ "${dry_run}" == "true" ]]; then + # Loop through the positional parameters and simply print them. + printf "(Dry run) " + printf '%s ' "$@" +else + echo "Spinning up a Docker container with ${docker_image} …" + "$@" + + echo "Done. Look for wheel in /tmp/tensorflow_quantum/." + ls -l /tmp/tensorflow_quantum/ +fi diff --git a/release/build_pip_package.sh b/release/build_pip_package.sh index d8654e719..02538b871 100755 --- a/release/build_pip_package.sh +++ b/release/build_pip_package.sh @@ -62,7 +62,6 @@ main() { echo "=== Copying TFQ files" # Copy over files necessary to run setup.py - cp "${EXPORT_DIR}/README.md" "${TMPDIR}" cp "${EXPORT_DIR}/release/setup.py" "${TMPDIR}" cp "${EXPORT_DIR}/release/MANIFEST.in" "${TMPDIR}" mkdir "${TMPDIR}/tensorflow_quantum" diff --git a/release/clean_distribution.sh b/release/clean_distribution.sh index 333aac357..38600af56 100755 --- a/release/clean_distribution.sh +++ b/release/clean_distribution.sh @@ -39,6 +39,7 @@ docker_image="quay.io/pypa/manylinux_2_34_x86_64" platform="manylinux_2_17_x86_64" py_version=$(python3 --version | cut -d' ' -f2 | cut -d. -f1,2) action="repair" +verbose="" usage="Usage: ${0} [OPTIONS] /path/to/wheel.whl Run auditwheel on the given wheel file. Available options: @@ -50,15 +51,20 @@ Configuration options: General options: -h Show this help message and exit - -s Run 'auditwheel show', not repair (default: run 'auditwheel repair')" + -n Dry run: print commands but don't execute them + -s Run 'auditwheel show', not repair (default: run 'auditwheel repair') + -v Produce verbose output" -while getopts "hm:p:st:" opt; do +dry_run="false" +while getopts "hm:np:st:v" opt; do case "${opt}" in h) echo "${usage}"; exit 0 ;; m) docker_image="${OPTARG}" ;; + n) dry_run="true" ;; p) py_version="${OPTARG}" ;; s) action="show" ;; t) platform="${OPTARG}" ;; + v) verbose="--verbose" ;; *) quit "${usage}" ;; esac done @@ -70,21 +76,28 @@ fi wheel_path="$(cd "$(dirname "${1}")" && pwd)/$(basename "${1}")" wheel_name="$(basename "${1}")" -auditwheel_args=() +args="" if [[ "${action}" == "repair" ]]; then - auditwheel_args+=( - "--exclude" "libtensorflow_framework.so.2" - "--plat" "${platform}" - "-w" "/tfq/wheelhouse" - ) + args="${verbose} --exclude libtensorflow_framework.so.2 --plat ${platform}" fi -echo "Running 'auditwheel ${action}' in Docker with image ${docker_image}" -docker run -it --rm --network host \ +# Use 'set --' to build the command in the positional parameters ($1, $2, ...) +set -- docker run -it --rm --network host \ -w /tfq \ -v "${repo_dir}":/tfq \ -v "${wheel_path}":"/tmp/${wheel_name}" \ "${docker_image}" \ - auditwheel "${action}" "${auditwheel_args[@]}" "/tmp/${wheel_name}" + bash -c "auditwheel ${action} ${args} -w /tfq/wheelhouse /tmp/${wheel_name}" -echo "Done. New wheel file written to ${repo_dir}/wheelhouse" +if [[ "${dry_run}" == "true" ]]; then + # Loop through the positional parameters and simply print them. + printf "(Dry run) " + printf '%s ' "$@" + echo +else + echo "Running 'auditwheel ${action}' in Docker with image ${docker_image}" + "$@" + if [[ "${action}" == "repair" ]]; then + echo "Done. New wheel file written to ${repo_dir}/wheelhouse" + fi +fi diff --git a/release/setup.py b/release/setup.py index e99c35ca3..a63019563 100644 --- a/release/setup.py +++ b/release/setup.py @@ -61,22 +61,7 @@ def read_version(): CUR_VERSION = read_version() - -def read_readme(): - """Return the project README contents for PyPI.""" - - setup_dir = Path(__file__).resolve().parent - - # setup.py runs from release/ in the source tree, but it is copied to the - # package root in the wheel build tmpdir. - if (setup_dir / "tensorflow_quantum").is_dir(): - readme_path = setup_dir / "README.md" - else: - readme_path = setup_dir.parent / "README.md" - - if not readme_path.is_file(): - raise RuntimeError(f"Could not find README.md at: {readme_path}") - return readme_path.read_text(encoding="utf-8") +DOCLINES = __doc__.split("\n") class InstallPlatlib(install): @@ -94,12 +79,12 @@ def finalize_options(self): "numpy>=2,<3", "scipy>=1.15.3,<2", "sympy==1.14", - "tf-keras>=2.18,<2.19", + "tf-keras>=2.19,<2.20", # The following are transitive dependencies that need to be constrained to # avoid incompatible versions or because some (e.g., contourpy 1.3.3) # require Python 3.11+ and we want to maintain Python 3.10 compatibility. - # TODO: revisit after we reach compatibility with TensorFlow 2.19+. + # TODO: revisit after we reach compatibility with TensorFlow 2.20+. "jax>=0.5,<0.6", "contourpy<=1.3.2", ] @@ -108,7 +93,7 @@ def finalize_options(self): # installations. Users can run "pip install tensorflow-quantum[and-tensorflow]" # to get everything in one go (or "pip install tensorflow tensorflow-quantum"). EXTRA_PACKAGES = {} -EXTRA_PACKAGES["and-tensorflow"] = ["tensorflow>=2.18,<2.19"] +EXTRA_PACKAGES["and-tensorflow"] = ["tensorflow>=2.19.1,<2.20"] # "extras" was used before 0.7.4. Prefer "and-tensorflow" in 0.7.4+. EXTRA_PACKAGES["extras"] = EXTRA_PACKAGES["and-tensorflow"] @@ -136,7 +121,7 @@ def has_ext_modules(self): name=PROJECT_NAME, version=BUILD_VERSION, description="Library for hybrid quantum-classical machine learning.", - long_description=read_readme(), + long_description="\n".join(DOCLINES[2:]), long_description_content_type="text/markdown", author="The TensorFlow Quantum Authors", author_email="tensorflow-quantum-team@google.com", diff --git a/requirements.in b/requirements.in index 1fc1a2c9a..c350f9d7e 100644 --- a/requirements.in +++ b/requirements.in @@ -23,8 +23,8 @@ jax>=0.5,<0.6 numpy<=2.2.6 scipy<1.16 sympy==1.14 -tensorflow>=2.18,<2.19 -tf-keras~=2.18.0 +tensorflow>=2.19.1,<2.20 +tf-keras~=2.19.0 wheel==0.46.2 # TODO: the next ones are not truly core requirements. A better place should be diff --git a/requirements.txt b/requirements.txt index 210c06f29..399dd925d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,144 +4,1132 @@ # # ./scripts/generate_requirements.sh # -absl-py==2.4.0 +absl-py==2.4.0 \ + --hash=sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d \ + --hash=sha256:8c6af82722b35cf71e0f4d1d47dcaebfff286e27110a99fc359349b247dfb5d4 # via # keras # tensorboard # tensorflow # tensorflow-docs -astor==0.8.1 +astor==0.8.1 \ + --hash=sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5 \ + --hash=sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e # via tensorflow-docs -astroid==3.3.11 +astroid==3.3.11 \ + --hash=sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce \ + --hash=sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec # via pylint -astunparse==1.6.3 +astunparse==1.6.3 \ + --hash=sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872 \ + --hash=sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 # via tensorflow -attrs==25.4.0 +attrs==26.1.0 \ + --hash=sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 \ + --hash=sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32 # via # cirq-core # jsonschema # referencing # typedunits -certifi==2026.1.4 +certifi==2026.4.22 \ + --hash=sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a \ + --hash=sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580 # via requests -cffi==2.0.0 +cffi==2.0.0 \ + --hash=sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb \ + --hash=sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b \ + --hash=sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f \ + --hash=sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9 \ + --hash=sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44 \ + --hash=sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2 \ + --hash=sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c \ + --hash=sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 \ + --hash=sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65 \ + --hash=sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e \ + --hash=sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a \ + --hash=sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e \ + --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 \ + --hash=sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a \ + --hash=sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe \ + --hash=sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b \ + --hash=sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91 \ + --hash=sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592 \ + --hash=sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187 \ + --hash=sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c \ + --hash=sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1 \ + --hash=sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94 \ + --hash=sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba \ + --hash=sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb \ + --hash=sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165 \ + --hash=sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529 \ + --hash=sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca \ + --hash=sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c \ + --hash=sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6 \ + --hash=sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c \ + --hash=sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0 \ + --hash=sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743 \ + --hash=sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63 \ + --hash=sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5 \ + --hash=sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5 \ + --hash=sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4 \ + --hash=sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d \ + --hash=sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b \ + --hash=sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93 \ + --hash=sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205 \ + --hash=sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27 \ + --hash=sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512 \ + --hash=sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d \ + --hash=sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c \ + --hash=sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037 \ + --hash=sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26 \ + --hash=sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322 \ + --hash=sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb \ + --hash=sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c \ + --hash=sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8 \ + --hash=sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4 \ + --hash=sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414 \ + --hash=sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9 \ + --hash=sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664 \ + --hash=sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9 \ + --hash=sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775 \ + --hash=sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739 \ + --hash=sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc \ + --hash=sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062 \ + --hash=sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe \ + --hash=sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9 \ + --hash=sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92 \ + --hash=sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5 \ + --hash=sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 \ + --hash=sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d \ + --hash=sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 \ + --hash=sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f \ + --hash=sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495 \ + --hash=sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b \ + --hash=sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6 \ + --hash=sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c \ + --hash=sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef \ + --hash=sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5 \ + --hash=sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18 \ + --hash=sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad \ + --hash=sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3 \ + --hash=sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7 \ + --hash=sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5 \ + --hash=sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534 \ + --hash=sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49 \ + --hash=sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2 \ + --hash=sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5 \ + --hash=sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453 \ + --hash=sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf # via cryptography -charset-normalizer==3.4.4 +charset-normalizer==3.4.7 \ + --hash=sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc \ + --hash=sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c \ + --hash=sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67 \ + --hash=sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4 \ + --hash=sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0 \ + --hash=sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c \ + --hash=sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5 \ + --hash=sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444 \ + --hash=sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153 \ + --hash=sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9 \ + --hash=sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01 \ + --hash=sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217 \ + --hash=sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b \ + --hash=sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c \ + --hash=sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a \ + --hash=sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83 \ + --hash=sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5 \ + --hash=sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7 \ + --hash=sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb \ + --hash=sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c \ + --hash=sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1 \ + --hash=sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42 \ + --hash=sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab \ + --hash=sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df \ + --hash=sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e \ + --hash=sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207 \ + --hash=sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18 \ + --hash=sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734 \ + --hash=sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38 \ + --hash=sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 \ + --hash=sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18 \ + --hash=sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44 \ + --hash=sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d \ + --hash=sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48 \ + --hash=sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e \ + --hash=sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5 \ + --hash=sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d \ + --hash=sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53 \ + --hash=sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790 \ + --hash=sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c \ + --hash=sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b \ + --hash=sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 \ + --hash=sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d \ + --hash=sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10 \ + --hash=sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6 \ + --hash=sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2 \ + --hash=sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776 \ + --hash=sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a \ + --hash=sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265 \ + --hash=sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008 \ + --hash=sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943 \ + --hash=sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374 \ + --hash=sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246 \ + --hash=sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e \ + --hash=sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5 \ + --hash=sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616 \ + --hash=sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15 \ + --hash=sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41 \ + --hash=sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960 \ + --hash=sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752 \ + --hash=sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e \ + --hash=sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72 \ + --hash=sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7 \ + --hash=sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8 \ + --hash=sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b \ + --hash=sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4 \ + --hash=sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545 \ + --hash=sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706 \ + --hash=sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366 \ + --hash=sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb \ + --hash=sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a \ + --hash=sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e \ + --hash=sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00 \ + --hash=sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f \ + --hash=sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a \ + --hash=sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1 \ + --hash=sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66 \ + --hash=sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356 \ + --hash=sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319 \ + --hash=sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4 \ + --hash=sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad \ + --hash=sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d \ + --hash=sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5 \ + --hash=sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7 \ + --hash=sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0 \ + --hash=sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686 \ + --hash=sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34 \ + --hash=sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49 \ + --hash=sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c \ + --hash=sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1 \ + --hash=sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e \ + --hash=sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60 \ + --hash=sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0 \ + --hash=sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274 \ + --hash=sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d \ + --hash=sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0 \ + --hash=sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae \ + --hash=sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f \ + --hash=sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d \ + --hash=sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe \ + --hash=sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3 \ + --hash=sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393 \ + --hash=sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1 \ + --hash=sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af \ + --hash=sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44 \ + --hash=sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00 \ + --hash=sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c \ + --hash=sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3 \ + --hash=sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7 \ + --hash=sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd \ + --hash=sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e \ + --hash=sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b \ + --hash=sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8 \ + --hash=sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259 \ + --hash=sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859 \ + --hash=sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46 \ + --hash=sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30 \ + --hash=sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b \ + --hash=sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 \ + --hash=sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24 \ + --hash=sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a \ + --hash=sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24 \ + --hash=sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc \ + --hash=sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215 \ + --hash=sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 \ + --hash=sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832 \ + --hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \ + --hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \ + --hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464 # via requests -cirq-core==1.5.0 +cirq-core==1.5.0 \ + --hash=sha256:104a574c766011c979e897f0fb5e90eb69a2b58ec1dc389a73495e63124923d0 # via # -r requirements.in # cirq-google -cirq-google==1.5.0 +cirq-google==1.5.0 \ + --hash=sha256:e8092a248a62fe130e14bc47830d63a6d26f4e586f9572de70dfd82c1cde70a5 # via -r requirements.in -clang-format==18.1.8 +clang-format==18.1.8 \ + --hash=sha256:03e0a762b4b504750ce4999174fa50a3c4d6b83d7999481e1b6a1b3bc2915121 \ + --hash=sha256:065ddb7fdd0cb329976115fa03500dd560d9753dd50c25a269776648e6e6bf35 \ + --hash=sha256:2a73a50e17c94325712631c15e5b210e374841bbeefb915f12934b902310df7b \ + --hash=sha256:2de122b8aa78ba49e326f974131caab2c79f4ae877c227cd4e3e5d82a98d21e5 \ + --hash=sha256:310206c21fa8177c019a3871de8c5400e51867376cae630ee3d1610aa6c93816 \ + --hash=sha256:4762e95ea887d522bf664c1411d93d4d41fc9eb059835dd88b9ad54bc3cb08e0 \ + --hash=sha256:4be2b5d983a0cc1ef90a224b599f5928d82ce31154ba69accfdcb670aea62f40 \ + --hash=sha256:6ca6768270e291495174faa6d8c082aa0181722b29ef8e36558b397069fa4a2d \ + --hash=sha256:7c41e2521b7e6ba706cc5d1c3e95eed9a41c1522244e23624e1518991f02a604 \ + --hash=sha256:7d71869103d0f27be3c4930bea59dc6325177a259ba321a04663a231432ec343 \ + --hash=sha256:82c5dd546efa80a838bb9fd4cf6f6e37d85301c0bca13cd79ab5749422ca35a1 \ + --hash=sha256:c11ecdae9cd9068ed010b7cc5fa9d3d2ae08de8bbfa493df865774ad63fd7d76 \ + --hash=sha256:d2db077523bd4517b41fa6adb2e5ee63fc91bc7b641dc6e28b959fa8050cf41b \ + --hash=sha256:d3a41b7c7c3e65fa56763f5712f919111b35d7a8e857f8bef4ad5a4cdc1be131 \ + --hash=sha256:ea103b3ae5b0941152cd29c67eab086aafc98675370ac13581005807680132aa # via -r requirements.in -contourpy==1.3.2 +contourpy==1.3.2 \ + --hash=sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f \ + --hash=sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92 \ + --hash=sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16 \ + --hash=sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f \ + --hash=sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f \ + --hash=sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7 \ + --hash=sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e \ + --hash=sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08 \ + --hash=sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841 \ + --hash=sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5 \ + --hash=sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2 \ + --hash=sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415 \ + --hash=sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878 \ + --hash=sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0 \ + --hash=sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab \ + --hash=sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445 \ + --hash=sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43 \ + --hash=sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c \ + --hash=sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823 \ + --hash=sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69 \ + --hash=sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15 \ + --hash=sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef \ + --hash=sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5 \ + --hash=sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73 \ + --hash=sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9 \ + --hash=sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912 \ + --hash=sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5 \ + --hash=sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85 \ + --hash=sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d \ + --hash=sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631 \ + --hash=sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2 \ + --hash=sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54 \ + --hash=sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773 \ + --hash=sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934 \ + --hash=sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a \ + --hash=sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441 \ + --hash=sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422 \ + --hash=sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532 \ + --hash=sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739 \ + --hash=sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b \ + --hash=sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f \ + --hash=sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1 \ + --hash=sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87 \ + --hash=sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52 \ + --hash=sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1 \ + --hash=sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd \ + --hash=sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989 \ + --hash=sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb \ + --hash=sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f \ + --hash=sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad \ + --hash=sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9 \ + --hash=sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512 \ + --hash=sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd \ + --hash=sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83 \ + --hash=sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe \ + --hash=sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0 \ + --hash=sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c # via # -r requirements.in # matplotlib -cryptography==46.0.4 +cryptography==48.0.0 \ + --hash=sha256:0890f502ddf7d9c6426129c3f49f5c0a39278ed7cd6322c8755ffca6ee675a13 \ + --hash=sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6 \ + --hash=sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8 \ + --hash=sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25 \ + --hash=sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c \ + --hash=sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832 \ + --hash=sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12 \ + --hash=sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c \ + --hash=sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7 \ + --hash=sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c \ + --hash=sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec \ + --hash=sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5 \ + --hash=sha256:4defde8685ae324a9eb9d818717e93b4638ef67070ac9bc15b8ca85f63048355 \ + --hash=sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c \ + --hash=sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741 \ + --hash=sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86 \ + --hash=sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321 \ + --hash=sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a \ + --hash=sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7 \ + --hash=sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920 \ + --hash=sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e \ + --hash=sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff \ + --hash=sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd \ + --hash=sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3 \ + --hash=sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f \ + --hash=sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602 \ + --hash=sha256:84cf79f0dc8b36ac5da873481716e87aef31fcfa0444f9e1d8b4b2cece142855 \ + --hash=sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18 \ + --hash=sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a \ + --hash=sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336 \ + --hash=sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239 \ + --hash=sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74 \ + --hash=sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a \ + --hash=sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c \ + --hash=sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4 \ + --hash=sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c \ + --hash=sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f \ + --hash=sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4 \ + --hash=sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db \ + --hash=sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166 \ + --hash=sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5 \ + --hash=sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f \ + --hash=sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae \ + --hash=sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20 \ + --hash=sha256:db63bf618e5dea46c07de12e900fe1cdd2541e6dc9dbae772a70b7d4d4765f6a \ + --hash=sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057 \ + --hash=sha256:ecde28a596bead48b0cfd2a1b4416c3d43074c2d785e3a398d7ec1fc4d0f7fbb \ + --hash=sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c \ + --hash=sha256:fdfef35d751d510fcef5252703621574364fec16418c4a1e5e1055248401054b # via google-auth -cycler==0.12.1 +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c # via matplotlib -cython==3.2.4 +cython==3.2.4 \ + --hash=sha256:02cb0cc0f23b9874ad262d7d2b9560aed9c7e2df07b49b920bda6f2cc9cb505e \ + --hash=sha256:03893c88299a2c868bb741ba6513357acd104e7c42265809fd58dce1456a36fc \ + --hash=sha256:14dae483ca2838b287085ff98bc206abd7a597b7bb16939a092f8e84d9062842 \ + --hash=sha256:1a64a112a34ec719b47c01395647e54fb4cf088a511613f9a3a5196694e8e382 \ + --hash=sha256:28b1e363b024c4b8dcf52ff68125e635cb9cb4b0ba997d628f25e32543a71103 \ + --hash=sha256:28e8075087a59756f2d059273184b8b639fe0f16cf17470bd91c39921bc154e0 \ + --hash=sha256:2b1f12c0e4798293d2754e73cd6f35fa5bbdf072bdc14bc6fc442c059ef2d290 \ + --hash=sha256:31a90b4a2c47bb6d56baeb926948348ec968e932c1ae2c53239164e3e8880ccf \ + --hash=sha256:35ab0632186057406ec729374c737c37051d2eacad9d515d94e5a3b3e58a9b02 \ + --hash=sha256:36bf3f5eb56d5281aafabecbaa6ed288bc11db87547bba4e1e52943ae6961ccf \ + --hash=sha256:3b6e58f73a69230218d5381817850ce6d0da5bb7e87eb7d528c7027cbba40b06 \ + --hash=sha256:3b8e62049afef9da931d55de82d8f46c9a147313b69d5ff6af6e9121d545ce7a \ + --hash=sha256:55b6c44cd30821f0b25220ceba6fe636ede48981d2a41b9bbfe3c7902ce44ea7 \ + --hash=sha256:55eb425c0baf1c8a46aa4424bc35b709db22f3c8a1de33adb3ecb8a3d54ea42a \ + --hash=sha256:64d7f71be3dd6d6d4a4c575bb3a4674ea06d1e1e5e4cd1b9882a2bc40ed3c4c9 \ + --hash=sha256:67922c9de058a0bfb72d2e75222c52d09395614108c68a76d9800f150296ddb3 \ + --hash=sha256:6d5267f22b6451eb1e2e1b88f6f78a2c9c8733a6ddefd4520d3968d26b824581 \ + --hash=sha256:72e6c0bbd978e2678b45351395f6825b9b8466095402eae293f4f7a73e9a3e85 \ + --hash=sha256:732fc93bc33ae4b14f6afaca663b916c2fdd5dcbfad7114e17fb2434eeaea45c \ + --hash=sha256:767b143704bdd08a563153448955935844e53b852e54afdc552b43902ed1e235 \ + --hash=sha256:83266c356c13c68ffe658b4905279c993d8a5337bb0160fa90c8a3e297ea9a2e \ + --hash=sha256:84226ecd313b233da27dc2eb3601b4f222b8209c3a7216d8733b031da1dc64e6 \ + --hash=sha256:869487ea41d004f8b92171f42271fbfadb1ec03bede3158705d16cd570d6b891 \ + --hash=sha256:90f43be4eaa6afd58ce20d970bb1657a3627c44e1760630b82aa256ba74b4acb \ + --hash=sha256:983f9d2bb8a896e16fa68f2b37866ded35fa980195eefe62f764ddc5f9f5ef8e \ + --hash=sha256:b362819d155fff1482575e804e43e3a8825332d32baa15245f4642022664a3f4 \ + --hash=sha256:b84d4e3c875915545f77c88dba65ad3741afd2431e5cdee6c9a20cefe6905647 \ + --hash=sha256:ca2399dc75796b785f74fb85c938254fa10c80272004d573c455f9123eceed86 \ + --hash=sha256:ca578c9cb872c7ecffbe14815dc4590a003bc13339e90b2633540c7e1a252839 \ + --hash=sha256:d4b4fd5332ab093131fa6172e8362f16adef3eac3179fd24bbdc392531cb82fa \ + --hash=sha256:e3b5ac54e95f034bc7fb07313996d27cbf71abc17b229b186c1540942d2dc28e \ + --hash=sha256:e65e4773021f8dc8532010b4fbebe782c77f9a0817e93886e518c93bd6a44e9d \ + --hash=sha256:e71efb20048358a6b8ec604a0532961c50c067b5e63e345e2e359fff72feaee8 \ + --hash=sha256:f136f379a4a54246facd0eb6f1ee15c3837cb314ce87b677582ec014db4c6845 \ + --hash=sha256:f583cad7a7eed109f0babb5035e92d0c1260598f53add626a8568b57246b62c3 \ + --hash=sha256:f81eda419b5ada7b197bbc3c5f4494090e3884521ffd75a3876c93fbf66c9ca8 \ + --hash=sha256:f8d685a70bce39acc1d62ec3916d9b724b5ef665b0ce25ae55e1c85ee09747fc \ + --hash=sha256:fdfdd753ad7e18e5092b413e9f542e8d28b8a08203126090e1c15f7783b7fe57 \ + --hash=sha256:ff9af2134c05e3734064808db95b4dd7341a39af06e8945d05ea358e1741aaed # via typedunits -dill==0.4.1 +dill==0.4.1 \ + --hash=sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d \ + --hash=sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa # via pylint -duet==0.2.9 +duet==0.2.9 \ + --hash=sha256:a16088b68b0faee8aee12cdf4d0a8af060ed958badb44f3e32f123f13f64119a \ + --hash=sha256:d6fa39582e6a3dce1096c47e5fbcbda648a633eed94a38943e68662afa2587f3 # via cirq-core -flatbuffers==25.12.19 +flatbuffers==25.12.19 \ + --hash=sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4 # via tensorflow -fonttools==4.60.2 +fonttools==4.62.1 \ + --hash=sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04 \ + --hash=sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a \ + --hash=sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9 \ + --hash=sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392 \ + --hash=sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82 \ + --hash=sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d \ + --hash=sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b \ + --hash=sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e \ + --hash=sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416 \ + --hash=sha256:2d850f66830a27b0d498ee05adb13a3781637b1826982cd7e2b3789ef0cc71ae \ + --hash=sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069 \ + --hash=sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9 \ + --hash=sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7 \ + --hash=sha256:486f32c8047ccd05652aba17e4a8819a3a9d78570eb8a0e3b4503142947880ed \ + --hash=sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800 \ + --hash=sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e \ + --hash=sha256:5a648bde915fba9da05ae98856987ca91ba832949a9e2888b48c47ef8b96c5a9 \ + --hash=sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b \ + --hash=sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1 \ + --hash=sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe \ + --hash=sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7 \ + --hash=sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd \ + --hash=sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056 \ + --hash=sha256:7bca7a1c1faf235ffe25d4f2e555246b4750220b38de8261d94ebc5ce8a23c23 \ + --hash=sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae \ + --hash=sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260 \ + --hash=sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974 \ + --hash=sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87 \ + --hash=sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24 \ + --hash=sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53 \ + --hash=sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936 \ + --hash=sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14 \ + --hash=sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42 \ + --hash=sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c \ + --hash=sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1 \ + --hash=sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca \ + --hash=sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c \ + --hash=sha256:b4e0fcf265ad26e487c56cb12a42dffe7162de708762db951e1b3f755319507d \ + --hash=sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a \ + --hash=sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782 \ + --hash=sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c \ + --hash=sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a \ + --hash=sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79 \ + --hash=sha256:c9b9e288b4da2f64fd6180644221749de651703e8d0c16bd4b719533a3a7d6e3 \ + --hash=sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7 \ + --hash=sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d \ + --hash=sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2 \ + --hash=sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4 \ + --hash=sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68 \ + --hash=sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca # via matplotlib -gast==0.7.0 +gast==0.7.0 \ + --hash=sha256:0bb14cd1b806722e91ddbab6fb86bba148c22b40e7ff11e248974e04c8adfdae \ + --hash=sha256:99cbf1365633a74099f69c59bd650476b96baa5ef196fec88032b00b31ba36f7 # via tensorflow -google-api-core[grpc]==2.29.0 +google-api-core[grpc]==2.30.3 \ + --hash=sha256:a85761ba72c444dad5d611c2220633480b2b6be2521eca69cca2dbb3ffd6bfe8 \ + --hash=sha256:e601a37f148585319b26db36e219df68c5d07b6382cff2d580e83404e44d641b # via cirq-google -google-auth==2.48.0 +google-auth==2.52.0 \ + --hash=sha256:01f30e1a9e3638698d89464f5e603ce29d18e1c0e63ec31ac570aba4e164aaf5 \ + --hash=sha256:aee92803ba0ff93a70a3b8a35c7b4797837751cd6380b63ff38372b98f3ed627 # via google-api-core -google-pasta==0.2.0 +google-pasta==0.2.0 \ + --hash=sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954 \ + --hash=sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed \ + --hash=sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e # via tensorflow -googleapis-common-protos==1.72.0 +googleapis-common-protos==1.75.0 \ + --hash=sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd \ + --hash=sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed # via # google-api-core # grpcio-status -grpcio==1.76.0 +grpcio==1.80.0 \ + --hash=sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1 \ + --hash=sha256:02e64bb0bb2da14d947a49e6f120a75e947250aebe65f9629b62bb1f5c14e6e9 \ + --hash=sha256:05d55e1798756282cddd52d56c896b3e7d673e3a8798c2f1cd05ba249a3bb4de \ + --hash=sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab \ + --hash=sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921 \ + --hash=sha256:1b97cd29a8eda100b559b455331c487a80915b6ea6bd91cf3e89836c4ee8d957 \ + --hash=sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f \ + --hash=sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257 \ + --hash=sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d \ + --hash=sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05 \ + --hash=sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd \ + --hash=sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e \ + --hash=sha256:33eb763f18f006dc7fee1e69831d38d23f5eccd15b2e0f92a13ee1d9242e5e02 \ + --hash=sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae \ + --hash=sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f \ + --hash=sha256:3cb8130ba457d2aa09fa6b7c3ed6b6e4e6a2685fce63cb803d479576c4d80e21 \ + --hash=sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e \ + --hash=sha256:43168871f170d1e4ed16ae03d10cd21efa29f190e710a624cee7e5ae07da6f4f \ + --hash=sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1 \ + --hash=sha256:4560cf0e86514595dbbd330cd65b7afad4b5c4b8c4905c041cfffa138d45e6fd \ + --hash=sha256:46c2390b59d67f84e882694d489f5b45707c657832d7934859ceb8c33f467069 \ + --hash=sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411 \ + --hash=sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14 \ + --hash=sha256:50a9871536d71c4fba24ee856abc03a87764570f0c457dd8db0b4018f379fed9 \ + --hash=sha256:51b4a7189b0bef2aa30adce3c78f09c83526cf3dddb24c6a96555e3b97340440 \ + --hash=sha256:52d143637e3872633fc7dd7c3c6a1c84e396b359f3a72e215f8bf69fd82084fc \ + --hash=sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060 \ + --hash=sha256:627fb7312171cdc52828bd6fac8d7028ff2a64b89f1957b6f3416caa2218d141 \ + --hash=sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6 \ + --hash=sha256:7b641fc3f1dc647bfd80bd713addc68f6d145956f64677e56d9ebafc0bd72388 \ + --hash=sha256:8502122a3cc1714038e39a0b071acb1207ca7844208d5ea0d091317555ee7106 \ + --hash=sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140 \ + --hash=sha256:886457a7768e408cdce226ad1ca67d2958917d306523a0e21e1a2fdaa75c9c9c \ + --hash=sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f \ + --hash=sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7 \ + --hash=sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0 \ + --hash=sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294 \ + --hash=sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f \ + --hash=sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff \ + --hash=sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f \ + --hash=sha256:a361c20ec1ccd3c3953d20fb6d7b4125093bdd10dff44c5e2bbb39e58917cedc \ + --hash=sha256:a72d84ad0514db063e21887fbacd1fd7acb4d494a564cae22227cd45c7fbf199 \ + --hash=sha256:aacdfb4ed3eb919ca997504d27e03d5dba403c85130b8ed450308590a738f7a4 \ + --hash=sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2 \ + --hash=sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7 \ + --hash=sha256:bac1d573dfa84ce59a5547073e28fa7326d53352adda6912e362da0b917fcef4 \ + --hash=sha256:c51bf8ac4575af2e0678bccfb07e47321fc7acb5049b4482832c5c195e04e13a \ + --hash=sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0 \ + --hash=sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193 \ + --hash=sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6 \ + --hash=sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de \ + --hash=sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f \ + --hash=sha256:dc053420fc75749c961e2a4c906398d7c15725d36ccc04ae6d16093167223b58 \ + --hash=sha256:deb10a1528473c11f72a0939eed36d83e847d7cbb63e8cc5611fb7a912d38614 \ + --hash=sha256:dfab85db094068ff42e2a3563f60ab3dddcc9d6488a35abf0132daec13209c8a \ + --hash=sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50 \ + --hash=sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad \ + --hash=sha256:ec0a592e926071b4abad50c1495cd0d0d513324b3ff5e7267067c33ba27506e4 \ + --hash=sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9 \ + --hash=sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2 \ + --hash=sha256:f7691a6788ad9196872f95716df5bc643ebba13c97140b7a5ee5c8e75d1dea81 # via # google-api-core # grpcio-status # tensorboard # tensorflow -grpcio-status==1.71.2 +grpcio-status==1.71.2 \ + --hash=sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3 \ + --hash=sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50 # via google-api-core -h5py==3.15.1 +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 # via # keras # tensorflow -idna==3.11 +idna==3.15 \ + --hash=sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 \ + --hash=sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc # via requests -ipython-genutils==0.2.0 +ipython-genutils==0.2.0 \ + --hash=sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8 \ + --hash=sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8 # via nbformat -isort==5.13.2 +isort==5.13.2 \ + --hash=sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109 \ + --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 # via pylint -jax==0.5.3 +jax==0.5.3 \ + --hash=sha256:1483dc237b4f47e41755d69429e8c3c138736716147cd43bb2b99b259d4e3c41 \ + --hash=sha256:f17fcb0fd61dc289394af6ce4de2dada2312f2689bb0d73642c6f026a95fbb2c # via -r requirements.in -jaxlib==0.5.3 +jaxlib==0.5.3 \ + --hash=sha256:29e1530fc81833216f1e28b578d0c59697654f72ee31c7a44ed7753baf5ac466 \ + --hash=sha256:31321c25282a06a6dfc940507bc14d0a0ac838d8ced6c07aa00a7fae34ce7b3f \ + --hash=sha256:48ff5c89fb8a0fe04d475e9ddc074b4879a91d7ab68a51cec5cd1e87f81e6c47 \ + --hash=sha256:4c9a9d4cda091a3ef068ace8379fff9e98eea2fc51dbdd7c3386144a1bdf715d \ + --hash=sha256:520665929649f29f7d948d4070dbaf3e032a4c1f7c11f2863eac73320fcee784 \ + --hash=sha256:52be6c9775aff738a61170d8c047505c75bb799a45518e66a7a0908127b11785 \ + --hash=sha256:5a5e88ab1cd6fdf78d69abe3544e8f09cce200dd339bb85fbe3c2ea67f2a5e68 \ + --hash=sha256:8019f73a10b1290f988dd3768c684f3a8a147239091c3b790ce7e47e3bbc00bd \ + --hash=sha256:8eb54e38d789557579f900ea3d70f104a440f8555a9681ed45f4a122dcbfd92e \ + --hash=sha256:972400db4af6e85270d81db5e6e620d31395f0472e510c50dfcd4cb3f72b7220 \ + --hash=sha256:a4666f81d72c060ed3e581ded116a9caa9b0a70a148a54cb12a1d3afca3624b5 \ + --hash=sha256:b41a6fcaeb374fabc4ee7e74cfed60843bdab607cd54f60a68b7f7655cde2b66 \ + --hash=sha256:b62bd8b29e5a4f9bfaa57c8daf6e04820b2c994f448f3dec602d64255545e9f2 \ + --hash=sha256:bb7593cb7fffcb13963f22fa5229ed960b8fb4ae5ec3b0820048cbd67f1e8e31 \ + --hash=sha256:bddf6360377aa1c792e47fd87f307c342e331e5ff3582f940b1bca00f6b4bc73 \ + --hash=sha256:d394dbde4a1c6bd67501cfb29d3819a10b900cb534cc0fc603319f7092f24cfa \ + --hash=sha256:e904b92dedfbc7e545725a8d7676987030ae9c069001d94701bc109c6dab4100 # via jax -jinja2==3.1.6 +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 # via tensorflow-docs -jsonschema==4.26.0 +jsonschema==4.26.0 \ + --hash=sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326 \ + --hash=sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce # via nbformat -jsonschema-specifications==2025.9.1 +jsonschema-specifications==2025.9.1 \ + --hash=sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe \ + --hash=sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d # via jsonschema -jupyter-client==8.8.0 +jupyter-client==8.8.0 \ + --hash=sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e \ + --hash=sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a # via nbclient -jupyter-core==5.9.1 +jupyter-core==5.9.1 \ + --hash=sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508 \ + --hash=sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407 # via # jupyter-client # nbformat -keras==3.12.0 +keras==3.12.2 \ + --hash=sha256:0433310d7d626d5cbbc58e98223b3a77ce7d7d4398bf7e169d4e8bdcf9ce0296 \ + --hash=sha256:e19c7c7f8f2a81e44d4f203e567731a15a270d8ef351060982b45a1fafdf3fce # via tensorflow -kiwisolver==1.4.7 +kiwisolver==1.5.0 \ + --hash=sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9 \ + --hash=sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679 \ + --hash=sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0 \ + --hash=sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8 \ + --hash=sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276 \ + --hash=sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96 \ + --hash=sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e \ + --hash=sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac \ + --hash=sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f \ + --hash=sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a \ + --hash=sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15 \ + --hash=sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7 \ + --hash=sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368 \ + --hash=sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02 \ + --hash=sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9 \ + --hash=sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681 \ + --hash=sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57 \ + --hash=sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27 \ + --hash=sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4 \ + --hash=sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920 \ + --hash=sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374 \ + --hash=sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3 \ + --hash=sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa \ + --hash=sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23 \ + --hash=sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859 \ + --hash=sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb \ + --hash=sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d \ + --hash=sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc \ + --hash=sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581 \ + --hash=sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c \ + --hash=sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099 \ + --hash=sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05 \ + --hash=sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9 \ + --hash=sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd \ + --hash=sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc \ + --hash=sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796 \ + --hash=sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303 \ + --hash=sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca \ + --hash=sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314 \ + --hash=sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489 \ + --hash=sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57 \ + --hash=sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1 \ + --hash=sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797 \ + --hash=sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021 \ + --hash=sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db \ + --hash=sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22 \ + --hash=sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028 \ + --hash=sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083 \ + --hash=sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65 \ + --hash=sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588 \ + --hash=sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0 \ + --hash=sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a \ + --hash=sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1 \ + --hash=sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c \ + --hash=sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac \ + --hash=sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476 \ + --hash=sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53 \ + --hash=sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3 \ + --hash=sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4 \ + --hash=sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615 \ + --hash=sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb \ + --hash=sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18 \ + --hash=sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b \ + --hash=sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1 \ + --hash=sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2 \ + --hash=sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c \ + --hash=sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac \ + --hash=sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d \ + --hash=sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf \ + --hash=sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2 \ + --hash=sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f \ + --hash=sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f \ + --hash=sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4 \ + --hash=sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9 \ + --hash=sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e \ + --hash=sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737 \ + --hash=sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b \ + --hash=sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed \ + --hash=sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3 \ + --hash=sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7 \ + --hash=sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08 \ + --hash=sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e \ + --hash=sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902 \ + --hash=sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd \ + --hash=sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6 \ + --hash=sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310 \ + --hash=sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537 \ + --hash=sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554 \ + --hash=sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e \ + --hash=sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87 \ + --hash=sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a \ + --hash=sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c \ + --hash=sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79 \ + --hash=sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e \ + --hash=sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16 \ + --hash=sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1 \ + --hash=sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875 \ + --hash=sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd \ + --hash=sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0 \ + --hash=sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9 \ + --hash=sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646 \ + --hash=sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657 \ + --hash=sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4 \ + --hash=sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232 \ + --hash=sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819 \ + --hash=sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384 \ + --hash=sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309 \ + --hash=sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede \ + --hash=sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2 \ + --hash=sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203 \ + --hash=sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7 \ + --hash=sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df \ + --hash=sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c \ + --hash=sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167 \ + --hash=sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3 \ + --hash=sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09 \ + --hash=sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398 # via matplotlib -libclang==18.1.1 +libclang==18.1.1 \ + --hash=sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a \ + --hash=sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8 \ + --hash=sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb \ + --hash=sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592 \ + --hash=sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f \ + --hash=sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5 \ + --hash=sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8 \ + --hash=sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250 \ + --hash=sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b \ + --hash=sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe # via tensorflow -markdown==3.10.1 +markdown==3.10.2 \ + --hash=sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950 \ + --hash=sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36 # via tensorboard -markdown-it-py==3.0.0 +markdown-it-py==4.2.0 \ + --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ + --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a # via rich -markupsafe==3.0.3 +markupsafe==3.0.3 \ + --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ + --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ + --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ + --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26 \ + --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \ + --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \ + --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \ + --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758 \ + --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \ + --hash=sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8 \ + --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ + --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2 \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ + --hash=sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b \ + --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ + --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \ + --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \ + --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ + --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \ + --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \ + --hash=sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7 \ + --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42 \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \ + --hash=sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc \ + --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 # via # jinja2 # werkzeug -matplotlib==3.9.4 +matplotlib==3.10.9 \ + --hash=sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9 \ + --hash=sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42 \ + --hash=sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d \ + --hash=sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b \ + --hash=sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37 \ + --hash=sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b \ + --hash=sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456 \ + --hash=sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc \ + --hash=sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f \ + --hash=sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6 \ + --hash=sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2 \ + --hash=sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4 \ + --hash=sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320 \ + --hash=sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20 \ + --hash=sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf \ + --hash=sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c \ + --hash=sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80 \ + --hash=sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9 \ + --hash=sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716 \ + --hash=sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585 \ + --hash=sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb \ + --hash=sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38 \ + --hash=sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4 \ + --hash=sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2 \ + --hash=sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217 \ + --hash=sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838 \ + --hash=sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4 \ + --hash=sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda \ + --hash=sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb \ + --hash=sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f \ + --hash=sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f \ + --hash=sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f \ + --hash=sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c \ + --hash=sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb \ + --hash=sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b \ + --hash=sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285 \ + --hash=sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294 \ + --hash=sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65 \ + --hash=sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e \ + --hash=sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d \ + --hash=sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f \ + --hash=sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8 \ + --hash=sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39 \ + --hash=sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6 \ + --hash=sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f \ + --hash=sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf \ + --hash=sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2 \ + --hash=sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe \ + --hash=sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99 \ + --hash=sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb \ + --hash=sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8 \ + --hash=sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1 \ + --hash=sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921 \ + --hash=sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba \ + --hash=sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358 # via cirq-core -mccabe==0.7.0 +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint -mdurl==0.1.2 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -ml-dtypes==0.5.4 +ml-dtypes==0.5.4 \ + --hash=sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf \ + --hash=sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d \ + --hash=sha256:14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f \ + --hash=sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483 \ + --hash=sha256:2314892cdc3fcf05e373d76d72aaa15fda9fb98625effa73c1d646f331fcecb7 \ + --hash=sha256:2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22 \ + --hash=sha256:304ad47faa395415b9ccbcc06a0350800bc50eda70f0e45326796e27c62f18b6 \ + --hash=sha256:35f29491a3e478407f7047b8a4834e4640a77d2737e0b294d049746507af5175 \ + --hash=sha256:388d399a2152dd79a3f0456a952284a99ee5c93d3e2f8dfe25977511e0515270 \ + --hash=sha256:3bbbe120b915090d9dd1375e4684dd17a20a2491ef25d640a908281da85e73f1 \ + --hash=sha256:3d277bf3637f2a62176f4575512e9ff9ef51d00e39626d9fe4a161992f355af2 \ + --hash=sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1 \ + --hash=sha256:4ff7f3e7ca2972e7de850e7b8fcbb355304271e2933dd90814c1cb847414d6e2 \ + --hash=sha256:531eff30e4d368cb6255bc2328d070e35836aa4f282a0fb5f3a0cd7260257298 \ + --hash=sha256:533ce891ba774eabf607172254f2e7260ba5f57bdd64030c9a4fcfbd99815d0d \ + --hash=sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de \ + --hash=sha256:5a0f68ca8fd8d16583dfa7793973feb86f2fbb56ce3966daf9c9f748f52a2049 \ + --hash=sha256:6a0df4223b514d799b8a1629c65ddc351b3efa833ccf7f8ea0cf654a61d1e35d \ + --hash=sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90 \ + --hash=sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb \ + --hash=sha256:805cef3a38f4eafae3a5bf9ebdcdb741d0bcfd9e1bd90eb54abd24f928cd2465 \ + --hash=sha256:88c982aac7cb1cbe8cbb4e7f253072b1df872701fcaf48d84ffbb433b6568f24 \ + --hash=sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453 \ + --hash=sha256:8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56 \ + --hash=sha256:8c760d85a2f82e2bed75867079188c9d18dae2ee77c25a54d60e9cc79be1bc48 \ + --hash=sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff \ + --hash=sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460 \ + --hash=sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac \ + --hash=sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900 \ + --hash=sha256:a9b61c19040397970d18d7737375cffd83b1f36a11dd4ad19f83a016f736c3ef \ + --hash=sha256:b4b801ebe0b477be666696bda493a9be8356f1f0057a57f1e35cd26928823e5a \ + --hash=sha256:b95e97e470fe60ed493fd9ae3911d8da4ebac16bd21f87ffa2b7c588bf22ea2c \ + --hash=sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040 \ + --hash=sha256:bfc534409c5d4b0bf945af29e5d0ab075eae9eecbb549ff8a29280db822f34f9 \ + --hash=sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7 \ + --hash=sha256:cb73dccfc991691c444acc8c0012bee8f2470da826a92e3a20bb333b1a7894e6 \ + --hash=sha256:ce756d3a10d0c4067172804c9cc276ba9cc0ff47af9078ad439b075d1abdc29b \ + --hash=sha256:d81fdb088defa30eb37bf390bb7dde35d3a83ec112ac8e33d75ab28cc29dd8b0 \ + --hash=sha256:f21c9219ef48ca5ee78402d5cc831bd58ea27ce89beda894428bc67a52da5328 # via # jax # jaxlib # keras # tensorflow -mpmath==1.3.0 +mpmath==1.3.0 \ + --hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c # via sympy -namex==0.1.0 +namex==0.1.0 \ + --hash=sha256:117f03ccd302cc48e3f5c58a296838f6b89c83455ab8683a1e85f2a430aa4306 \ + --hash=sha256:e2012a474502f1e2251267062aae3114611f07df4224b6e06334c57b0f2ce87c # via keras -nbclient==0.6.5 +nbclient==0.6.5 \ + --hash=sha256:9565739f326a9148553b04efa387ccce84c4acd0e57d94daeea4b8efb50ea966 \ + --hash=sha256:c0a942c8e68e2883cfa0ae73d85e88e50a5f58a8d68c4ed5343e76c184a61ff7 # via -r requirements.in -nbformat==5.1.3 +nbformat==5.1.3 \ + --hash=sha256:b516788ad70771c6250977c1374fcca6edebe6126fd2adb5a69aa5c2356fd1c8 \ + --hash=sha256:eb8447edd7127d043361bc17f2f5a807626bc8e878c7709a1c647abda28a9171 # via # -r requirements.in # nbclient # tensorflow-docs -nest-asyncio==1.6.0 +nest-asyncio==1.6.0 \ + --hash=sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c # via nbclient -networkx==3.2.1 +networkx==3.4.2 \ + --hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f # via cirq-core -numpy==2.0.2 +numpy==2.1.3 \ + --hash=sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe \ + --hash=sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0 \ + --hash=sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48 \ + --hash=sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a \ + --hash=sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564 \ + --hash=sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958 \ + --hash=sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17 \ + --hash=sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0 \ + --hash=sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee \ + --hash=sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b \ + --hash=sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4 \ + --hash=sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4 \ + --hash=sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6 \ + --hash=sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4 \ + --hash=sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d \ + --hash=sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f \ + --hash=sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f \ + --hash=sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f \ + --hash=sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56 \ + --hash=sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9 \ + --hash=sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd \ + --hash=sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23 \ + --hash=sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed \ + --hash=sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a \ + --hash=sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098 \ + --hash=sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1 \ + --hash=sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512 \ + --hash=sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f \ + --hash=sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09 \ + --hash=sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f \ + --hash=sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc \ + --hash=sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8 \ + --hash=sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0 \ + --hash=sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761 \ + --hash=sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef \ + --hash=sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5 \ + --hash=sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e \ + --hash=sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b \ + --hash=sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d \ + --hash=sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43 \ + --hash=sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c \ + --hash=sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41 \ + --hash=sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff \ + --hash=sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408 \ + --hash=sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2 \ + --hash=sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9 \ + --hash=sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57 \ + --hash=sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb \ + --hash=sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9 \ + --hash=sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3 \ + --hash=sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a \ + --hash=sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0 \ + --hash=sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e \ + --hash=sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598 \ + --hash=sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4 # via # -r requirements.in # cirq-core @@ -157,33 +1145,296 @@ numpy==2.0.2 # tensorboard # tensorflow # typedunits -opt-einsum==3.4.0 +opt-einsum==3.4.0 \ + --hash=sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd \ + --hash=sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac # via # jax # tensorflow -optree==0.18.0 +optree==0.19.1 \ + --hash=sha256:01c88294235b118b7478b5e80d360e5f110977cdf79f84d61dae21c2eb1d4cdd \ + --hash=sha256:03faa8e23fdaf3a18f9a1568c2c0eb0641a6aa05baf3a20639bd11fb34664700 \ + --hash=sha256:068edb89fadd94f6f57fdb51f4ad2c764b5a0bfd00903c55ffe433c2863a8037 \ + --hash=sha256:06f5c8a4cf356a1a276ce5cec1be44719ed260690f79c036d04b4d427e801258 \ + --hash=sha256:08ccec0ee5a565eb5aa4fe30383016a358627ea23d968ec8ab28b1f2ce4ce3d8 \ + --hash=sha256:14f959bc6bea6e0532f9239c67ea6952f3b8d0755ea9b4dd498284b649275aba \ + --hash=sha256:1687c962bb1691525178a6e90dde5840197cd7a7ad914b407eb7b635f15d47cb \ + --hash=sha256:17a986fd91ccdc18bb7b587ca1f508c1761580a93517e6db33a13b22e46acb9b \ + --hash=sha256:1a74e0656ccef45b1fec07b9d964ce97f3def8bab73711f56175076c4259884f \ + --hash=sha256:1b28b0d89def1b4554051f3de2a1ed81e20216b6454a59a0d16c9f55c08cff77 \ + --hash=sha256:1c5d21176b670407f4555aae40711668832599c4fb0627000c5ce3ed0d6e2dae \ + --hash=sha256:27c8dc0f89ade9233aa7ed25ce15991da188e6950eb17cc0c313fc1f327c5b0b \ + --hash=sha256:312048e69dc88de26915674f961bf38980a765a6b48ead2f1672858a39402c41 \ + --hash=sha256:333a9eb982232184dfe65edff1b60f3423f89b3810b3bd4a02c82fa6c1eb319d \ + --hash=sha256:3507ae5db5827eef3da42d04c5a41df649cedc2e42d5d39dc0f869d36915a00b \ + --hash=sha256:38f2e503fad50aff58cade85db448002d4adc72f4b3b50dcc7f3ef4bcd3b0173 \ + --hash=sha256:39a006735d2a0a68751a3bc33d670184fddcd86db63b0293e1e819739e8105e4 \ + --hash=sha256:3aeadcbcd0904c463001e6e36c75743a25ec2b6e6f2d4c1389dfb8c7bdbec689 \ + --hash=sha256:3d0e1493429ae1d1a5e34855774ee604c974a8f76656bd0e562cdbf9466c9b1f \ + --hash=sha256:3f4f1c276fa06227cdaf58349d22a3231b3dd3d47de1f90a86222ebf831fc397 \ + --hash=sha256:42e367a9d81e57c31a23247094727987a2f64b708901233a42a24d44d24e93f6 \ + --hash=sha256:4497d1c9197b8c6842e511368163d318ce536521ebdcff8bebb7551dcdfac532 \ + --hash=sha256:470742544ff2d4b63843023f38dcfb83e82c3a9877c783dee0e69cbb974de6d1 \ + --hash=sha256:486252b73ef0c6b94635a8d8fb91b20fc17d8bfcfe0df826c038e57ad8ffe610 \ + --hash=sha256:4e103e212d1e8fe0399ed076eff80a905fb14929729bbd994d3660110a27a252 \ + --hash=sha256:50d77b91a8cd01adf422472b7edf39fc445b0268816176a868a385d28f8367c2 \ + --hash=sha256:544b70958dbd7e732bc6874e0180c609c9052115937d0ec28123bb49c1a574aa \ + --hash=sha256:5b8f9e0196c532b3be1504fb2c1f3ca39723026f2e9ffc65efd4dbf5da18cfc4 \ + --hash=sha256:5d9d198343e1e6ced18bef0cbff84091c1877964fc4a121df33f18840e073a01 \ + --hash=sha256:5dc35cb31540ab6ed9850b0f8865ccd400994ebd51fcf0c156cc772073f43c04 \ + --hash=sha256:60e9345405d7b06cafdf1b1dd2e2261ceddddce10f35729240f90e2bab845a0b \ + --hash=sha256:65e5da77c77352b4f555c7edf69435a3dda503fe82d74e511aa2db4e6b2dedb5 \ + --hash=sha256:672588408906051d3e9a99aca6c0af93c6e0b638137a701418088eaa0bb6c719 \ + --hash=sha256:6b139d22664ac3b78690c0839446e51e79dd739026bc05c383d6d3b0e3e6f1b9 \ + --hash=sha256:6f0b1efc177bed6495f78d39d5aa495ccb31cc20bcf64bb1b806ca4c919f4049 \ + --hash=sha256:732c4581fb666869b8b391ec4ca13d2729795f9abe72b5aec2e582bcbea1975d \ + --hash=sha256:75fe038a1bed44f487a084af7a978874c51bba55f850bc12bf8068f3242463d6 \ + --hash=sha256:76b3e9e5d37e6b05ec82fff91758c8c0e27e159b35faea4b33d5eb975d720257 \ + --hash=sha256:77d93eafbd0046c7350bc592ab8e3814abbd39a6d716b5b1e5d652cc486f445c \ + --hash=sha256:7853b58aa084e882ea078f390936bd92e46972eb8f9b5e654360b6480ca7283b \ + --hash=sha256:7a1202371d9fe3aa75f3e886b1f871aac4991a655aadb65e54f58a3ae9388ab2 \ + --hash=sha256:7d934f240b109c6891dd06b2e30400b123b8a4b6ed31dcd0db2ae2378d30a6e8 \ + --hash=sha256:930268ebfdebca43a8808f6293910d6ade2fe7c84fa784692017d7120d285226 \ + --hash=sha256:9690c132822d9dee479cf7dff8cc52a67c8af42a4f7529d21f0f4f1d99e4c84e \ + --hash=sha256:96e5c7c3b9144f08ae40c3d9848cfbcfa36b6bead0f8215ad071d5922ee6c4a5 \ + --hash=sha256:96fad6c7b3a6fde3a0c8655fd003359cd247f8400749217502591a5ffc328699 \ + --hash=sha256:9870d33ec50cca0c46c2b431cea24c6247457da15fd4ad66ccb8ab78145c1490 \ + --hash=sha256:987bba55366917d9829f45b5ee86499ecc87a30e9103072db9ab8d67f9958179 \ + --hash=sha256:9dde5b756946c1f1458aeab248a7a9b0c01bb06b5787de9f06d52ad38b745557 \ + --hash=sha256:9fb767746231ff279d273e8ff71af2a8f89c0c3870ca367c45fd4526d331ae4b \ + --hash=sha256:a33bd23fc5c67ecb9ff491b75fde10cd9b53f47f8a876de842090e8c7a2437e1 \ + --hash=sha256:a496b864fe1fe0b5ea23d1ee3d1ef958d910704661808db2b2d2e16a0cfac96c \ + --hash=sha256:a5f8383952f18d5a4ec6b248d8ae6fe27012434ad9750aa33a821ad4846da5af \ + --hash=sha256:a609c90e4f64e4f3e2b5b3cc022210314834737e0e61a745485e33b33eae773b \ + --hash=sha256:a9b9c7e9148ec470124dc4c1d1cd1485dbeb35973357b5911b181a79090426d2 \ + --hash=sha256:aa0845b725bcd0029e179cf9b4bc2cc016c7358e56fc7c0d2c43bf4d514c96cf \ + --hash=sha256:ab8ad9803376d553a2958471b6bb6842b7e15888e19cc6aeb76da96c6afd948d \ + --hash=sha256:ae9d42718ebf985cdad3182364b5cf829193b8fd2c6d993fbb4111d38e2bdf96 \ + --hash=sha256:afd4abeb2783b2367093287bc6268ac9af244b20c8d9b01696ccfe817483b66c \ + --hash=sha256:b0c920579bddc3b18a0e051850f017618e24efcc19ba83dcd415cf74db5fd904 \ + --hash=sha256:b17a7b70ff8bd406c2142914c5ab0a57f8bcfb9f52181f7012e32406bbdbfdda \ + --hash=sha256:b2757c5d922aab76cfc9b870c373fb35209c2094e3c912733b326c043e85a0c6 \ + --hash=sha256:b81d637c94fb573e91050996b154a9adf9d12d4daf67eae27b6c0836e18ba8fa \ + --hash=sha256:b9120510d3f951e268e417a3f64f335bc1c539e1e80bff2129ddc6fb60ac7b56 \ + --hash=sha256:b964bcdb5cfe367cdf56447e80ba5a49123098d8c4e8e68b41c20890eec6e58e \ + --hash=sha256:c1667e502e0eda9477925fb17c2ad879b199a2283ac98f18e6453692819b7811 \ + --hash=sha256:c380140a9cb1ac7c10d7363df9ebcf4948da4198ca584d50eb88bbf3e561b5f4 \ + --hash=sha256:c682ab6711b7a623503711fa661a2bba7886e1c21dc06c3b7febba101b458051 \ + --hash=sha256:cd28a527bb363a1d7d28e8b2fb62816ace6743418bb86e9c5f27ea6877dcdf6c \ + --hash=sha256:d16cef4d0555d49ce221d80249f1285a2d3faf932e451c3ce6cb8ccb6a846767 \ + --hash=sha256:d2cb43c36638f469f5d8f4cf638e914de90c62242d8bed29f1b4487e0346ab94 \ + --hash=sha256:d32b1261be71211f77837e839e43a3e3e8fc57707091d2454d0a88590fb6abe8 \ + --hash=sha256:d3bba2af7a5fce0c25e99024688e68dfe9be41e3d6e92720febbefdc879fba38 \ + --hash=sha256:d41ccc4c20bfeae01d1d221c057a6d026e84e32229664952eddcdbe4b9b71417 \ + --hash=sha256:d4bac18638fa56efd2377cf8c43e17cd083aa566e69a31ce10f7fdaefd9676a3 \ + --hash=sha256:d7edead66cace8b3b905488e391b38487614f75ae4fa7f3b612c7fe0e54b8a90 \ + --hash=sha256:dae6c247cc8751bd2f167951468769f5c98f8cfdae31c0db0f2eb4145a6ec560 \ + --hash=sha256:dc2db0b449baff53aa7e583306101de0ade5e5ae9e6fce78400eb2319bbd23dc \ + --hash=sha256:ddeefb7ca799c09647e332ebc1a5f6c09888a5a0e51f2dff4ca55e65b42a8c14 \ + --hash=sha256:de8acbed5965beae6f6b0456fcb8d1afaea1fe300810739e88645e22138849bc \ + --hash=sha256:dfae64c4c371640a4b3e2a9e3e6aa3a3e8cdf2da5247a88fef5b632614b948a6 \ + --hash=sha256:e0f02600832ab8d0f6c934dcb5c339e17a36938d477641a45798e02625ebe107 \ + --hash=sha256:e12ee3776a16f6feaa8263b92469ad546b870af71d50602745855d8449219221 \ + --hash=sha256:e1951ddc870f67430310fd17393971c30510ee9fd290525b44c12afe25f3c307 \ + --hash=sha256:e70faa00ab69331f49f8337d45021bed09ae2265d1db72eea9d7817af2b73c64 \ + --hash=sha256:e757079d44a00319447f43df5c51e55bf9b62d9f05eea0e2db5ff7c7ca5ec71d \ + --hash=sha256:eb6a6566b3656d28ba845ba1d00adabc53418020f6c469a2f1c30b46c8ce6020 \ + --hash=sha256:ef2409d4efda1c5a6eb69f83ffff89fb04d5607fd056704552ec359fb865cd6c \ + --hash=sha256:f0ce49f64f804f7f35f2f9c2a21e3ba94c090199fccdcfd40e3ded4426c5c175 \ + --hash=sha256:f10d58c1a17e1b32f9d9b5e1b9d1ad964d99c1113d9df0b9f62f2fe7dde19909 \ + --hash=sha256:f144cfd65fb17c6aa2c51818614eb009e6052d3d6ace91f7e570b1318cdcac4c \ + --hash=sha256:f1d7838e8b1b62258abd73a5911afad1153ed76822070558c3ba7e0bb5b44192 \ + --hash=sha256:f3a900df0ffb9b8259961b337289754531a7e0a5de2f681e9c80866b6a7cb74e \ + --hash=sha256:f55841132ba8a34dbbd85e0c2cf990602384eea0e4638df986cd3266482f4a17 \ + --hash=sha256:f5d8ccf4f38327efef9e17b399a7d911482cb73f022815cf7f649aea5cef5e8f \ + --hash=sha256:f61a01ed9991193ed6f3db8e956ede05218190a32ca2ddfb71cfc40c8daba1d5 \ + --hash=sha256:f658fa46305b2bdccdc5bb2cb07818aeaef88a1085499deda5be48a0a58d2971 \ + --hash=sha256:fff5fd89a9b333d91a05a7ca2e66c8e6632d0bdbc94c1725a341b77001f09511 # via keras -packaging==26.0 +packaging==26.2 \ + --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \ + --hash=sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661 # via # keras # matplotlib # tensorboard # tensorflow # wheel -pandas==2.3.3 +pandas==2.3.3 \ + --hash=sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7 \ + --hash=sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593 \ + --hash=sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5 \ + --hash=sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791 \ + --hash=sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73 \ + --hash=sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec \ + --hash=sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4 \ + --hash=sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5 \ + --hash=sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac \ + --hash=sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084 \ + --hash=sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c \ + --hash=sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87 \ + --hash=sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35 \ + --hash=sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250 \ + --hash=sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c \ + --hash=sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826 \ + --hash=sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9 \ + --hash=sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 \ + --hash=sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1 \ + --hash=sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523 \ + --hash=sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3 \ + --hash=sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78 \ + --hash=sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53 \ + --hash=sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c \ + --hash=sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21 \ + --hash=sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5 \ + --hash=sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff \ + --hash=sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45 \ + --hash=sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110 \ + --hash=sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493 \ + --hash=sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b \ + --hash=sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450 \ + --hash=sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86 \ + --hash=sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8 \ + --hash=sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98 \ + --hash=sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89 \ + --hash=sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66 \ + --hash=sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b \ + --hash=sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 \ + --hash=sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29 \ + --hash=sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6 \ + --hash=sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc \ + --hash=sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2 \ + --hash=sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788 \ + --hash=sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa \ + --hash=sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151 \ + --hash=sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838 \ + --hash=sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b \ + --hash=sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a \ + --hash=sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d \ + --hash=sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908 \ + --hash=sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0 \ + --hash=sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b \ + --hash=sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c \ + --hash=sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee # via cirq-core -pillow==11.0.0 +pillow==12.2.0 \ + --hash=sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9 \ + --hash=sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5 \ + --hash=sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987 \ + --hash=sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9 \ + --hash=sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b \ + --hash=sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f \ + --hash=sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd \ + --hash=sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e \ + --hash=sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e \ + --hash=sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe \ + --hash=sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795 \ + --hash=sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601 \ + --hash=sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1 \ + --hash=sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed \ + --hash=sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea \ + --hash=sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5 \ + --hash=sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97 \ + --hash=sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453 \ + --hash=sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98 \ + --hash=sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa \ + --hash=sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b \ + --hash=sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d \ + --hash=sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705 \ + --hash=sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8 \ + --hash=sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024 \ + --hash=sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0 \ + --hash=sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286 \ + --hash=sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150 \ + --hash=sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2 \ + --hash=sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3 \ + --hash=sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b \ + --hash=sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f \ + --hash=sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463 \ + --hash=sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940 \ + --hash=sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166 \ + --hash=sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed \ + --hash=sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f \ + --hash=sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795 \ + --hash=sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780 \ + --hash=sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7 \ + --hash=sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1 \ + --hash=sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5 \ + --hash=sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295 \ + --hash=sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b \ + --hash=sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354 \ + --hash=sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60 \ + --hash=sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65 \ + --hash=sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005 \ + --hash=sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c \ + --hash=sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be \ + --hash=sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5 \ + --hash=sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06 \ + --hash=sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae \ + --hash=sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c \ + --hash=sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c \ + --hash=sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612 \ + --hash=sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e \ + --hash=sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab \ + --hash=sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808 \ + --hash=sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f \ + --hash=sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e \ + --hash=sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909 \ + --hash=sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec \ + --hash=sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe \ + --hash=sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50 \ + --hash=sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4 \ + --hash=sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f \ + --hash=sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff \ + --hash=sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5 \ + --hash=sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb \ + --hash=sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414 \ + --hash=sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1 \ + --hash=sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032 \ + --hash=sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76 \ + --hash=sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136 \ + --hash=sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e \ + --hash=sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c \ + --hash=sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3 \ + --hash=sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea \ + --hash=sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f \ + --hash=sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104 \ + --hash=sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176 \ + --hash=sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24 \ + --hash=sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3 \ + --hash=sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4 \ + --hash=sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed \ + --hash=sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43 \ + --hash=sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421 \ + --hash=sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7 \ + --hash=sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06 \ + --hash=sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5 # via matplotlib -platformdirs==4.5.1 +platformdirs==4.9.6 \ + --hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \ + --hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917 # via # jupyter-core # pylint # yapf -proto-plus==1.27.0 +proto-plus==1.28.0 \ + --hash=sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9 \ + --hash=sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8 # via # cirq-google # google-api-core -protobuf==5.29.5 +protobuf==5.29.6 \ + --hash=sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05 \ + --hash=sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1 \ + --hash=sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86 \ + --hash=sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18 \ + --hash=sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda \ + --hash=sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6 \ + --hash=sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6 \ + --hash=sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269 \ + --hash=sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49 \ + --hash=sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723 \ + --hash=sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9 # via # cirq-google # google-api-core @@ -194,105 +1445,589 @@ protobuf==5.29.5 # tensorflow # tensorflow-docs # typedunits -pyasn1==0.6.2 - # via - # pyasn1-modules - # rsa -pyasn1-modules==0.4.2 +pyasn1==0.6.3 \ + --hash=sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf \ + --hash=sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde + # via pyasn1-modules +pyasn1-modules==0.4.2 \ + --hash=sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a \ + --hash=sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6 # via google-auth -pycparser==3.0 +pycparser==3.0 \ + --hash=sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29 \ + --hash=sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992 # via cffi -pygments==2.19.2 +pygments==2.20.0 \ + --hash=sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f \ + --hash=sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 # via rich -pylint==3.3.3 +pylint==3.3.3 \ + --hash=sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a \ + --hash=sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183 # via -r requirements.in -pyparsing==3.3.2 +pyparsing==3.3.2 \ + --hash=sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d \ + --hash=sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc # via # matplotlib # typedunits -python-dateutil==2.9.0.post0 +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via # jupyter-client # matplotlib # pandas -pytz==2025.2 +pytz==2026.2 \ + --hash=sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126 \ + --hash=sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a # via pandas -pyzmq==27.1.0 +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via tensorflow-docs +pyzmq==27.1.0 \ + --hash=sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d \ + --hash=sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8 \ + --hash=sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e \ + --hash=sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba \ + --hash=sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581 \ + --hash=sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05 \ + --hash=sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386 \ + --hash=sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db \ + --hash=sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28 \ + --hash=sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e \ + --hash=sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea \ + --hash=sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b \ + --hash=sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066 \ + --hash=sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97 \ + --hash=sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0 \ + --hash=sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113 \ + --hash=sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92 \ + --hash=sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3 \ + --hash=sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86 \ + --hash=sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd \ + --hash=sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc \ + --hash=sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233 \ + --hash=sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345 \ + --hash=sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31 \ + --hash=sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74 \ + --hash=sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc \ + --hash=sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429 \ + --hash=sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381 \ + --hash=sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172 \ + --hash=sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b \ + --hash=sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556 \ + --hash=sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4 \ + --hash=sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27 \ + --hash=sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c \ + --hash=sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd \ + --hash=sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e \ + --hash=sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526 \ + --hash=sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e \ + --hash=sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f \ + --hash=sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128 \ + --hash=sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96 \ + --hash=sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f \ + --hash=sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027 \ + --hash=sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa \ + --hash=sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f \ + --hash=sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50 \ + --hash=sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c \ + --hash=sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2 \ + --hash=sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146 \ + --hash=sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d \ + --hash=sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97 \ + --hash=sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5 \ + --hash=sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098 \ + --hash=sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb \ + --hash=sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32 \ + --hash=sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62 \ + --hash=sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf \ + --hash=sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312 \ + --hash=sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda \ + --hash=sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540 \ + --hash=sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604 \ + --hash=sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0 \ + --hash=sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db \ + --hash=sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78 \ + --hash=sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f \ + --hash=sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef \ + --hash=sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2 \ + --hash=sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78 \ + --hash=sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b \ + --hash=sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f \ + --hash=sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6 \ + --hash=sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39 \ + --hash=sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f \ + --hash=sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355 \ + --hash=sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a \ + --hash=sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a \ + --hash=sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856 \ + --hash=sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9 \ + --hash=sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968 \ + --hash=sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7 \ + --hash=sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1 \ + --hash=sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266 \ + --hash=sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831 \ + --hash=sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f \ + --hash=sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7 \ + --hash=sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394 \ + --hash=sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07 \ + --hash=sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496 \ + --hash=sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90 \ + --hash=sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271 \ + --hash=sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6 \ + --hash=sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9 # via jupyter-client -referencing==0.37.0 +referencing==0.37.0 \ + --hash=sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231 \ + --hash=sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8 # via # jsonschema # jsonschema-specifications -requests==2.32.5 +requests==2.34.1 \ + --hash=sha256:0fc5669f2b69704449fe1552360bd2a73a54512dfd03e65529157f1513322beb \ + --hash=sha256:bf38a3ff993960d3dd819c08862c40b3c703306eb7c744fcd9f4ddbb95b548f0 # via # google-api-core # tensorflow -rich==14.3.1 +rich==15.0.0 \ + --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \ + --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 # via keras -rpds-py==0.30.0 +rpds-py==0.30.0 \ + --hash=sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f \ + --hash=sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136 \ + --hash=sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3 \ + --hash=sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7 \ + --hash=sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65 \ + --hash=sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4 \ + --hash=sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169 \ + --hash=sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf \ + --hash=sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4 \ + --hash=sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2 \ + --hash=sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c \ + --hash=sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4 \ + --hash=sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3 \ + --hash=sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6 \ + --hash=sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7 \ + --hash=sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89 \ + --hash=sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85 \ + --hash=sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6 \ + --hash=sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa \ + --hash=sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb \ + --hash=sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6 \ + --hash=sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87 \ + --hash=sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856 \ + --hash=sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4 \ + --hash=sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f \ + --hash=sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53 \ + --hash=sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229 \ + --hash=sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad \ + --hash=sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23 \ + --hash=sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db \ + --hash=sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038 \ + --hash=sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27 \ + --hash=sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00 \ + --hash=sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18 \ + --hash=sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083 \ + --hash=sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c \ + --hash=sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738 \ + --hash=sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898 \ + --hash=sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e \ + --hash=sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7 \ + --hash=sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08 \ + --hash=sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6 \ + --hash=sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551 \ + --hash=sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e \ + --hash=sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288 \ + --hash=sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df \ + --hash=sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0 \ + --hash=sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2 \ + --hash=sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05 \ + --hash=sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0 \ + --hash=sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464 \ + --hash=sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5 \ + --hash=sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404 \ + --hash=sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7 \ + --hash=sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139 \ + --hash=sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394 \ + --hash=sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb \ + --hash=sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15 \ + --hash=sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff \ + --hash=sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed \ + --hash=sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6 \ + --hash=sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e \ + --hash=sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95 \ + --hash=sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d \ + --hash=sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950 \ + --hash=sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3 \ + --hash=sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5 \ + --hash=sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97 \ + --hash=sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e \ + --hash=sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e \ + --hash=sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b \ + --hash=sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd \ + --hash=sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad \ + --hash=sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8 \ + --hash=sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425 \ + --hash=sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221 \ + --hash=sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d \ + --hash=sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825 \ + --hash=sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51 \ + --hash=sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e \ + --hash=sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f \ + --hash=sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8 \ + --hash=sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f \ + --hash=sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d \ + --hash=sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07 \ + --hash=sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877 \ + --hash=sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31 \ + --hash=sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58 \ + --hash=sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94 \ + --hash=sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28 \ + --hash=sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000 \ + --hash=sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1 \ + --hash=sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1 \ + --hash=sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7 \ + --hash=sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7 \ + --hash=sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40 \ + --hash=sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d \ + --hash=sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0 \ + --hash=sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84 \ + --hash=sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f \ + --hash=sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a \ + --hash=sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7 \ + --hash=sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419 \ + --hash=sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8 \ + --hash=sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a \ + --hash=sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9 \ + --hash=sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be \ + --hash=sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed \ + --hash=sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a \ + --hash=sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d \ + --hash=sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324 \ + --hash=sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f \ + --hash=sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2 \ + --hash=sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f \ + --hash=sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5 # via # jsonschema # referencing -rsa==4.9.1 - # via google-auth -scipy==1.15.3 +scipy==1.15.3 \ + --hash=sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477 \ + --hash=sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c \ + --hash=sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723 \ + --hash=sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730 \ + --hash=sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539 \ + --hash=sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb \ + --hash=sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6 \ + --hash=sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594 \ + --hash=sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92 \ + --hash=sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82 \ + --hash=sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49 \ + --hash=sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759 \ + --hash=sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba \ + --hash=sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982 \ + --hash=sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8 \ + --hash=sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65 \ + --hash=sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4 \ + --hash=sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e \ + --hash=sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed \ + --hash=sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c \ + --hash=sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5 \ + --hash=sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5 \ + --hash=sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019 \ + --hash=sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e \ + --hash=sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1 \ + --hash=sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889 \ + --hash=sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca \ + --hash=sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825 \ + --hash=sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9 \ + --hash=sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62 \ + --hash=sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb \ + --hash=sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b \ + --hash=sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13 \ + --hash=sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb \ + --hash=sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40 \ + --hash=sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c \ + --hash=sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253 \ + --hash=sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb \ + --hash=sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f \ + --hash=sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163 \ + --hash=sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45 \ + --hash=sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7 \ + --hash=sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11 \ + --hash=sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf \ + --hash=sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e \ + --hash=sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126 # via # -r requirements.in # cirq-core # jax # jaxlib -setuptools==75.0.0 - # via - # tensorboard - # tensorflow -six==1.17.0 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 # via # astunparse # google-pasta # python-dateutil # tensorboard # tensorflow -sortedcontainers==2.4.0 +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via cirq-core -sympy==1.14.0 +sympy==1.14.0 \ + --hash=sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 # via # -r requirements.in # cirq-core -tensorboard==2.18.0 +tensorboard==2.19.0 \ + --hash=sha256:5e71b98663a641a7ce8a6e70b0be8e1a4c0c45d48760b076383ac4755c35b9a0 # via tensorflow -tensorboard-data-server==0.7.2 +tensorboard-data-server==0.7.2 \ + --hash=sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb \ + --hash=sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60 \ + --hash=sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530 # via tensorboard -tensorflow==2.18.1 +tensorflow==2.19.1 \ + --hash=sha256:02c69369a82709827c6a5218c6697ee94dcd1397230319cc17c47a3342249354 \ + --hash=sha256:04f3b4dbb3ce4b507d853decfb2d116f8d0344d23413e2ad889e1e069fbeb54d \ + --hash=sha256:11377d4cecdc665515e370524b650a8ceb80b461f40f5e63993ed27d0ef931da \ + --hash=sha256:14ec6dee7ab3b241aae3537616e6f1ed1c7c67eff5d853e586eb66a2e9276ccc \ + --hash=sha256:1729bc2ae90a100a87d5a462b5e9b85a088261a03f0a7179eebb8735938bed57 \ + --hash=sha256:22deedc251837f2382d2b287c705705cb089bfaf79b2274b78c08740e02bf188 \ + --hash=sha256:35a6950f3fee0ad2d1668241d31684676f2e6eceb613cbeef960ea22014ef8fb \ + --hash=sha256:4c0e78b6100545fd90934c557f1ce802e6a9a7fdb031025efc298efb4aa2e3bb \ + --hash=sha256:7a66b66fcc3eee0cc4d6c405cb5918972afeeb148684e174693d5d0449c3fdaf \ + --hash=sha256:7e770ce558ceeed129537683d3bc7ec9214de8bb296354e1c4198169f4deda1f \ + --hash=sha256:8a274a1336051bef0e7e042fa5818a9d342e300d9c311c5d7933eb60e2269770 \ + --hash=sha256:8e5524eb492160576e5eeea9bb472ddc653123503f2290f83123d5ac9545750e \ + --hash=sha256:9077404d1928ee58bfb82ea1b0fce25353420338c259742227c27c4e00377f4b \ + --hash=sha256:938fb49b3299a77ccdaa26c0824dfcca3002b260c7bc994cb129d4ec12f31619 \ + --hash=sha256:a61c209ec594b2ed4ee2d55a905945bd748df6a1d73ab7ccecf7a9234f52045f \ + --hash=sha256:ed3148ee523cb46badd30ea04a6b7fb6056b9bdb7e082de294a86b2fdc01f9e4 # via # -r requirements.in # tf-keras -tensorflow-docs==2025.2.19.33219 +tensorflow-docs==2025.2.19.33219 \ + --hash=sha256:b52682f3739110ce804af701f9ab5ac1efe07760109a5b5640769851d7d14b19 # via -r requirements.in -tensorflow-io-gcs-filesystem==0.37.1 +tensorflow-io-gcs-filesystem==0.37.1 \ + --hash=sha256:0df00891669390078a003cedbdd3b8e645c718b111917535fa1d7725e95cdb95 \ + --hash=sha256:249c12b830165841411ba71e08215d0e94277a49c551e6dd5d72aab54fe5491b \ + --hash=sha256:257aab23470a0796978efc9c2bcf8b0bc80f22e6298612a4c0a50d3f4e88060c \ + --hash=sha256:286389a203a5aee1a4fa2e53718c661091aa5fea797ff4fa6715ab8436b02e6c \ + --hash=sha256:32c50ab4e29a23c1f91cd0f9ab8c381a0ab10f45ef5c5252e94965916041737c \ + --hash=sha256:426de1173cb81fbd62becec2012fc00322a295326d90eb6c737fab636f182aed \ + --hash=sha256:6e1f2796b57e799a8ca1b75bf47c2aaa437c968408cc1a402a9862929e104cda \ + --hash=sha256:8943036bbf84e7a2be3705cb56f9c9df7c48c9e614bb941f0936c58e3ca89d6f \ + --hash=sha256:8febbfcc67c61e542a5ac1a98c7c20a91a5e1afc2e14b1ef0cb7c28bc3b6aa70 \ + --hash=sha256:9679b36e3a80921876f31685ab6f7270f3411a4cc51bc2847e80d0e4b5291e27 \ + --hash=sha256:b02f9c5f94fd62773954a04f69b68c4d576d076fd0db4ca25d5479f0fbfcdbad \ + --hash=sha256:ee5da49019670ed364f3e5fb86b46420841a6c3cb52a300553c63841671b3e6d \ + --hash=sha256:ee7c8ee5fe2fd8cb6392669ef16e71841133041fee8a330eff519ad9b36e4556 \ + --hash=sha256:fbb33f1745f218464a59cecd9a18e32ca927b0f4d77abd8f8671b645cc1a182f \ + --hash=sha256:fe8dcc6d222258a080ac3dfcaaaa347325ce36a7a046277f6b3e19abc1efb3c5 \ + --hash=sha256:ffebb6666a7bfc28005f4fbbb111a455b5e7d6cd3b12752b7050863ecb27d5cc # via tensorflow -termcolor==3.1.0 +termcolor==3.3.0 \ + --hash=sha256:348871ca648ec6a9a983a13ab626c0acce02f515b9e1983332b17af7979521c5 \ + --hash=sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5 # via tensorflow -tf-keras==2.18.0 +tf-keras==2.19.0 \ + --hash=sha256:4f339e800987b39d1548a8c76a7b33b6801a97ec7fcd89c299ec29741f7890bd \ + --hash=sha256:b09a407d87a4571ce1e8ca985cfc68483e3d63b2518a5d79a97ad92cb64dbe9c # via -r requirements.in -tomli==2.4.0 +tomli==2.4.1 \ + --hash=sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853 \ + --hash=sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe \ + --hash=sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5 \ + --hash=sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d \ + --hash=sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd \ + --hash=sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26 \ + --hash=sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54 \ + --hash=sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6 \ + --hash=sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c \ + --hash=sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a \ + --hash=sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd \ + --hash=sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f \ + --hash=sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5 \ + --hash=sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9 \ + --hash=sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662 \ + --hash=sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9 \ + --hash=sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1 \ + --hash=sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585 \ + --hash=sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e \ + --hash=sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c \ + --hash=sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41 \ + --hash=sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f \ + --hash=sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085 \ + --hash=sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15 \ + --hash=sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7 \ + --hash=sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c \ + --hash=sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36 \ + --hash=sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076 \ + --hash=sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac \ + --hash=sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8 \ + --hash=sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232 \ + --hash=sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece \ + --hash=sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a \ + --hash=sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897 \ + --hash=sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d \ + --hash=sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4 \ + --hash=sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917 \ + --hash=sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396 \ + --hash=sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a \ + --hash=sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc \ + --hash=sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba \ + --hash=sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f \ + --hash=sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257 \ + --hash=sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30 \ + --hash=sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf \ + --hash=sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9 \ + --hash=sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049 # via # pylint # yapf -tomlkit==0.14.0 +tomlkit==0.15.0 \ + --hash=sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738 \ + --hash=sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3 # via pylint -tornado==6.5.4 +tornado==6.5.5 \ + --hash=sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9 \ + --hash=sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6 \ + --hash=sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca \ + --hash=sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e \ + --hash=sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07 \ + --hash=sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa \ + --hash=sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b \ + --hash=sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521 \ + --hash=sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7 \ + --hash=sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5 # via jupyter-client -tqdm==4.67.1 +tqdm==4.67.3 \ + --hash=sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb \ + --hash=sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf # via cirq-core -traitlets==5.14.3 +traitlets==5.15.0 \ + --hash=sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971 \ + --hash=sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40 # via # jupyter-client # jupyter-core # nbclient # nbformat -typedunits==0.0.1 +typedunits==0.0.2 \ + --hash=sha256:08ccc81be3663b05550a0e88719f07dfbe5f956f0f3b21554a75bb5d3cf33b2f \ + --hash=sha256:2e344da69381eddc928c584c7c25293e10326544d78ac906ef4c25ac440fdbaf \ + --hash=sha256:3d6b03ec6fe1676c870875cc302b3034064ab22889cc11bda9ad0c2b110a1025 \ + --hash=sha256:5a86d87149c90082be2203fbc952ad12ccb344581943762d451975a4eac6b543 \ + --hash=sha256:5f6faca980dda2220c57681375d0131dff9e174bc68db5e88a970f274a2dfc7e \ + --hash=sha256:666399dd90e4b57e04e315411ffbd40261f4d7dfdd9da8fde07c9887e209cd51 \ + --hash=sha256:666e21abf91f477a7afe6af535d96e4c75fbf78b4bb457b1a5a4c365cfd440d1 \ + --hash=sha256:6b0ddb8e9d3e2e5831cb4a3b6c5c329d8ecf60020c5c07f916cae45359b8fc69 \ + --hash=sha256:702f40f0a5e64262d5de4a5e5182edbcd1aae7262f1ea8fab6e86710f91d9df3 \ + --hash=sha256:71bcd5d77a75be2f86fec17739f3f4f5d542fe4f51e6400cd6e989853ecc1f81 \ + --hash=sha256:7a38732f9f8b8c1e4586b74647aba12337b7adbc240d6be7cf806133fa7a4403 \ + --hash=sha256:8e3f9d829054842d8d528b46f5b311a17e581bf3204f17a22b904bb23adc5bfe \ + --hash=sha256:98c4fc14e6854cefcc794609fa6710de918d469c8662a04fb8e533aff356786b \ + --hash=sha256:9d180c6e576e0149220e56805bc9cfc6b0d83b4eb84a407c5819210eafca31e3 \ + --hash=sha256:9ed57f0a9fa2f6bf2ba2f2e2cc27672935faf380bd6978d39f2324a78fe87017 \ + --hash=sha256:a008277c1cc073861d1238ebc6456750ab2fe29c0d008c6f7dad9d6d0d4d7edb \ + --hash=sha256:b561776c9c0105fb61d21c00784114b8f6cb4a3cd5059d2260d19a5495c69e27 \ + --hash=sha256:bb9164a2572fc65d5ec31d425aff693304c47f49057c420558f006f697d5ead2 \ + --hash=sha256:c04eac8d23bc927ca94ce7dd4ca98ab926288a57810cb4987cb028f38148e9c6 \ + --hash=sha256:c32e68e9e2d24d8223ba0ab89ca684e16f786c50d4538b5d9c4b37acf255d566 \ + --hash=sha256:cb7bbd55650e7479d7b7d848b4851236adf0f9fc00e5119dd14e930bc8cc9d7e \ + --hash=sha256:cb8c47da0b6faf5da8ec990b3ef297e83aefc85a74b83f6839ecf1c2e3560f93 \ + --hash=sha256:dc524490037d55ecab434f6d4d0c02e711db36d11123c55d39ca484dfa4c756d \ + --hash=sha256:e0dd0f0d100cabb0aebd48e7bb5366df892917bd8efe9e0d605b1bfd6693093d \ + --hash=sha256:e2f1e02d0de5b04cba9316366c35c185dcd75eb18abd12fedcc0a99566138731 \ + --hash=sha256:e59a9da833eb6d899efae373731c6cb65938d9644a8af90ce1bbefb6b095ed02 \ + --hash=sha256:f3ab5064c58038509365af401fb605410f9afd6f6cda097466b85f05b658d890 \ + --hash=sha256:f3ea03bb2005a40f54b1e1026f953c6e344cf0aaff728290e4cc6e552fc52982 \ + --hash=sha256:fb30e321cf3f56df5590cdffa229ef0e933e51096d93a29d44b9af3254225302 \ + --hash=sha256:fbea15a29e62c29fdb615db14dbb16a982e447197ae036f4209c83d55c3730ba # via cirq-google -typing-extensions==4.15.0 +typing-extensions==4.15.0 \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 # via # astroid # cirq-core @@ -301,20 +2036,125 @@ typing-extensions==4.15.0 # optree # referencing # tensorflow -tzdata==2025.3 +tzdata==2026.2 \ + --hash=sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10 \ + --hash=sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7 # via pandas -urllib3==2.6.3 +urllib3==2.7.0 \ + --hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \ + --hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 # via requests -werkzeug==3.1.5 +werkzeug==3.1.8 \ + --hash=sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50 \ + --hash=sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44 # via tensorboard -wheel==0.46.2 +wheel==0.46.2 \ + --hash=sha256:33ae60725d69eaa249bc1982e739943c23b34b58d51f1cb6253453773aca6e65 \ + --hash=sha256:3d79e48fde9847618a5a181f3cc35764c349c752e2fe911e65fa17faab9809b0 # via # -r requirements.in # astunparse -wrapt==1.17.3 +wrapt==2.1.2 \ + --hash=sha256:08ffa54146a7559f5b8df4b289b46d963a8e74ed16ba3687f99896101a3990c5 \ + --hash=sha256:0fc04bc8664a8bc4c8e00b37b5355cffca2535209fba1abb09ae2b7c76ddf82b \ + --hash=sha256:1370e516598854e5b4366e09ce81e08bfe94d42b0fd569b88ec46cc56d9164a9 \ + --hash=sha256:162e4e2ba7542da9027821cb6e7c5e068d64f9a10b5f15512ea28e954893a267 \ + --hash=sha256:16997dfb9d67addc2e3f41b62a104341e80cac52f91110dece393923c0ebd5ca \ + --hash=sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63 \ + --hash=sha256:1c6cc827c00dc839350155f316f1f8b4b0c370f52b6a19e782e2bda89600c7dc \ + --hash=sha256:2b8b28e97a44d21836259739ae76284e180b18abbb4dcfdff07a415cf1016c3e \ + --hash=sha256:2d3ff4f0024dd224290c0eabf0240f1bfc1f26363431505fb1b0283d3b08f11d \ + --hash=sha256:305d8a1755116bfdad5dda9e771dcb2138990a1d66e9edd81658816edf51aed1 \ + --hash=sha256:3144b027ff30cbd2fca07c0a87e67011adb717eb5f5bd8496325c17e454257a3 \ + --hash=sha256:3278c471f4468ad544a691b31bb856374fbdefb7fee1a152153e64019379f015 \ + --hash=sha256:3756219045f73fb28c5d7662778e4156fbd06cf823c4d2d4b19f97305e52819c \ + --hash=sha256:3769a77df8e756d65fbc050333f423c01ae012b4f6731aaf70cf2bef61b34596 \ + --hash=sha256:3969c56e4563c375861c8df14fa55146e81ac11c8db49ea6fb7f2ba58bc1ff9a \ + --hash=sha256:3996a67eecc2c68fd47b4e3c564405a5777367adfd9b8abb58387b63ee83b21e \ + --hash=sha256:3b8d15e52e195813efe5db8cec156eebe339aaf84222f4f4f051a6c01f237ed7 \ + --hash=sha256:3beb22f674550d5634642c645aba4c72a2c66fb185ae1aebe1e955fae5a13baf \ + --hash=sha256:3d7b6fd105f8b24e5bd23ccf41cb1d1099796524bcc6f7fbb8fe576c44befbc9 \ + --hash=sha256:4006c351de6d5007aa33a551f600404ba44228a89e833d2fadc5caa5de8edfbf \ + --hash=sha256:45914e8efbe4b9d5102fcf0e8e2e3258b83a5d5fba9f8f7b6d15681e9d29ffe0 \ + --hash=sha256:467e7c76315390331c67073073d00662015bb730c566820c9ca9b54e4d67fd04 \ + --hash=sha256:478282ebd3795a089154fb16d3db360e103aa13d3b2ad30f8f6aac0d2207de0e \ + --hash=sha256:4b7a86d99a14f76facb269dc148590c01aaf47584071809a70da30555228158c \ + --hash=sha256:4bdf26e03e6d0da3f0e9422fd36bcebf7bc0eeb55fdf9c727a09abc6b9fe472e \ + --hash=sha256:5681123e60aed0e64c7d44f72bbf8b4ce45f79d81467e2c4c728629f5baf06eb \ + --hash=sha256:577dff354e7acd9d411eaf4bfe76b724c89c89c8fc9b7e127ee28c5f7bcb25b6 \ + --hash=sha256:57d7c0c980abdc5f1d98b11a2aa3bb159790add80258c717fa49a99921456d90 \ + --hash=sha256:5a0a0a3a882393095573344075189eb2d566e0fd205a2b6414e9997b1b800a8b \ + --hash=sha256:5c35b5d82b16a3bc6e0a04349b606a0582bc29f573786aebe98e0c159bc48db6 \ + --hash=sha256:5e0fa9cc32300daf9eb09a1f5bdc6deb9a79defd70d5356ba453bcd50aef3742 \ + --hash=sha256:62503ffbc2d3a69891cf29beeaccdb4d5e0a126e2b6a851688d4777e01428dbb \ + --hash=sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748 \ + --hash=sha256:64a07a71d2730ba56f11d1a4b91f7817dc79bc134c11516b75d1921a7c6fcda1 \ + --hash=sha256:6de1a3851c27e0bd6a04ca993ea6f80fc53e6c742ee1601f486c08e9f9b900a9 \ + --hash=sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1 \ + --hash=sha256:6f8dbdd3719e534860d6a78526aafc220e0241f981367018c2875178cf83a413 \ + --hash=sha256:6f97edc9842cf215312b75fe737ee7c8adda75a89979f8e11558dfff6343cc4b \ + --hash=sha256:710f6e5dfaf6a5d5c397d2d6758a78fecd9649deb21f1b645f5b57a328d63050 \ + --hash=sha256:72aaa9d0d8e4ed0e2e98019cea47a21f823c9dd4b43c7b77bba6679ffcca6a00 \ + --hash=sha256:76405518ca4e1b76fbb1b9f686cff93aebae03920cc55ceeec48ff9f719c5f67 \ + --hash=sha256:767c0dbbe76cae2a60dd2b235ac0c87c9cccf4898aef8062e57bead46b5f6894 \ + --hash=sha256:776867878e83130c7a04237010463372e877c1c994d449ca6aaafeab6aab2586 \ + --hash=sha256:787fd6f4d67befa6fe2abdffcbd3de2d82dfc6fb8a6d850407c53332709d030b \ + --hash=sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8 \ + --hash=sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2 \ + --hash=sha256:84ce8f1c2104d2f6daa912b1b5b039f331febfeee74f8042ad4e04992bd95c8f \ + --hash=sha256:866abdbf4612e0b34764922ef8b1c5668867610a718d3053d59e24a5e5fcfc15 \ + --hash=sha256:96159a0ee2b0277d44201c3b5be479a9979cf154e8c82fa5df49586a8e7679bb \ + --hash=sha256:970d57ed83fa040d8b20c52fe74a6ae7e3775ae8cff5efd6a81e06b19078484c \ + --hash=sha256:98ba61833a77b747901e9012072f038795de7fc77849f1faa965464f3f87ff2d \ + --hash=sha256:9c691a6bc752c0cc4711cc0c00896fcd0f116abc253609ef64ef930032821842 \ + --hash=sha256:a5d516e22aedb7c9c1d47cba1c63160b1a6f61ec2f3948d127cd38d5cfbb556f \ + --hash=sha256:a76d61a2e851996150ba0f80582dd92a870643fa481f3b3846f229de88caf044 \ + --hash=sha256:a819e39017f95bf7aede768f75915635aa8f671f2993c036991b8d3bfe8dbb6f \ + --hash=sha256:a8914c754d3134a3032601c6984db1c576e6abaf3fc68094bb8ab1379d75ff92 \ + --hash=sha256:a9372fc3639a878c8e7d87e1556fa209091b0a66e912c611e3f833e2c4202be2 \ + --hash=sha256:a93cd767e37faeddbe07d8fc4212d5cba660af59bdb0f6372c93faaa13e6e679 \ + --hash=sha256:a9b9d50c9af998875a1482a038eb05755dfd6fe303a313f6a940bb53a83c3f18 \ + --hash=sha256:a9dd9813825f7ecb018c17fd147a01845eb330254dff86d3b5816f20f4d6aaf8 \ + --hash=sha256:b89f095fe98bc12107f82a9f7d570dc83a0870291aeb6b1d7a7d35575f55d98a \ + --hash=sha256:b8aefb4dbb18d904b96827435a763fa42fc1f08ea096a391710407a60983ced8 \ + --hash=sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8 \ + --hash=sha256:bbac24d879aa22998e87f6b3f481a5216311e7d53c7db87f189a7a0266dafffb \ + --hash=sha256:c0be8b5a74c5824e9359b53e7e58bef71a729bacc82e16587db1c4ebc91f7c5a \ + --hash=sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e \ + --hash=sha256:c7e6cd120ef837d5b6f860a6ea3745f8763805c418bb2f12eeb1fa6e25f22d22 \ + --hash=sha256:c87cf3f0c85e27b3ac7d9ad95da166bf8739ca215a8b171e8404a2d739897a45 \ + --hash=sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf \ + --hash=sha256:cef91c95a50596fcdc31397eb6955476f82ae8a3f5a8eabdc13611b60ee380ba \ + --hash=sha256:d1c5fea4f9fe3762e2b905fdd67df51e4be7a73b7674957af2d2ade71a5c075d \ + --hash=sha256:d307aa6888d5efab2c1cde09843d48c843990be13069003184b67d426d145394 \ + --hash=sha256:d8f7740e1af13dff2684e4d56fe604a7e04d6c94e737a60568d8d4238b9a0c71 \ + --hash=sha256:da1f00a557c66225d53b095a97eace0fc5349e3bfda28fa34ffae238978ee575 \ + --hash=sha256:dad63212b168de8569b1c512f4eac4b57f2c6934b30df32d6ee9534a79f1493f \ + --hash=sha256:de9f1a2bbc5ac7f6012ec24525bdd444765a2ff64b5985ac6e0692144838542e \ + --hash=sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c \ + --hash=sha256:e5aeab8fe15c3dff75cfee94260dcd9cded012d4ff06add036c28fae7718593b \ + --hash=sha256:e6ed62c82ddf58d001096ae84ce7f833db97ae2263bff31c9b336ba8cfe3f508 \ + --hash=sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0 \ + --hash=sha256:f01277d9a5fc1862f26f7626da9cf443bebc0abd2f303f41c5e995b15887dabd \ + --hash=sha256:f069e113743a21a3defac6677f000068ebb931639f789b5b226598e247a4c89e \ + --hash=sha256:f0d8fc30a43b5fe191cf2b1a0c82bab2571dadd38e7c0062ee87d6df858dd06e \ + --hash=sha256:f29c827a8d9936ac320746747a016c4bc66ef639f5cd0d32df24f5eacbf9c69f \ + --hash=sha256:f3b7d73012ea75aee5844de58c88f44cf62d0d62711e39da5a82824a7c4626a8 \ + --hash=sha256:f8bc1c264d8d1cf5b3560a87bbdd31131573eb25f9f9447bb6252b8d4c44a3a1 \ + --hash=sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c \ + --hash=sha256:fab036efe5464ec3291411fabb80a7a39e2dd80bae9bcbeeca5087fdfa891e19 \ + --hash=sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9 \ + --hash=sha256:ff95d4264e55839be37bafe1536db2ab2de19da6b65f9244f01f332b5286cfbf # via tensorflow -yapf==0.43.0 +yapf==0.43.0 \ + --hash=sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e \ + --hash=sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca # via -r requirements.in # The following packages are considered to be unsafe in a requirements file: -# pyyaml +setuptools==82.0.1 \ + --hash=sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9 \ + --hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb + # via + # tensorboard + # tensorflow diff --git a/requirements_lock_3_10.txt b/requirements_lock_3_10.txt new file mode 100644 index 000000000..bc04b4960 --- /dev/null +++ b/requirements_lock_3_10.txt @@ -0,0 +1 @@ +-r requirements.txt diff --git a/requirements_lock_3_11.txt b/requirements_lock_3_11.txt new file mode 100644 index 000000000..bc04b4960 --- /dev/null +++ b/requirements_lock_3_11.txt @@ -0,0 +1 @@ +-r requirements.txt diff --git a/requirements_lock_3_12.txt b/requirements_lock_3_12.txt new file mode 100644 index 000000000..bc04b4960 --- /dev/null +++ b/requirements_lock_3_12.txt @@ -0,0 +1 @@ +-r requirements.txt diff --git a/scripts/benchmark_all.sh b/scripts/benchmark_all.sh index 642496aef..cd50209c2 100755 --- a/scripts/benchmark_all.sh +++ b/scripts/benchmark_all.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -14,7 +14,7 @@ # limitations under the License. # ============================================================================== echo "Testing benchmarks."; -test_outputs=$(bazel test -c opt --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors $(bazel query //benchmarks/...)) +test_outputs=$(bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors $(bazel query //benchmarks/...)) exit_code=$? if [ "$exit_code" == "0" ]; then @@ -26,5 +26,5 @@ else fi echo "Running preconfigured benchmarks."; -bazel_run=${bazel run -c opt --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4"} -bazel_run benchmarks/scripts:benchmark_clifford_circuit -- --op_density 1 --n_moments 10 --n_qubits 4 +bazel_run=${bazel run -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4"} +bazel_run benchmarks/scripts:benchmark_clifford_circuit -- --op_density 1 --n_moments 10 --n_qubits 4 \ No newline at end of file diff --git a/scripts/build_pip_package_test.sh b/scripts/build_pip_package_test.sh index c77091945..644338b6a 100755 --- a/scripts/build_pip_package_test.sh +++ b/scripts/build_pip_package_test.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -19,7 +19,7 @@ pip install -r requirements.txt # cd tensorflow_quantum echo "Y\n" | ./configure.sh -bazel build -c opt --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" release:build_pip_package +bazel build -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" release:build_pip_package rm /tmp/tensorflow_quantum/* || echo ok bazel-bin/release/build_pip_package /tmp/tensorflow_quantum/ pip install -U /tmp/tensorflow_quantum/*.whl diff --git a/scripts/ci_validate_tutorials.sh b/scripts/ci_validate_tutorials.sh index 0afd1d6bc..f1294f65b 100755 --- a/scripts/ci_validate_tutorials.sh +++ b/scripts/ci_validate_tutorials.sh @@ -16,7 +16,7 @@ set -e -# Use legacy tf.keras (Keras 2) with TF 2.16 +# Use legacy tf.keras (Keras 2) with TensorFlow 2.17+. export TF_USE_LEGACY_KERAS=1 # Tools for running notebooks non-interactively diff --git a/scripts/format_all.sh b/scripts/format_all.sh index b470d7f02..63ea26708 100755 --- a/scripts/format_all.sh +++ b/scripts/format_all.sh @@ -14,10 +14,11 @@ # limitations under the License. # ============================================================================== echo "Doing python language formatting..." -python3 -m yapf --in-place --recursive ./benchmarks ./tensorflow_quantum ./scripts +python3 -m yapf --style=google --in-place --recursive --parallel \ + ./benchmarks ./scripts ./tensorflow_quantum echo -e "Done! \nDoing notebook formatting..." python3 ./scripts/format_ipynb.py echo -e "Done! \nDoing C++ formatting..." -find tensorflow_quantum/ -iname *.h -o -iname *.cc | xargs clang-format -i +find tensorflow_quantum/ -iname *.h -o -iname *.cc | xargs clang-format -i -style=google echo "Done!" exit 0; diff --git a/scripts/format_check.sh b/scripts/format_check.sh index 0512bca25..f0de918dc 100755 --- a/scripts/format_check.sh +++ b/scripts/format_check.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -72,7 +72,7 @@ for changed_file in ${changed_files}; do ) if [[ "${changed_line_ranges}" != "--lines=0-0 " ]]; then # Do the formatting. - results=$(python3 -m yapf --diff "${changed_file}" ${changed_line_ranges}) + results=$(yapf --style=google --diff "${changed_file}" ${changed_line_ranges}) # Print colorized error messages. if [ ! -z "${results}" ]; then @@ -100,7 +100,7 @@ if [ $? -ne 0 ]; then fi echo "Checking C++ formatting..."; -formatting_outputs=$(find tensorflow_quantum/ -iname *.h -o -iname *.cc | xargs clang-format -output-replacements-xml); +formatting_outputs=$(find tensorflow_quantum/ -iname *.h -o -iname *.cc | xargs clang-format -style=google -output-replacements-xml); CFORMATCHECK=0 while read -r formatting_outputs; do if [ "$formatting_outputs" != "" ] && [ "$formatting_outputs" != "" ] && [ "$formatting_outputs" != "" ] && [ "$formatting_outputs" != " " ]; then diff --git a/scripts/format_ipynb.py b/scripts/format_ipynb.py index 1624d2d5c..0818224e9 100644 --- a/scripts/format_ipynb.py +++ b/scripts/format_ipynb.py @@ -12,37 +12,34 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== -"""Format notebook code cells using yapf google style.""" - -import glob -import nbformat -import yapf - - -def format_notebooks(): - """Format tutorial notebooks. - - This must be run from the top level of the repository.""" - - for fname in glob.glob("docs/tutorials/*.ipynb"): - nb = nbformat.read(fname, as_version=nbformat.NO_CONVERT) - all_cells = nb.get('cells') - for i, cell in enumerate(all_cells): - if cell.get('cell_type') != 'code': - continue - lines = cell.get('source') - # This will safely skip over cells containing !% magic - try: - fmt_lines = yapf.yapf_api.FormatCode(''.join(lines), - style_config="google")[0] - except (SyntaxError, yapf.yapflib.errors.YapfError): - continue - # google style always adds an EOF newline; undo this. - all_cells[i]['source'] = fmt_lines[:-1] - - nb['cells'] = all_cells - nbformat.write(nb, fname, version=nbformat.NO_CONVERT) - - -if __name__ == "__main__": - format_notebooks() +"""Format notebook code cells using yapf google style.""" +import glob +import nbformat +import yapf + + +def format_notebooks(): + """Format tutorial notebooks from the repo root.""" + notebook_paths = glob.glob("docs/tutorials/*.ipynb") + for fname in notebook_paths: + nb = nbformat.read(fname, as_version=nbformat.NO_CONVERT) + all_cells = nb.get('cells') + for i, cell in enumerate(all_cells): + if cell.get('cell_type') != 'code': + continue + lines = cell.get('source') + # This will safely skip over cells containing !% magic + try: + fmt_lines = yapf.yapf_api.FormatCode(''.join(lines), + style_config="google")[0] + except (SyntaxError, yapf.yapflib.errors.YapfError): + continue + # Google style always adds an EOF newline; undo this. + all_cells[i]['source'] = fmt_lines[:-1] + + nb['cells'] = all_cells + nbformat.write(nb, fname, version=nbformat.NO_CONVERT) + + +if __name__ == "__main__": + format_notebooks() diff --git a/scripts/generate_requirements.sh b/scripts/generate_requirements.sh index d9c57a10c..33cac4176 100755 --- a/scripts/generate_requirements.sh +++ b/scripts/generate_requirements.sh @@ -14,7 +14,7 @@ # limitations under the License. # ============================================================================== -# Summary: produce requirements.txt using pip-compile & munging the result. +# Summary: produce requirements.txt using pip-compile under Python 3.10. # Usage: ./scripts/generate_requirements.sh set -eu @@ -24,17 +24,22 @@ thisdir=$(CDPATH="" cd -- "$(dirname -- "${0}")" && pwd -P) repo_dir=$(git -C "${thisdir}" rev-parse --show-toplevel 2>/dev/null) cd "${repo_dir}" -if ! pip show -qq pip-tools; then - echo "Error: 'pip-compile' not found. Please install 'pip-tools'." >&2 +if ! python - <<'PY' +import sys +raise SystemExit(0 if sys.version_info[:2] == (3, 10) else 1) +PY +then + echo "Error: run this script with Python 3.10 so requirements.txt is locked for the primary target interpreter." >&2 exit 1 fi -# Special case: don't pin PyYAML in requirements.txt, because its inclusion can -# lead to pip trying to uninstall an existing version installed by distutils. -declare -a constraints=() -constraints+=(--unsafe-package pyyaml) +if ! python -m pip show -qq pip-tools; then + echo "Error: 'pip-compile' not found. Please install 'pip-tools'." >&2 + exit 1 +fi # Check for a constraints file and use it if it exists. +declare -a constraints=() pins_file="$(realpath --relative-to=. "${repo_dir}/requirements-pins.txt")" if [[ -e "${pins_file}" ]]; then constraints+=(--constraints "${pins_file}") @@ -44,10 +49,14 @@ fi export CUSTOM_COMPILE_COMMAND="${0}" echo "Running pip-compile in ${repo_dir} …" -pip-compile -q \ +python -m piptools compile -q \ + --allow-unsafe \ + --upgrade \ --rebuild \ + --generate-hashes \ --no-strip-extras \ --no-emit-index-url \ + -o requirements.txt \ "${constraints[@]}" echo "Done." diff --git a/scripts/lint_all.sh b/scripts/lint_all.sh index e54e8c747..b821610af 100755 --- a/scripts/lint_all.sh +++ b/scripts/lint_all.sh @@ -1,21 +1,20 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. # ============================================================================== -echo "Checking for lint in Python code..." -linting_outputs=$(pylint --rcfile .pylintrc \ - ./benchmarks ./scripts ./tensorflow_quantum) +echo "Checking for lint in python code..."; +linting_outputs=$(pylint --rcfile .pylintrc ./tensorflow_quantum); exit_code=$? if [ "$exit_code" == "0" ]; then echo "Python linting complete!"; diff --git a/scripts/msan_test.sh b/scripts/msan_test.sh index 988c623f7..d47e8ccfe 100755 --- a/scripts/msan_test.sh +++ b/scripts/msan_test.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -14,19 +14,19 @@ # limitations under the License. # ============================================================================== echo "Testing All Bazel cc_tests with msan."; -test_outputs=$(bazel test -c opt \ +test_outputs=$(bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" \ --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" \ --cxxopt="-fsanitize=address" --linkopt="-fsanitize=address" \ --cxxopt="-g" --cxxopt="-O0" \ --notest_keep_going --test_output=errors \ //tensorflow_quantum/core/src:all && \ - bazel test -c opt \ + bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" \ --cxxopt="-mavx2" --cxxopt="-mavx" --cxxopt="-mfma" \ --cxxopt="-fsanitize=address" --linkopt="-fsanitize=address" \ --cxxopt="-g" --cxxopt="-O0" \ --notest_keep_going --test_output=errors \ //tensorflow_quantum/core/src:all && \ - bazel test -c opt \ + bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" \ --cxxopt="-fsanitize=address" --linkopt="-fsanitize=address" \ --cxxopt="-g" --cxxopt="-O0" \ --notest_keep_going --test_output=errors \ @@ -39,4 +39,4 @@ else echo "Testing failed, please correct errors before proceeding." echo "{$test_outputs}" exit 64; -fi +fi \ No newline at end of file diff --git a/scripts/test_all.sh b/scripts/test_all.sh index 1601a1607..5d5405fac 100755 --- a/scripts/test_all.sh +++ b/scripts/test_all.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -14,7 +14,7 @@ # limitations under the License. # ============================================================================== echo "Testing All Bazel py_test and cc_tests."; -test_outputs=$(bazel test -c opt --experimental_repo_remote_exec --test_output=errors --cxxopt="-std=c++17" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" //tensorflow_quantum/...) +test_outputs=$(bazel test -c opt --experimental_repo_remote_exec --test_output=errors --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-std=c++17" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" //tensorflow_quantum/...) exit_code=$? if [ "$exit_code" == "0" ]; then echo "Testing Complete!"; diff --git a/scripts/test_benchmarks.sh b/scripts/test_benchmarks.sh index 620676c4e..07e3adec1 100755 --- a/scripts/test_benchmarks.sh +++ b/scripts/test_benchmarks.sh @@ -1,12 +1,12 @@ #!/bin/bash # Copyright 2020 The TensorFlow Quantum Authors. All Rights Reserved. -# +# # 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 -# +# # http://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. @@ -14,12 +14,16 @@ # limitations under the License. # ============================================================================== echo "Testing all Benchmarks."; -bazel test -c opt --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors $(bazel query //benchmarks/scripts:all) +bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors $(bazel query //benchmarks/scripts:all) +# test_outputs=$(bazel test -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors $(bazel query //benchmarks/scripts:all)) +bench_outputs=$() +# bench_outputs=$(bazel run -c opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=1" --cxxopt="-msse2" --cxxopt="-msse3" --cxxopt="-msse4" --test_output=errors //benchmarks/scripts:benchmark_clifford_circuit) exit_code=$? if [ "$exit_code" == "0" ]; then echo "Testing Complete!"; exit 0; else echo "Testing failed, please correct errors before proceeding." + echo "{$test_outputs}" exit 64; -fi +fi \ No newline at end of file diff --git a/tensorflow_quantum/core/ops/batch_util_test.py b/tensorflow_quantum/core/ops/batch_util_test.py index c702338d6..074b01fcb 100644 --- a/tensorflow_quantum/core/ops/batch_util_test.py +++ b/tensorflow_quantum/core/ops/batch_util_test.py @@ -308,28 +308,6 @@ def test_no_circuit(self, sim): self.assertDTypeEqual(results, np.int8) self.assertEqual(np.zeros(shape=(0, 0, 0)).shape, results.shape) - def test_pauli_sum_collector_collect(self): - """Test the collect method of TFQPauliSumCollector.""" - qubit = cirq.GridQubit(0, 0) - circuit = cirq.Circuit(cirq.X(qubit)) - samples_per_term = 100 - sampler = cirq.Simulator() - - test_cases = [ - ("Pauli observable (Z)", cirq.PauliSum.wrap(cirq.Z(qubit)), -1.0), - ("Identity observable", cirq.PauliSum.wrap(cirq.I(qubit)), 1.0), - ("Mixed observable (Z + 2.0*I)", - cirq.Z(qubit) + 2.0 * cirq.I(qubit), 1.0), - ] - - for name, observable, expected_energy in test_cases: - with self.subTest(name): - collector = batch_util.TFQPauliSumCollector( - circuit, observable, samples_per_term=samples_per_term) - collector.collect(sampler) - self.assertAlmostEqual(collector.estimated_energy(), - expected_energy) - if __name__ == '__main__': tf.test.main() diff --git a/tensorflow_quantum/core/ops/noise/tfq_noisy_expectation.cc b/tensorflow_quantum/core/ops/noise/tfq_noisy_expectation.cc index 5a13fa1af..59256c11d 100644 --- a/tensorflow_quantum/core/ops/noise/tfq_noisy_expectation.cc +++ b/tensorflow_quantum/core/ops/noise/tfq_noisy_expectation.cc @@ -269,8 +269,7 @@ class TfqNoisyExpectationOp : public tensorflow::OpKernel { qsim::MultiQubitGateFuser, Simulator>; const int output_dim_batch_size = output_tensor->dimension(0); - std::vector batch_locks(output_dim_batch_size, - tensorflow::mutex()); + std::vector batch_locks(output_dim_batch_size); const int num_threads = context->device() ->tensorflow_cpu_worker_threads() diff --git a/tensorflow_quantum/core/ops/noise/tfq_noisy_sampled_expectation.cc b/tensorflow_quantum/core/ops/noise/tfq_noisy_sampled_expectation.cc index ed59331b1..d57e26841 100644 --- a/tensorflow_quantum/core/ops/noise/tfq_noisy_sampled_expectation.cc +++ b/tensorflow_quantum/core/ops/noise/tfq_noisy_sampled_expectation.cc @@ -273,8 +273,7 @@ class TfqNoisySampledExpectationOp : public tensorflow::OpKernel { qsim::MultiQubitGateFuser, Simulator>; const int output_dim_batch_size = output_tensor->dimension(0); - std::vector batch_locks(output_dim_batch_size, - tensorflow::mutex()); + std::vector batch_locks(output_dim_batch_size); const int num_threads = context->device() ->tensorflow_cpu_worker_threads() diff --git a/tensorflow_quantum/datasets/spin_system_test.py b/tensorflow_quantum/datasets/spin_system_test.py index 682870c25..cfb20ee4c 100644 --- a/tensorflow_quantum/datasets/spin_system_test.py +++ b/tensorflow_quantum/datasets/spin_system_test.py @@ -328,16 +328,6 @@ def test_param_resolver(self): rtol=1e-3) -class UniqueNameTest(tf.test.TestCase): - """Testing unique_name.""" - - def test_unique_name(self): - """Test that unique_name generates the correct sequence.""" - gen = spin_system.unique_name() - for i in range(100): - self.assertEqual(next(gen), f"theta_{i}") - - if __name__ == '__main__': tf.test.main() diff --git a/tensorflow_quantum/python/util_test.py b/tensorflow_quantum/python/util_test.py index d22c118a8..00715899b 100644 --- a/tensorflow_quantum/python/util_test.py +++ b/tensorflow_quantum/python/util_test.py @@ -33,8 +33,8 @@ def _single_to_tensor(item): if not isinstance(item, (cirq.PauliSum, cirq.PauliString, cirq.Circuit)): - raise TypeError("Item must be a Circuit, PauliString, or PauliSum." - f" Got {type(item)}.") + raise TypeError( + f"Item must be a Circuit or PauliSum. Got {type(item)}.") if isinstance(item, (cirq.PauliSum, cirq.PauliString)): return serializer.serialize_paulisum(item).SerializeToString( deterministic=True) @@ -84,61 +84,6 @@ def test_get_supported_channels(self): len(serializer.SERIALIZER.supported_gate_types()) - len(util.get_supported_gates())) - @parameterized.named_parameters( - ('without_channels', False), - ('with_channels', True), - ) - def test_random_circuit_resolver_batch_shapes_and_types( - self, include_channels): - """Confirm random_circuit_resolver_batch returns the expected types.""" - qubits = cirq.GridQubit.rect(1, 3) - batch_size = 4 - - circuits, resolvers = util.random_circuit_resolver_batch( - qubits, batch_size, n_moments=5, include_channels=include_channels) - - self.assertLen(circuits, batch_size) - self.assertLen(resolvers, batch_size) - for circuit in circuits: - self.assertIsInstance(circuit, cirq.Circuit) - self.assertFalse(cirq.is_parameterized(circuit)) - for resolver in resolvers: - self.assertIsInstance(resolver, cirq.ParamResolver) - self.assertEmpty(resolver.param_dict) - - @parameterized.named_parameters( - ('without_channels', False), - ('with_channels', True), - ) - def test_random_symbol_circuit_resolver_batch_shapes_and_types( - self, include_channels): - """Confirm random_symbol_circuit_resolver_batch returns - the expected types.""" - qubits = cirq.GridQubit.rect(1, 3) - symbols = ['alpha', 'beta', 'gamma'] - batch_size = 4 - - circuits, resolvers = util.random_symbol_circuit_resolver_batch( - qubits, - symbols, - batch_size, - n_moments=5, - include_channels=include_channels) - - self.assertLen(circuits, batch_size) - self.assertLen(resolvers, batch_size) - for circuit in circuits: - self.assertIsInstance(circuit, cirq.Circuit) - self.assertSetEqual(set(util.get_circuit_symbols(circuit)), - set(symbols)) - for resolver in resolvers: - self.assertIsInstance(resolver, cirq.ParamResolver) - self.assertEqual(set(resolver.param_dict.keys()), set(symbols)) - self.assertTrue( - all( - isinstance(value, float) - for value in resolver.param_dict.values())) - @parameterized.parameters(_items_to_tensorize()) def test_convert_to_tensor(self, item): """Test that the convert_to_tensor function works correctly by manually @@ -402,59 +347,6 @@ def test_gate_approx_eq(self): util.gate_approx_eq( cirq.X, cirq.ops.ControlledGate(cirq.X, 2, [1, 0], [2, 2]))) - def test_gate_approx_eq_channels(self): - """Check valid TFQ channels for approximate equality.""" - atol = 1e-2 - - test_cases = [ - (cirq.DepolarizingChannel, (0.1,), (0.105,), (0.2,)), - (cirq.AsymmetricDepolarizingChannel, (0.1, 0.2, 0.3), - (0.105, 0.195, 0.305), (0.2, 0.2, 0.3)), - (cirq.GeneralizedAmplitudeDampingChannel, (0.1, 0.2), - (0.105, 0.205), (0.2, 0.2)), - (cirq.AmplitudeDampingChannel, (0.1,), (0.105,), (0.2,)), - (cirq.PhaseDampingChannel, (0.1,), (0.105,), (0.2,)), - (cirq.PhaseFlipChannel, (0.1,), (0.105,), (0.2,)), - (cirq.BitFlipChannel, (0.1,), (0.105,), (0.2,)), - ] - - for channel, exact_params, approx_params, unequal_params in test_cases: - with self.subTest(channel=channel.__name__): - gate1 = channel(*exact_params) - gate2_exact = channel(*exact_params) - gate2_approx = channel(*approx_params) - gate2_not_equal = channel(*unequal_params) - - # Exact equality - self.assertTrue( - util.gate_approx_eq(gate1, gate2_exact, atol=atol)) - # Approximate equality - self.assertTrue( - util.gate_approx_eq(gate1, gate2_approx, atol=atol)) - # Not equal - self.assertFalse( - util.gate_approx_eq(gate1, gate2_not_equal, atol=atol)) - - # ResetChannel - self.assertTrue( - util.gate_approx_eq(cirq.ResetChannel(), - cirq.ResetChannel(), - atol=atol)) - - # Mismatched types - self.assertFalse( - util.gate_approx_eq(cirq.DepolarizingChannel(0.1), - cirq.BitFlipChannel(0.1), - atol=atol)) - self.assertFalse( - util.gate_approx_eq(cirq.DepolarizingChannel(0.1), - cirq.X, - atol=atol)) - self.assertFalse( - util.gate_approx_eq(cirq.X, - cirq.DepolarizingChannel(0.1), - atol=atol)) - def test_gate_approx_eq_error(self): """Confirms that bad inputs cause an error to be raised.""" # junk diff --git a/third_party/BUILD b/third_party/BUILD index a4792a7cd..c172b454e 100644 --- a/third_party/BUILD +++ b/third_party/BUILD @@ -11,11 +11,3 @@ # 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. - -package(default_visibility = ["//visibility:public"]) - -exports_files([ - "python_configure.bzl", - "python/BUILD.tpl", - "python/defs.bzl.tpl", -]) diff --git a/third_party/python/BUILD b/third_party/python/BUILD deleted file mode 100644 index 1a0ec3114..000000000 --- a/third_party/python/BUILD +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors. All Rights Reserved. -# -# 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 -# -# http://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. -# ============================================================================== - -# Build file intentionally left empty. -# This file is used to define the Python interpreter path for the TFQ build. diff --git a/third_party/python/BUILD.tpl b/third_party/python/BUILD.tpl deleted file mode 100644 index 88752bad0..000000000 --- a/third_party/python/BUILD.tpl +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors -# -# 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 -# -# http://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. - -"""Generated BUILD file for the Python toolchain repository.""" - -load("@bazel_tools//tools/python:toolchain.bzl", "py_runtime_pair") - -package(default_visibility = ["//visibility:public"]) - -# Detected path: %{PYTHON_BIN_PATH}% -py_runtime( - name = "py3_runtime", - interpreter_path = "%{PYTHON_BIN_PATH}%", - python_version = "PY3", -) - -py_runtime_pair( - name = "py_runtime_pair", - py3_runtime = ":py3_runtime", -) - -toolchain( - name = "py_toolchain", - toolchain = ":py_runtime_pair", - toolchain_type = "@bazel_tools//tools/python:toolchain_type", -) diff --git a/third_party/python/defs.bzl.tpl b/third_party/python/defs.bzl.tpl deleted file mode 100644 index 1cc59a099..000000000 --- a/third_party/python/defs.bzl.tpl +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors. All Rights Reserved. -# -# 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 -# -# http://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. - -# Generated by python_configure.bzl -interpreter = "%{PYTHON_BIN_PATH}%" diff --git a/third_party/python_configure.bzl b/third_party/python_configure.bzl deleted file mode 100644 index ba061ff91..000000000 --- a/third_party/python_configure.bzl +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2026 The TensorFlow Quantum Authors -# -# 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 -# -# http://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. - -"""Repository rule for Python detection and toolchain registration.""" - -def _python_configure_impl(repository_ctx): - python_bin = repository_ctx.os.environ.get("PYTHON_BIN_PATH") or \ - repository_ctx.which("python3") or \ - repository_ctx.which("python") - - if not python_bin: - fail("Python interpreter not found. Please provide it via " + - "--repo_env=PYTHON_BIN_PATH=/path/to/python " + - "or set the PYTHON_BIN_PATH environment variable.") - - substitutions = {"%{PYTHON_BIN_PATH}%": str(python_bin).replace("\\", "\\\\")} - - repository_ctx.template( - "BUILD", - Label("//third_party/python:BUILD.tpl"), - substitutions, - ) - repository_ctx.template( - "defs.bzl", - Label("//third_party/python:defs.bzl.tpl"), - substitutions, - ) - -_python_configure = repository_rule( - implementation = _python_configure_impl, - environ = [ - "PYTHON_BIN_PATH", - "PATH", - ], -) - -def python_configure(): - """Configures the Python toolchain for TFQ, TF, and XLA. - - Three identical repositories are created to satisfy the naming expectations - of various external dependencies: - - 'local_config_python': Used by TensorFlow Quantum and its internal rules. - - 'local_execution_config_python': Required by TensorFlow (org_tensorflow) - and TSL for certain toolchain configurations. - - 'python': Provided as a generic handle. - - Although redundant, this ensures compatibility across the diverse dependency - tree without requiring extensive repo_mapping. - """ - _python_configure(name = "local_config_python") - _python_configure(name = "local_execution_config_python") - _python_configure(name = "python")