diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..8a2880a8 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,164 @@ +name: Build and push docker image to registry + +on: + workflow_dispatch: + push: + branches: + - 'main' + tags: + - 'v*' + pull_request: + paths: + - ".github/workflows/build.yaml" + - ".github/workflows/matrix.json" + - "integration-tests/**" + - "backends/**" + - "core/**" + - "router/**" + - "Cargo.lock" + - "rust-toolchain.toml" + - "Dockerfile" + branches: + - 'main' + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - id: set-matrix + run: | + branchName=$(echo '${{ github.ref }}' | sed 's,refs/heads/,,g') + matrix=$(jq --arg branchName "$branchName" 'map(. | select((.runOn==$branchName) or (.runOn=="always")) )' .github/workflows/matrix.json) + echo "{\"include\":$(echo $matrix)}" + echo ::set-output name=matrix::{\"include\":$(echo $matrix)}\" + + build-and-push-image: + needs: matrix + strategy: + matrix: ${{fromJson(needs.matrix.outputs.matrix)}} + concurrency: + group: ${{ github.workflow }}-${{ github.job }}-${{matrix.name}}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + runs-on: + group: aws-highmemory-32-plus-priv + permissions: + contents: write + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + security-events: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + buildkitd-config: /tmp/buildkitd.toml + + - name: Configure sccache + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Inject slug/short variables + uses: rlespinasse/github-slug-action@v4 + + - name: Login to internal Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_PASSWORD }} + registry: registry.internal.huggingface.tech + + - name: Login to GitHub Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + registry.internal.huggingface.tech/api-inference/text-embeddings-inference + ghcr.io/huggingface/text-embeddings-inference + flavor: | + latest=false + tags: | + type=semver,pattern=${{ matrix.imageNamePrefix }}{{version}} + type=semver,pattern=${{ matrix.imageNamePrefix }}{{major}}.{{minor}} + type=raw,value=${{ matrix.imageNamePrefix }}latest + type=raw,value=${{ matrix.imageNamePrefix }}sha-${{ env.GITHUB_SHA_SHORT }} + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + push: ${{ github.event_name != 'pull_request' }} + platforms: 'linux/amd64' + build-args: | + SCCACHE_GHA_ENABLED=${{ matrix.sccache }} + ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} + ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} + CUDA_COMPUTE_CAP=${{ matrix.cudaComputeCap }} + GIT_SHA=${{ env.GITHUB_SHA }} + DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} + ${{matrix.extraBuildArgs}} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + cache-to: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max + + - name: Extract metadata (tags, labels) for Docker + id: meta-grpc + if: ${{ matrix.grpc }} + uses: docker/metadata-action@v5 + with: + images: | + registry.internal.huggingface.tech/api-inference/text-embeddings-inference + ghcr.io/huggingface/text-embeddings-inference + flavor: | + latest=false + tags: | + type=semver,pattern=${{ matrix.imageNamePrefix }}{{version}}-grpc + type=semver,pattern=${{ matrix.imageNamePrefix }}{{major}}.{{minor}}-grpc + type=raw,value=${{ matrix.imageNamePrefix }}latest-grpc + type=raw,value=${{ matrix.imageNamePrefix }}sha-${{ env.GITHUB_SHA_SHORT }}-grpc + + - name: Build and push Docker image + id: build-and-push-grpc + if: ${{ matrix.grpc }} + uses: docker/build-push-action@v6 + with: + context: . + target: grpc + file: ${{ matrix.dockerfile }} + push: ${{ github.event_name != 'pull_request' }} + platforms: 'linux/amd64' + build-args: | + SCCACHE_GHA_ENABLED=${{ matrix.sccache }} + ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} + ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} + CUDA_COMPUTE_CAP=${{ matrix.cudaComputeCap }} + GIT_SHA=${{ env.GITHUB_SHA }} + DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} + ${{matrix.extraBuildArgs}} + tags: ${{ steps.meta-grpc.outputs.tags }} + labels: ${{ steps.meta-grpc.outputs.labels }} + cache-from: type=s3,region=us-east-1,bucket=ci-docker-buildx-cache,name=text-embeddings-inference-cache-${{matrix.name}},access_key_id=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_ACCESS_KEY_ID }},secret_access_key=${{ secrets.S3_CI_DOCKER_BUILDX_CACHE_SECRET_ACCESS_KEY }},mode=max diff --git a/.github/workflows/build_75.yaml b/.github/workflows/build_75.yaml deleted file mode 100644 index 6d941d03..00000000 --- a/.github/workflows/build_75.yaml +++ /dev/null @@ -1,136 +0,0 @@ - name: Build and push Cuda Turing docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-75-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-75 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=turing-{{version}} - type=semver,pattern=turing-{{major}}.{{minor}} - type=raw,value=turing-latest - type=raw,value=turing-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-75 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=75 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - DEFAULT_USE_FLASH_ATTENTION=False - tags: ${{ steps.meta-75.outputs.tags }} - labels: ${{ steps.meta-75.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-75-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=turing-{{version}}-grpc - type=semver,pattern=turing-{{major}}.{{minor}}-grpc - type=raw,value=turing-latest-grpc - type=raw,value=turing-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-75-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=75 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - DEFAULT_USE_FLASH_ATTENTION=False - tags: ${{ steps.meta-75-grpc.outputs.tags }} - labels: ${{ steps.meta-75-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-75,mode=max diff --git a/.github/workflows/build_80.yaml b/.github/workflows/build_80.yaml deleted file mode 100644 index 7a41c117..00000000 --- a/.github/workflows/build_80.yaml +++ /dev/null @@ -1,146 +0,0 @@ - name: Build and push Cuda Ampere docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - pull_request: - paths: - - ".github/workflows/build.yaml" -# - "integration-tests/**" - - "backends/**" - - "core/**" - - "router/**" - - "Cargo.lock" - - "rust-toolchain.toml" - - "Dockerfile" - branches: - - 'main' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-80-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-80 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest - type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-80 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=80 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-80.outputs.tags }} - labels: ${{ steps.meta-80.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-80-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern={{version}}-grpc - type=semver,pattern={{major}}.{{minor}}-grpc - type=raw,value=latest-grpc - type=raw,value=sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-80-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=80 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-80-grpc.outputs.tags }} - labels: ${{ steps.meta-80-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-80,mode=max diff --git a/.github/workflows/build_86.yaml b/.github/workflows/build_86.yaml deleted file mode 100644 index 16c182ec..00000000 --- a/.github/workflows/build_86.yaml +++ /dev/null @@ -1,134 +0,0 @@ - name: Build and push Cuda A10 docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-86-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-86 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=86-{{version}} - type=semver,pattern=86-{{major}}.{{minor}} - type=raw,value=86-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=86-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-86 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=86 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-86.outputs.tags }} - labels: ${{ steps.meta-86.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-86-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=86-{{version}}-grpc - type=semver,pattern=86-{{major}}.{{minor}}-grpc - type=raw,value=86-latest-grpc - type=raw,value=86-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-86-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=86 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-86-grpc.outputs.tags }} - labels: ${{ steps.meta-86-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-86,mode=max diff --git a/.github/workflows/build_89.yaml b/.github/workflows/build_89.yaml deleted file mode 100644 index 689838f6..00000000 --- a/.github/workflows/build_89.yaml +++ /dev/null @@ -1,134 +0,0 @@ - name: Build and push Cuda RTX 4000 series docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-89-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-89 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=89-{{version}} - type=semver,pattern=89-{{major}}.{{minor}} - type=raw,value=89-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=89-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-89 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=89 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-89.outputs.tags }} - labels: ${{ steps.meta-89.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-89-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=89-{{version}}-grpc - type=semver,pattern=89-{{major}}.{{minor}}-grpc - type=raw,value=89-latest-grpc - type=raw,value=89-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-89-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=89 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-89-grpc.outputs.tags }} - labels: ${{ steps.meta-89-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-89,mode=max diff --git a/.github/workflows/build_90.yaml b/.github/workflows/build_90.yaml deleted file mode 100644 index 40f05235..00000000 --- a/.github/workflows/build_90.yaml +++ /dev/null @@ -1,134 +0,0 @@ - name: Build and push Cuda Hopper docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-90-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-90 - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=hopper-{{version}} - type=semver,pattern=hopper-{{major}}.{{minor}} - type=raw,value=hopper-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=hopper-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-90 - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=90 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-90.outputs.tags }} - labels: ${{ steps.meta-90.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-90-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=hopper-{{version}}-grpc - type=semver,pattern=hopper-{{major}}.{{minor}}-grpc - type=raw,value=hopper-latest-grpc - type=raw,value=hopper-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-90-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile-cuda - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - CUDA_COMPUTE_CAP=90 - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-90-grpc.outputs.tags }} - labels: ${{ steps.meta-90-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-90,mode=max diff --git a/.github/workflows/build_all.yaml b/.github/workflows/build_all.yaml deleted file mode 100644 index 58aa7b09..00000000 --- a/.github/workflows/build_all.yaml +++ /dev/null @@ -1,119 +0,0 @@ - name: Build and push Cuda docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-all-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Tailscale - uses: huggingface/tailscale-action@v1 - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cuda-{{version}} - type=semver,pattern=cuda-{{major}}.{{minor}} - type=raw,value=cuda-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cuda-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda-all - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-sagemaker - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference/sagemaker - flavor: | - latest=false - tags: | - type=semver,pattern=cuda-{{version}} - type=semver,pattern=cuda-{{major}}.{{minor}} - type=raw,value=cuda-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cuda-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-sagemaker - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile-cuda-all - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - target: sagemaker - build-args: | - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-sagemaker.outputs.tags }} - labels: ${{ steps.meta-sagemaker.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-all,mode=max diff --git a/.github/workflows/build_cpu.yaml b/.github/workflows/build_cpu.yaml deleted file mode 100644 index 3cf87f5a..00000000 --- a/.github/workflows/build_cpu.yaml +++ /dev/null @@ -1,144 +0,0 @@ - name: Build and push CPU docker image to registry - - on: - workflow_dispatch: - push: - branches: - - 'main' - tags: - - 'v*' - pull_request: - paths: - - ".github/workflows/build.yaml" -# - "integration-tests/**" - - "backends/**" - - "core/**" - - "router/**" - - "Cargo.lock" - - "rust-toolchain.toml" - - "Dockerfile" - branches: - - 'main' - - jobs: - build-and-push-image: - concurrency: - group: ${{ github.workflow }}-${{ github.job }}-cpu-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - runs-on: [self-hosted, intel-cpu, 32-cpu, 256-ram, ci] - permissions: - contents: write - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - security-events: write - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Configure sccache - uses: actions/github-script@v6 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Tailscale - uses: huggingface/tailscale-action@main - with: - authkey: ${{ secrets.TAILSCALE_AUTHKEY }} - - - name: Initialize Docker Buildx - uses: docker/setup-buildx-action@v2.0.0 - with: - install: true - config-inline: | - [registry."docker.io"] - mirrors = ["registry.github-runners.huggingface.tech"] - - - name: Login to GitHub Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to internal Container Registry - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.TAILSCALE_DOCKER_USERNAME }} - password: ${{ secrets.TAILSCALE_DOCKER_PASSWORD }} - registry: registry.internal.huggingface.tech - - - name: Extract metadata (tags, labels) for Docker - id: meta-cpu - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cpu-{{version}} - type=semver,pattern=cpu-{{major}}.{{minor}} - type=raw,value=cpu-latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} - type=raw,value=cpu-sha-${{ env.GITHUB_SHA_SHORT }} - - - name: Build and push Docker image - id: build-and-push-cpu - uses: docker/build-push-action@v4 - with: - context: . - file: Dockerfile - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-cpu.outputs.tags }} - labels: ${{ steps.meta-cpu.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max - cache-to: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max - - - name: Extract metadata (tags, labels) for Docker - id: meta-cpu-grpc - uses: docker/metadata-action@v4.3.0 - with: - images: | - registry.internal.huggingface.tech/api-inference/text-embeddings-inference - ghcr.io/huggingface/text-embeddings-inference - flavor: | - latest=false - tags: | - type=semver,pattern=cpu-{{version}}-grpc - type=semver,pattern=cpu-{{major}}.{{minor}}-grpc - type=raw,value=cpu-latest-grpc - type=raw,value=cpu-sha-${{ env.GITHUB_SHA_SHORT }}-grpc - - - name: Build and push Docker image - id: build-and-push-cpu-grpc - uses: docker/build-push-action@v4 - with: - context: . - target: grpc - file: Dockerfile - push: ${{ github.event_name != 'pull_request' }} - platforms: 'linux/amd64' - build-args: | - SCCACHE_GHA_ENABLED=on - ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} - ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} - GIT_SHA=${{ env.GITHUB_SHA }} - DOCKER_LABEL=sha-${{ env.GITHUB_SHA_SHORT }} - tags: ${{ steps.meta-cpu-grpc.outputs.tags }} - labels: ${{ steps.meta-cpu-grpc.outputs.labels }} - cache-from: type=registry,ref=registry.internal.huggingface.tech/api-inference/text-embeddings-inference:cache-cpu,mode=max diff --git a/.github/workflows/matrix.json b/.github/workflows/matrix.json new file mode 100644 index 00000000..230bd986 --- /dev/null +++ b/.github/workflows/matrix.json @@ -0,0 +1,64 @@ +[ + { + "name": "turing", + "imageNamePrefix": "turing-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 75, + "extraBuildArgs": "DEFAULT_USE_FLASH_ATTENTION=False", + "grpc": true, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "ampere", + "imageNamePrefix": "", + "runOn": "always", + "sccache": true, + "cudaComputeCap": 80, + "grpc": true, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "a10", + "imageNamePrefix": "86-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 86, + "grpc": true, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "RTX 4000", + "imageNamePrefix": "89-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 89, + "grpc": true, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "Hopper", + "imageNamePrefix": "hopper-", + "runOn": "main", + "sccache": true, + "cudaComputeCap": 90, + "grpc": true, + "dockerfile": "Dockerfile-cuda" + }, + { + "name": "All", + "imageNamePrefix": "cuda-", + "runOn": "main", + "sccache": false, + "grpc": false, + "dockerfile": "Dockerfile-cuda-all" + }, + { + "name": "cpu", + "imageNamePrefix": "cpu-", + "runOn": "main", + "sccache": true, + "grpc": true, + "dockerfile": "Dockerfile" + } +] diff --git a/Cargo.lock b/Cargo.lock index 2b494010..38c868f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "415ed64958754dbe991900f3940677e6a7eefb4d7367afd70d642677b0c7d19d" [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -61,47 +61,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -109,13 +110,34 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" dependencies = [ "backtrace", ] +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -135,7 +157,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -146,14 +168,47 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "aws-lc-rs" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a47f2fb521b70c11ce7369a6c5fa4bd6af7e5d62ec06303875bafe7c6ba245" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2927c7af777b460b7ccd95f8b67acd7b4c04ec8896bf0c8e80ba30523cffc057" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] [[package]] name = "axum" @@ -168,7 +223,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "itoa", "matchit", "memchr", @@ -196,7 +251,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-util", "itoa", "matchit", @@ -257,25 +312,25 @@ dependencies = [ [[package]] name = "axum-tracing-opentelemetry" -version = "0.17.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91387a3e9f6aa45f112cd05d1e5430f9ba40b51440849e4760a5dd51b736149f" +checksum = "f26965dca35be1ca4a128177b9302c4c04f0661443621171adb09d002dcdf1d5" dependencies = [ "axum 0.7.5", "futures-core", "futures-util", "http 1.1.0", - "opentelemetry 0.21.0", + "opentelemetry 0.22.0", "pin-project-lite", "tower", "tracing", - "tracing-opentelemetry 0.22.0", + "tracing-opentelemetry 0.23.0", "tracing-opentelemetry-instrumentation-sdk", ] [[package]] name = "backend-grpc-client" -version = "1.2.3" +version = "1.5.1" dependencies = [ "grpc-metadata", "prost 0.11.9", @@ -290,9 +345,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -323,9 +378,32 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease 0.2.20", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.68", + "which", +] [[package]] name = "bindgen_cuda" @@ -361,9 +439,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block" @@ -388,22 +466,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -421,7 +499,7 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "candle-core" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "accelerate-src", "byteorder", @@ -442,7 +520,7 @@ dependencies = [ "safetensors", "thiserror", "yoke", - "zip", + "zip 0.6.6", ] [[package]] @@ -458,7 +536,7 @@ dependencies = [ [[package]] name = "candle-flash-attn" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "anyhow", "bindgen_cuda", @@ -481,7 +559,7 @@ dependencies = [ [[package]] name = "candle-kernels" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "bindgen_cuda", ] @@ -501,7 +579,7 @@ dependencies = [ [[package]] name = "candle-metal-kernels" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "metal", "once_cell", @@ -512,7 +590,7 @@ dependencies = [ [[package]] name = "candle-nn" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "accelerate-src", "candle-core", @@ -541,7 +619,7 @@ dependencies = [ [[package]] name = "candle-transformers" version = "0.5.0" -source = "git+https://github.com/OlivierDehaene/candle?rev=33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3#33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3" +source = "git+https://github.com/OlivierDehaene/candle?rev=7e02ad856104799b73a946ac1e153f0de77feaaf#7e02ad856104799b73a946ac1e153f0de77feaaf" dependencies = [ "byteorder", "candle-core", @@ -558,9 +636,23 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.95" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -582,11 +674,22 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" -version = "4.5.4" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -594,39 +697,57 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] [[package]] name = "console" @@ -679,18 +800,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -716,9 +837,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -746,9 +867,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -756,27 +877,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.60", + "strsim", + "syn 2.0.68", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -786,7 +907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -801,6 +922,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "derive_builder" version = "0.20.0" @@ -819,7 +951,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -829,7 +961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -872,6 +1004,23 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-stack" version = "0.10.0" @@ -884,9 +1033,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -912,7 +1061,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -923,9 +1072,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -940,6 +1089,27 @@ dependencies = [ "cc", ] +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fancy-regex" version = "0.13.0" @@ -947,15 +1117,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "filetime" @@ -965,7 +1135,7 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] @@ -977,9 +1147,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1018,7 +1188,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1042,6 +1212,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.30" @@ -1098,7 +1274,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1147,7 +1323,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1162,7 +1338,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1177,7 +1353,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1195,7 +1371,7 @@ dependencies = [ "once_cell", "paste", "pulp", - "raw-cpuid", + "raw-cpuid 10.7.0", "rayon", "seq-macro", "sysctl", @@ -1214,7 +1390,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "rayon", "seq-macro", ] @@ -1230,7 +1406,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1245,7 +1421,7 @@ dependencies = [ "num-complex", "num-traits", "paste", - "raw-cpuid", + "raw-cpuid 10.7.0", "seq-macro", ] @@ -1261,9 +1437,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1284,9 +1460,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1323,6 +1499,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.4.1" @@ -1345,19 +1540,13 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.13.1" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "heck" version = "0.4.1" @@ -1379,17 +1568,17 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hf-hub" version = "0.3.2" -source = "git+https://github.com/huggingface/hf-hub?rev=b167f69692be5f49eb8003788f7f8a499a98b096#b167f69692be5f49eb8003788f7f8a499a98b096" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b780635574b3d92f036890d8373433d6f9fc7abb320ee42a5c25897fc8ed732" dependencies = [ "dirs", "futures", - "http 1.1.0", "indicatif", "log", "native-tls", "num_cpus", "rand", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror", @@ -1451,12 +1640,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body 1.0.0", "pin-project-lite", @@ -1464,9 +1653,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1476,15 +1665,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -1500,13 +1689,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -1515,6 +1705,27 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.0", + "hyper-util", + "log", + "rustls 0.23.10", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", ] [[package]] @@ -1523,7 +1734,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.28", + "hyper 0.14.29", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1536,26 +1747,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.28", + "hyper 0.14.29", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.0", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.3.1", + "hyper 1.4.0", "pin-project-lite", "socket2", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1614,7 +1845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -1633,15 +1864,16 @@ dependencies = [ [[package]] name = "init-tracing-opentelemetry" -version = "0.14.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bd26b1b737bc11f183620072e188d1c6ede67e0e78682228d66b49ec510e17" +checksum = "754367a7e7f9314afe3ee9780ba8b8ea2cab487cdc8017c9794793051242f878" dependencies = [ - "opentelemetry 0.20.0", - "opentelemetry-otlp", + "opentelemetry 0.22.0", + "opentelemetry-otlp 0.15.0", + "opentelemetry_sdk 0.22.1", "thiserror", "tracing", - "tracing-opentelemetry 0.21.0", + "tracing-opentelemetry 0.23.0", ] [[package]] @@ -1660,9 +1892,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1704,6 +1936,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.10.5" @@ -1737,6 +1975,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -1748,15 +1995,31 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] [[package]] name = "libm" @@ -1766,9 +2029,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libmimalloc-sys" -version = "0.1.37" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81eb4061c0582dedea1cbc7aff2240300dd6982e0239d1c99e65c1dbf4a30ba7" +checksum = "23aa6811d3bd4deb8a84dde645f943476d13b248d818edcf8ce0b2f37f036b44" dependencies = [ "cc", "libc", @@ -1780,7 +2043,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -1792,15 +2055,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1808,18 +2071,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "macro_rules_attribute" @@ -1861,11 +2115,21 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -1883,7 +2147,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -1894,24 +2158,26 @@ dependencies = [ [[package]] name = "metrics" -version = "0.21.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" +checksum = "884adb57038347dfbaf2d5065887b6cf4312330dc8e94bc30a1a839bd79d3261" dependencies = [ "ahash", - "metrics-macros", "portable-atomic", ] [[package]] name = "metrics-exporter-prometheus" -version = "0.12.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" +checksum = "bf0af7a0d7ced10c0151f870e5e3f3f8bc9ffc5992d32873566ca1f9169ae776" dependencies = [ - "base64 0.21.7", - "hyper 0.14.28", - "indexmap 1.9.3", + "base64 0.22.1", + "http-body-util", + "hyper 1.4.0", + "hyper-rustls", + "hyper-util", + "indexmap 2.2.6", "ipnet", "metrics", "metrics-util", @@ -1921,26 +2187,15 @@ dependencies = [ "tracing", ] -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "metrics-util" -version = "0.15.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" +checksum = "4259040465c955f9f2f1a4a8a16dc46726169bca0f88e8fb2dbeced487c3e828" dependencies = [ "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.1", + "hashbrown 0.14.5", "metrics", "num_cpus", "quanta", @@ -1949,9 +2204,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f41a2280ded0da56c8cf898babb86e8f10651a34adcfff190ae9a1159c6908d" +checksum = "68914350ae34959d83f732418d51e2427a794055d0b9529f48259ac07af65633" dependencies = [ "libmimalloc-sys", ] @@ -1964,9 +2219,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", @@ -1980,9 +2235,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -1998,11 +2253,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "monostate" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20fffcd8ca4c69d31e036a71abc400147b41f90895df4edcb36497a1f8af8bf" +checksum = "0d208407d7552cd041d8cdb69a1bc3303e029c598738177a3d87082004dc0e1e" dependencies = [ "monostate-impl", "serde", @@ -2010,13 +2271,13 @@ dependencies = [ [[package]] name = "monostate-impl" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf307cbbbd777a9c10cec88ddafee572b3484caad5cce0c9236523c3803105a6" +checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2033,11 +2294,10 @@ checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2049,6 +2309,21 @@ dependencies = [ "tempfile", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2077,9 +2352,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "bytemuck", "num-traits", @@ -2091,11 +2366,20 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -2111,6 +2395,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -2147,23 +2452,25 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] [[package]] name = "oci-spec" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e423c4f827362c0d8d8da4b1f571270f389ebde73bcd3240a3d23c6d6f61d0f0" +checksum = "098bc31d7c87110e22090eb082903caaed19f06319f63b6f7d7ed273bc8bdaec" dependencies = [ "derive_builder", "getset", "serde", "serde_json", + "strum", + "strum_macros", "thiserror", ] @@ -2174,7 +2481,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb3293021f06540803301af45e7ab81693d50e89a7398a3420bdab139e7ba5e" dependencies = [ "base16ct", - "base64 0.22.0", + "base64 0.22.1", "chrono", "directories", "flate2", @@ -2228,7 +2535,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2245,7 +2552,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2272,102 +2579,116 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" dependencies = [ - "opentelemetry_api 0.19.0", + "opentelemetry_api", "opentelemetry_sdk 0.19.0", ] [[package]] name = "opentelemetry" -version = "0.20.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" +checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", ] [[package]] name = "opentelemetry" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" +checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.2.6", "js-sys", "once_cell", "pin-project-lite", "thiserror", - "urlencoding", ] [[package]] name = "opentelemetry-otlp" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" dependencies = [ "async-trait", "futures-core", "http 0.2.12", - "opentelemetry-proto", + "opentelemetry 0.22.0", + "opentelemetry-proto 0.5.0", "opentelemetry-semantic-conventions", - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", - "prost 0.11.9", + "opentelemetry_sdk 0.22.1", + "prost 0.12.6", "thiserror", "tokio", - "tonic 0.9.2", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry-proto" -version = "0.3.0" +name = "opentelemetry-otlp" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" +checksum = "a94c69209c05319cdf7460c6d4c055ed102be242a0a6245835d7bc42c6ec7f54" dependencies = [ - "opentelemetry_api 0.20.0", - "opentelemetry_sdk 0.20.0", - "prost 0.11.9", - "tonic 0.9.2", + "async-trait", + "futures-core", + "http 0.2.12", + "opentelemetry 0.23.0", + "opentelemetry-proto 0.6.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "thiserror", + "tokio", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry-semantic-conventions" -version = "0.12.0" +name = "opentelemetry-proto" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" dependencies = [ - "opentelemetry 0.20.0", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", + "prost 0.12.6", + "tonic 0.11.0", ] [[package]] -name = "opentelemetry_api" -version = "0.19.0" +name = "opentelemetry-proto" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" +checksum = "984806e6cf27f2b49282e2a05e288f30594f3dbc74eb7a6e99422bc48ed78162" dependencies = [ - "fnv", - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "once_cell", - "pin-project-lite", - "thiserror", - "urlencoding", + "opentelemetry 0.23.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "tonic 0.11.0", ] +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" + [[package]] name = "opentelemetry_api" -version = "0.20.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" +checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" dependencies = [ + "fnv", "futures-channel", "futures-util", "indexmap 1.9.3", - "js-sys", "once_cell", "pin-project-lite", "thiserror", @@ -2388,7 +2709,7 @@ dependencies = [ "futures-executor", "futures-util", "once_cell", - "opentelemetry_api 0.19.0", + "opentelemetry_api", "percent-encoding", "rand", "thiserror", @@ -2396,22 +2717,21 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.20.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" +checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" dependencies = [ "async-trait", "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", + "glob", "once_cell", - "opentelemetry_api 0.20.0", - "ordered-float 3.9.2", + "opentelemetry 0.22.0", + "ordered-float", "percent-encoding", "rand", - "regex", - "serde_json", "thiserror", "tokio", "tokio-stream", @@ -2419,22 +2739,24 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.21.2" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" +checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" dependencies = [ "async-trait", - "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", "glob", + "lazy_static", "once_cell", - "opentelemetry 0.21.0", - "ordered-float 4.2.0", + "opentelemetry 0.23.0", + "ordered-float", "percent-encoding", "rand", "thiserror", + "tokio", + "tokio-stream", ] [[package]] @@ -2445,20 +2767,36 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "3.9.2" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" dependencies = [ "num-traits", ] [[package]] -name = "ordered-float" -version = "4.2.0" +name = "ort" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +checksum = "11826e6118cc42fea0cb2b102f7d006c1bb339cb167f8badb5fb568616438234" dependencies = [ - "num-traits", + "half", + "ndarray", + "ort-sys", + "tracing", +] + +[[package]] +name = "ort-sys" +version = "2.0.0-rc.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4780a8b8681e653b2bed85c7f0e2c6e8547224c3e983e5ad27bf0457e012407" +dependencies = [ + "flate2", + "pkg-config", + "sha2", + "tar", + "ureq", ] [[package]] @@ -2467,11 +2805,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2479,22 +2823,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -2504,9 +2848,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap 2.2.6", @@ -2529,7 +2873,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2556,6 +2900,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +[[package]] +name = "portable-atomic-util" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +dependencies = [ + "portable-atomic", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2580,12 +2933,21 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.60", + "syn 2.0.68", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", ] [[package]] @@ -2614,9 +2976,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2633,12 +2995,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.4", + "prost-derive 0.12.6", ] [[package]] @@ -2665,9 +3027,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" dependencies = [ "bytes", "heck 0.5.0", @@ -2676,11 +3038,11 @@ dependencies = [ "multimap 0.10.0", "once_cell", "petgraph", - "prettyplease 0.2.19", - "prost 0.12.4", - "prost-types 0.12.4", + "prettyplease 0.2.20", + "prost 0.12.6", + "prost-types 0.12.6", "regex", - "syn 2.0.60", + "syn 2.0.68", "tempfile", ] @@ -2699,15 +3061,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.4" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2720,40 +3082,86 @@ dependencies = [ ] [[package]] -name = "prost-types" -version = "0.12.4" +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost 0.12.6", +] + +[[package]] +name = "pulp" +version = "0.18.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec8d02258294f59e4e223b41ad7e81c874aa6b15bc4ced9ba3965826da0eed5" +dependencies = [ + "bytemuck", + "libm", + "num-complex", + "reborrow", +] + +[[package]] +name = "quanta" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid 11.0.2", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quinn" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" dependencies = [ - "prost 0.12.4", + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.10", + "thiserror", + "tokio", + "tracing", ] [[package]] -name = "pulp" -version = "0.18.10" +name = "quinn-proto" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14989307e408d9f4245d4fda09a7b144a08114ba124e26cab60ab83dc98db10" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" dependencies = [ - "bytemuck", - "libm", - "num-complex", - "reborrow", + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.10", + "slab", + "thiserror", + "tinyvec", + "tracing", ] [[package]] -name = "quanta" -version = "0.11.1" +name = "quinn-udp" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" dependencies = [ - "crossbeam-utils", "libc", - "mach2", "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi", + "socket2", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -2814,6 +3222,21 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "raw-cpuid" +version = "11.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" version = "1.10.0" @@ -2860,6 +3283,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" version = "0.4.5" @@ -2873,14 +3305,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -2894,13 +3326,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -2911,9 +3343,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -2926,11 +3358,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", - "hyper-tls", + "hyper 0.14.29", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -2939,7 +3371,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", @@ -2952,7 +3384,56 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.4.0", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.10", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg 0.52.0", ] [[package]] @@ -2972,9 +3453,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" +checksum = "19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2983,22 +3464,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" +checksum = "cb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.60", + "syn 2.0.68", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.3.0" +version = "8.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" +checksum = "38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32" dependencies = [ "sha2", "walkdir", @@ -3006,9 +3487,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" @@ -3016,7 +3503,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3037,6 +3524,35 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls" +version = "0.23.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3046,18 +3562,29 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -3065,15 +3592,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safetensors" @@ -3111,11 +3638,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3124,9 +3651,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3140,29 +3667,29 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3190,9 +3717,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -3244,7 +3771,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3267,6 +3794,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -3282,6 +3815,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +[[package]] +name = "simsimd" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc843bc8f12d9c8e6b734a0fe8918fc497b42f6ae0f347dbfdad5b5138ab9b4" +dependencies = [ + "cc", +] + [[package]] name = "sketches-ddsketch" version = "0.2.2" @@ -3305,9 +3847,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3350,21 +3892,34 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "strsim" -version = "0.11.1" +name = "strum" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.68", +] [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3379,9 +3934,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3408,7 +3963,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3417,7 +3972,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "enum-as-inner", "libc", @@ -3448,9 +4003,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -3471,11 +4026,14 @@ dependencies = [ [[package]] name = "text-embeddings-backend" -version = "1.2.3" +version = "1.5.1" dependencies = [ "clap", + "hf-hub", + "serde_json", "text-embeddings-backend-candle", "text-embeddings-backend-core", + "text-embeddings-backend-ort", "text-embeddings-backend-python", "tokio", "tracing", @@ -3483,7 +4041,7 @@ dependencies = [ [[package]] name = "text-embeddings-backend-candle" -version = "1.2.3" +version = "1.5.1" dependencies = [ "accelerate-src", "anyhow", @@ -3513,16 +4071,32 @@ dependencies = [ [[package]] name = "text-embeddings-backend-core" -version = "1.2.3" +version = "1.5.1" dependencies = [ "clap", "nohash-hasher", "thiserror", ] +[[package]] +name = "text-embeddings-backend-ort" +version = "1.5.1" +dependencies = [ + "anyhow", + "ndarray", + "nohash-hasher", + "num_cpus", + "ort", + "serde", + "serde_json", + "text-embeddings-backend-core", + "thiserror", + "tracing", +] + [[package]] name = "text-embeddings-backend-python" -version = "1.2.3" +version = "1.5.1" dependencies = [ "backend-grpc-client", "nohash-hasher", @@ -3536,10 +4110,12 @@ dependencies = [ [[package]] name = "text-embeddings-core" -version = "1.2.3" +version = "1.5.1" dependencies = [ + "async-channel", "hf-hub", "metrics", + "serde_json", "text-embeddings-backend", "thiserror", "tokenizers", @@ -3549,13 +4125,13 @@ dependencies = [ [[package]] name = "text-embeddings-router" -version = "1.2.3" +version = "1.5.1" dependencies = [ "anyhow", "async-stream", "axum 0.7.5", "axum-tracing-opentelemetry", - "base64 0.21.7", + "base64 0.22.1", "clap", "futures", "hf-hub", @@ -3563,16 +4139,19 @@ dependencies = [ "init-tracing-opentelemetry", "insta", "is_close", + "libc", "metrics", "metrics-exporter-prometheus", "mimalloc", "num_cpus", - "opentelemetry 0.20.0", - "opentelemetry-otlp", - "prost 0.12.4", - "reqwest", + "opentelemetry 0.23.0", + "opentelemetry-otlp 0.16.0", + "opentelemetry_sdk 0.23.0", + "prost 0.12.6", + "reqwest 0.12.5", "serde", "serde_json", + "simsimd", "text-embeddings-backend", "text-embeddings-core", "thiserror", @@ -3580,12 +4159,12 @@ dependencies = [ "tokio", "tokio-stream", "tonic 0.11.0", - "tonic-build 0.10.2", + "tonic-build 0.11.0", "tonic-health", "tonic-reflection", "tower-http", "tracing", - "tracing-opentelemetry 0.21.0", + "tracing-opentelemetry 0.24.0", "tracing-subscriber", "utoipa", "utoipa-swagger-ui", @@ -3595,22 +4174,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3658,9 +4237,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -3692,7 +4271,7 @@ dependencies = [ "rayon", "rayon-cond", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", "serde", "serde_json", "spm_precompiled", @@ -3704,9 +4283,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3733,13 +4312,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3752,6 +4331,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.10", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -3765,50 +4355,60 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.14", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.13", ] [[package]] @@ -3823,10 +4423,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", @@ -3850,14 +4450,14 @@ dependencies = [ "axum 0.6.20", "base64 0.21.7", "bytes", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.4", + "prost 0.12.6", "tokio", "tokio-stream", "tower", @@ -3881,15 +4481,15 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" dependencies = [ - "prettyplease 0.2.19", + "prettyplease 0.2.20", "proc-macro2", - "prost-build 0.12.4", + "prost-build 0.12.6", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3899,7 +4499,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cef6e24bc96871001a7e48e820ab240b3de2201e59b517cf52835df2f1d2350" dependencies = [ "async-stream", - "prost 0.12.4", + "prost 0.12.6", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3911,8 +4511,8 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "548c227bd5c0fae5925812c4ec6c66ffcfced23ea370cb823f4d18f0fc1cb6a7" dependencies = [ - "prost 0.12.4", - "prost-types 0.12.4", + "prost 0.12.6", + "prost-types 0.12.6", "tokio", "tokio-stream", "tonic 0.11.0", @@ -3944,7 +4544,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "http 1.1.0", "http-body 1.0.0", @@ -3986,7 +4586,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4037,30 +4637,32 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" +checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" dependencies = [ + "js-sys", "once_cell", - "opentelemetry 0.20.0", - "opentelemetry_sdk 0.20.0", + "opentelemetry 0.22.0", + "opentelemetry_sdk 0.22.1", "smallvec", "tracing", "tracing-core", - "tracing-log 0.1.4", + "tracing-log 0.2.0", "tracing-subscriber", + "web-time", ] [[package]] name = "tracing-opentelemetry" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" +checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.2", + "opentelemetry 0.23.0", + "opentelemetry_sdk 0.23.0", "smallvec", "tracing", "tracing-core", @@ -4071,14 +4673,14 @@ dependencies = [ [[package]] name = "tracing-opentelemetry-instrumentation-sdk" -version = "0.17.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db99a4f5224920c499515a737e2749eb9a19b729b3880afc24594524e9861de" +checksum = "9a276058193f1b03d8279356215ec4c8c1bb21e40e5554bb239aa94fb2d8e189" dependencies = [ "http 1.1.0", - "opentelemetry 0.21.0", + "opentelemetry 0.22.0", "tracing", - "tracing-opentelemetry 0.22.0", + "tracing-opentelemetry 0.23.0", ] [[package]] @@ -4171,9 +4773,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode_categories" @@ -4195,16 +4797,16 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.9.6" +version = "2.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +checksum = "d11a831e3c0b56e438a28308e7c810799e3c118417f342d30ecec080105395cd" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls", + "rustls 0.22.4", "rustls-pki-types", "rustls-webpki", "serde", @@ -4216,9 +4818,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -4233,15 +4835,15 @@ checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "utoipa" -version = "4.2.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" +checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ "indexmap 2.2.6", "serde", @@ -4251,38 +4853,40 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "4.2.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c9f4d08338c1bfa70dde39412a040a884c6f318b3d09aaaf3437a1e52027fc" +checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "regex", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "utoipa-swagger-ui" -version = "6.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b39868d43c011961e04b41623e050aedf2cc93652562ff7935ce0f819aaf2da" +checksum = "943e0ff606c6d57d410fd5663a4d7c074ab2c5f14ab903b9514565e59fa1189e" dependencies = [ "axum 0.7.5", "mime_guess", "regex", + "reqwest 0.12.5", "rust-embed", "serde", "serde_json", + "url", "utoipa", - "zip", + "zip 1.1.4", ] [[package]] name = "uuid" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -4317,7 +4921,7 @@ checksum = "cff2381c6b31ab2555441e382d699a56c3551d0cfdf0c4df5617bf271c1dd102" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4384,7 +4988,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -4418,7 +5022,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4441,9 +5045,9 @@ dependencies = [ [[package]] name = "web-time" -version = "0.2.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4451,9 +5055,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -4651,9 +5255,18 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.6" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -4668,6 +5281,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "xattr" version = "1.3.1" @@ -4690,9 +5313,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" dependencies = [ "serde", "stable_deref_trait", @@ -4702,62 +5325,76 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "zerofrom" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] [[package]] name = "zip" @@ -4768,5 +5405,20 @@ dependencies = [ "byteorder", "crc32fast", "crossbeam-utils", +] + +[[package]] +name = "zip" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cc23c04387f4da0374be4533ad1208cbb091d5c11d070dfef13676ad6497164" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", "flate2", + "indexmap 2.2.6", + "num_enum", + "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index f8198679..3d13f7de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "backends", "backends/candle", + "backends/ort", "backends/core", "backends/python", "backends/grpc-client", @@ -11,18 +12,32 @@ members = [ resolver = "2" [workspace.package] -version = "1.2.3" +version = "1.5.1" edition = "2021" authors = ["Olivier Dehaene"] homepage = "https://github.com/huggingface/text-embeddings-inference" +[workspace.dependencies] +anyhow = "1.0.75" +clap = { version = "4.1", features = ["derive", "env"] } +hf-hub = { version = "0.3.2", features = ["tokio", "online"], default-features = false } +metrics = "0.23" +nohash-hasher = "0.2" +num_cpus = "1.16.0" +tokenizers = { version = "0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } +tokio = { version = "1.25", features = ["rt", "rt-multi-thread", "parking_lot", "sync", "signal"] } +tracing = "0.1" +serde = { version = "1.0", features = ["serde_derive"] } +serde_json = "1.0" +thiserror = "1.0" + + [patch.crates-io] cudarc = { git = "https://github.com/coreylowman/cudarc", rev = "c388e724af93a3e8fbe484f5ded2d8b3c1badd8e" } -candle = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-core" } -candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-nn" } -candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-transformers" } -candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "33b7ecf9ed82bb7c20f1a94555218fabfbaa2fe3", package = "candle-flash-attn" } -hf-hub = { git = "https://github.com/huggingface/hf-hub", rev = "b167f69692be5f49eb8003788f7f8a499a98b096" } +candle = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-core" } +candle-nn = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-nn" } +candle-transformers = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-transformers" } +candle-flash-attn = { git = "https://github.com/OlivierDehaene/candle", rev = "7e02ad856104799b73a946ac1e153f0de77feaaf", package = "candle-flash-attn" } [profile.release] debug = 0 diff --git a/Dockerfile b/Dockerfile index 8c1368c0..152f2738 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,22 +28,9 @@ ARG ACTIONS_CACHE_URL ARG ACTIONS_RUNTIME_TOKEN ARG SCCACHE_GHA_ENABLED -RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \ -| gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \ - echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | \ - tee /etc/apt/sources.list.d/oneAPI.list - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - intel-oneapi-mkl-devel=2024.0.0-49656 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* - -RUN echo "int mkl_serv_intel_cpu_true() {return 1;}" > fakeintel.c && \ - gcc -shared -fPIC -o libfakeintel.so fakeintel.c - COPY --from=planner /usr/src/recipe.json recipe.json -RUN cargo chef cook --release --features candle --features mkl-dynamic --no-default-features --recipe-path recipe.json && sccache -s +RUN cargo chef cook --release --features ort --no-default-features --recipe-path recipe.json && sccache -s COPY backends backends COPY core core @@ -51,11 +38,11 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -FROM builder as http-builder +FROM builder AS http-builder -RUN cargo build --release --bin text-embeddings-router -F candle -F mkl-dynamic -F http --no-default-features && sccache -s +RUN cargo build --release --bin text-embeddings-router -F ort -F http --no-default-features && sccache -s -FROM builder as grpc-builder +FROM builder AS grpc-builder RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP && \ @@ -65,37 +52,21 @@ RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ COPY proto proto -RUN cargo build --release --bin text-embeddings-router -F grpc -F candle -F mkl-dynamic --no-default-features && sccache -s +RUN cargo build --release --bin text-embeddings-router -F grpc -F ort --no-default-features && sccache -s -FROM debian:bookworm-slim as base +FROM debian:bookworm-slim AS base ENV HUGGINGFACE_HUB_CACHE=/data \ - PORT=80 \ - MKL_ENABLE_INSTRUCTIONS=AVX512_E4 \ - RAYON_NUM_THREADS=8 \ - LD_PRELOAD=/usr/local/libfakeintel.so \ - LD_LIBRARY_PATH=/usr/local/lib + PORT=80 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - libomp-dev \ ca-certificates \ libssl-dev \ curl \ && rm -rf /var/lib/apt/lists/* -# Copy a lot of the Intel shared objects because of the mkl_serv_intel_cpu_true patch... -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.so.2 /usr/local/lib/libmkl_intel_lp64.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_thread.so.2 /usr/local/lib/libmkl_intel_thread.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so.2 /usr/local/lib/libmkl_core.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_def.so.2 /usr/local/lib/libmkl_vml_def.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_def.so.2 /usr/local/lib/libmkl_def.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_avx2.so.2 /usr/local/lib/libmkl_vml_avx2.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_vml_avx512.so.2 /usr/local/lib/libmkl_vml_avx512.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_avx2.so.2 /usr/local/lib/libmkl_avx2.so.2 -COPY --from=builder /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_avx512.so.2 /usr/local/lib/libmkl_avx512.so.2 -COPY --from=builder /usr/src/libfakeintel.so /usr/local/libfakeintel.so -FROM base as grpc +FROM base AS grpc COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router @@ -107,7 +78,7 @@ FROM base AS http COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router # Amazon SageMaker compatible image -FROM http as sagemaker +FROM http AS sagemaker COPY --chmod=775 sagemaker-entrypoint.sh entrypoint.sh ENTRYPOINT ["./entrypoint.sh"] diff --git a/Dockerfile-arm64 b/Dockerfile-arm64 deleted file mode 100644 index e170a534..00000000 --- a/Dockerfile-arm64 +++ /dev/null @@ -1,92 +0,0 @@ -FROM lukemathwalker/cargo-chef:latest-rust-1.75-bookworm AS chef - -WORKDIR /usr/src - -ENV SCCACHE=0.5.4 -ENV RUSTC_WRAPPER=/usr/local/bin/sccache - -# Donwload and configure sccache -RUN curl -fsSL https://github.com/mozilla/sccache/releases/download/v$SCCACHE/sccache-v$SCCACHE-x86_64-unknown-linux-musl.tar.gz | tar -xzv --strip-components=1 -C /usr/local/bin sccache-v$SCCACHE-x86_64-unknown-linux-musl/sccache && \ - chmod +x /usr/local/bin/sccache - -FROM chef AS planner - -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ - -RUN cargo chef prepare --recipe-path recipe.json - -FROM chef AS builder - -ARG GIT_SHA -ARG DOCKER_LABEL - -# sccache specific variables -ARG ACTIONS_CACHE_URL -ARG ACTIONS_RUNTIME_TOKEN -ARG SCCACHE_GHA_ENABLED - -RUN echo "int mkl_serv_intel_cpu_true() {return 1;}" > fakeintel.c && \ - gcc -shared -fPIC -o libfakeintel.so fakeintel.c - -COPY --from=planner /usr/src/recipe.json recipe.json - -RUN cargo chef cook --release --features candle --no-default-features --recipe-path recipe.json && sccache -s - -COPY backends backends -COPY core core -COPY router router -COPY Cargo.toml ./ -COPY Cargo.lock ./ - -FROM builder as http-builder - -RUN cargo build --release --bin text-embeddings-router -F candle -F http --no-default-features && sccache -s - -FROM builder as grpc-builder - -RUN PROTOC_ZIP=protoc-21.12-linux-x86_64.zip && \ - curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP && \ - unzip -o $PROTOC_ZIP -d /usr/local bin/protoc && \ - unzip -o $PROTOC_ZIP -d /usr/local 'include/*' && \ - rm -f $PROTOC_ZIP - -COPY proto proto - -RUN cargo build --release --bin text-embeddings-router -F grpc -F candle --no-default-features && sccache -s - -FROM debian:bookworm-slim as base - -COPY --from=builder /usr/src/libfakeintel.so /usr/local/libfakeintel.so - -ENV HUGGINGFACE_HUB_CACHE=/data \ - PORT=80 \ - MKL_ENABLE_INSTRUCTIONS=AVX512_E4 \ - RAYON_NUM_THREADS=8 \ - LD_PRELOAD=/usr/local/libfakeintel.so \ - LD_LIBRARY_PATH=/usr/local/lib - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - libomp-dev \ - ca-certificates \ - libssl-dev \ - curl \ - && rm -rf /var/lib/apt/lists/* - - -FROM base as grpc - -COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router - -ENTRYPOINT ["text-embeddings-router"] -CMD ["--json-output"] - -FROM base - -COPY --from=http-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router - -ENTRYPOINT ["text-embeddings-router"] -CMD ["--json-output"] diff --git a/Dockerfile-cuda b/Dockerfile-cuda index d67eba93..1e39fb1e 100644 --- a/Dockerfile-cuda +++ b/Dockerfile-cuda @@ -75,7 +75,7 @@ COPY router router COPY Cargo.toml ./ COPY Cargo.lock ./ -FROM builder as http-builder +FROM builder AS http-builder RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ then \ @@ -84,7 +84,7 @@ RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ cargo build --release --bin text-embeddings-router -F candle-cuda -F static-linking -F http --no-default-features && sccache -s; \ fi; -FROM builder as grpc-builder +FROM builder AS grpc-builder RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ unzip \ @@ -105,7 +105,7 @@ RUN if [ ${CUDA_COMPUTE_CAP} -ge 75 -a ${CUDA_COMPUTE_CAP} -lt 80 ]; \ cargo build --release --bin text-embeddings-router -F candle-cuda -F static-linking -F grpc --no-default-features && sccache -s; \ fi; -FROM nvidia/cuda:12.2.0-base-ubuntu22.04 as base +FROM nvidia/cuda:12.2.0-base-ubuntu22.04 AS base ARG DEFAULT_USE_FLASH_ATTENTION=True @@ -113,7 +113,13 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION -FROM base as grpc +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + libssl-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + +FROM base AS grpc COPY --from=grpc-builder /usr/src/target/release/text-embeddings-router /usr/local/bin/text-embeddings-router diff --git a/Dockerfile-cuda-all b/Dockerfile-cuda-all index 71321705..851a3c97 100644 --- a/Dockerfile-cuda-all +++ b/Dockerfile-cuda-all @@ -110,7 +110,7 @@ RUN if [ $VERTEX = "true" ]; \ RUN mv /usr/src/target/release/text-embeddings-router /usr/src/target/release/text-embeddings-router-90 -FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 as base +FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 AS base ARG DEFAULT_USE_FLASH_ATTENTION=True @@ -118,6 +118,12 @@ ENV HUGGINGFACE_HUB_CACHE=/data \ PORT=80 \ USE_FLASH_ATTENTION=$DEFAULT_USE_FLASH_ATTENTION +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + libssl-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + COPY --from=builder /usr/src/target/release/text-embeddings-router-75 /usr/local/bin/text-embeddings-router-75 COPY --from=builder /usr/src/target/release/text-embeddings-router-80 /usr/local/bin/text-embeddings-router-80 COPY --from=builder /usr/src/target/release/text-embeddings-router-90 /usr/local/bin/text-embeddings-router-90 diff --git a/README.md b/README.md index e9306fda..002bcdfc 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ length of 512 tokens: - [Docker Images](#docker-images) - [API Documentation](#api-documentation) - [Using a private or gated model](#using-a-private-or-gated-model) + - [Air gapped deployment](#air-gapped-deployment) - [Using Re-rankers models](#using-re-rankers-models) - [Using Sequence Classification models](#using-sequence-classification-models) - [Using SPLADE pooling](#using-splade-pooling) @@ -63,30 +64,33 @@ Ember, GTE and E5. TEI implements many features such as: #### Text Embeddings -You can use any JinaBERT model with Alibi or absolute positions or any BERT, CamemBERT, RoBERTa, or XLM-RoBERTa model -with absolute positions in `text-embeddings-inference`. +Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT +model with Alibi positions and Mistral, Alibaba GTE and Qwen2 models with Rope positions. -**Support for other model types will be added in the future.** +Below are some examples of the currently supported models: -Examples of supported models: +| MTEB Rank | Model Size | Model Type | Model ID | +|-----------|---------------------|-------------|--------------------------------------------------------------------------------------------------| +| 1 | 7B (Very Expensive) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | +| 2 | 7B (Very Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-7B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-7B-instruct) | +| 9 | 1.5B (Expensive) | Qwen2 | [Alibaba-NLP/gte-Qwen2-1.5B-instruct](https://hf.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](https://hf.co/Alibaba-NLP/gte-large-en-v1.5) | +| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | +| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | -| MTEB Rank | Model Type | Model ID | -|-----------|-------------|--------------------------------------------------------------------------------------------------| -| 6 | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | -| 10 | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | -You can explore the list of best performing text embeddings -models [here](https://huggingface.co/spaces/mteb/leaderboard). +To explore the list of best performing text embeddings models, visit the +[Massive Text Embedding Benchmark (MTEB) Leaderboard](https://huggingface.co/spaces/mteb/leaderboard). #### Sequence Classification and Re-Ranking -`text-embeddings-inference` v0.4.0 added support for Bert, CamemBERT, RoBERTa and XLM-RoBERTa Sequence Classification models. +Text Embeddings Inference currently supports CamemBERT, and XLM-RoBERTa Sequence Classification models with absolute positions. -Example of supported sequence classification models: +Below are some examples of the currently supported models: | Task | Model Type | Model ID | |--------------------|-------------|---------------------------------------------------------------------------------------------| @@ -98,10 +102,9 @@ Example of supported sequence classification models: ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` And then you can make requests like @@ -163,9 +166,11 @@ Options: [env: POOLING=] Possible values: - - cls: Select the CLS token as embedding - - mean: Apply Mean pooling to the model embeddings - - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only available if the loaded model is a `ForMaskedLM` Transformer model + - cls: Select the CLS token as embedding + - mean: Apply Mean pooling to the model embeddings + - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only + available if the loaded model is a `ForMaskedLM` Transformer model + - last-token: Select the last token as embedding --max-concurrent-requests The maximum amount of concurrent requests for this particular deployment. @@ -199,6 +204,37 @@ Options: [env: MAX_CLIENT_BATCH_SIZE=] [default: 32] + --auto-truncate + Automatically truncate inputs that are longer than the maximum supported size + + Unused for gRPC servers + + [env: AUTO_TRUNCATE=] + + --default-prompt-name + The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. + + Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + + For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the + sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because + the prompt text will be prepended before any text to encode. + + The argument '--default-prompt-name ' cannot be used with '--default-prompt ` + + [env: DEFAULT_PROMPT_NAME=] + + --default-prompt + The prompt that should be used by default for encoding. If not set, no prompt will be applied. + + For example if ``default_prompt`` is "query: " then the sentence "What is the capital of France?" will be + encoded as "query: What is the capital of France?" because the prompt text will be prepended before any text + to encode. + + The argument '--default-prompt ' cannot be used with '--default-prompt-name ` + + [env: DEFAULT_PROMPT=] + --hf-api-token Your HuggingFace hub token @@ -224,9 +260,10 @@ Options: [default: /tmp/text-embeddings-inference-server] --huggingface-hub-cache - The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk for instance + The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk + for instance - [env: HUGGINGFACE_HUB_CACHE=/data] + [env: HUGGINGFACE_HUB_CACHE=] --payload-limit Payload size limit in bytes @@ -239,7 +276,8 @@ Options: --api-key Set an api key for request authorization. - By default the server responds to every request. With an api key set, the requests must have the Authorization header set with the api key as Bearer token. + By default the server responds to every request. With an api key set, the requests must have the Authorization + header set with the api key as Bearer token. [env: API_KEY=] @@ -254,12 +292,14 @@ Options: [env: OTLP_ENDPOINT=] --otlp-service-name - The service name for opentelemetry. + The service name for opentelemetry. e.g. `text-embeddings-inference.server` [env: OTLP_SERVICE_NAME=] [default: text-embeddings-inference.server] --cors-allow-origin + Unused for gRPC servers + [env: CORS_ALLOW_ORIGIN=] ``` @@ -269,13 +309,13 @@ Text Embeddings Inference ships with multiple Docker images that you can use to | Architecture | Image | |-------------------------------------|-------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.2 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.2 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.2 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.2 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.2 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.5 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.5 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.5 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.5 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.5 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. @@ -288,14 +328,14 @@ at: [https://huggingface.github.io/text-embeddings-inference](https://huggingfac ### Using a private or gated model -You have the option to utilize the `HUGGING_FACE_HUB_TOKEN` environment variable for configuring the token employed by +You have the option to utilize the `HF_API_TOKEN` environment variable for configuring the token employed by `text-embeddings-inference`. This allows you to gain access to protected resources. For example: 1. Go to https://huggingface.co/settings/tokens 2. Copy your cli READ token -3. Export `HUGGING_FACE_HUB_TOKEN=` +3. Export `HF_API_TOKEN=` or with Docker: @@ -304,7 +344,30 @@ model= volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run token= -docker run --gpus all -e HUGGING_FACE_HUB_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model +``` + +### Air gapped deployment + +To deploy Text Embeddings Inference in an air-gapped environment, first download the weights and then mount them inside +the container using a volume. + +For example: + +```shell +# (Optional) create a `models` directory +mkdir models +cd models + +# Make sure you have git-lfs installed (https://git-lfs.com) +git lfs install +git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 + +# Set the models directory as the volume path +volume=$PWD + +# Mount the models directory inside the container with a volume and set the model ID +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id /data/gte-base-en-v1.5 ``` ### Using Re-rankers models @@ -319,10 +382,9 @@ downstream performance. ```shell model=BAAI/bge-reranker-large -revision=refs/pr/4 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` And then you can rank the similarity between a query and a list of texts with: @@ -342,7 +404,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -362,7 +424,7 @@ You can choose to activate SPLADE pooling for Bert and Distilbert MaskedLM archi model=naver/efficient-splade-VI-BT-large-query volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --pooling splade +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model --pooling splade ``` Once you have deployed the model you can use the `/embed_sparse` endpoint to get the sparse embedding: @@ -382,16 +444,16 @@ by setting the address to an OTLP collector with the `--otlp-endpoint` argument. ### gRPC `text-embeddings-inference` offers a gRPC API as an alternative to the default HTTP API for high performance -deployments. The API protobuf definition can be found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/proto/tei.proto). +deployments. The API protobuf definition can be +found [here](https://github.com/huggingface/text-embeddings-inference/blob/main/proto/tei.proto). You can use the gRPC API by adding the `-grpc` tag to any TEI Docker image. For example: ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 volume=$PWD/data # share a volume with the Docker container to avoid downloading weights every run -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2-grpc --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5-grpc --model-id $model ``` ```shell @@ -423,9 +485,8 @@ You can now launch Text Embeddings Inference on CPU with: ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 -text-embeddings-router --model-id $model --revision $revision --port 8080 +text-embeddings-router --model-id $model --port 8080 ``` **Note:** on some machines, you may also need the OpenSSL libraries and gcc. On Linux machines, run: @@ -438,7 +499,8 @@ sudo apt-get install libssl-dev gcc -y GPUs with Cuda compute capabilities < 7.5 are not supported (V100, Titan V, GTX 1000 series, ...). -Make sure you have Cuda and the nvidia drivers installed. NVIDIA drivers on your device need to be compatible with CUDA version 12.2 or higher. +Make sure you have Cuda and the nvidia drivers installed. NVIDIA drivers on your device need to be compatible with CUDA +version 12.2 or higher. You also need to add the nvidia binaries to your path: ```shell @@ -461,9 +523,8 @@ You can now launch Text Embeddings Inference on GPU with: ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 -text-embeddings-router --model-id $model --revision $revision --port 8080 +text-embeddings-router --model-id $model --port 8080 ``` ## Docker build @@ -499,12 +560,18 @@ docker build . -f Dockerfile-cuda --build-arg CUDA_COMPUTE_CAP=$runtime_compute_ ``` ### Apple M1/M2 arm64 architectures + #### DISCLAIMER -As explained here [MPS-Ready, ARM64 Docker Image](https://github.com/pytorch/pytorch/issues/81224), Metal / MPS is not supported via Docker. As such inference will be CPU bound and most likely pretty slow when using this docker image on an M1/M2 ARM CPU. + +As explained here [MPS-Ready, ARM64 Docker Image](https://github.com/pytorch/pytorch/issues/81224), Metal / MPS is not +supported via Docker. As such inference will be CPU bound and most likely pretty slow when using this docker image on an +M1/M2 ARM CPU. + ``` -docker build . -f Dockerfile-arm64 --platform=linux/arm64 +docker build . -f Dockerfile --platform=linux/arm64 ``` ## Examples + - [Set up an Inference Endpoint with TEI](https://huggingface.co/learn/cookbook/automatic_embedding_tei_inference_endpoints) - [RAG containers with TEI](https://github.com/plaggy/rag-containers) diff --git a/backends/Cargo.toml b/backends/Cargo.toml index 3a6797cb..f29283ad 100644 --- a/backends/Cargo.toml +++ b/backends/Cargo.toml @@ -6,16 +6,20 @@ authors.workspace = true homepage.workspace = true [dependencies] -clap = { version = "4.1.4", features = ["derive"], optional = true } +clap = { workspace = true, optional = true } +hf-hub = { workspace = true } +serde_json = { workspace = true } text-embeddings-backend-core = { path = "core" } text-embeddings-backend-python = { path = "python", optional = true } text-embeddings-backend-candle = { path = "candle", optional = true } -tokio = { version = "^1.25", features = ["sync"] } -tracing = "^0.1" +text-embeddings-backend-ort = { path = "ort", optional = true } +tokio = { workspace = true } +tracing = { workspace = true } [features] clap = ["dep:clap", "text-embeddings-backend-core/clap"] python = ["dep:text-embeddings-backend-python"] +ort = ["dep:text-embeddings-backend-ort"] candle = ["dep:text-embeddings-backend-candle"] cuda = ["text-embeddings-backend-candle?/cuda"] metal = ["text-embeddings-backend-candle?/metal"] diff --git a/backends/candle/Cargo.toml b/backends/candle/Cargo.toml index 9fb300b9..f26d213a 100644 --- a/backends/candle/Cargo.toml +++ b/backends/candle/Cargo.toml @@ -6,7 +6,7 @@ authors.workspace = true homepage.workspace = true [dependencies] -anyhow = "^1.0" +anyhow = { workspace = true } accelerate-src = { version = "0.3.2", optional = true } intel-mkl-src = { version = "0.8.1", optional = true } candle = { version = "*", package = "candle-core", default-features = false } @@ -17,21 +17,21 @@ candle-flash-attn-v1 = { git = "https://github.com/huggingface/candle-flash-attn candle-cublaslt = { git = "https://github.com/huggingface/candle-cublaslt", rev = "cf789b7dd6d4abb19b03b9556442f94f0588b4a0", optional = true } candle-layer-norm = { git = "https://github.com/huggingface/candle-layer-norm", rev = "94c2add7d94c2d63aebde77f7534614e04dbaea1", optional = true } candle-rotary = { git = "https://github.com/huggingface/candle-rotary", rev = "0a718a0856569a92f3112e64f10d07e4447822e8", optional = true } -nohash-hasher = "^0.2" +nohash-hasher = { workspace = true } text-embeddings-backend-core = { path = "../core" } -tracing = "^0.1" +tracing = { workspace = true } safetensors = "^0.4" -thiserror = "^1.0" -serde = { version = "^1.0", features = ["serde_derive"] } -serde_json = "^1.0" +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } memmap2 = "^0.9" [dev-dependencies] insta = { git = "https://github.com/OlivierDehaene/insta", rev = "f4f98c0410b91fb5a28b10df98e4422955be9c2c", features = ["yaml"] } is_close = "0.1.3" hf-hub = "0.3.2" -anyhow = "1.0.75" -tokenizers = { version = "^0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } +anyhow = { workspace = true } +tokenizers = { workspace = true } serial_test = "2.0.0" [build-dependencies] diff --git a/backends/candle/src/flash_attn.rs b/backends/candle/src/flash_attn.rs index 3afc6517..f2016928 100644 --- a/backends/candle/src/flash_attn.rs +++ b/backends/candle/src/flash_attn.rs @@ -31,6 +31,7 @@ pub(crate) fn flash_attn_varlen( max_seqlen_k: usize, softmax_scale: f32, causal: bool, + window_size_left: Option, ) -> Result { let runtime_compute_cap = get_runtime_compute_cap(); @@ -38,6 +39,9 @@ pub(crate) fn flash_attn_varlen( if alibi_slopes.is_some() { candle::bail!("Flash attention v1 does not support alibi"); } + if window_size_left.is_some() { + candle::bail!("Flash attention v1 does not support attention windowing"); + } #[cfg(feature = "flash-attn-v1")] { @@ -59,10 +63,12 @@ pub(crate) fn flash_attn_varlen( } else if (80..90).contains(&runtime_compute_cap) || runtime_compute_cap == 90 { #[cfg(feature = "flash-attn")] { - use candle_flash_attn::{flash_attn_varlen, flash_attn_varlen_alibi}; + use candle_flash_attn::{flash_attn_varlen_alibi_windowed, flash_attn_varlen_windowed}; + + let window_size_right = if causal { Some(0) } else { None }; let attention = if let Some(alibi_slopes) = alibi_slopes { - flash_attn_varlen_alibi( + flash_attn_varlen_alibi_windowed( q, k, v, @@ -72,10 +78,11 @@ pub(crate) fn flash_attn_varlen( max_seqlen_q, max_seqlen_k, softmax_scale, - causal, + window_size_left, + window_size_right, ) } else { - flash_attn_varlen( + flash_attn_varlen_windowed( q, k, v, @@ -84,7 +91,8 @@ pub(crate) fn flash_attn_varlen( max_seqlen_q, max_seqlen_k, softmax_scale, - causal, + window_size_left, + window_size_right, ) }; diff --git a/backends/candle/src/layers/linear.rs b/backends/candle/src/layers/linear.rs index 3fdd025b..fc8af1dd 100644 --- a/backends/candle/src/layers/linear.rs +++ b/backends/candle/src/layers/linear.rs @@ -7,6 +7,7 @@ use serde::Deserialize; pub enum HiddenAct { Gelu, Relu, + #[serde(alias = "silu")] Swiglu, } diff --git a/backends/candle/src/layers/mod.rs b/backends/candle/src/layers/mod.rs index 8e108fc2..81f63310 100644 --- a/backends/candle/src/layers/mod.rs +++ b/backends/candle/src/layers/mod.rs @@ -2,7 +2,11 @@ mod cublaslt; mod layer_norm; mod linear; +#[allow(dead_code, unused)] +mod rms_norm; pub use cublaslt::get_cublas_lt_wrapper; pub use layer_norm::LayerNorm; pub use linear::{HiddenAct, Linear}; +#[allow(unused_imports)] +pub use rms_norm::RMSNorm; diff --git a/backends/candle/src/layers/rms_norm.rs b/backends/candle/src/layers/rms_norm.rs new file mode 100644 index 00000000..e7dab642 --- /dev/null +++ b/backends/candle/src/layers/rms_norm.rs @@ -0,0 +1,96 @@ +use candle::{DType, Device, Result, Tensor, D}; +use candle_nn::VarBuilder; + +#[derive(Debug)] +pub struct RMSNorm { + weight: Tensor, + epsilon: f32, + span: tracing::Span, +} + +impl RMSNorm { + pub fn load(vb: VarBuilder, hidden_size: usize, epsilon: f32) -> Result { + Ok(Self { + weight: vb + .get(hidden_size, "weight") + .or_else(|_| vb.get(hidden_size, "gamma"))?, + epsilon, + span: tracing::span!(tracing::Level::TRACE, "rms-norm"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + match hidden_states.device() { + Device::Cpu | Device::Metal(_) => { + let mut hidden_states = hidden_states.clone(); + let residual_add = if let Some(residual) = residual { + let residual_add = hidden_states.add(residual)?; + hidden_states = residual_add.clone(); + residual_add + } else { + hidden_states.clone() + }; + + let hidden_states_dtype = hidden_states.dtype(); + let internal_dtype = match hidden_states_dtype { + DType::F16 | DType::BF16 => DType::F32, + d => d, + }; + let hidden_size = hidden_states.dim(D::Minus1)?; + let hidden_states = hidden_states.to_dtype(internal_dtype)?; + let norm_hidden_states = + (hidden_states.sqr()?.sum_keepdim(D::Minus1)? / hidden_size as f64)?; + let hidden_states_normed = hidden_states + .broadcast_div(&(norm_hidden_states + self.epsilon as f64)?.sqrt()?)?; + Ok(( + hidden_states_normed + .to_dtype(hidden_states_dtype)? + .broadcast_mul(&self.weight)?, + residual_add, + )) + } + Device::Cuda(_) => { + #[cfg(feature = "cuda")] + { + use candle_layer_norm::{fused_add_rms_norm, rms_norm}; + + let original_shape = hidden_states.shape(); + let hidden_states = hidden_states.flatten_to(D::Minus2)?; + + if let Some(residual) = residual { + let residual = residual.flatten_to(D::Minus2)?; + + let (result, residual_add) = fused_add_rms_norm( + &hidden_states, + &residual, + &self.weight, + None, + self.epsilon, + )?; + Ok(( + result.reshape(original_shape)?, + residual_add.reshape(original_shape)?, + )) + } else { + let residual_add = hidden_states.clone(); + + let result = rms_norm(&hidden_states, &self.weight, None, self.epsilon)?; + + Ok(( + result.reshape(original_shape)?, + residual_add.reshape(original_shape)?, + )) + } + } + #[cfg(not(feature = "cuda"))] + candle::bail!("`cuda` feature is not enabled") + } + } + } +} diff --git a/backends/candle/src/lib.rs b/backends/candle/src/lib.rs index a7a5dcf0..acd93750 100644 --- a/backends/candle/src/lib.rs +++ b/backends/candle/src/lib.rs @@ -11,13 +11,13 @@ use crate::compute_cap::{ compatible_compute_cap, get_compile_compute_cap, get_runtime_compute_cap, }; use crate::models::{ - BertConfig, BertModel, DistilBertConfig, DistilBertModel, JinaBertModel, JinaCodeBertModel, - Model, NomicBertModel, NomicConfig, + BertConfig, BertModel, DistilBertConfig, DistilBertModel, GTEConfig, JinaBertModel, + JinaCodeBertModel, MistralConfig, Model, NomicBertModel, NomicConfig, Qwen2Config, }; #[cfg(feature = "cuda")] use crate::models::{ - FlashBertModel, FlashDistilBertModel, FlashJinaBertModel, FlashJinaCodeBertModel, - FlashNomicBertModel, + FlashBertModel, FlashDistilBertModel, FlashGTEModel, FlashJinaBertModel, + FlashJinaCodeBertModel, FlashMistralModel, FlashNomicBertModel, FlashQwen2Model, }; use anyhow::Context; use candle::{DType, Device}; @@ -56,6 +56,10 @@ enum Config { DistilBert(DistilBertConfig), #[serde(rename(deserialize = "nomic_bert"))] NomicBert(NomicConfig), + Mistral(MistralConfig), + #[serde(rename = "new")] + Gte(GTEConfig), + Qwen2(Qwen2Config), } pub struct CandleBackend { @@ -69,6 +73,54 @@ impl CandleBackend { dtype: String, model_type: ModelType, ) -> Result { + // Default files + let default_safetensors = model_path.join("model.safetensors"); + let default_pytorch = model_path.join("pytorch_model.bin"); + + // Single Files + let model_files = if default_safetensors.exists() { + vec![default_safetensors] + } else if default_pytorch.exists() { + vec![default_pytorch] + } + // Sharded weights + else { + // Get index file + let index_file = model_path.join("model.safetensors.index.json"); + + // Parse file + let index_file_string: String = std::fs::read_to_string(&index_file) + .map_err(|err| BackendError::Start(err.to_string()))?; + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .map_err(|err| BackendError::Start(err.to_string()))?; + + let weight_map = match json.get("weight_map") { + None => { + return Err(BackendError::Start(format!( + "no weight map in {index_file:?}" + ))); + } + Some(serde_json::Value::Object(map)) => map, + Some(_) => { + return Err(BackendError::Start(format!( + "weight map in {index_file:?} is not a map" + ))); + } + }; + let mut safetensors_files = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_files.insert(file.to_string()); + } + } + + // Collect paths + safetensors_files + .iter() + .map(|n| model_path.join(n)) + .collect() + }; + // Load config let config: String = std::fs::read_to_string(model_path.join("config.json")) .context("Unable to read config file") @@ -115,17 +167,10 @@ impl CandleBackend { ))) }?; - let safetensors_path = model_path.join("model.safetensors"); - let vb = if safetensors_path.exists() { - unsafe { - VarBuilder::from_mmaped_safetensors( - &[model_path.join("model.safetensors")], - dtype, - &device, - ) - } + let vb = if model_files.len() == 1 && model_files[0].extension().unwrap() == "bin" { + VarBuilder::from_pth(&model_files[0], dtype, &device) } else { - VarBuilder::from_pth(model_path.join("pytorch_model.bin"), dtype, &device) + unsafe { VarBuilder::from_mmaped_safetensors(&model_files, dtype, &device) } } .s()?; @@ -136,7 +181,7 @@ impl CandleBackend { )), (Config::Bert(config), Device::Cpu | Device::Metal(_)) => match config { BertConfigWrapper::JinaBert(config) => { - tracing::info!("Starting JinaBertModel model on {:?}", device); + tracing::info!("Starting JinaBert model on {:?}", device); Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) } BertConfigWrapper::JinaCodeBert(config) => { @@ -160,15 +205,27 @@ impl CandleBackend { )) } (Config::DistilBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting DistilBertModel model on {:?}", device); + tracing::info!("Starting DistilBert model on {:?}", device); Ok(Box::new( DistilBertModel::load(vb, &config, model_type).s()?, )) } (Config::NomicBert(config), Device::Cpu | Device::Metal(_)) => { - tracing::info!("Starting NomicBertModel model on {:?}", device); + tracing::info!("Starting NomicBert model on {:?}", device); Ok(Box::new(NomicBertModel::load(vb, &config, model_type).s()?)) } + (Config::Mistral(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "Mistral is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), + (Config::Gte(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "GTE is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), + (Config::Qwen2(_), Device::Cpu | Device::Metal(_)) => Err(BackendError::Start( + "Qwen2 is only supported on Cuda devices in fp16 with flash attention enabled" + .to_string(), + )), #[cfg(feature = "cuda")] (Config::Bert(config), Device::Cuda(_)) => { if cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) @@ -198,7 +255,7 @@ impl CandleBackend { } else { match config { BertConfigWrapper::JinaBert(config) => { - tracing::info!("Starting JinaBertModel model on {:?}", device); + tracing::info!("Starting JinaBert model on {:?}", device); Ok(Box::new(JinaBertModel::load(vb, &config, model_type).s()?)) } BertConfigWrapper::JinaCodeBert(config) => { @@ -245,7 +302,7 @@ impl CandleBackend { .to_lowercase() == "true" { - tracing::info!("Starting FlashDistilBertModel model on {:?}", device); + tracing::info!("Starting FlashDistilBert model on {:?}", device); Ok(Box::new( FlashDistilBertModel::load(vb, &config, model_type).s()?, )) @@ -265,15 +322,50 @@ impl CandleBackend { .to_lowercase() == "true" { - tracing::info!("Starting FlashNomicBertModel model on {:?}", device); + tracing::info!("Starting FlashNomicBert model on {:?}", device); Ok(Box::new( FlashNomicBertModel::load(vb, &config, model_type).s()?, )) } else { - tracing::info!("Starting NomicBertModel model on {:?}", device); + tracing::info!("Starting NomicBert model on {:?}", device); Ok(Box::new(NomicBertModel::load(vb, &config, model_type).s()?)) } } + #[cfg(feature = "cuda")] + (Config::Mistral(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(feature = "flash-attn") + || get_runtime_compute_cap().unwrap() < 80 + { + return Err(BackendError::Start("Mistral is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + } + tracing::info!("Starting FlashMistral model on {:?}", device); + Ok(Box::new( + FlashMistralModel::load(vb, &config, model_type).s()?, + )) + } + #[cfg(feature = "cuda")] + (Config::Gte(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) + { + return Err(BackendError::Start("GTE is only supported on Cuda devices in fp16 with flash attention enabled".to_string())); + } + tracing::info!("Starting FlashGTE model on {:?}", device); + Ok(Box::new(FlashGTEModel::load(vb, &config, model_type).s()?)) + } + #[cfg(feature = "cuda")] + (Config::Qwen2(config), Device::Cuda(_)) => { + if dtype != DType::F16 + || !cfg!(any(feature = "flash-attn", feature = "flash-attn-v1")) + { + return Err(BackendError::Start("Qwen2 is only supported on Cuda devices in fp16 with flash attention v2 enabled".to_string())); + } + tracing::info!("Starting FlashQwen2 model on {:?}", device); + Ok(Box::new( + FlashQwen2Model::load(vb, &config, model_type).s()?, + )) + } }; Ok(Self { diff --git a/backends/candle/src/models/bert.rs b/backends/candle/src/models/bert.rs index d12d90d2..32880d44 100644 --- a/backends/candle/src/models/bert.rs +++ b/backends/candle/src/models/bert.rs @@ -35,6 +35,7 @@ pub enum PositionEmbeddingType { #[default] Absolute, Alibi, + Rope, } #[derive(Debug)] @@ -638,6 +639,10 @@ impl BertModel { (pool, Some(classifier), None) } ModelType::Embedding(pool) => { + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Bert"); + } + let splade = if pool == Pool::Splade { Some(BertSpladeHead::load_roberta(vb.clone(), config)?) } else { @@ -799,7 +804,7 @@ impl BertModel { let input_ids = Tensor::from_vec(input_ids, shape, &self.device)?; let type_ids = Tensor::from_vec(type_ids, shape, &self.device)?; let position_ids = Tensor::from_vec(position_ids, shape, &self.device)?; - let input_lengths = + let mut input_lengths = Tensor::from_vec(input_lengths, (batch_size, 1), &self.device)?.to_dtype(self.dtype)?; let embedding_output = self @@ -832,6 +837,8 @@ impl BertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { @@ -840,6 +847,7 @@ impl BertModel { if let Some(pooled_indices) = pooled_indices { // Select values in the batch attention_mask = attention_mask.index_select(&pooled_indices, 0)?; + input_lengths = input_lengths.index_select(&pooled_indices, 0)?; }; // Mask padded values diff --git a/backends/candle/src/models/distilbert.rs b/backends/candle/src/models/distilbert.rs index e7145309..2cf62081 100644 --- a/backends/candle/src/models/distilbert.rs +++ b/backends/candle/src/models/distilbert.rs @@ -389,7 +389,12 @@ impl DistilBertModel { ModelType::Classifier => { candle::bail!("`classifier` model type is not supported for DistilBert") } - ModelType::Embedding(pool) => pool, + ModelType::Embedding(pool) => { + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for DistilBert"); + } + pool + } }; let (embeddings, encoder) = match ( @@ -564,6 +569,8 @@ impl DistilBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/flash_bert.rs b/backends/candle/src/models/flash_bert.rs index d248c91f..8951dcc1 100644 --- a/backends/candle/src/models/flash_bert.rs +++ b/backends/candle/src/models/flash_bert.rs @@ -5,7 +5,7 @@ use crate::models::bert::{ PositionEmbeddingType, RobertaClassificationHead, }; use crate::models::Model; -use candle::{DType, Device, Result, Tensor}; +use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; @@ -103,6 +103,7 @@ impl BertAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -393,27 +394,47 @@ impl FlashBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; - - // If raw_indices is empty, we don't need to do anything with - // the pooled_indices - if has_raw_requests { - // We need the pooled indices to select the correct cls indices - let pooled_indices = Tensor::from_vec( - batch.pooled_indices.clone(), - batch.pooled_indices.len(), - &self.device, - )?; - - // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } - - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) } // Mean pooling Pool::Mean => { diff --git a/backends/candle/src/models/flash_distilbert.rs b/backends/candle/src/models/flash_distilbert.rs index 3d30c3a8..7f060601 100644 --- a/backends/candle/src/models/flash_distilbert.rs +++ b/backends/candle/src/models/flash_distilbert.rs @@ -4,7 +4,7 @@ use crate::models::distilbert::{ DistilBertConfig, DistilBertEmbeddings, DistilBertMLP, DistilBertSpladeHead, }; use crate::models::Model; -use candle::{DType, Device, Result, Tensor}; +use candle::{DType, Device, IndexOp, Result, Tensor}; use candle_nn::VarBuilder; use text_embeddings_backend_core::{Batch, ModelType, Pool}; @@ -84,6 +84,7 @@ impl DistilBertAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -259,27 +260,45 @@ impl FlashDistilBertModel { let pooled_embeddings = if has_pooling_requests { let pooled_embeddings = match self.pool { - // CLS pooling - Pool::Cls => { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; - - // If raw_indices is empty, we don't need to do anything with - // the pooled_indices - if has_raw_requests { - // We need the pooled indices to select the correct cls indices - let pooled_indices = Tensor::from_vec( - batch.pooled_indices.clone(), - batch.pooled_indices.len(), - &self.device, - )?; - - // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + outputs.index_select(&indices, 0)? + } else { + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)? } - - // Select cls tokens - outputs.index_select(&cls_indices, 0)? } // Mean pooling Pool::Mean => { diff --git a/backends/candle/src/models/flash_gte.rs b/backends/candle/src/models/flash_gte.rs new file mode 100644 index 00000000..f3aec220 --- /dev/null +++ b/backends/candle/src/models/flash_gte.rs @@ -0,0 +1,463 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, LayerNorm, Linear}; +use crate::models::{GTEConfig, Model, NTKScaling, PositionEmbeddingType, RopeScaling}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct GTEAttention { + qkv_linear: Linear, + o_proj: Linear, + + num_attention_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl GTEAttention { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let hidden_size = config.hidden_size; + + let qkv_weight = vb + .pp("qkv_proj") + .get((hidden_size * 3, hidden_size), "weight")?; + let qkv_bias = vb.pp("qkv_proj").get(hidden_size * 3, "bias")?; + + let qkv_linear = Linear::new(qkv_weight, Some(qkv_bias), None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + let o_proj_bias = vb.pp("o_proj").get(hidden_size, "bias")?; + + let o_proj = Linear::new(o_proj_weight, Some(o_proj_bias), None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + num_attention_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads * 3); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_attention_heads)?; + let v = qkv.narrow(1, self.num_attention_heads * 2, self.num_attention_heads)?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + false, + None, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct GTEMLP { + up_gate_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl GTEMLP { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let intermediate_size = config.intermediate_size; + + let up_gate_proj_weight = vb + .pp("up_gate_proj") + .get((intermediate_size * 2, config.hidden_size), "weight")?; + + let up_gate_proj = Linear::new(up_gate_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj_bias = vb.pp("down_proj").get(config.hidden_size, "bias")?; + let down_proj = Linear::new(down_proj_weight, Some(down_proj_bias), None); + + Ok(Self { + up_gate_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let up_gate_states = self.up_gate_proj.forward(hidden_states)?; + let up_states = up_gate_states.narrow(1, 0, self.intermediate_size)?; + let gate_states = + up_gate_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct GTELayer { + attention: GTEAttention, + mlp: GTEMLP, + attention_layer_norm: LayerNorm, + mlp_layer_norm: LayerNorm, + + span: tracing::Span, +} + +impl GTELayer { + pub fn load(vb: VarBuilder, config: >EConfig) -> Result { + let attention = GTEAttention::load(vb.pp("attention"), config)?; + let mlp = GTEMLP::load(vb.pp("mlp"), config)?; + + let attention_layer_norm = + LayerNorm::load(vb.pp("attn_ln"), config.hidden_size, config.layer_norm_eps)?; + let mlp_layer_norm = + LayerNorm::load(vb.pp("mlp_ln"), config.hidden_size, config.layer_norm_eps)?; + + Ok(Self { + attention, + mlp, + attention_layer_norm, + mlp_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + let attn_output = self + .attention + .forward(&hidden_states, cu_seqlens, cos, sin, max_s)?; + let normed_attn_res_output = self + .attention_layer_norm + .forward(&attn_output, Some(hidden_states))?; + + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + let normed_mlp_res_output = self + .mlp_layer_norm + .forward(&mlp_output, Some(&normed_attn_res_output))?; + Ok(normed_mlp_res_output) + } +} + +pub struct FlashGTEModel { + word_embeddings: Embedding, + token_type_embeddings: Option, + layers: Vec, + embeddings_norm: LayerNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashGTEModel { + pub fn load(vb: VarBuilder, config: >EConfig, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashGTE requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashGTE requires DType::F16") + } + + if config.logn_attention_clip1 { + candle::bail!("`logn_attention_clip1` is not supported"); + } + if config.logn_attention_scale { + candle::bail!("`logn_attention_scale` is not supported"); + } + + if config.position_embedding_type != PositionEmbeddingType::Rope { + candle::bail!("Only `PositionEmbeddingType::Rope` is supported"); + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for GTE") + } + ModelType::Embedding(pool) => pool, + }; + + let word_embeddings = Embedding::new( + vb.pp("embeddings.word_embeddings") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let token_type_embeddings = if config.type_vocab_size > 0 { + Some(Embedding::new( + vb.pp("embeddings.token_type_embeddings") + .get((config.type_vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + )) + } else { + None + }; + + let layers = (0..config.num_hidden_layers) + .map(|index| GTELayer::load(vb.pp(format!("encoder.layer.{index}")), config)) + .collect::>>()?; + + let embeddings_norm = LayerNorm::load( + vb.pp("embeddings.LayerNorm"), + config.hidden_size, + config.layer_norm_eps, + )?; + + let inv_freqs = if let Some(RopeScaling::Ntk(NTKScaling { factor })) = config.rope_scaling { + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta * factor, + vb.device(), + )?; + let s = factor.powf(2.0 / layers[0].attention.attention_head_size as f32) as f64; + inv_freqs / s + } else { + candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + ) + }?; + + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + word_embeddings, + token_type_embeddings, + layers, + embeddings_norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let token_type_ids = Tensor::from_vec(batch.token_type_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let word_embeddings = self.word_embeddings.forward(&input_ids)?; + let token_type_embeddings = self + .token_type_embeddings + .as_ref() + .map(|emb| emb.forward(&token_type_ids)) + .transpose()?; + + let mut hidden_states = self + .embeddings_norm + .forward(&word_embeddings, token_type_embeddings.as_ref())?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + for layer in &self.layers { + let h = layer.forward( + &hidden_states, + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + } + + let outputs = hidden_states; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashGTEModel { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/flash_jina.rs b/backends/candle/src/models/flash_jina.rs index b2d47e51..83c5b0a4 100644 --- a/backends/candle/src/models/flash_jina.rs +++ b/backends/candle/src/models/flash_jina.rs @@ -105,6 +105,7 @@ impl JinaAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -241,6 +242,7 @@ impl FlashJinaBertModel { ) } PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; match vb.device() { @@ -319,11 +321,18 @@ impl FlashJinaBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -336,13 +345,22 @@ impl FlashJinaBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/flash_jina_code.rs b/backends/candle/src/models/flash_jina_code.rs index 5df80be2..56ab1976 100644 --- a/backends/candle/src/models/flash_jina_code.rs +++ b/backends/candle/src/models/flash_jina_code.rs @@ -141,6 +141,7 @@ impl JinaCodeAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(candle::D::Minus2)?; @@ -294,6 +295,7 @@ impl FlashJinaCodeBertModel { ) } PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; match vb.device() { @@ -372,11 +374,18 @@ impl FlashJinaCodeBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -389,13 +398,22 @@ impl FlashJinaCodeBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/flash_mistral.rs b/backends/candle/src/models/flash_mistral.rs new file mode 100644 index 00000000..eb94c913 --- /dev/null +++ b/backends/candle/src/models/flash_mistral.rs @@ -0,0 +1,445 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, Linear, RMSNorm}; +use crate::models::{MistralConfig, Model}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct MistralAttention { + qkv_linear: Linear, + o_proj: Linear, + + window_size_left: Option, + + num_attention_heads: usize, + num_key_value_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl MistralAttention { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let window_size_left = config.sliding_window; + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let num_key_value_heads = config.num_key_value_heads; + let hidden_size = config.hidden_size; + + let query_weight = vb.pp("q_proj").get((hidden_size, hidden_size), "weight")?; + + let key_weight = vb.pp("k_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + + let value_weight = vb.pp("v_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + + let qkv_weight = Tensor::cat(&[&query_weight, &key_weight, &value_weight], 0)?; + let qkv_linear = Linear::new(qkv_weight, None, None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + + let o_proj = Linear::new(o_proj_weight, None, None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + window_size_left, + num_attention_heads, + num_key_value_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads + 2 * self.num_key_value_heads); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_key_value_heads)?; + let v = qkv.narrow( + 1, + self.num_attention_heads + self.num_key_value_heads, + self.num_key_value_heads, + )?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + true, + self.window_size_left, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct MistralMLP { + gate_up_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl MistralMLP { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let intermediate_size = config.intermediate_size; + + let gate_proj_weight = vb + .pp("gate_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let up_proj_weight = vb + .pp("up_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let gate_up_proj_weight = Tensor::cat(&[&gate_proj_weight, &up_proj_weight], 0)?; + let gate_up_proj = Linear::new(gate_up_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj = Linear::new(down_proj_weight, None, None); + + Ok(Self { + gate_up_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let gate_up_states = self.gate_up_proj.forward(hidden_states)?; + let gate_states = gate_up_states.narrow(1, 0, self.intermediate_size)?; + let up_states = gate_up_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct MistralLayer { + attention: MistralAttention, + mlp: MistralMLP, + input_layer_norm: RMSNorm, + post_attention_layer_norm: RMSNorm, + + span: tracing::Span, +} + +impl MistralLayer { + pub fn load(vb: VarBuilder, config: &MistralConfig) -> Result { + let attention = MistralAttention::load(vb.pp("self_attn"), config)?; + let mlp = MistralMLP::load(vb.pp("mlp"), config)?; + + let input_layer_norm = RMSNorm::load( + vb.pp("input_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + let post_attention_layer_norm = RMSNorm::load( + vb.pp("post_attention_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + + Ok(Self { + attention, + mlp, + input_layer_norm, + post_attention_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + let (normed_hidden_states, res) = self.input_layer_norm.forward(hidden_states, residual)?; + let attn_output = + self.attention + .forward(&normed_hidden_states, cu_seqlens, cos, sin, max_s)?; + let (normed_attn_res_output, attn_res) = self + .post_attention_layer_norm + .forward(&attn_output, Some(&res))?; + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + + Ok((mlp_output, attn_res)) + } +} + +pub struct FlashMistralModel { + embeddings: Embedding, + layers: Vec, + norm: RMSNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashMistralModel { + pub fn load(vb: VarBuilder, config: &MistralConfig, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashMistral requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashMistral requires DType::F16") + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Mistral") + } + ModelType::Embedding(pool) => pool, + }; + + let embeddings = Embedding::new( + vb.pp("embed_tokens") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let layers = (0..config.num_hidden_layers) + .map(|index| MistralLayer::load(vb.pp(format!("layers.{index}")), config)) + .collect::>>()?; + + let norm = RMSNorm::load(vb.pp("norm"), config.hidden_size, config.rms_norm_eps)?; + + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + )?; + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + embeddings, + layers, + norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let mut hidden_states = self.embeddings.forward(&input_ids)?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + let mut residual = None; + for layer in &self.layers { + let (h, r) = layer.forward( + &hidden_states, + residual.as_ref(), + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + residual = Some(r); + } + + let (outputs, _) = self.norm.forward(&hidden_states, residual.as_ref())?; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashMistralModel { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/flash_nomic.rs b/backends/candle/src/models/flash_nomic.rs index 12eff0f1..7f558b9e 100644 --- a/backends/candle/src/models/flash_nomic.rs +++ b/backends/candle/src/models/flash_nomic.rs @@ -81,6 +81,7 @@ impl NomicAttention { max_s, self.softmax_scale, false, + None, )?; let attention = attention.flatten_from(D::Minus2)?; @@ -304,11 +305,18 @@ impl FlashNomicBertModel { let pooled_embeddings = if has_pooling_requests { match self.pool { - // CLS pooling - Pool::Cls => { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { if batch_size > 1 { - // Get the indices of the cls tokens from cu_seqlens - let mut cls_indices = cu_seqlens.narrow(0, 0, batch_size)?; + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; // If raw_indices is empty, we don't need to do anything with // the pooled_indices @@ -321,13 +329,22 @@ impl FlashNomicBertModel { )?; // Only select indices that requires pooling - cls_indices = cls_indices.index_select(&pooled_indices, 0)? + indices = indices.index_select(&pooled_indices, 0)? } - // Select cls tokens - Some(outputs.index_select(&cls_indices, 0)?) + // Select tokens + Some(outputs.index_select(&indices, 0)?) } else { - Some(outputs.i(0)?) + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) } } // Mean pooling diff --git a/backends/candle/src/models/flash_qwen2.rs b/backends/candle/src/models/flash_qwen2.rs new file mode 100644 index 00000000..4dba7868 --- /dev/null +++ b/backends/candle/src/models/flash_qwen2.rs @@ -0,0 +1,455 @@ +use crate::flash_attn::flash_attn_varlen; +use crate::layers::{HiddenAct, Linear, RMSNorm}; +use crate::models::{Model, Qwen2Config}; +use candle::{DType, Device, IndexOp, Result, Tensor}; +use candle_nn::{Embedding, Module, VarBuilder}; +use text_embeddings_backend_core::{Batch, ModelType, Pool}; + +struct Qwen2Attention { + qkv_linear: Linear, + o_proj: Linear, + + num_attention_heads: usize, + num_key_value_heads: usize, + attention_head_size: usize, + + softmax_scale: f32, + + span: tracing::Span, +} + +impl Qwen2Attention { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + if config.use_sliding_window { + candle::bail!("Sliding window is not supported"); + } + + let num_attention_heads = config.num_attention_heads; + let attention_head_size = config.hidden_size / config.num_attention_heads; + let num_key_value_heads = config.num_key_value_heads; + let hidden_size = config.hidden_size; + + let query_weight = vb.pp("q_proj").get((hidden_size, hidden_size), "weight")?; + let query_bias = vb.pp("q_proj").get(hidden_size, "bias")?; + + let key_weight = vb.pp("k_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + let key_bias = vb + .pp("k_proj") + .get(num_key_value_heads * attention_head_size, "bias")?; + + let value_weight = vb.pp("v_proj").get( + (num_key_value_heads * attention_head_size, hidden_size), + "weight", + )?; + let value_bias = vb + .pp("v_proj") + .get(num_key_value_heads * attention_head_size, "bias")?; + + let qkv_weight = Tensor::cat(&[&query_weight, &key_weight, &value_weight], 0)?; + let qkv_bias = Tensor::cat(&[&query_bias, &key_bias, &value_bias], 0)?; + let qkv_linear = Linear::new(qkv_weight, Some(qkv_bias), None); + + let o_proj_weight = vb.pp("o_proj").get((hidden_size, hidden_size), "weight")?; + + let o_proj = Linear::new(o_proj_weight, None, None); + + let softmax_scale = (1. / (attention_head_size as f64).sqrt()) as f32; + + Ok(Self { + qkv_linear, + o_proj, + num_attention_heads, + num_key_value_heads, + attention_head_size, + softmax_scale, + span: tracing::span!(tracing::Level::TRACE, "attention"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result { + let _enter = self.span.enter(); + + let qkv = self.qkv_linear.forward(hidden_states)?; + + // Reshape to [tokens, heads, head_size] + let mut new_qkv_shape = qkv.dims().to_vec(); + new_qkv_shape.pop(); + new_qkv_shape.push(self.num_attention_heads + 2 * self.num_key_value_heads); + new_qkv_shape.push(self.attention_head_size); + + let qkv = qkv.reshape(new_qkv_shape)?; + + // Split qkv tensor + let q = qkv.narrow(1, 0, self.num_attention_heads)?; + let k = qkv.narrow(1, self.num_attention_heads, self.num_key_value_heads)?; + let v = qkv.narrow( + 1, + self.num_attention_heads + self.num_key_value_heads, + self.num_key_value_heads, + )?; + + candle_rotary::apply_rotary_inplace(&q, &k, &cos, &sin, true)?; + + let attention = flash_attn_varlen( + &q, + &k, + &v, + None, + cu_seqlens, + cu_seqlens, + max_s, + max_s, + self.softmax_scale, + false, + None, + )?; + let attention = attention.flatten_from(candle::D::Minus2)?; + + self.o_proj.forward(&attention) + } +} + +struct Qwen2MLP { + gate_up_proj: Linear, + down_proj: Linear, + + act: HiddenAct, + intermediate_size: usize, + + span: tracing::Span, +} + +impl Qwen2MLP { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + let intermediate_size = config.intermediate_size; + + let gate_proj_weight = vb + .pp("gate_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let up_proj_weight = vb + .pp("up_proj") + .get((intermediate_size, config.hidden_size), "weight")?; + + let gate_up_proj_weight = Tensor::cat(&[&gate_proj_weight, &up_proj_weight], 0)?; + let gate_up_proj = Linear::new(gate_up_proj_weight, None, None); + + let down_proj_weight = vb + .pp("down_proj") + .get((config.hidden_size, intermediate_size), "weight")?; + let down_proj = Linear::new(down_proj_weight, None, None); + + Ok(Self { + gate_up_proj, + down_proj, + intermediate_size, + act: config.hidden_act.clone(), + span: tracing::span!(tracing::Level::TRACE, "mlp"), + }) + } + + pub fn forward(&self, hidden_states: &Tensor) -> Result { + let _enter = self.span.enter(); + + let gate_up_states = self.gate_up_proj.forward(hidden_states)?; + let gate_states = gate_up_states.narrow(1, 0, self.intermediate_size)?; + let up_states = gate_up_states.narrow(1, self.intermediate_size, self.intermediate_size)?; + + let gate_states = match self.act { + HiddenAct::Gelu => gate_states.gelu(), + HiddenAct::Relu => gate_states.relu(), + HiddenAct::Swiglu => gate_states.silu(), + }?; + let r = self.down_proj.forward(&(gate_states * up_states)?); + r + } +} + +struct Qwen2Layer { + attention: Qwen2Attention, + mlp: Qwen2MLP, + input_layer_norm: RMSNorm, + post_attention_layer_norm: RMSNorm, + + span: tracing::Span, +} + +impl Qwen2Layer { + pub fn load(vb: VarBuilder, config: &Qwen2Config) -> Result { + let attention = Qwen2Attention::load(vb.pp("self_attn"), config)?; + let mlp = Qwen2MLP::load(vb.pp("mlp"), config)?; + + let input_layer_norm = RMSNorm::load( + vb.pp("input_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + let post_attention_layer_norm = RMSNorm::load( + vb.pp("post_attention_layernorm"), + config.hidden_size, + config.rms_norm_eps, + )?; + + Ok(Self { + attention, + mlp, + input_layer_norm, + post_attention_layer_norm, + span: tracing::span!(tracing::Level::TRACE, "layer"), + }) + } + + pub fn forward( + &self, + hidden_states: &Tensor, + residual: Option<&Tensor>, + cu_seqlens: &Tensor, + cos: &Tensor, + sin: &Tensor, + max_s: usize, + ) -> Result<(Tensor, Tensor)> { + let _enter = self.span.enter(); + + let (normed_hidden_states, res) = self.input_layer_norm.forward(hidden_states, residual)?; + let attn_output = + self.attention + .forward(&normed_hidden_states, cu_seqlens, cos, sin, max_s)?; + let (normed_attn_res_output, attn_res) = self + .post_attention_layer_norm + .forward(&attn_output, Some(&res))?; + let mlp_output = self.mlp.forward(&normed_attn_res_output)?; + + Ok((mlp_output, attn_res)) + } +} + +pub struct FlashQwen2Model { + embeddings: Embedding, + layers: Vec, + norm: RMSNorm, + cos_cache: Tensor, + sin_cache: Tensor, + pool: Pool, + pub device: Device, + + span: tracing::Span, +} + +impl FlashQwen2Model { + pub fn load(vb: VarBuilder, config: &Qwen2Config, model_type: ModelType) -> Result { + match vb.device() { + Device::Cuda(_) => {} + _ => candle::bail!("FlashQwen2 requires Cuda"), + } + + if vb.dtype() != DType::F16 { + candle::bail!("FlashQwen2 requires DType::F16") + } + + let pool = match model_type { + ModelType::Classifier => { + candle::bail!("`classifier` model type is not supported for Qwen2") + } + ModelType::Embedding(pool) => pool, + }; + + let vb = vb.pp("model"); + + let embeddings = Embedding::new( + vb.pp("embed_tokens") + .get((config.vocab_size, config.hidden_size), "weight")?, + config.hidden_size, + ); + + let layers = (0..config.num_hidden_layers) + .map(|index| Qwen2Layer::load(vb.pp(format!("layers.{index}")), config)) + .collect::>>()?; + + let norm = RMSNorm::load(vb.pp("norm"), config.hidden_size, config.rms_norm_eps)?; + + let inv_freqs = candle_rotary::inv_freqs( + layers[0].attention.attention_head_size, + config.rope_theta, + vb.device(), + )?; + let (cos_cache, sin_cache) = + candle_rotary::cos_sin(config.max_position_embeddings, &inv_freqs, vb.dtype())?; + + Ok(Self { + embeddings, + layers, + norm, + cos_cache, + sin_cache, + pool, + device: vb.device().clone(), + span: tracing::span!(tracing::Level::TRACE, "model"), + }) + } + + pub fn forward(&self, batch: Batch) -> Result<(Option, Option)> { + let _enter = self.span.enter(); + + let batch_size = batch.cumulative_seq_lengths.len() - 1; + let shape = batch.input_ids.len(); + + // Create Cuda tensors + let input_ids = Tensor::from_vec(batch.input_ids, shape, &self.device)?; + let position_ids = Tensor::from_vec(batch.position_ids, shape, &self.device)?; + let cu_seqlens = Tensor::from_vec( + batch.cumulative_seq_lengths.clone(), + batch_size + 1, + &self.device, + )?; + + let mut hidden_states = self.embeddings.forward(&input_ids)?; + + let cos = self.cos_cache.index_select(&position_ids, 0)?; + let sin = self.sin_cache.index_select(&position_ids, 0)?; + + let mut residual = None; + for layer in &self.layers { + let (h, r) = layer.forward( + &hidden_states, + residual.as_ref(), + &cu_seqlens, + &cos, + &sin, + batch.max_length as usize, + )?; + hidden_states = h; + residual = Some(r); + } + + let (outputs, _) = self.norm.forward(&hidden_states, residual.as_ref())?; + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + let pooled_embeddings = if has_pooling_requests { + match self.pool { + // CLS and LastToken pooling + Pool::Cls | Pool::LastToken => { + if batch_size > 1 { + // Get token indices form cu_seqlens + let mut indices = match self.pool { + Pool::Cls => cu_seqlens.narrow(0, 0, batch_size)?, + Pool::LastToken => { + let end = cu_seqlens.narrow(0, 1, batch_size)?; + (&end - &end.ones_like()?)? + } + _ => unreachable!(), + }; + + // If raw_indices is empty, we don't need to do anything with + // the pooled_indices + if has_raw_requests { + // We need the pooled indices to select the correct cls indices + let pooled_indices = Tensor::from_vec( + batch.pooled_indices.clone(), + batch.pooled_indices.len(), + &self.device, + )?; + + // Only select indices that requires pooling + indices = indices.index_select(&pooled_indices, 0)? + } + + // Select tokens + Some(outputs.index_select(&indices, 0)?) + } else { + Some( + match self.pool { + Pool::Cls => outputs.i(0)?, + Pool::LastToken => { + outputs.i(batch.cumulative_seq_lengths[1] as usize - 1)? + } + _ => unreachable!(), + } + .unsqueeze(0)?, + ) + } + } + // Mean pooling + Pool::Mean => { + if batch_size > 1 { + // for each request that requires pooling + let results: Result> = batch + .pooled_indices + .into_iter() + .map(|i| { + let i = i as usize; + let start = batch.cumulative_seq_lengths[i]; + let len = batch.cumulative_seq_lengths[i + 1] - start; + + // Mean + let embeddings = outputs.narrow(0, start as usize, len as usize)?; + embeddings.sum_keepdim(0)? / (len as f64) + }) + .collect(); + + // Concatenate all results + Some(Tensor::cat(&results?, 0)?) + } else { + Some((outputs.sum_keepdim(0)? / (batch.max_length as f64))?) + } + } + Pool::Splade => { + unreachable!(); + } + } + } else { + None + }; + + let raw_embeddings = if has_raw_requests { + if batch_size > 1 && has_pooling_requests { + // Create indexing vector for the embeddings + let mut final_indices: Vec = Vec::with_capacity(shape); + for i in batch.raw_indices.into_iter() { + let i = i as usize; + // Get start/end token index of this specific member of the batch + let start = batch.cumulative_seq_lengths[i]; + let end = batch.cumulative_seq_lengths[i + 1]; + + for j in start..end { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j); + } + } + + let final_indices_length = final_indices.len(); + let final_indices = + Tensor::from_vec(final_indices, final_indices_length, &self.device)?; + + // Select the tokens with final indices + Some(outputs.index_select(&final_indices, 0)?) + } else { + Some(outputs) + } + } else { + None + }; + + Ok((pooled_embeddings, raw_embeddings)) + } +} + +impl Model for FlashQwen2Model { + fn is_padded(&self) -> bool { + false + } + fn embed(&self, batch: Batch) -> Result<(Option, Option)> { + self.forward(batch) + } +} diff --git a/backends/candle/src/models/gte.rs b/backends/candle/src/models/gte.rs new file mode 100644 index 00000000..e5e75638 --- /dev/null +++ b/backends/candle/src/models/gte.rs @@ -0,0 +1,35 @@ +use crate::layers::HiddenAct; +use crate::models::PositionEmbeddingType; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct NTKScaling { + pub factor: f32, +} + +#[derive(Debug, Clone, PartialEq, Deserialize)] +#[serde(tag = "type", rename_all = "kebab-case")] +pub enum RopeScaling { + Ntk(NTKScaling), +} + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct GTEConfig { + pub vocab_size: usize, + pub hidden_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub intermediate_size: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub type_vocab_size: usize, + pub layer_norm_type: String, + pub layer_norm_eps: f32, + pub position_embedding_type: PositionEmbeddingType, + pub rope_theta: f32, + pub rope_scaling: Option, + #[serde(default)] + pub logn_attention_scale: bool, + #[serde(default)] + pub logn_attention_clip1: bool, +} diff --git a/backends/candle/src/models/jina.rs b/backends/candle/src/models/jina.rs index 768e1a6f..ecee8bfe 100644 --- a/backends/candle/src/models/jina.rs +++ b/backends/candle/src/models/jina.rs @@ -363,6 +363,7 @@ impl JinaBertModel { vb.dtype(), )?), PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; let pool = match model_type { @@ -373,6 +374,9 @@ impl JinaBertModel { if pool == Pool::Splade { candle::bail!("`splade` is not supported for Jina") } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Jina"); + } pool } }; @@ -594,6 +598,8 @@ impl JinaBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/jina_code.rs b/backends/candle/src/models/jina_code.rs index 348f5892..5f13fe08 100644 --- a/backends/candle/src/models/jina_code.rs +++ b/backends/candle/src/models/jina_code.rs @@ -352,15 +352,19 @@ impl JinaCodeBertModel { vb.dtype(), )?), PositionEmbeddingType::Absolute => None, + _ => candle::bail!("not supported"), }; let pool = match model_type { ModelType::Classifier => { - candle::bail!("`classifier` model type is not supported for Jina") + candle::bail!("`classifier` model type is not supported for JinaCode") } ModelType::Embedding(pool) => { if pool == Pool::Splade { - candle::bail!("`splade` is not supported for Jina") + candle::bail!("`splade` is not supported for JinaCode") + } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for JinaCode"); } pool } @@ -583,6 +587,8 @@ impl JinaCodeBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/mistral.rs b/backends/candle/src/models/mistral.rs new file mode 100644 index 00000000..33c5ab00 --- /dev/null +++ b/backends/candle/src/models/mistral.rs @@ -0,0 +1,19 @@ +use crate::layers::HiddenAct; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct MistralConfig { + pub vocab_size: usize, + pub hidden_size: usize, + pub intermediate_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub num_key_value_heads: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub initializer_range: f64, + pub rms_norm_eps: f32, + pub model_type: Option, + pub rope_theta: f32, + pub sliding_window: Option, +} diff --git a/backends/candle/src/models/mod.rs b/backends/candle/src/models/mod.rs index a7d6b267..b1e9f937 100644 --- a/backends/candle/src/models/mod.rs +++ b/backends/candle/src/models/mod.rs @@ -8,6 +8,7 @@ mod bert; mod distilbert; mod jina; mod jina_code; +mod mistral; mod nomic; #[cfg(feature = "cuda")] @@ -25,12 +26,26 @@ mod flash_nomic; #[cfg(feature = "cuda")] mod flash_distilbert; +#[cfg(feature = "cuda")] +mod flash_gte; +#[cfg(feature = "cuda")] +mod flash_mistral; + +#[cfg(feature = "cuda")] +mod flash_qwen2; +mod gte; +mod qwen2; + pub use bert::{BertConfig, BertModel, PositionEmbeddingType}; use candle::{Result, Tensor}; pub use distilbert::{DistilBertConfig, DistilBertModel}; +#[allow(unused_imports)] +pub use gte::{GTEConfig, NTKScaling, RopeScaling}; pub use jina::JinaBertModel; pub use jina_code::JinaCodeBertModel; +pub use mistral::MistralConfig; pub use nomic::{NomicBertModel, NomicConfig}; +pub use qwen2::Qwen2Config; use text_embeddings_backend_core::Batch; #[cfg(feature = "cuda")] @@ -48,6 +63,15 @@ pub use flash_nomic::FlashNomicBertModel; #[cfg(feature = "cuda")] pub use flash_distilbert::FlashDistilBertModel; +#[cfg(feature = "cuda")] +pub use flash_mistral::FlashMistralModel; + +#[cfg(feature = "cuda")] +pub use flash_gte::FlashGTEModel; + +#[cfg(feature = "cuda")] +pub use flash_qwen2::FlashQwen2Model; + pub(crate) trait Model { fn is_padded(&self) -> bool; diff --git a/backends/candle/src/models/nomic.rs b/backends/candle/src/models/nomic.rs index 4f9e7551..cdaaea92 100644 --- a/backends/candle/src/models/nomic.rs +++ b/backends/candle/src/models/nomic.rs @@ -405,6 +405,9 @@ impl NomicBertModel { if pool == Pool::Splade { candle::bail!("`splade` is not supported for Nomic") } + if pool == Pool::LastToken { + candle::bail!("`last_token` is not supported for Nomic"); + } pool } }; @@ -610,6 +613,8 @@ impl NomicBertModel { let pooled_embeddings = match self.pool { // CLS pooling Pool::Cls => outputs.i((.., 0))?, + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), // Mean pooling Pool::Mean => { if let Some(ref attention_mask) = attention_mask { diff --git a/backends/candle/src/models/qwen2.rs b/backends/candle/src/models/qwen2.rs new file mode 100644 index 00000000..8d2d1f86 --- /dev/null +++ b/backends/candle/src/models/qwen2.rs @@ -0,0 +1,18 @@ +use crate::layers::HiddenAct; +use serde::Deserialize; + +#[derive(Debug, Clone, PartialEq, Deserialize)] +pub struct Qwen2Config { + pub vocab_size: usize, + pub hidden_size: usize, + pub intermediate_size: usize, + pub num_hidden_layers: usize, + pub num_attention_heads: usize, + pub num_key_value_heads: usize, + pub hidden_act: HiddenAct, + pub max_position_embeddings: usize, + pub rms_norm_eps: f32, + pub rope_theta: f32, + pub sliding_window: usize, + pub use_sliding_window: bool, +} diff --git a/backends/candle/tests/common.rs b/backends/candle/tests/common.rs index d7ebc67d..0c069a47 100644 --- a/backends/candle/tests/common.rs +++ b/backends/candle/tests/common.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use hf_hub::api::sync::ApiBuilder; +use hf_hub::api::sync::{ApiBuilder, ApiError, ApiRepo}; use hf_hub::{Repo, RepoType}; use insta::internals::YamlMatcher; use serde::{Deserialize, Serialize}; @@ -25,7 +25,7 @@ impl Score { impl PartialEq for Score { fn eq(&self, other: &Self) -> bool { // Default tolerance for equality - self.is_close(other, 6e-3) + self.is_close(other, 5e-3) } } @@ -51,6 +51,44 @@ impl From>> for SnapshotScores { } } +#[derive(Serialize, Deserialize, Debug)] +pub struct SnapEmbedding(Vec); + +impl PartialEq for SnapEmbedding { + fn eq(&self, other: &Self) -> bool { + assert_eq!(self.0.len(), other.0.len()); + + let mut sumxx = 0.0; + let mut sumyy = 0.0; + let mut sumxy = 0.0; + + for (x, y) in self.0.iter().zip(other.0.iter()) { + sumxx += x * x; + sumyy += y * y; + sumxy += x * y; + } + + (sumxy / (sumxx * sumyy).sqrt()) > 0.999 + } +} + +#[derive(Serialize, Deserialize, Debug, PartialEq)] +pub struct SnapshotEmbeddings(Vec); + +impl Deref for SnapshotEmbeddings { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From>> for SnapshotEmbeddings { + fn from(value: Vec>) -> Self { + Self(value.into_iter().map(|v| SnapEmbedding(v)).collect()) + } +} + pub fn sort_embeddings(embeddings: Embeddings) -> (Vec>, Vec>) { let mut pooled_embeddings = Vec::new(); let mut raw_embeddings = Vec::new(); @@ -69,7 +107,11 @@ pub fn download_artifacts( model_id: &'static str, revision: Option<&'static str>, ) -> Result { - let builder = ApiBuilder::new().with_progress(false); + let mut builder = ApiBuilder::new().with_progress(false); + + if let Some(cache_dir) = std::env::var_os("HUGGINGFACE_HUB_CACHE") { + builder = builder.with_cache_dir(cache_dir.into()); + } let api = builder.build().unwrap(); let api_repo = if let Some(revision) = revision { @@ -85,23 +127,66 @@ pub fn download_artifacts( api_repo.get("config.json")?; api_repo.get("tokenizer.json")?; - let model_root = match api_repo.get("model.safetensors") { + let model_files = match download_safetensors(&api_repo) { Ok(p) => p, Err(_) => { + tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); + tracing::info!("Downloading `pytorch_model.bin`"); let p = api_repo.get("pytorch_model.bin")?; - tracing::warn!("`model.safetensors` not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); - p + vec![p] } - } - .parent().unwrap() - .to_path_buf(); + }; + let model_root = model_files[0].parent().unwrap().to_path_buf(); Ok(model_root) } +fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { + // Single file + tracing::info!("Downloading `model.safetensors`"); + match api.get("model.safetensors") { + Ok(p) => return Ok(vec![p]), + Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), + }; + + // Sharded weights + // Download and parse index file + tracing::info!("Downloading `model.safetensors.index.json`"); + let index_file = api.get("model.safetensors.index.json")?; + let index_file_string: String = + std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .expect("model.safetensors.index.json is corrupted"); + + let weight_map = match json.get("weight_map") { + Some(serde_json::Value::Object(map)) => map, + _ => panic!("model.safetensors.index.json is corrupted"), + }; + + let mut safetensors_filenames = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_filenames.insert(file.to_string()); + } + } + + // Download weight files + let mut safetensors_files = Vec::new(); + for n in safetensors_filenames { + tracing::info!("Downloading `{}`", n); + safetensors_files.push(api.get(&n)?); + } + + Ok(safetensors_files) +} + pub fn relative_matcher() -> YamlMatcher { YamlMatcher::new() } +pub fn cosine_matcher() -> YamlMatcher { + YamlMatcher::new() +} + pub fn load_tokenizer(model_root: &Path) -> Result { // Load tokenizer let tokenizer_path = model_root.join("tokenizer.json"); diff --git a/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap b/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap new file mode 100644 index 00000000..d8bbd66e --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_gte__gte_batch.snap @@ -0,0 +1,2309 @@ +--- +source: backends/candle/tests/test_flash_gte.rs +assertion_line: 37 +expression: embeddings_batch +--- +- - 0.4428711 + - 0.6118164 + - 0.07043457 + - -0.5917969 + - 0.88183594 + - -0.10839844 + - 0.0881958 + - -0.20483398 + - 1.9345703 + - 0.6230469 + - 0.59521484 + - 0.18737793 + - 0.030548096 + - -0.078308105 + - 0.79589844 + - -0.23474121 + - -0.8720703 + - 1.6923828 + - 0.12597656 + - -1.9267578 + - -0.34472656 + - -1.9326172 + - 0.89990234 + - -0.2006836 + - 0.024230957 + - 0.2878418 + - 0.3642578 + - 0.17956543 + - -0.51123047 + - 0.025817871 + - -0.8964844 + - 0.14147949 + - -0.39257813 + - -0.8486328 + - 0.005218506 + - 0.42358398 + - 0.23181152 + - 1.1630859 + - -1.1455078 + - 0.3388672 + - -2.1484375 + - -1.0146484 + - -0.2841797 + - 0.021499634 + - 0.16235352 + - 0.39453125 + - -0.9511719 + - 0.41064453 + - -0.15563965 + - -0.484375 + - -0.07080078 + - 0.07312012 + - 0.56103516 + - 0.028213501 + - -0.027938843 + - 0.43896484 + - 1.0136719 + - 0.7788086 + - -0.5644531 + - -1.9824219 + - -0.011169434 + - 0.50634766 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.07208252 + - 0.008544922 + - 0.7788086 + - -0.10021973 + - -0.30859375 + - 0.35888672 + - -0.44848633 + - -0.08679199 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34228516 + - -0.45385742 + - 0.8027344 + - 0.50634766 + - 0.703125 + - -0.96533203 + - -0.042938232 + - -1.0927734 + - 0.35205078 + - -0.56689453 + - -0.5341797 + - 0.23571777 + - -2.0234375 + - -0.26342773 + - 0.1998291 + - 0.7739258 + - 0.17797852 + - 1.2255859 + - 0.9814453 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.2479248 + - -0.2166748 + - 0.29052734 + - -0.5004883 + - 0.26513672 + - 0.5024414 + - -0.042266846 + - -0.013465881 + - -0.6376953 + - 0.64501953 + - -1.7958984 + - 0.25512695 + - -0.20458984 + - -0.12927246 + - 0.19665527 + - 0.8076172 + - -0.96777344 + - 0.26391602 + - -0.5649414 + - -0.58740234 + - -0.15466309 + - 0.7392578 + - 0.5336914 + - 0.60253906 + - 1.1875 + - -0.37719727 + - 0.8198242 + - -0.2401123 + - 0.40527344 + - 0.17114258 + - -0.32128906 + - -0.75439453 + - 0.056488037 + - 0.16491699 + - 0.6899414 + - -0.6171875 + - -0.05316162 + - 0.43017578 + - -0.6074219 + - 0.040374756 + - -0.8618164 + - -0.7192383 + - 0.7402344 + - -0.42138672 + - 0.26831055 + - -1.5429688 + - 0.1706543 + - 1.2158203 + - -0.17077637 + - -0.13964844 + - -0.5449219 + - -0.59033203 + - -0.7783203 + - -0.18786621 + - -0.34838867 + - 0.6230469 + - -0.5878906 + - -0.90234375 + - -0.7324219 + - -0.81933594 + - 0.4819336 + - -1.1591797 + - 1.2109375 + - -1.0517578 + - 0.25219727 + - 1.2841797 + - 0.06347656 + - -0.72021484 + - -0.3671875 + - 0.07330322 + - -0.022644043 + - -0.3713379 + - -0.008430481 + - 0.3564453 + - -0.8354492 + - -0.59521484 + - -0.40405273 + - -0.027923584 + - -0.3100586 + - -1.109375 + - -0.030593872 + - 0.14086914 + - -1.2128906 + - 0.03488159 + - 0.35424805 + - -1.5683594 + - 0.17773438 + - -0.66796875 + - -1.9804688 + - -0.35327148 + - -0.2927246 + - -1.2011719 + - -0.4165039 + - 0.36645508 + - -0.049957275 + - -0.87353516 + - -0.9086914 + - 0.4790039 + - -1.4599609 + - 0.7866211 + - -0.27490234 + - 0.08477783 + - 0.2220459 + - 0.0017213821 + - -1.0927734 + - -0.006439209 + - -0.62060547 + - -0.68115234 + - 0.4572754 + - -0.61572266 + - -0.7871094 + - -1.3847656 + - 1.5566406 + - 0.2680664 + - 0.8466797 + - -0.2578125 + - -0.76416016 + - 0.6484375 + - -0.05279541 + - -0.1307373 + - -0.11853027 + - -0.6357422 + - -0.17700195 + - 0.9472656 + - -0.4958496 + - 0.015464783 + - -0.23168945 + - -1.6748047 + - -0.8911133 + - 0.86865234 + - 1.0722656 + - 0.34228516 + - 0.7182617 + - -0.5488281 + - -0.45166016 + - -0.3022461 + - 0.45336914 + - -0.28808594 + - -0.7626953 + - 0.016067505 + - 0.63183594 + - 0.46923828 + - -0.07373047 + - 1.7832031 + - -0.41796875 + - -0.89453125 + - 0.07757568 + - -0.29589844 + - -1.0673828 + - 1.3320313 + - 1.4160156 + - 0.20703125 + - -0.1060791 + - 0.1508789 + - 0.37231445 + - 0.05053711 + - -0.68896484 + - 0.7397461 + - 0.15771484 + - 0.5595703 + - -0.8198242 + - -0.17712402 + - -0.2479248 + - -0.066345215 + - 0.4194336 + - 1.0517578 + - -1.6650391 + - 0.90283203 + - 0.22937012 + - -0.5908203 + - -0.79785156 + - -0.003993988 + - -0.47314453 + - 0.19116211 + - -0.39038086 + - 0.6333008 + - -0.28686523 + - -0.8720703 + - 0.080200195 + - -1.2587891 + - 0.22790527 + - 0.55126953 + - -0.47485352 + - -0.20471191 + - 0.75390625 + - -1.0488281 + - 0.9902344 + - 1.2275391 + - 0.40966797 + - -0.36791992 + - 0.54833984 + - -0.32788086 + - 0.2208252 + - 1.1289063 + - -0.017410278 + - -0.67089844 + - 0.7236328 + - 0.20788574 + - 0.55566406 + - 0.7104492 + - -0.16589355 + - 0.57958984 + - 1.1494141 + - -0.15930176 + - -0.4963379 + - 0.016326904 + - 1.5634766 + - -0.5029297 + - 1.2011719 + - -1.0029297 + - -0.3557129 + - -0.31079102 + - -0.12670898 + - 0.81933594 + - 0.75683594 + - 1.1630859 + - 1.6669922 + - -0.8022461 + - -0.3034668 + - 0.3798828 + - -0.71484375 + - -0.7470703 + - 1.1904297 + - -0.95654297 + - 0.30297852 + - 0.16992188 + - 0.8173828 + - -0.8798828 + - 1.1376953 + - -0.4543457 + - 0.6142578 + - -0.47680664 + - 1.1181641 + - 0.01398468 + - -0.49560547 + - -0.039031982 + - 0.2878418 + - -0.71533203 + - 0.82128906 + - -0.03768921 + - 0.60546875 + - 0.7578125 + - -0.3322754 + - 0.86376953 + - -0.71435547 + - 0.7597656 + - -1.3496094 + - 0.18652344 + - -0.39990234 + - 0.31103516 + - 0.16809082 + - 1.2626953 + - -0.42919922 + - 0.2434082 + - 0.83935547 + - -1.3994141 + - 0.34472656 + - -0.68603516 + - -0.28759766 + - 0.4663086 + - 0.6816406 + - -0.48120117 + - -0.11029053 + - -0.48339844 + - 0.1706543 + - 0.29614258 + - -0.7290039 + - -0.87158203 + - 0.8457031 + - 0.57128906 + - 0.1640625 + - -0.1739502 + - -0.16394043 + - 0.8652344 + - -0.38671875 + - 0.5625 + - -0.30493164 + - 1.8251953 + - 0.041931152 + - 0.17285156 + - -1.0107422 + - -0.20788574 + - 1.1005859 + - 0.7973633 + - -1.0029297 + - 0.67041016 + - -0.96240234 + - 0.45166016 + - -0.32202148 + - -0.97753906 + - 1.7080078 + - -0.04626465 + - 0.4404297 + - 0.28833008 + - 0.32006836 + - -0.5341797 + - -0.74658203 + - -1.28125 + - -0.2076416 + - -0.57958984 + - 0.88134766 + - -0.21875 + - -0.51171875 + - 0.20214844 + - -0.9536133 + - -0.89160156 + - 0.6279297 + - -0.08929443 + - 1.2490234 + - -0.3083496 + - 0.5253906 + - -1.5771484 + - 0.86572266 + - -0.16223145 + - -0.6455078 + - -0.9008789 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.2052002 + - 1.0820313 + - 0.5390625 + - 0.2454834 + - -0.0053596497 + - 0.09838867 + - -0.08288574 + - 0.6616211 + - -0.06573486 + - -0.8120117 + - -0.08306885 + - 0.12176514 + - -1.4072266 + - 0.6533203 + - 0.49536133 + - 0.48339844 + - -0.6142578 + - 0.06011963 + - 0.4951172 + - -0.33935547 + - -0.85058594 + - -0.8510742 + - 0.10028076 + - 0.64501953 + - 0.62841797 + - 0.79052734 + - -0.8486328 + - -0.76708984 + - 0.38891602 + - 0.5917969 + - -0.06939697 + - -0.13366699 + - -0.8964844 + - -0.76660156 + - 1.3134766 + - 0.98046875 + - 0.37158203 + - 0.04675293 + - -1.2890625 + - 0.17102051 + - -0.16772461 + - -0.10760498 + - -0.111816406 + - 0.20251465 + - -0.65527344 + - 0.2800293 + - -1.8037109 + - 0.15270996 + - 0.25024414 + - 0.6713867 + - 0.67578125 + - -1.0322266 + - -0.4140625 + - -0.59277344 + - 0.028778076 + - -1.3515625 + - 0.12548828 + - 0.87353516 + - 0.87060547 + - -0.18518066 + - 0.7949219 + - -0.7011719 + - -0.28759766 + - 0.39013672 + - 0.43139648 + - -0.053955078 + - -0.60498047 + - 0.6381836 + - 0.20996094 + - 0.09857178 + - -0.7402344 + - 0.24731445 + - -0.41430664 + - -0.49365234 + - -0.7817383 + - -0.35766602 + - -0.53759766 + - -0.13439941 + - 0.03010559 + - 0.47070313 + - 0.16564941 + - 1.0439453 + - 0.7026367 + - 0.3251953 + - 0.021118164 + - -0.25976563 + - 1.4033203 + - 0.3383789 + - -0.0637207 + - 0.8149414 + - -0.7651367 + - -0.5332031 + - -0.19335938 + - 0.19458008 + - -0.61083984 + - 0.07684326 + - -0.6982422 + - -0.38989258 + - 0.37841797 + - 0.5966797 + - -1.9882813 + - -0.36767578 + - -2.0214844 + - 0.9682617 + - 0.46826172 + - -0.49829102 + - -0.20861816 + - -0.15332031 + - -0.13891602 + - 1.8779297 + - -0.18640137 + - 0.38134766 + - -0.1373291 + - -0.29492188 + - 0.42871094 + - -0.24523926 + - 0.16320801 + - 0.8408203 + - -0.34985352 + - 0.5307617 + - -0.14685059 + - 0.7729492 + - -0.11444092 + - -0.23522949 + - 1.2089844 + - -1.5595703 + - 0.09820557 + - -1.3476563 + - 0.6196289 + - -1.1464844 + - -0.47045898 + - -0.10656738 + - -1.3115234 + - 0.4309082 + - 0.054748535 + - 0.80078125 + - 0.43359375 + - -0.22290039 + - 0.55908203 + - -8.1484375 + - -0.7236328 + - -0.4831543 + - -0.21447754 + - 0.51904297 + - 0.5449219 + - 0.8520508 + - -0.8852539 + - 0.36865234 + - -0.1694336 + - -0.32250977 + - 0.12176514 + - 0.92578125 + - 0.38891602 + - 0.79296875 + - 0.46875 + - 0.9213867 + - 0.9970703 + - -0.32739258 + - 1.2900391 + - -0.1517334 + - 0.18640137 + - -0.6113281 + - 0.060821533 + - 0.3527832 + - -0.7915039 + - -0.3942871 + - 1.2158203 + - -0.8051758 + - 0.13598633 + - 0.21057129 + - -0.66552734 + - 1.5957031 + - 0.44262695 + - -0.24023438 + - -0.3984375 + - -1.0517578 + - -0.36499023 + - -0.5966797 + - 0.60546875 + - 1.2324219 + - 0.21520996 + - -0.18481445 + - -0.0066490173 + - -0.08239746 + - 0.7993164 + - -0.81884766 + - -1.6660156 + - -1.2861328 + - -0.8535156 + - 0.15856934 + - 0.6230469 + - 0.60595703 + - 0.5234375 + - -0.93603516 + - 0.7529297 + - 0.06738281 + - -0.002035141 + - -0.92285156 + - -0.25512695 + - -0.50878906 + - -0.7944336 + - -0.44970703 + - -0.64501953 + - 0.8569336 + - 0.12030029 + - -0.08343506 + - -0.5126953 + - 0.16540527 + - 1.6054688 + - -0.3947754 + - 0.34350586 + - -0.43066406 + - -0.04083252 + - 0.2956543 + - -0.5175781 + - 0.6567383 + - 0.57470703 + - 0.6694336 + - 0.13891602 + - 0.9790039 + - 0.16503906 + - -0.12017822 + - -0.8745117 + - 0.057861328 + - 0.24194336 + - -0.012207031 + - 0.40722656 + - -0.34936523 + - -0.1998291 + - 0.41210938 + - -0.17858887 + - -0.011474609 + - 0.10394287 + - -0.1048584 + - 0.037384033 + - 1.1806641 + - -0.68896484 + - 0.7397461 + - -0.7661133 + - -0.3540039 + - 0.6098633 + - -0.93066406 + - -0.49047852 + - -0.29418945 + - -1.4736328 + - -1.0498047 + - -1.2509766 + - -0.546875 + - -1.4882813 + - 0.4802246 + - -0.79052734 + - -0.24499512 + - -0.5517578 + - -0.08282471 + - -0.47705078 + - 0.18701172 + - 0.47827148 + - -0.21008301 + - -0.83154297 + - -0.106933594 + - 0.041656494 + - -0.09887695 + - 0.58447266 + - -0.80859375 + - -1.1503906 + - 0.19140625 + - 0.50146484 + - -0.8930664 + - -0.037750244 + - -0.4411621 + - 0.50439453 + - 1.484375 + - -0.8754883 + - -0.3227539 + - -0.98583984 + - -0.09124756 + - 0.48510742 + - -0.2775879 + - 0.80371094 + - -0.5683594 + - -0.25732422 + - 0.7504883 + - -0.37426758 + - 0.2199707 + - 0.37426758 + - -0.03375244 + - -0.40771484 + - -0.18078613 + - -0.48095703 + - -1.5078125 + - -0.6743164 + - 0.82177734 + - 0.25073242 + - -0.8261719 + - 0.33862305 + - -1.2646484 + - 0.8666992 + - -0.27392578 + - -0.34399414 + - -0.42333984 + - -0.4116211 + - 0.8027344 + - 1.1503906 + - -1.2041016 + - 0.35620117 + - -0.00016129017 + - -1.953125 + - -0.6035156 + - 0.58154297 + - 0.08703613 + - 0.48266602 + - -0.35180664 + - -0.11047363 + - 0.65966797 + - -1.4921875 + - -0.14086914 + - -0.2130127 + - 1.0244141 + - -1.4472656 + - 0.56152344 + - 1.734375 + - 0.09698486 + - -0.5415039 + - -0.1340332 + - 0.7583008 + - -0.2722168 + - 1.0488281 + - 1.0498047 + - 0.23254395 + - -0.15222168 + - 0.18005371 + - 0.097839355 + - -1.6386719 + - -0.6035156 + - -0.91748047 + - -0.93847656 + - 1.0576172 + - 0.703125 + - 0.70410156 + - 0.8198242 + - -2.25 + - -0.6357422 + - 0.35058594 + - 0.75146484 + - -0.12322998 + - -1.0859375 + - 0.50634766 + - -0.67822266 + - 0.7495117 + - -0.27685547 + - -0.13537598 +- - 0.039520264 + - 0.4255371 + - 0.19506836 + - -0.4951172 + - 0.5908203 + - -0.17102051 + - 1.3964844 + - 0.14685059 + - 1.8730469 + - 0.5810547 + - 0.7573242 + - 0.2841797 + - 0.027160645 + - -0.61328125 + - 0.24157715 + - -0.13586426 + - -0.44848633 + - 1.1748047 + - 0.5546875 + - -1.8710938 + - -0.08605957 + - -1.2617188 + - 0.7163086 + - -0.32055664 + - 0.11517334 + - 0.99658203 + - 0.09411621 + - 0.4724121 + - 0.20117188 + - 0.50439453 + - -0.07611084 + - -0.026397705 + - -0.5605469 + - -0.12670898 + - -0.7915039 + - 0.19970703 + - 0.97265625 + - 0.7597656 + - -1.6689453 + - -0.16137695 + - -1.5742188 + - -0.8232422 + - 0.3774414 + - -0.105651855 + - -0.026626587 + - 0.5175781 + - -1.21875 + - -0.67089844 + - -0.28198242 + - -0.20910645 + - 0.19665527 + - 0.64990234 + - 1.0576172 + - 0.24536133 + - 0.33862305 + - 0.76708984 + - 0.8564453 + - 0.20861816 + - -0.99853516 + - -1.0507813 + - -0.011680603 + - 0.5522461 + - -0.47558594 + - -0.8598633 + - -0.93847656 + - -0.46899414 + - 0.21325684 + - 1.4003906 + - 0.67089844 + - -0.48999023 + - -0.20861816 + - -0.53515625 + - 0.2241211 + - -1.1054688 + - 0.73339844 + - -1.2802734 + - 0.2442627 + - -0.0713501 + - 1.09375 + - 0.68408203 + - 0.94873047 + - -0.51904297 + - -0.14282227 + - -0.6435547 + - 0.32421875 + - 0.28881836 + - -0.0848999 + - -0.12792969 + - -1.9990234 + - 0.039886475 + - 0.6035156 + - -0.10223389 + - -0.095581055 + - 0.9741211 + - 0.025161743 + - -0.34033203 + - 1.1289063 + - 1.0546875 + - 0.19396973 + - -0.041290283 + - 0.9580078 + - -0.37304688 + - 0.20910645 + - 0.3161621 + - 0.44311523 + - 0.088012695 + - -1.1035156 + - 0.9350586 + - -1.3847656 + - 0.3918457 + - -0.14111328 + - -0.58251953 + - -0.43579102 + - 0.79589844 + - -0.6230469 + - 0.63427734 + - -0.6152344 + - -1.3935547 + - 0.3203125 + - 1.1542969 + - -0.022766113 + - 0.81933594 + - 0.59814453 + - -0.23718262 + - 0.8051758 + - -0.68115234 + - 0.25463867 + - -0.118896484 + - -0.15356445 + - 0.12756348 + - -0.32617188 + - -0.27734375 + - 0.95410156 + - -1.3583984 + - -0.55322266 + - -0.19372559 + - -1.0253906 + - 0.14758301 + - -1.6992188 + - -0.3317871 + - 0.5078125 + - -0.3552246 + - 0.037506104 + - -1.3037109 + - 0.016326904 + - 1.2617188 + - -0.4633789 + - 0.34521484 + - -0.8574219 + - -0.9423828 + - -0.55029297 + - 0.28564453 + - -0.1239624 + - 0.111572266 + - -0.40600586 + - -1.0878906 + - -0.5410156 + - 0.74658203 + - 0.06738281 + - -1.5810547 + - 1.1582031 + - -0.84765625 + - -0.10479736 + - 1.1591797 + - 0.08850098 + - -0.49902344 + - -0.071777344 + - 1.0751953 + - 0.6298828 + - 0.0947876 + - -0.36889648 + - 0.18457031 + - -0.5332031 + - -0.8461914 + - 0.5776367 + - -0.47265625 + - -0.53515625 + - -0.21533203 + - 0.31445313 + - 0.50878906 + - -0.80078125 + - -0.09869385 + - -0.46484375 + - 0.23132324 + - -0.1071167 + - -0.9375 + - -0.94433594 + - 0.22302246 + - -1.3183594 + - -1.2880859 + - -1.0263672 + - 0.7392578 + - -1.0771484 + - -0.06707764 + - -1.1992188 + - 0.09863281 + - -1.1689453 + - 0.703125 + - -0.51171875 + - -0.036346436 + - -0.6064453 + - 0.17321777 + - -0.26416016 + - 0.31811523 + - -1.2773438 + - 0.012527466 + - 1.4785156 + - -0.10699463 + - -0.35961914 + - -0.28881836 + - 1.0390625 + - 0.37646484 + - 0.97998047 + - -0.31567383 + - -0.72509766 + - 1.1767578 + - -0.35302734 + - -0.15820313 + - -0.08886719 + - 0.6435547 + - 0.03665161 + - 1.578125 + - -0.359375 + - -0.60791016 + - -0.048919678 + - -0.7290039 + - -0.1685791 + - 0.65283203 + - 1.0820313 + - -0.26586914 + - 0.11590576 + - -0.5361328 + - -0.81347656 + - -1.0986328 + - 1.3056641 + - -0.33984375 + - -0.23547363 + - -0.0713501 + - 0.83984375 + - 0.5654297 + - -0.74609375 + - 1.4326172 + - -0.80078125 + - -0.6508789 + - 0.42749023 + - 0.036346436 + - -0.02998352 + - 0.7915039 + - 1.0439453 + - 0.66748047 + - 0.57128906 + - 0.33276367 + - -0.31152344 + - 0.028060913 + - 0.037902832 + - 0.6381836 + - 0.06414795 + - 0.19274902 + - -0.68847656 + - 0.11767578 + - -0.4963379 + - 0.12487793 + - 0.041503906 + - 0.31567383 + - -1.3642578 + - 0.6875 + - 0.8310547 + - -0.37670898 + - -0.9199219 + - 0.039245605 + - 0.0040512085 + - -0.068603516 + - -0.011726379 + - 0.7993164 + - -0.16674805 + - -0.45703125 + - -0.71191406 + - -1.1611328 + - -0.06738281 + - 1.1181641 + - -0.44482422 + - 0.3383789 + - 0.39501953 + - -0.28930664 + - 1.0507813 + - 0.26464844 + - 0.8310547 + - -0.8935547 + - 0.15002441 + - -0.8461914 + - 0.7841797 + - 1.3574219 + - 0.05038452 + - 0.3569336 + - -0.8769531 + - -0.27441406 + - 0.28857422 + - 0.1459961 + - 0.0003156662 + - 0.043121338 + - 0.65771484 + - 0.08758545 + - -0.0033512115 + - -0.1875 + - 0.7397461 + - -0.5463867 + - 0.46826172 + - -1.1835938 + - -0.23535156 + - -0.3701172 + - -0.16711426 + - 0.5722656 + - 0.38354492 + - 1.0068359 + - 0.8955078 + - 0.17358398 + - 0.08251953 + - -0.33251953 + - -0.06994629 + - -0.6298828 + - 0.96435547 + - -0.8149414 + - 0.6376953 + - 0.38549805 + - 1.0146484 + - -1.4296875 + - 0.2109375 + - -0.46557617 + - 0.5151367 + - -0.47729492 + - 0.91748047 + - 0.058654785 + - 0.62939453 + - 0.18261719 + - 0.08685303 + - -1.2226563 + - 0.36083984 + - -0.60791016 + - 0.53808594 + - -0.042816162 + - -1.0537109 + - 1.5537109 + - -0.35009766 + - 0.9067383 + - -0.74902344 + - 0.3059082 + - -0.4177246 + - 0.23950195 + - -0.19958496 + - 0.9589844 + - -0.26416016 + - 0.17883301 + - 0.028823853 + - -0.20239258 + - 0.6230469 + - -1.2568359 + - 0.73046875 + - 1.1914063 + - 0.38842773 + - -0.49365234 + - -0.33691406 + - 0.085754395 + - 0.21142578 + - -0.096069336 + - 0.30981445 + - -1.4892578 + - 0.6958008 + - 0.16235352 + - 0.15075684 + - -0.15576172 + - -0.73828125 + - 0.97802734 + - -0.22546387 + - 0.79296875 + - -0.40625 + - 1.8994141 + - 0.053527832 + - 0.02268982 + - -0.7207031 + - -0.63134766 + - -0.07324219 + - 0.08795166 + - 0.22595215 + - 0.035247803 + - -0.83203125 + - -0.08026123 + - 0.07891846 + - -1.4433594 + - 1.2402344 + - 0.7402344 + - 0.2479248 + - -0.25732422 + - 0.29418945 + - -0.88916016 + - -0.35229492 + - -0.65771484 + - 0.048614502 + - -0.1295166 + - 0.1381836 + - -0.60253906 + - -0.5102539 + - -0.39868164 + - -1.6806641 + - -0.6455078 + - 0.24414063 + - -0.19958496 + - 0.62353516 + - -0.86035156 + - 0.10614014 + - -1.0644531 + - 0.84033203 + - -0.48266602 + - -0.30493164 + - -0.3864746 + - -0.052856445 + - -1.2080078 + - -0.43115234 + - 0.12310791 + - 0.80859375 + - 0.21838379 + - -0.027175903 + - -0.10418701 + - -0.44189453 + - -0.051757813 + - 0.6767578 + - -0.7939453 + - -0.703125 + - -0.6723633 + - -0.1743164 + - -1.3681641 + - -0.36376953 + - -0.85546875 + - 1.3095703 + - 0.22692871 + - 0.27783203 + - -0.018127441 + - -0.671875 + - -0.921875 + - -0.2841797 + - -0.45874023 + - -0.20581055 + - -0.3786621 + - 1.0615234 + - -0.8754883 + - -1.0185547 + - 0.13696289 + - 0.15734863 + - 0.57714844 + - -0.234375 + - -1.0605469 + - -0.54052734 + - 0.9375 + - 1.0097656 + - -0.8676758 + - 0.09088135 + - -0.88671875 + - 0.5229492 + - 0.08917236 + - -0.12042236 + - -0.8720703 + - 1.0849609 + - -0.46362305 + - 0.6347656 + - -1.7353516 + - -0.42382813 + - -0.017181396 + - 0.40551758 + - -0.07434082 + - -0.120910645 + - -0.10473633 + - 0.29589844 + - 0.6972656 + - -1.015625 + - 0.5371094 + - -0.51171875 + - 1.1914063 + - -0.113342285 + - 1.3095703 + - -0.8334961 + - 0.39233398 + - -0.09277344 + - 0.21032715 + - 0.24316406 + - 0.15551758 + - 0.15319824 + - -0.6533203 + - -0.3918457 + - -0.83984375 + - 0.15820313 + - -0.3544922 + - -0.19848633 + - 0.074401855 + - -0.23913574 + - -0.36791992 + - -0.5986328 + - 0.2980957 + - -0.1463623 + - -0.43823242 + - 0.9272461 + - 0.24169922 + - 0.1842041 + - -0.38793945 + - -0.54589844 + - 0.67333984 + - -0.20532227 + - 0.7084961 + - 0.19482422 + - 0.3100586 + - -0.18029785 + - 0.83691406 + - 0.09051514 + - -0.14501953 + - 0.08215332 + - 0.016418457 + - 0.2763672 + - 0.5053711 + - -0.6357422 + - -2.8535156 + - 0.09869385 + - -1.2763672 + - 0.7895508 + - 0.32861328 + - -0.58691406 + - 0.05392456 + - -0.49316406 + - 0.03439331 + - 1.3232422 + - -0.3791504 + - -0.009689331 + - 0.12915039 + - 0.39648438 + - 0.40820313 + - -0.5541992 + - 0.07409668 + - 0.16479492 + - -0.008087158 + - 0.17626953 + - -0.22290039 + - 0.93310547 + - -0.03164673 + - 0.010131836 + - 0.97998047 + - 0.16027832 + - 0.5805664 + - -0.96191406 + - 0.39916992 + - -0.23803711 + - -0.7949219 + - 0.16552734 + - -1.9003906 + - -0.5800781 + - -0.39697266 + - 0.10223389 + - 0.18554688 + - -0.7553711 + - 1.5869141 + - -10.421875 + - -0.06225586 + - 0.010032654 + - -0.56103516 + - 0.6611328 + - 0.43969727 + - 0.3322754 + - -1.2880859 + - 0.35083008 + - -0.030227661 + - -0.38964844 + - -0.19934082 + - 0.2993164 + - -0.23413086 + - 0.7788086 + - 0.2434082 + - 0.8574219 + - 0.5605469 + - -0.60253906 + - 0.74560547 + - -0.092163086 + - 0.1550293 + - 0.0060577393 + - -0.27563477 + - 0.30200195 + - -0.7753906 + - 0.16113281 + - 0.47851563 + - 0.20031738 + - -0.032348633 + - 0.6723633 + - -0.9267578 + - 1.2167969 + - 0.08666992 + - -0.0042877197 + - -0.46826172 + - 0.49487305 + - -0.037994385 + - -0.12225342 + - 0.16149902 + - 0.6699219 + - 0.11102295 + - -0.09790039 + - -0.4350586 + - -0.4189453 + - 0.36376953 + - -0.27807617 + - -1.6953125 + - -0.7861328 + - -0.042816162 + - 0.43481445 + - 0.5102539 + - 0.037719727 + - -0.6269531 + - -0.8925781 + - -0.3461914 + - 0.28271484 + - -0.3173828 + - -0.8359375 + - 0.81884766 + - -0.025634766 + - -1.0087891 + - 0.051361084 + - -0.5576172 + - 0.4494629 + - 0.15014648 + - -0.30273438 + - -0.47631836 + - 0.49731445 + - 1.28125 + - -0.33496094 + - 0.46240234 + - 0.44091797 + - 1.1992188 + - -0.6147461 + - -0.2121582 + - 0.13452148 + - 1.1835938 + - 0.27856445 + - 0.026153564 + - 1.4316406 + - -0.08312988 + - -0.25976563 + - 0.1541748 + - -0.49804688 + - -0.0099487305 + - -0.23522949 + - 0.31103516 + - 0.08532715 + - -0.3959961 + - 0.2553711 + - 0.14807129 + - -0.049591064 + - -0.50097656 + - -0.10668945 + - -0.34399414 + - 0.54541016 + - -0.94628906 + - 0.29467773 + - -0.59472656 + - 0.1361084 + - 0.06640625 + - -0.030883789 + - -0.55908203 + - -0.41186523 + - -0.95947266 + - -1.0517578 + - 0.14428711 + - -0.16186523 + - -1.5146484 + - 0.19555664 + - -0.5473633 + - -0.073913574 + - -0.24536133 + - -0.47998047 + - -1.0888672 + - -0.021987915 + - -0.5107422 + - -0.4970703 + - -0.78027344 + - -0.3671875 + - 0.46923828 + - 0.011650085 + - 0.09283447 + - -0.8222656 + - -0.7807617 + - 1.0908203 + - -0.5229492 + - -0.75927734 + - -0.47705078 + - -0.4206543 + - 0.39086914 + - 1.2792969 + - 0.5048828 + - -0.09899902 + - -0.6352539 + - -0.00077199936 + - 0.80078125 + - -0.8129883 + - 0.95166016 + - -0.70996094 + - -0.37841797 + - 0.17565918 + - 0.20361328 + - -0.037200928 + - 0.057159424 + - -0.03933716 + - 0.16137695 + - -0.14086914 + - -1.0478516 + - -1.3056641 + - -0.80126953 + - 1.4951172 + - 0.74902344 + - -0.73583984 + - -0.38842773 + - -1.3876953 + - 0.7602539 + - -0.45458984 + - 0.105163574 + - 0.92871094 + - -0.5180664 + - 0.62939453 + - 1.828125 + - 0.13671875 + - -0.5917969 + - 0.17919922 + - -0.79248047 + - -0.29663086 + - 0.5097656 + - 0.33911133 + - 0.3540039 + - -0.50341797 + - 0.1182251 + - -0.15393066 + - -1.3339844 + - -0.28442383 + - 0.59716797 + - 0.8642578 + - -1.6845703 + - 0.15039063 + - 1.9853516 + - 0.30371094 + - 0.041412354 + - 0.29492188 + - 0.30395508 + - -0.5595703 + - 0.56396484 + - 1.0253906 + - -0.6640625 + - -0.031311035 + - -0.15283203 + - -0.055267334 + - -0.4880371 + - -0.19238281 + - -0.5 + - -0.7084961 + - 0.42822266 + - 0.1541748 + - -0.014923096 + - 1.0146484 + - -1.2333984 + - -0.13317871 + - 0.6503906 + - 0.8798828 + - 0.14440918 + - -0.7792969 + - 0.2890625 + - 0.35961914 + - -0.072509766 + - -0.14611816 + - -0.041137695 +- - 0.4428711 + - 0.6118164 + - 0.07043457 + - -0.5917969 + - 0.88183594 + - -0.10839844 + - 0.0881958 + - -0.20483398 + - 1.9345703 + - 0.6230469 + - 0.59521484 + - 0.18737793 + - 0.030548096 + - -0.078308105 + - 0.79589844 + - -0.23474121 + - -0.8720703 + - 1.6923828 + - 0.12597656 + - -1.9267578 + - -0.34472656 + - -1.9326172 + - 0.89990234 + - -0.2006836 + - 0.024230957 + - 0.2878418 + - 0.3642578 + - 0.17956543 + - -0.51123047 + - 0.025817871 + - -0.8964844 + - 0.14147949 + - -0.39257813 + - -0.8486328 + - 0.005218506 + - 0.42358398 + - 0.23181152 + - 1.1630859 + - -1.1455078 + - 0.3388672 + - -2.1484375 + - -1.0146484 + - -0.2841797 + - 0.021499634 + - 0.16235352 + - 0.39453125 + - -0.9511719 + - 0.41064453 + - -0.15563965 + - -0.484375 + - -0.07080078 + - 0.07312012 + - 0.56103516 + - 0.028213501 + - -0.027938843 + - 0.43896484 + - 1.0136719 + - 0.7788086 + - -0.5644531 + - -1.9824219 + - -0.011169434 + - 0.50634766 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.07208252 + - 0.008544922 + - 0.7788086 + - -0.10021973 + - -0.30859375 + - 0.35888672 + - -0.44848633 + - -0.08679199 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34228516 + - -0.45385742 + - 0.8027344 + - 0.50634766 + - 0.703125 + - -0.96533203 + - -0.042938232 + - -1.0927734 + - 0.35205078 + - -0.56689453 + - -0.5341797 + - 0.23571777 + - -2.0234375 + - -0.26342773 + - 0.1998291 + - 0.7739258 + - 0.17797852 + - 1.2255859 + - 0.9814453 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.2479248 + - -0.2166748 + - 0.29052734 + - -0.5004883 + - 0.26513672 + - 0.5024414 + - -0.042266846 + - -0.013465881 + - -0.6376953 + - 0.64501953 + - -1.7958984 + - 0.25512695 + - -0.20458984 + - -0.12927246 + - 0.19665527 + - 0.8076172 + - -0.96777344 + - 0.26391602 + - -0.5649414 + - -0.58740234 + - -0.15466309 + - 0.7392578 + - 0.5336914 + - 0.60253906 + - 1.1875 + - -0.37719727 + - 0.8198242 + - -0.2401123 + - 0.40527344 + - 0.17114258 + - -0.32128906 + - -0.75439453 + - 0.056488037 + - 0.16491699 + - 0.6899414 + - -0.6171875 + - -0.05316162 + - 0.43017578 + - -0.6074219 + - 0.040374756 + - -0.8618164 + - -0.7192383 + - 0.7402344 + - -0.42138672 + - 0.26831055 + - -1.5429688 + - 0.1706543 + - 1.2158203 + - -0.17077637 + - -0.13964844 + - -0.5449219 + - -0.59033203 + - -0.7783203 + - -0.18786621 + - -0.34838867 + - 0.6230469 + - -0.5878906 + - -0.90234375 + - -0.7324219 + - -0.81933594 + - 0.4819336 + - -1.1591797 + - 1.2109375 + - -1.0517578 + - 0.25219727 + - 1.2841797 + - 0.06347656 + - -0.72021484 + - -0.3671875 + - 0.07330322 + - -0.022644043 + - -0.3713379 + - -0.008430481 + - 0.3564453 + - -0.8354492 + - -0.59521484 + - -0.40405273 + - -0.027923584 + - -0.3100586 + - -1.109375 + - -0.030593872 + - 0.14086914 + - -1.2128906 + - 0.03488159 + - 0.35424805 + - -1.5683594 + - 0.17773438 + - -0.66796875 + - -1.9804688 + - -0.35327148 + - -0.2927246 + - -1.2011719 + - -0.4165039 + - 0.36645508 + - -0.049957275 + - -0.87353516 + - -0.9086914 + - 0.4790039 + - -1.4599609 + - 0.7866211 + - -0.27490234 + - 0.08477783 + - 0.2220459 + - 0.0017213821 + - -1.0927734 + - -0.006439209 + - -0.62060547 + - -0.68115234 + - 0.4572754 + - -0.61572266 + - -0.7871094 + - -1.3847656 + - 1.5566406 + - 0.2680664 + - 0.8466797 + - -0.2578125 + - -0.76416016 + - 0.6484375 + - -0.05279541 + - -0.1307373 + - -0.11853027 + - -0.6357422 + - -0.17700195 + - 0.9472656 + - -0.4958496 + - 0.015464783 + - -0.23168945 + - -1.6748047 + - -0.8911133 + - 0.86865234 + - 1.0722656 + - 0.34228516 + - 0.7182617 + - -0.5488281 + - -0.45166016 + - -0.3022461 + - 0.45336914 + - -0.28808594 + - -0.7626953 + - 0.016067505 + - 0.63183594 + - 0.46923828 + - -0.07373047 + - 1.7832031 + - -0.41796875 + - -0.89453125 + - 0.07757568 + - -0.29589844 + - -1.0673828 + - 1.3320313 + - 1.4160156 + - 0.20703125 + - -0.1060791 + - 0.1508789 + - 0.37231445 + - 0.05053711 + - -0.68896484 + - 0.7397461 + - 0.15771484 + - 0.5595703 + - -0.8198242 + - -0.17712402 + - -0.2479248 + - -0.066345215 + - 0.4194336 + - 1.0517578 + - -1.6650391 + - 0.90283203 + - 0.22937012 + - -0.5908203 + - -0.79785156 + - -0.003993988 + - -0.47314453 + - 0.19116211 + - -0.39038086 + - 0.6333008 + - -0.28686523 + - -0.8720703 + - 0.080200195 + - -1.2587891 + - 0.22790527 + - 0.55126953 + - -0.47485352 + - -0.20471191 + - 0.75390625 + - -1.0488281 + - 0.9902344 + - 1.2275391 + - 0.40966797 + - -0.36791992 + - 0.54833984 + - -0.32788086 + - 0.2208252 + - 1.1289063 + - -0.017410278 + - -0.67089844 + - 0.7236328 + - 0.20788574 + - 0.55566406 + - 0.7104492 + - -0.16589355 + - 0.57958984 + - 1.1494141 + - -0.15930176 + - -0.4963379 + - 0.016326904 + - 1.5634766 + - -0.5029297 + - 1.2011719 + - -1.0029297 + - -0.3557129 + - -0.31079102 + - -0.12670898 + - 0.81933594 + - 0.75683594 + - 1.1630859 + - 1.6669922 + - -0.8022461 + - -0.3034668 + - 0.3798828 + - -0.71484375 + - -0.7470703 + - 1.1904297 + - -0.95654297 + - 0.30297852 + - 0.16992188 + - 0.8173828 + - -0.8798828 + - 1.1376953 + - -0.4543457 + - 0.6142578 + - -0.47680664 + - 1.1181641 + - 0.01398468 + - -0.49560547 + - -0.039031982 + - 0.2878418 + - -0.71533203 + - 0.82128906 + - -0.03768921 + - 0.60546875 + - 0.7578125 + - -0.3322754 + - 0.86376953 + - -0.71435547 + - 0.7597656 + - -1.3496094 + - 0.18652344 + - -0.39990234 + - 0.31103516 + - 0.16809082 + - 1.2626953 + - -0.42919922 + - 0.2434082 + - 0.83935547 + - -1.3994141 + - 0.34472656 + - -0.68603516 + - -0.28759766 + - 0.4663086 + - 0.6816406 + - -0.48120117 + - -0.11029053 + - -0.48339844 + - 0.1706543 + - 0.29614258 + - -0.7290039 + - -0.87158203 + - 0.8457031 + - 0.57128906 + - 0.1640625 + - -0.1739502 + - -0.16394043 + - 0.8652344 + - -0.38671875 + - 0.5625 + - -0.30493164 + - 1.8251953 + - 0.041931152 + - 0.17285156 + - -1.0107422 + - -0.20788574 + - 1.1005859 + - 0.7973633 + - -1.0029297 + - 0.67041016 + - -0.96240234 + - 0.45166016 + - -0.32202148 + - -0.97753906 + - 1.7080078 + - -0.04626465 + - 0.4404297 + - 0.28833008 + - 0.32006836 + - -0.5341797 + - -0.74658203 + - -1.28125 + - -0.2076416 + - -0.57958984 + - 0.88134766 + - -0.21875 + - -0.51171875 + - 0.20214844 + - -0.9536133 + - -0.89160156 + - 0.6279297 + - -0.08929443 + - 1.2490234 + - -0.3083496 + - 0.5253906 + - -1.5771484 + - 0.86572266 + - -0.16223145 + - -0.6455078 + - -0.9008789 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.2052002 + - 1.0820313 + - 0.5390625 + - 0.2454834 + - -0.0053596497 + - 0.09838867 + - -0.08288574 + - 0.6616211 + - -0.06573486 + - -0.8120117 + - -0.08306885 + - 0.12176514 + - -1.4072266 + - 0.6533203 + - 0.49536133 + - 0.48339844 + - -0.6142578 + - 0.06011963 + - 0.4951172 + - -0.33935547 + - -0.85058594 + - -0.8510742 + - 0.10028076 + - 0.64501953 + - 0.62841797 + - 0.79052734 + - -0.8486328 + - -0.76708984 + - 0.38891602 + - 0.5917969 + - -0.06939697 + - -0.13366699 + - -0.8964844 + - -0.76660156 + - 1.3134766 + - 0.98046875 + - 0.37158203 + - 0.04675293 + - -1.2890625 + - 0.17102051 + - -0.16772461 + - -0.10760498 + - -0.111816406 + - 0.20251465 + - -0.65527344 + - 0.2800293 + - -1.8037109 + - 0.15270996 + - 0.25024414 + - 0.6713867 + - 0.67578125 + - -1.0322266 + - -0.4140625 + - -0.59277344 + - 0.028778076 + - -1.3515625 + - 0.12548828 + - 0.87353516 + - 0.87060547 + - -0.18518066 + - 0.7949219 + - -0.7011719 + - -0.28759766 + - 0.39013672 + - 0.43139648 + - -0.053955078 + - -0.60498047 + - 0.6381836 + - 0.20996094 + - 0.09857178 + - -0.7402344 + - 0.24731445 + - -0.41430664 + - -0.49365234 + - -0.7817383 + - -0.35766602 + - -0.53759766 + - -0.13439941 + - 0.03010559 + - 0.47070313 + - 0.16564941 + - 1.0439453 + - 0.7026367 + - 0.3251953 + - 0.021118164 + - -0.25976563 + - 1.4033203 + - 0.3383789 + - -0.0637207 + - 0.8149414 + - -0.7651367 + - -0.5332031 + - -0.19335938 + - 0.19458008 + - -0.61083984 + - 0.07684326 + - -0.6982422 + - -0.38989258 + - 0.37841797 + - 0.5966797 + - -1.9882813 + - -0.36767578 + - -2.0214844 + - 0.9682617 + - 0.46826172 + - -0.49829102 + - -0.20861816 + - -0.15332031 + - -0.13891602 + - 1.8779297 + - -0.18640137 + - 0.38134766 + - -0.1373291 + - -0.29492188 + - 0.42871094 + - -0.24523926 + - 0.16320801 + - 0.8408203 + - -0.34985352 + - 0.5307617 + - -0.14685059 + - 0.7729492 + - -0.11444092 + - -0.23522949 + - 1.2089844 + - -1.5595703 + - 0.09820557 + - -1.3476563 + - 0.6196289 + - -1.1464844 + - -0.47045898 + - -0.10656738 + - -1.3115234 + - 0.4309082 + - 0.054748535 + - 0.80078125 + - 0.43359375 + - -0.22290039 + - 0.55908203 + - -8.1484375 + - -0.7236328 + - -0.4831543 + - -0.21447754 + - 0.51904297 + - 0.5449219 + - 0.8520508 + - -0.8852539 + - 0.36865234 + - -0.1694336 + - -0.32250977 + - 0.12176514 + - 0.92578125 + - 0.38891602 + - 0.79296875 + - 0.46875 + - 0.9213867 + - 0.9970703 + - -0.32739258 + - 1.2900391 + - -0.1517334 + - 0.18640137 + - -0.6113281 + - 0.060821533 + - 0.3527832 + - -0.7915039 + - -0.3942871 + - 1.2158203 + - -0.8051758 + - 0.13598633 + - 0.21057129 + - -0.66552734 + - 1.5957031 + - 0.44262695 + - -0.24023438 + - -0.3984375 + - -1.0517578 + - -0.36499023 + - -0.5966797 + - 0.60546875 + - 1.2324219 + - 0.21520996 + - -0.18481445 + - -0.0066490173 + - -0.08239746 + - 0.7993164 + - -0.81884766 + - -1.6660156 + - -1.2861328 + - -0.8535156 + - 0.15856934 + - 0.6230469 + - 0.60595703 + - 0.5234375 + - -0.93603516 + - 0.7529297 + - 0.06738281 + - -0.002035141 + - -0.92285156 + - -0.25512695 + - -0.50878906 + - -0.7944336 + - -0.44970703 + - -0.64501953 + - 0.8569336 + - 0.12030029 + - -0.08343506 + - -0.5126953 + - 0.16540527 + - 1.6054688 + - -0.3947754 + - 0.34350586 + - -0.43066406 + - -0.04083252 + - 0.2956543 + - -0.5175781 + - 0.6567383 + - 0.57470703 + - 0.6694336 + - 0.13891602 + - 0.9790039 + - 0.16503906 + - -0.12017822 + - -0.8745117 + - 0.057861328 + - 0.24194336 + - -0.012207031 + - 0.40722656 + - -0.34936523 + - -0.1998291 + - 0.41210938 + - -0.17858887 + - -0.011474609 + - 0.10394287 + - -0.1048584 + - 0.037384033 + - 1.1806641 + - -0.68896484 + - 0.7397461 + - -0.7661133 + - -0.3540039 + - 0.6098633 + - -0.93066406 + - -0.49047852 + - -0.29418945 + - -1.4736328 + - -1.0498047 + - -1.2509766 + - -0.546875 + - -1.4882813 + - 0.4802246 + - -0.79052734 + - -0.24499512 + - -0.5517578 + - -0.08282471 + - -0.47705078 + - 0.18701172 + - 0.47827148 + - -0.21008301 + - -0.83154297 + - -0.106933594 + - 0.041656494 + - -0.09887695 + - 0.58447266 + - -0.80859375 + - -1.1503906 + - 0.19140625 + - 0.50146484 + - -0.8930664 + - -0.037750244 + - -0.4411621 + - 0.50439453 + - 1.484375 + - -0.8754883 + - -0.3227539 + - -0.98583984 + - -0.09124756 + - 0.48510742 + - -0.2775879 + - 0.80371094 + - -0.5683594 + - -0.25732422 + - 0.7504883 + - -0.37426758 + - 0.2199707 + - 0.37426758 + - -0.03375244 + - -0.40771484 + - -0.18078613 + - -0.48095703 + - -1.5078125 + - -0.6743164 + - 0.82177734 + - 0.25073242 + - -0.8261719 + - 0.33862305 + - -1.2646484 + - 0.8666992 + - -0.27392578 + - -0.34399414 + - -0.42333984 + - -0.4116211 + - 0.8027344 + - 1.1503906 + - -1.2041016 + - 0.35620117 + - -0.00016129017 + - -1.953125 + - -0.6035156 + - 0.58154297 + - 0.08703613 + - 0.48266602 + - -0.35180664 + - -0.11047363 + - 0.65966797 + - -1.4921875 + - -0.14086914 + - -0.2130127 + - 1.0244141 + - -1.4472656 + - 0.56152344 + - 1.734375 + - 0.09698486 + - -0.5415039 + - -0.1340332 + - 0.7583008 + - -0.2722168 + - 1.0488281 + - 1.0498047 + - 0.23254395 + - -0.15222168 + - 0.18005371 + - 0.097839355 + - -1.6386719 + - -0.6035156 + - -0.91748047 + - -0.93847656 + - 1.0576172 + - 0.703125 + - 0.70410156 + - 0.8198242 + - -2.25 + - -0.6357422 + - 0.35058594 + - 0.75146484 + - -0.12322998 + - -1.0859375 + - 0.50634766 + - -0.67822266 + - 0.7495117 + - -0.27685547 + - -0.13537598 diff --git a/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap b/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap new file mode 100644 index 00000000..96c169b0 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_gte__gte_single.snap @@ -0,0 +1,773 @@ +--- +source: backends/candle/tests/test_flash_gte.rs +assertion_line: 48 +expression: embeddings_single +--- +- - 0.44262695 + - 0.6113281 + - 0.07098389 + - -0.5908203 + - 0.88134766 + - -0.10870361 + - 0.08959961 + - -0.20568848 + - 1.9335938 + - 0.62353516 + - 0.5957031 + - 0.18664551 + - 0.030349731 + - -0.07714844 + - 0.7963867 + - -0.23425293 + - -0.8720703 + - 1.6923828 + - 0.12585449 + - -1.9277344 + - -0.34448242 + - -1.9326172 + - 0.9003906 + - -0.20056152 + - 0.023971558 + - 0.28833008 + - 0.3647461 + - 0.17883301 + - -0.51123047 + - 0.02519226 + - -0.89453125 + - 0.14074707 + - -0.3918457 + - -0.84814453 + - 0.0044822693 + - 0.42407227 + - 0.23144531 + - 1.1621094 + - -1.1464844 + - 0.33862305 + - -2.1484375 + - -1.0136719 + - -0.2841797 + - 0.02142334 + - 0.16271973 + - 0.3942871 + - -0.9511719 + - 0.4099121 + - -0.15612793 + - -0.484375 + - -0.071777344 + - 0.07232666 + - 0.5595703 + - 0.028564453 + - -0.027267456 + - 0.43798828 + - 1.0136719 + - 0.7792969 + - -0.56396484 + - -1.9824219 + - -0.011451721 + - 0.50683594 + - -0.39331055 + - -0.3334961 + - -1.1679688 + - -0.072387695 + - 0.008460999 + - 0.7788086 + - -0.099609375 + - -0.30981445 + - 0.3581543 + - -0.4482422 + - -0.08532715 + - -1.0791016 + - 1.3193359 + - -1.0273438 + - 0.34350586 + - -0.45288086 + - 0.8022461 + - 0.5048828 + - 0.7026367 + - -0.96533203 + - -0.04159546 + - -1.09375 + - 0.35180664 + - -0.56689453 + - -0.5341797 + - 0.23583984 + - -2.0253906 + - -0.2619629 + - 0.19995117 + - 0.7739258 + - 0.17883301 + - 1.2255859 + - 0.98095703 + - -0.2902832 + - 1.2080078 + - 0.50097656 + - 0.24719238 + - -0.21533203 + - 0.2902832 + - -0.50097656 + - 0.26489258 + - 0.5019531 + - -0.042816162 + - -0.013328552 + - -0.63916016 + - 0.64404297 + - -1.7949219 + - 0.25439453 + - -0.2043457 + - -0.12939453 + - 0.19616699 + - 0.80908203 + - -0.9667969 + - 0.26342773 + - -0.5644531 + - -0.58691406 + - -0.1541748 + - 0.7397461 + - 0.5336914 + - 0.6020508 + - 1.1865234 + - -0.3774414 + - 0.8198242 + - -0.24084473 + - 0.40527344 + - 0.17089844 + - -0.3203125 + - -0.7548828 + - 0.056518555 + - 0.16540527 + - 0.6899414 + - -0.6166992 + - -0.052642822 + - 0.43041992 + - -0.6074219 + - 0.039886475 + - -0.8613281 + - -0.71875 + - 0.7402344 + - -0.42138672 + - 0.26953125 + - -1.5439453 + - 0.17004395 + - 1.2167969 + - -0.17102051 + - -0.13879395 + - -0.5463867 + - -0.59033203 + - -0.7783203 + - -0.1875 + - -0.34838867 + - 0.6230469 + - -0.5888672 + - -0.9038086 + - -0.7319336 + - -0.8183594 + - 0.4807129 + - -1.1611328 + - 1.2109375 + - -1.0537109 + - 0.25268555 + - 1.2851563 + - 0.06317139 + - -0.7207031 + - -0.36694336 + - 0.072265625 + - -0.022918701 + - -0.3708496 + - -0.0073547363 + - 0.35791016 + - -0.8354492 + - -0.5961914 + - -0.40429688 + - -0.027389526 + - -0.31079102 + - -1.1103516 + - -0.030670166 + - 0.14013672 + - -1.2119141 + - 0.035247803 + - 0.3527832 + - -1.5673828 + - 0.1763916 + - -0.66748047 + - -1.9804688 + - -0.35351563 + - -0.29223633 + - -1.2021484 + - -0.41601563 + - 0.36669922 + - -0.051330566 + - -0.87353516 + - -0.9086914 + - 0.4794922 + - -1.4589844 + - 0.7866211 + - -0.27441406 + - 0.084106445 + - 0.22143555 + - 0.0014467239 + - -1.0917969 + - -0.0079574585 + - -0.62060547 + - -0.6816406 + - 0.45751953 + - -0.6166992 + - -0.78759766 + - -1.3847656 + - 1.5576172 + - 0.2697754 + - 0.8461914 + - -0.25756836 + - -0.765625 + - 0.6489258 + - -0.053344727 + - -0.13195801 + - -0.119628906 + - -0.6357422 + - -0.17736816 + - 0.9477539 + - -0.49682617 + - 0.016204834 + - -0.23156738 + - -1.6738281 + - -0.890625 + - 0.8666992 + - 1.0703125 + - 0.3425293 + - 0.71972656 + - -0.5498047 + - -0.45263672 + - -0.30249023 + - 0.45336914 + - -0.28588867 + - -0.7626953 + - 0.017074585 + - 0.6308594 + - 0.47094727 + - -0.07519531 + - 1.7861328 + - -0.41723633 + - -0.8935547 + - 0.077697754 + - -0.29492188 + - -1.0673828 + - 1.3300781 + - 1.4150391 + - 0.20751953 + - -0.10571289 + - 0.15100098 + - 0.37182617 + - 0.05105591 + - -0.6875 + - 0.7392578 + - 0.15649414 + - 0.5600586 + - -0.81884766 + - -0.17700195 + - -0.24841309 + - -0.06628418 + - 0.42016602 + - 1.0527344 + - -1.6660156 + - 0.90283203 + - 0.22888184 + - -0.5917969 + - -0.7973633 + - -0.0041236877 + - -0.4741211 + - 0.19104004 + - -0.390625 + - 0.63427734 + - -0.28710938 + - -0.87158203 + - 0.08068848 + - -1.2587891 + - 0.22729492 + - 0.5517578 + - -0.47558594 + - -0.20385742 + - 0.7553711 + - -1.0498047 + - 0.99121094 + - 1.2275391 + - 0.41015625 + - -0.36791992 + - 0.54833984 + - -0.3269043 + - 0.21972656 + - 1.1298828 + - -0.01737976 + - -0.6699219 + - 0.72265625 + - 0.20800781 + - 0.5566406 + - 0.7109375 + - -0.16577148 + - 0.5805664 + - 1.1494141 + - -0.15942383 + - -0.49658203 + - 0.01625061 + - 1.5625 + - -0.50390625 + - 1.2011719 + - -1.0029297 + - -0.35473633 + - -0.3100586 + - -0.12658691 + - 0.8208008 + - 0.7578125 + - 1.1611328 + - 1.6660156 + - -0.8022461 + - -0.30273438 + - 0.38012695 + - -0.71484375 + - -0.7475586 + - 1.1914063 + - -0.9560547 + - 0.30297852 + - 0.17163086 + - 0.8183594 + - -0.87841797 + - 1.1376953 + - -0.4543457 + - 0.61376953 + - -0.47851563 + - 1.1181641 + - 0.013900757 + - -0.49560547 + - -0.03945923 + - 0.28637695 + - -0.71533203 + - 0.8203125 + - -0.037322998 + - 0.6044922 + - 0.75683594 + - -0.33276367 + - 0.8647461 + - -0.7138672 + - 0.7597656 + - -1.3496094 + - 0.18701172 + - -0.3996582 + - 0.3112793 + - 0.16809082 + - 1.2617188 + - -0.42993164 + - 0.24401855 + - 0.83935547 + - -1.3994141 + - 0.34594727 + - -0.68603516 + - -0.2878418 + - 0.46655273 + - 0.68066406 + - -0.48291016 + - -0.11004639 + - -0.48364258 + - 0.17126465 + - 0.29614258 + - -0.7290039 + - -0.8725586 + - 0.8457031 + - 0.5732422 + - 0.16186523 + - -0.17407227 + - -0.16455078 + - 0.8652344 + - -0.38598633 + - 0.56396484 + - -0.30639648 + - 1.8261719 + - 0.04208374 + - 0.1743164 + - -1.0107422 + - -0.20812988 + - 1.1015625 + - 0.79833984 + - -1.0019531 + - 0.67041016 + - -0.96191406 + - 0.45092773 + - -0.32226563 + - -0.9790039 + - 1.7089844 + - -0.04675293 + - 0.44091797 + - 0.28930664 + - 0.32104492 + - -0.5336914 + - -0.7475586 + - -1.2802734 + - -0.20861816 + - -0.57958984 + - 0.8798828 + - -0.21777344 + - -0.51220703 + - 0.20239258 + - -0.953125 + - -0.8925781 + - 0.62890625 + - -0.08935547 + - 1.2490234 + - -0.30859375 + - 0.52490234 + - -1.5771484 + - 0.8647461 + - -0.16259766 + - -0.64697266 + - -0.9003906 + - -0.68896484 + - -0.55566406 + - 0.54785156 + - -0.20458984 + - 1.0810547 + - 0.5390625 + - 0.24572754 + - -0.0054397583 + - 0.097717285 + - -0.08135986 + - 0.6616211 + - -0.06652832 + - -0.8129883 + - -0.08251953 + - 0.12164307 + - -1.4072266 + - 0.65283203 + - 0.4946289 + - 0.48364258 + - -0.6142578 + - 0.060272217 + - 0.49560547 + - -0.33911133 + - -0.85058594 + - -0.8510742 + - 0.10040283 + - 0.64453125 + - 0.6279297 + - 0.7890625 + - -0.8496094 + - -0.76708984 + - 0.38916016 + - 0.59277344 + - -0.07110596 + - -0.1340332 + - -0.8955078 + - -0.7661133 + - 1.3125 + - 0.98095703 + - 0.3708496 + - 0.046966553 + - -1.2900391 + - 0.17272949 + - -0.1673584 + - -0.1071167 + - -0.11187744 + - 0.20092773 + - -0.65478516 + - 0.27978516 + - -1.8027344 + - 0.15197754 + - 0.25 + - 0.671875 + - 0.6748047 + - -1.0322266 + - -0.41308594 + - -0.5917969 + - 0.028701782 + - -1.3515625 + - 0.12524414 + - 0.87402344 + - 0.8701172 + - -0.18334961 + - 0.79541016 + - -0.7006836 + - -0.28833008 + - 0.39086914 + - 0.43115234 + - -0.05316162 + - -0.60498047 + - 0.6386719 + - 0.21044922 + - 0.09869385 + - -0.7402344 + - 0.24731445 + - -0.4140625 + - -0.49487305 + - -0.78125 + - -0.35864258 + - -0.5366211 + - -0.13464355 + - 0.030441284 + - 0.47045898 + - 0.16552734 + - 1.0458984 + - 0.7026367 + - 0.32470703 + - 0.021697998 + - -0.26098633 + - 1.4023438 + - 0.33789063 + - -0.062469482 + - 0.81396484 + - -0.765625 + - -0.5341797 + - -0.19299316 + - 0.19433594 + - -0.6113281 + - 0.07598877 + - -0.6977539 + - -0.39038086 + - 0.3774414 + - 0.5957031 + - -1.9902344 + - -0.36889648 + - -2.0195313 + - 0.9692383 + - 0.46948242 + - -0.49975586 + - -0.20837402 + - -0.1529541 + - -0.13879395 + - 1.8769531 + - -0.18579102 + - 0.38256836 + - -0.13684082 + - -0.2956543 + - 0.42749023 + - -0.24560547 + - 0.16381836 + - 0.84228516 + - -0.35009766 + - 0.53125 + - -0.14697266 + - 0.7734375 + - -0.114990234 + - -0.23522949 + - 1.2080078 + - -1.5605469 + - 0.098083496 + - -1.3466797 + - 0.62060547 + - -1.1484375 + - -0.4699707 + - -0.106933594 + - -1.3095703 + - 0.43066406 + - 0.05444336 + - 0.80126953 + - 0.4326172 + - -0.22338867 + - 0.55908203 + - -8.1484375 + - -0.7246094 + - -0.48291016 + - -0.21386719 + - 0.51953125 + - 0.5449219 + - 0.8515625 + - -0.88378906 + - 0.36865234 + - -0.16955566 + - -0.3244629 + - 0.12188721 + - 0.92529297 + - 0.38891602 + - 0.7944336 + - 0.46850586 + - 0.921875 + - 0.9980469 + - -0.32739258 + - 1.2910156 + - -0.15161133 + - 0.18591309 + - -0.6123047 + - 0.060546875 + - 0.35327148 + - -0.7915039 + - -0.3947754 + - 1.2158203 + - -0.8046875 + - 0.13659668 + - 0.21166992 + - -0.6669922 + - 1.5957031 + - 0.44262695 + - -0.24145508 + - -0.39770508 + - -1.0517578 + - -0.36450195 + - -0.5961914 + - 0.60498047 + - 1.2314453 + - 0.21472168 + - -0.18359375 + - -0.0063056946 + - -0.08239746 + - 0.80029297 + - -0.8183594 + - -1.6660156 + - -1.2861328 + - -0.85253906 + - 0.15881348 + - 0.6225586 + - 0.60546875 + - 0.5239258 + - -0.9355469 + - 0.7529297 + - 0.06768799 + - -0.0025157928 + - -0.9238281 + - -0.25390625 + - -0.5097656 + - -0.79345703 + - -0.4501953 + - -0.6459961 + - 0.8564453 + - 0.121154785 + - -0.08404541 + - -0.51416016 + - 0.16540527 + - 1.6054688 + - -0.39404297 + - 0.34277344 + - -0.43017578 + - -0.040618896 + - 0.29614258 + - -0.5180664 + - 0.6567383 + - 0.57373047 + - 0.66845703 + - 0.14013672 + - 0.98046875 + - 0.16442871 + - -0.12042236 + - -0.8745117 + - 0.057556152 + - 0.24316406 + - -0.012084961 + - 0.40649414 + - -0.3486328 + - -0.20080566 + - 0.4116211 + - -0.17822266 + - -0.011131287 + - 0.10406494 + - -0.10601807 + - 0.038391113 + - 1.1806641 + - -0.68847656 + - 0.73779297 + - -0.7651367 + - -0.35229492 + - 0.6113281 + - -0.93066406 + - -0.49072266 + - -0.2944336 + - -1.4726563 + - -1.0498047 + - -1.2509766 + - -0.54833984 + - -1.4892578 + - 0.48120117 + - -0.7919922 + - -0.24487305 + - -0.5517578 + - -0.08355713 + - -0.4765625 + - 0.1875 + - 0.4790039 + - -0.21032715 + - -0.8310547 + - -0.10638428 + - 0.042144775 + - -0.098083496 + - 0.5839844 + - -0.80859375 + - -1.1503906 + - 0.19128418 + - 0.5019531 + - -0.8935547 + - -0.037200928 + - -0.4416504 + - 0.50390625 + - 1.4833984 + - -0.87597656 + - -0.32202148 + - -0.9848633 + - -0.09112549 + - 0.48486328 + - -0.2775879 + - 0.8051758 + - -0.56884766 + - -0.2565918 + - 0.75097656 + - -0.37402344 + - 0.21936035 + - 0.37524414 + - -0.03427124 + - -0.40771484 + - -0.18054199 + - -0.48168945 + - -1.5068359 + - -0.67333984 + - 0.82128906 + - 0.25219727 + - -0.82714844 + - 0.33935547 + - -1.2626953 + - 0.86621094 + - -0.27441406 + - -0.34350586 + - -0.42382813 + - -0.41186523 + - 0.80371094 + - 1.1513672 + - -1.2041016 + - 0.3552246 + - -0.00065660477 + - -1.953125 + - -0.60253906 + - 0.58154297 + - 0.086364746 + - 0.48217773 + - -0.35253906 + - -0.11077881 + - 0.66064453 + - -1.4921875 + - -0.14025879 + - -0.21313477 + - 1.0234375 + - -1.4482422 + - 0.56103516 + - 1.734375 + - 0.09710693 + - -0.54003906 + - -0.13305664 + - 0.75878906 + - -0.27246094 + - 1.0488281 + - 1.0507813 + - 0.23254395 + - -0.15209961 + - 0.18017578 + - 0.09790039 + - -1.6376953 + - -0.60253906 + - -0.9165039 + - -0.9379883 + - 1.0585938 + - 0.703125 + - 0.70458984 + - 0.8203125 + - -2.2519531 + - -0.63623047 + - 0.35058594 + - 0.7504883 + - -0.12408447 + - -1.0839844 + - 0.50683594 + - -0.6796875 + - 0.7495117 + - -0.27783203 + - -0.13562012 diff --git a/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap b/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap new file mode 100644 index 00000000..acea099b --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_mistral__mistral_batch.snap @@ -0,0 +1,12293 @@ +--- +source: backends/candle/tests/test_flash_mistral.rs +assertion_line: 37 +expression: embeddings_batch +--- +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0292969 + - 1.609375 + - -1.0048828 + - 0.43676758 + - -0.8769531 + - 0.79785156 + - -0.27612305 + - 0.4963379 + - -0.82128906 + - 0.16906738 + - -0.734375 + - -0.34936523 + - 0.03515625 + - 0.34375 + - 1.3769531 + - 1.5234375 + - -1.875 + - -1.4082031 + - 1.6289063 + - -1.1650391 + - 0.65234375 + - 1.796875 + - 1.984375 + - -0.4350586 + - 1.4003906 + - -0.34985352 + - -2.5253906 + - 2.5351563 + - 0.32348633 + - 2.3007813 + - 1.5195313 + - -0.28295898 + - 1.1650391 + - -3.4472656 + - 0.07421875 + - -5.28125 + - -0.8310547 + - 0.7524414 + - -2.4257813 + - -0.91845703 + - -0.9814453 + - -1.7285156 + - 2.0761719 + - 0.23657227 + - -3.9003906 + - -1.4052734 + - 0.8310547 + - 3.9140625 + - -0.43408203 + - -3.0429688 + - -100.5625 + - -3.0703125 + - -0.93652344 + - 2.71875 + - -1.0527344 + - -1.3789063 + - -7.3671875 + - -2.3789063 + - 0.58251953 + - 0.8388672 + - 0.13110352 + - 2.4003906 + - 0.07421875 + - -2.5488281 + - 0.5126953 + - 2.0644531 + - -1.5556641 + - -4.6679688 + - 0.055236816 + - -2.9921875 + - -0.9038086 + - -1.2294922 + - -0.3984375 + - 2.9863281 + - 3.1328125 + - -0.13867188 + - -0.36523438 + - -0.63916016 + - -0.6064453 + - -1.5869141 + - -0.3425293 + - -2.0234375 + - 0.5336914 + - -1.8027344 + - -0.15185547 + - 2.2578125 + - 0.86376953 + - -1.234375 + - 5.9453125 + - 2.7089844 + - -19.703125 + - -2.8125 + - -2.7832031 + - -4.4375 + - 0.35595703 + - 1.5751953 + - -4.09375 + - 1.6884766 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.0055770874 + - -2.7949219 + - 0.08062744 + - -1.3369141 + - -1.5839844 + - -0.056915283 + - 0.04058838 + - 0.4296875 + - 0.47753906 + - -1.5585938 + - -0.055511475 + - 3.03125 + - 2.8515625 + - 0.70947266 + - -0.18884277 + - 0.29467773 + - 2.2421875 + - 0.59472656 + - 0.15393066 + - -2.4863281 + - -2.1992188 + - -0.27172852 + - 2.40625 + - -0.73095703 + - 0.32299805 + - 1.59375 + - 2.3808594 + - 0.17297363 + - -3.2519531 + - 1.1630859 + - 1.234375 + - 2.40625 + - -0.3088379 + - 0.78564453 + - -1.2050781 + - -1.4824219 + - 1.5166016 + - -0.4206543 + - 1.3535156 + - -2.7734375 + - 1.1757813 + - -2.8027344 + - -1.7998047 + - -0.9379883 + - -2.5703125 + - 4.5820313 + - 0.78564453 + - -1.9257813 + - -1.0478516 + - 0.03515625 + - 0.5151367 + - -2.7832031 + - 0.90722656 + - -0.5102539 + - -3.0390625 + - -3.1289063 + - -1.2509766 + - -2.6191406 + - -0.5546875 + - -1.1376953 + - 0.51416016 + - 1.3994141 + - 3.3613281 + - -1.1591797 + - -0.7583008 + - -0.46289063 + - -2.6386719 + - -1.9306641 + - -0.43896484 + - -2.9863281 + - -0.09875488 + - 0.25195313 + - -1.3115234 + - 2.09375 + - -4.265625 + - -2.2519531 + - 1.7910156 + - 0.8022461 + - -1.8603516 + - -1.8544922 + - 0.13891602 + - 5.1054688 + - -3.4863281 + - -0.85253906 + - -1.1806641 + - 0.07336426 + - -1.9082031 + - -3.7753906 + - -0.5541992 + - 0.640625 + - -2.2460938 + - 1.4951172 + - 3.6328125 + - -2.1640625 + - -1.4921875 + - 0.13476563 + - 0.44189453 + - -2.359375 + - 1.9189453 + - 0.7114258 + - 7.9375 + - 3.2929688 + - 4.2617188 + - -2.8378906 + - -0.3474121 + - -2.2304688 + - -2.0644531 + - -0.7504883 + - -2.9101563 + - -0.859375 + - 0.8330078 + - 3.9570313 + - -0.0036258698 + - -2.5214844 + - 3.0898438 + - -0.70458984 + - -3.8535156 + - 0.6298828 + - -0.32739258 + - 3.1289063 + - -0.08618164 + - -1.21875 + - 0.09649658 + - 0.7675781 + - 0.39672852 + - -3.1464844 + - 0.7763672 + - -0.7680664 + - -1.0068359 + - -0.88671875 + - -0.2064209 + - 1.5820313 + - 0.7441406 + - 2.3671875 + - 2.8554688 + - 1.6601563 + - 6.0390625 + - -0.35351563 + - -3.4589844 + - 0.23046875 + - -2.2324219 + - -1.7626953 + - 3.2714844 + - 2.5566406 + - -0.61572266 + - 0.20751953 + - 1.2539063 + - 0.4423828 + - -2.1269531 + - 0.5131836 + - 0.62353516 + - -0.6958008 + - -0.33032227 + - -2.28125 + - 0.032348633 + - 0.3408203 + - 1.4726563 + - 1.8486328 + - 1.890625 + - 1.8886719 + - -0.37426758 + - 2.4140625 + - -2.3027344 + - 3.9121094 + - 0.85546875 + - -4.6953125 + - 0.32983398 + - 0.8154297 + - 3.2304688 + - 0.8305664 + - -0.42773438 + - -1.1630859 + - -3.9277344 + - 1.3681641 + - 0.18469238 + - 1.0292969 + - -2.1328125 + - -2.6738281 + - 1.3876953 + - 0.1361084 + - 0.99902344 + - -0.77783203 + - -0.064697266 + - 1.828125 + - 0.65771484 + - 0.03390503 + - 1.7265625 + - 1.2138672 + - 10.0703125 + - 0.064697266 + - 0.6723633 + - -0.4819336 + - 1.8457031 + - -1.4023438 + - 2.2148438 + - -0.5493164 + - -0.07574463 + - -0.20422363 + - 2.7597656 + - 3.3242188 + - -1.6425781 + - 1.5322266 + - 2.4785156 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6650391 + - -0.10546875 + - -0.8964844 + - 0.072509766 + - 1.1875 + - -2.4375 + - 0.08258057 + - -0.14453125 + - -3.1816406 + - 1.2851563 + - 1.8339844 + - 1.2412109 + - -3.8457031 + - 2.5703125 + - -1.4052734 + - -0.78564453 + - -1.3427734 + - -1.5039063 + - 2.3652344 + - -3.5820313 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7709961 + - 2.34375 + - -0.11657715 + - 2.7832031 + - -0.49926758 + - 0.08984375 + - 0.105285645 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5488281 + - 1.9433594 + - 1.1533203 + - -0.21252441 + - 2.6777344 + - -5.0664063 + - -0.8847656 + - 2.1464844 + - -1.265625 + - 0.3330078 + - 0.5102539 + - -2.1738281 + - -0.7841797 + - -4.1015625 + - -1.609375 + - -1.6220703 + - -1.4111328 + - -1.4921875 + - 1.7324219 + - 4.359375 + - -1.3857422 + - 2.9726563 + - -2.90625 + - 6.1757813 + - 1.6982422 + - 1.4638672 + - -2.6894531 + - 0.7714844 + - -1.5244141 + - -2.125 + - 3.5058594 + - -0.3996582 + - 3.5996094 + - -1.4482422 + - 0.3935547 + - 0.7109375 + - 2.4746094 + - -1.3896484 + - -1.2880859 + - -1.9433594 + - -0.859375 + - -0.703125 + - 1.8554688 + - 1.8632813 + - -4.2226563 + - -8.125 + - -2.1074219 + - 0.453125 + - -0.09375 + - -2.6660156 + - -0.95751953 + - 0.047698975 + - -0.29663086 + - 2.6464844 + - 2.1074219 + - -2.1464844 + - 1.5498047 + - -2.3339844 + - 1.5898438 + - -0.5654297 + - -4.3476563 + - -0.1673584 + - 1.7988281 + - 2.0488281 + - -2.1660156 + - -14.390625 + - -0.12243652 + - -2.2089844 + - -1.6064453 + - 3.1171875 + - -1.1591797 + - 1.4433594 + - -0.19689941 + - -3.6835938 + - -1.4238281 + - -3.6152344 + - 5.109375 + - -0.5004883 + - -0.4736328 + - 2.7988281 + - -0.32592773 + - -0.75927734 + - 1.0458984 + - 0.1619873 + - -2.0371094 + - 2.2246094 + - -1.4375 + - -1.921875 + - -1.7138672 + - -3.8613281 + - 0.85009766 + - -0.37939453 + - -1.8525391 + - 0.5839844 + - -1.9013672 + - 0.7519531 + - 1.6748047 + - -1.3095703 + - -1.5087891 + - -0.6269531 + - -1.6445313 + - -2.2011719 + - -0.9091797 + - 0.06640625 + - 2.7050781 + - -2.1679688 + - -3.5800781 + - -0.009483337 + - 1.5244141 + - -0.58935547 + - -2.0390625 + - -0.47583008 + - 5.609375 + - 4.625 + - -0.033477783 + - 0.07110596 + - 3.2851563 + - -0.44482422 + - -2.8945313 + - -1.7675781 + - 2.7714844 + - -0.9301758 + - -0.84521484 + - -0.9785156 + - 0.27197266 + - 0.33666992 + - -2.3515625 + - 4.9375 + - 2.3125 + - 0.29882813 + - 1.015625 + - 0.35131836 + - 0.43896484 + - 0.8076172 + - -0.91064453 + - -0.6064453 + - 3.8203125 + - 0.5683594 + - 0.55908203 + - 0.9736328 + - -1.9970703 + - -0.3269043 + - 1.2158203 + - -6.0039063 + - 0.13977051 + - 3.71875 + - -0.5605469 + - 0.46313477 + - 1.5683594 + - -0.7011719 + - -0.46362305 + - -2.6328125 + - -1.3330078 + - 2.4570313 + - -2.0488281 + - -2.9238281 + - 5.375 + - 0.21679688 + - -5.9726563 + - 2.0390625 + - 0.055786133 + - 1.3359375 + - 3.8378906 + - -0.6225586 + - -0.6113281 + - -1.5830078 + - 2.8535156 + - 3.6679688 + - -2.5703125 + - -1.5019531 + - 0.69091797 + - -2.0332031 + - 1.6210938 + - -0.3408203 + - -0.5522461 + - -1.4355469 + - -0.5078125 + - 0.5957031 + - 1.5869141 + - 3.6757813 + - -0.018692017 + - 0.55566406 + - 1.4609375 + - 0.20336914 + - -1.3769531 + - 1.6767578 + - 2.1894531 + - 0.85253906 + - 0.4519043 + - -0.00390625 + - -1.8789063 + - 3.5800781 + - 0.16516113 + - -4.5117188 + - -0.12890625 + - -0.3557129 + - -1.6269531 + - -1.9589844 + - -1.0107422 + - 3.1054688 + - -0.8457031 + - -4.8476563 + - -2.3652344 + - -1.3818359 + - 0.20703125 + - 1.9863281 + - 1.4814453 + - 0.6333008 + - 1.9667969 + - -17.671875 + - -1.453125 + - -1.0478516 + - -2.0019531 + - -1.3818359 + - 0.61279297 + - 0.20227051 + - 0.0055770874 + - 2.3476563 + - -3.4804688 + - -1.0546875 + - -2.2363281 + - 1.2685547 + - -1.0302734 + - 0.87597656 + - -2.4453125 + - -1.4394531 + - -2.3496094 + - -2.2890625 + - -0.8925781 + - -1.9296875 + - 0.9921875 + - 0.2939453 + - -1.2851563 + - 1.1201172 + - 0.578125 + - 0.30908203 + - 0.7246094 + - -3.2089844 + - 0.65478516 + - 2.5683594 + - -3.2148438 + - -2.9394531 + - 1.6816406 + - 1.6416016 + - -2.3417969 + - -3.5 + - -1.1904297 + - 1.4462891 + - -3.1875 + - -1.890625 + - -0.1015625 + - -1.9082031 + - 1.4306641 + - 5.1757813 + - 3.9101563 + - 1.0263672 + - 3.2402344 + - -0.8222656 + - -0.68603516 + - 0.055786133 + - -2.2578125 + - -2.3261719 + - 0.15234375 + - -3.6972656 + - 0.5625 + - -4.3789063 + - 0.9506836 + - 2.5957031 + - -1.7587891 + - -1.9824219 + - 1.9609375 + - -0.60595703 + - -0.2524414 + - -1.5576172 + - 1.8701172 + - -2.1386719 + - 0.00390625 + - 1.4619141 + - 1.8613281 + - 0.00027894974 + - 0.44140625 + - -1.6054688 + - 3.4902344 + - 0.036834717 + - 1.4169922 + - 0.7788086 + - -0.12384033 + - 1.7070313 + - -0.52197266 + - -3.2265625 + - -2.6875 + - 0.61572266 + - 2.6113281 + - -2.8164063 + - -0.83251953 + - -0.25439453 + - 0.037384033 + - -2.2226563 + - -2.5703125 + - -0.08013916 + - 2.7851563 + - 4.390625 + - -1.0810547 + - 0.59375 + - -4.6757813 + - 7.9140625 + - -3.1503906 + - 0.73339844 + - 3.3554688 + - -1.6220703 + - -2.59375 + - 0.984375 + - -1.6298828 + - -0.5546875 + - 2.6933594 + - 3.8125 + - -0.45922852 + - 1.4638672 + - 1.0556641 + - 1.6621094 + - 3.1113281 + - -0.55126953 + - 2.4003906 + - 1.8222656 + - -2.0507813 + - 0.22314453 + - 0.98535156 + - -0.5253906 + - -1.0029297 + - 0.6152344 + - 0.6113281 + - -0.71191406 + - -2.9492188 + - -0.19580078 + - -0.98828125 + - -0.1899414 + - 0.044067383 + - 1.5214844 + - 1.734375 + - 1.0146484 + - -1.4179688 + - 7.7578125 + - 3.3652344 + - 7.0976563 + - 1.4726563 + - -5.7226563 + - -5.890625 + - -0.3828125 + - -1.3154297 + - -0.31958008 + - -1.5888672 + - 0.1907959 + - -0.23181152 + - -1.046875 + - 1.6132813 + - -1.9482422 + - 2.6699219 + - 3.2246094 + - 3.6679688 + - -0.9091797 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09313965 + - -3.0195313 + - 1.8251953 + - 0.71484375 + - 0.77197266 + - -2.15625 + - 1.1113281 + - 3 + - 2.96875 + - -0.28686523 + - -0.0496521 + - 0.5957031 + - 4.7929688 + - 1.4414063 + - 3.0625 + - -5.0664063 + - -0.17687988 + - -1.8623047 + - -1.8876953 + - -3.6367188 + - 0.9038086 + - -0.4519043 + - 1.453125 + - -0.27124023 + - -1.8652344 + - 2.1582031 + - 0.65771484 + - -3.4160156 + - -5.7304688 + - -0.22070313 + - -3.03125 + - -0.9975586 + - 1.8378906 + - -1.4101563 + - 1.4414063 + - 3.9804688 + - -1.9648438 + - -1.5292969 + - -1.8769531 + - 2.2949219 + - -0.23254395 + - -0.5600586 + - 1.2783203 + - 0.60791016 + - 1.453125 + - 0.8408203 + - -0.73535156 + - -0.99658203 + - -3.1132813 + - 2.9472656 + - -0.5136719 + - 0.32617188 + - -2.6640625 + - -1.5917969 + - 1.0527344 + - 0.119384766 + - -1.2695313 + - -1.6621094 + - 2.1621094 + - -1.7226563 + - -1.7275391 + - -0.45898438 + - -0.26733398 + - 2.6152344 + - 0.4230957 + - -1.1201172 + - -0.47021484 + - 4.1289063 + - 1.4775391 + - -0.26342773 + - 2.9726563 + - -2.859375 + - 2.3222656 + - 0.52197266 + - -1.1865234 + - -3.2050781 + - -1.1943359 + - 2.2285156 + - -2.5 + - 5.8789063 + - -0.001953125 + - 2.4101563 + - -0.78027344 + - -1.4560547 + - 0.8540039 + - 2.6914063 + - 0.49853516 + - -1.1474609 + - -0.55566406 + - 0.46972656 + - 1.1582031 + - -3.6191406 + - 2.3203125 + - -4.75 + - -4.75 + - -3.7871094 + - 1.0068359 + - 3.9179688 + - 1.4345703 + - -1.3925781 + - 0.171875 + - 2.4257813 + - 1.21875 + - -2.6074219 + - 1.1171875 + - -1.5332031 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.23010254 + - 2.109375 + - 1.9853516 + - -0.9951172 + - 2.140625 + - -0.2705078 + - -2.8164063 + - -0.19946289 + - 4.5820313 + - -2.5664063 + - -0.3581543 + - 2.8847656 + - -1.4316406 + - 0.06585693 + - 1.0810547 + - -1.1972656 + - -9.3359375 + - 1.4482422 + - -47.25 + - -1.2919922 + - -0.6015625 + - -2.0625 + - -3.9179688 + - -0.47729492 + - 0.296875 + - 1.0654297 + - 1.6640625 + - 1.0595703 + - 0.18188477 + - -1.796875 + - 4.6875 + - -0.5253906 + - -2.0019531 + - 1.5869141 + - 1.1044922 + - -0.7211914 + - 16.984375 + - 0.42285156 + - -0.9765625 + - -1.2626953 + - -0.9379883 + - -0.57958984 + - 0.4038086 + - 2.8007813 + - 0.87353516 + - -1.625 + - -0.4267578 + - -2.6699219 + - -0.9609375 + - -2.4199219 + - 0.1784668 + - 0.49438477 + - -0.88183594 + - 2.4472656 + - 1.0351563 + - 0.8046875 + - 1.4453125 + - 0.5073242 + - 3.921875 + - -0.3798828 + - 1.046875 + - 0.2524414 + - -3.1367188 + - 2.5292969 + - 0.12658691 + - -1.2939453 + - -0.52246094 + - -2.9902344 + - 0.3515625 + - -1.6132813 + - -0.08203125 + - -0.66015625 + - -0.059143066 + - 0.21252441 + - 1.9482422 + - -4.1484375 + - -2.4863281 + - 0.35864258 + - 0.18481445 + - -1.0009766 + - -2.59375 + - 1.2685547 + - 6.6015625 + - -0.65283203 + - -0.7451172 + - 4.7226563 + - -2.2519531 + - 2.3105469 + - -2.0625 + - -0.16796875 + - 0.17907715 + - -2.3144531 + - 2.8964844 + - -4.5703125 + - 3.5996094 + - -1.0625 + - 5.2304688 + - 0.46972656 + - 0.31811523 + - -3.0722656 + - 1.9150391 + - 0.18713379 + - 1.9267578 + - 2.9316406 + - -1.0644531 + - -0.28515625 + - 0.26489258 + - -0.71972656 + - 2.5703125 + - -1.4707031 + - -1.5351563 + - -2.7070313 + - 1.2441406 + - -0.47607422 + - -0.3474121 + - -0.8457031 + - -3.4179688 + - -1.0927734 + - -2.1328125 + - -5.7382813 + - -1.1689453 + - 0.2512207 + - 1.3505859 + - 3.4101563 + - 3.4472656 + - 0.40112305 + - 0.56689453 + - 0.064697266 + - 0.7753906 + - 0.9980469 + - -1.6445313 + - 2.921875 + - 0.97314453 + - 1.3320313 + - -2.6816406 + - 2.3125 + - -2.0449219 + - 2.2089844 + - 1.6376953 + - 0.4819336 + - -1.6738281 + - -1.7792969 + - 0.17663574 + - 0.31298828 + - 4.0273438 + - -0.7270508 + - 3.1933594 + - 2.3964844 + - 2.65625 + - 1.4794922 + - -0.0524292 + - 1.9814453 + - 0.39282227 + - 0.23828125 + - 2.7226563 + - -0.80126953 + - -2.8105469 + - 0.1665039 + - -2.1660156 + - -2.0292969 + - -2.4453125 + - -3.0078125 + - 1.9033203 + - 2.8339844 + - 2.7753906 + - -2.4765625 + - 0.8408203 + - -3.203125 + - 2.265625 + - -1.7246094 + - 4.75 + - 4.6875 + - 0.59472656 + - -0.53466797 + - 1.7792969 + - 0.2956543 + - 2.3515625 + - -4.1757813 + - 3.9179688 + - -1.46875 + - -4.9453125 + - -1.9033203 + - -1.0390625 + - -0.34399414 + - -2.9414063 + - -15.546875 + - 2.0390625 + - -1.2695313 + - 4.1445313 + - 1.2197266 + - 3.3535156 + - 1.3818359 + - 1.5996094 + - -0.45141602 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4921875 + - 2.0800781 + - -3.2675781 + - 0.96191406 + - -0.0072517395 + - -0.21252441 + - 1.2314453 + - 2.2519531 + - -1.0253906 + - 0.35327148 + - -0.015625 + - 1.5966797 + - -4.4726563 + - 0.20471191 + - -1.7744141 + - -16.671875 + - 0.61865234 + - 0.1204834 + - 2.9863281 + - -4.984375 + - -1.5673828 + - 0.2685547 + - 1.1904297 + - -5.015625 + - -2.6191406 + - -2.6132813 + - 3.6992188 + - -0.53271484 + - -0.45141602 + - -2.3652344 + - 0.70166016 + - -6.203125 + - -1.1904297 + - -0.35180664 + - 0.74072266 + - 1.1875 + - -0.9941406 + - -0.24536133 + - -2.4628906 + - -0.63623047 + - 2.921875 + - -3.5 + - -0.0418396 + - -0.52783203 + - 1.5361328 + - 3.4628906 + - -1.8183594 + - 0.32592773 + - -1.4794922 + - -0.74853516 + - 2.2285156 + - -0.75097656 + - 0.43237305 + - -18.859375 + - -0.33251953 + - -1.9013672 + - 2.4355469 + - -4.1875 + - 2.4121094 + - 0.5698242 + - 1.2294922 + - 1.6337891 + - -0.6972656 + - 1.4189453 + - -1.1513672 + - 2.2636719 + - -1.9921875 + - 0.50927734 + - -0.11621094 + - 0.58740234 + - 0.045196533 + - 1.4101563 + - -4.8007813 + - -1.421875 + - 2.3144531 + - -2.7324219 + - -0.19055176 + - 2.9023438 + - -1.4501953 + - 3.1484375 + - -2.5957031 + - -1.5234375 + - 2.0722656 + - 1.359375 + - 3.15625 + - -2.1503906 + - -1.5009766 + - -1.6464844 + - -0.4116211 + - -0.60595703 + - -1.6875 + - 1.4931641 + - 1.8671875 + - 3.7695313 + - 1.6650391 + - 2.296875 + - 3.6601563 + - -2.0839844 + - 0.4116211 + - -2.2988281 + - -1.4267578 + - -6.0625 + - 1.0380859 + - 2.4628906 + - 0.46191406 + - 0.2548828 + - 0.19689941 + - -2.0976563 + - 0.6020508 + - 0.14929199 + - 8.09375 + - -0.37939453 + - -1.6357422 + - -1.1328125 + - 1.1572266 + - 1.5166016 + - 1.8105469 + - -1.7607422 + - -1.9306641 + - 0.43115234 + - 2.6933594 + - 0.68603516 + - 3.0800781 + - -3.4238281 + - -4.5898438 + - 0.8173828 + - 0.81689453 + - 1.5869141 + - 0.9785156 + - 0.3359375 + - -0.2454834 + - 4.140625 + - 0.45922852 + - 0.1227417 + - -2.3183594 + - 1.6416016 + - -0.86376953 + - 1.2724609 + - -3.3242188 + - -0.48486328 + - 1.7539063 + - -2.6875 + - 1.2851563 + - 3.9628906 + - 2.2578125 + - -0.9003906 + - -0.890625 + - 1.5214844 + - 1.3681641 + - 0.6738281 + - 2.875 + - 4.9257813 + - -0.41552734 + - 1.0478516 + - -0.67822266 + - 0.17907715 + - 0.7519531 + - 2.2324219 + - 1.2285156 + - 1.1103516 + - 0.13671875 + - -4.5898438 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.5 + - -3.109375 + - -0.7890625 + - 2.46875 + - 6.3671875 + - 1.0234375 + - -1.5839844 + - 1.7226563 + - 2.2578125 + - -0.53271484 + - -1.3720703 + - 1.2597656 + - -5.4179688 + - 1.2451172 + - 2.6855469 + - 5.4140625 + - -0.4560547 + - 0.5136719 + - -1.0898438 + - -0.8725586 + - -2.5917969 + - -3.6132813 + - 3.6015625 + - -0.8730469 + - 0.97802734 + - 5.375 + - -2.1015625 + - -1.2539063 + - -2.5039063 + - -0.38916016 + - -0.047546387 + - 0.2939453 + - -1.1806641 + - -0.13952637 + - 3.3027344 + - -0.9951172 + - 0.3881836 + - 1.9726563 + - 0.578125 + - -0.53564453 + - -0.30908203 + - 3.3164063 + - -0.27539063 + - 0.8676758 + - 1.8466797 + - 2.5957031 + - 0.625 + - -0.63427734 + - -3.7246094 + - -3.3027344 + - 0.061645508 + - 3.0683594 + - -0.9375 + - 2.4726563 + - -0.6616211 + - 1.5009766 + - -0.15673828 + - -3.625 + - 0.9790039 + - 0.10180664 + - -0.1430664 + - -1.1445313 + - -2.4355469 + - 6.703125 + - -2.4082031 + - 0.82666016 + - -1.2753906 + - 2.6503906 + - 0.7402344 + - -0.68408203 + - -2.0527344 + - 0.01701355 + - -3.9707031 + - 0.9741211 + - 0.3684082 + - 1.9746094 + - 1.2275391 + - 11.5703125 + - -1.9726563 + - -1.2568359 + - 1.5556641 + - 0.38720703 + - 6.0625 + - 4.03125 + - 0.3269043 + - -1.5058594 + - -0.7089844 + - 0.52783203 + - 8.3125 + - 0.38867188 + - -0.64453125 + - 0.23876953 + - -1.2001953 + - 0.69921875 + - -3.109375 + - -2.7402344 + - -2.3964844 + - -3.6738281 + - 1.8652344 + - -3.6816406 + - -1.0703125 + - 1.0126953 + - 0.83251953 + - -4.9414063 + - -0.2487793 + - 0.36669922 + - 1.9873047 + - -0.4453125 + - -1.421875 + - 1.3291016 + - -1.1318359 + - -1.125 + - 2.25 + - 0.49023438 + - 1.9892578 + - 4.171875 + - -1.8466797 + - 1.5117188 + - 0.41845703 + - -4.1914063 + - -1.8828125 + - -0.3010254 + - -1.7539063 + - 3.1015625 + - -1.0146484 + - 0.4970703 + - 3.1601563 + - 0.080078125 + - 3.5722656 + - -0.74072266 + - 3.1738281 + - -1.8457031 + - 3.15625 + - -0.88671875 + - -3.90625 + - -2.7324219 + - -3.7539063 + - 1.6591797 + - 1.1328125 + - -0.9873047 + - -0.70703125 + - -0.78564453 + - -0.30078125 + - -2.2480469 + - -1.0400391 + - 1.1386719 + - 1.0878906 + - -0.74658203 + - 2.7128906 + - -9.265625 + - 3.6757813 + - 3.4140625 + - -0.7910156 + - 0.8730469 + - -2.4628906 + - -0.8623047 + - 0.82128906 + - -0.09765625 + - 1.9785156 + - 0.9145508 + - -0.8256836 + - 3.8378906 + - 0.45043945 + - -1.5556641 + - -2.703125 + - -0.60546875 + - 1.1132813 + - -0.43652344 + - -2.0175781 + - -0.31958008 + - -0.07867432 + - -1.5126953 + - 3.2539063 + - 0.37036133 + - -6.2109375 + - 1.9072266 + - 4.3515625 + - -0.01171875 + - 0.04852295 + - 0.296875 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.5605469 + - -0.43188477 + - -0.09667969 + - 1.4482422 + - 2.7324219 + - -0.17468262 + - -3.9589844 + - 10.7734375 + - 2.2988281 + - -3.1738281 + - -71 + - 0.8598633 + - -1.671875 + - -0.8847656 + - 2.8320313 + - 4.7929688 + - 1.6953125 + - 0.8984375 + - -0.09063721 + - -2.2050781 + - -2.765625 + - 1.6904297 + - -0.7163086 + - 2.3457031 + - 0.35083008 + - -5.0625 + - -2.6972656 + - -3.0078125 + - -0.32592773 + - 1.7851563 + - 2.4550781 + - 0.5205078 + - 1.1357422 + - -0.9584961 + - -1.6064453 + - -2.7480469 + - -1.6689453 + - -3.2753906 + - 1.0966797 + - -1.7207031 + - 1.1298828 + - -4.6367188 + - 0.08984375 + - -1.109375 + - -3.8867188 + - 1.0859375 + - 1.0166016 + - -0.043792725 + - 1.3095703 + - -2.6269531 + - -0.30297852 + - -1.3212891 + - 4.2148438 + - 1.796875 + - 1.2851563 + - -2.6074219 + - 2.0527344 + - 1.4707031 + - 2.9453125 + - 0.33374023 + - 1.2978516 + - -0.5600586 + - 1.0791016 + - 9.7578125 + - -4.8945313 + - 1.8242188 + - 0.14147949 + - 0.9223633 + - 0.3815918 + - -2.0175781 + - 0.9194336 + - 2.046875 + - 0.3852539 + - -3.15625 + - -0.7392578 + - 0.11602783 + - -4.640625 + - 0.7426758 + - -0.93603516 + - 0.4621582 + - -2.9628906 + - 2.0625 + - 2.890625 + - 0.58935547 + - 1.4394531 + - 0.2878418 + - -2.2128906 + - -0.7866211 + - 0.54345703 + - 1.0351563 + - -0.11187744 + - 0.4152832 + - -1.7988281 + - -1.1962891 + - 0.7685547 + - -2.7597656 + - 2.4375 + - 3.6503906 + - -0.6088867 + - -1.0214844 + - -1.2431641 + - 2.0878906 + - -0.15905762 + - 2.8632813 + - 2.4941406 + - 7.8046875 + - 1.8417969 + - 3.0839844 + - -1.7001953 + - 0.81103516 + - 1.5585938 + - -0.31445313 + - 0.3947754 + - 1.9375 + - -0.9941406 + - 0.13220215 + - -0.83740234 + - -2.9550781 + - 0.67822266 + - -1.1914063 + - 5.3007813 + - 16.75 + - 1.0976563 + - -0.65185547 + - -3.8984375 + - 1.375 + - -0.75 + - 1.6728516 + - 2.3945313 + - -0.31225586 + - -0.9316406 + - 3.2753906 + - 0.94970703 + - 1.359375 + - -1.875 + - 2.1777344 + - 2.2441406 + - -4.0898438 + - 1.3691406 + - 0.30395508 + - 2.1152344 + - 0.1126709 + - -1.7089844 + - 1.3037109 + - -0.82666016 + - 3.9414063 + - 1.4775391 + - -1.4306641 + - 3.2910156 + - 1.3632813 + - -1.796875 + - -3.2226563 + - 1.6689453 + - -0.072509766 + - -2.9960938 + - 0.76416016 + - 0.1616211 + - -2.6503906 + - 0.085510254 + - 1.9941406 + - 0.55908203 + - 0.34423828 + - 3.0351563 + - 1.4033203 + - -0.54785156 + - 0.37817383 + - 3.5644531 + - -0.7607422 + - 2.7578125 + - 0.76660156 + - 3.2304688 + - 2.390625 + - -2.2675781 + - -1.4804688 + - 2.2480469 + - 6.3867188 + - -2.7519531 + - -0.3305664 + - 3.0195313 + - -4.2539063 + - 0.103515625 + - -0.5175781 + - -2.2578125 + - 0.27441406 + - 0.76660156 + - 2.3105469 + - 1.1015625 + - 0.081726074 + - -0.16015625 + - -0.0078125 + - -1.9619141 + - -0.63720703 + - -2.21875 + - 0.4033203 + - 1.1953125 + - 0.39013672 + - -2.21875 + - -1.65625 + - -2.0566406 + - -1.6669922 + - -10.375 + - 0.6894531 + - 0.6230469 + - -0.0446167 + - -0.6328125 + - -1.4785156 + - -3.3125 + - 1.4169922 + - -0.5205078 + - 1.609375 + - 3.4453125 + - 1.1767578 + - 2.6171875 + - 5.765625 + - -1.453125 + - 1.8847656 + - -3.3789063 + - -3.6875 + - -2.703125 + - 1.6894531 + - 0.23828125 + - -2.6445313 + - 2.9140625 + - -2.3457031 + - -0.65478516 + - 0.69970703 + - 1.2314453 + - 5.4804688 + - -0.18164063 + - 0.48754883 + - 3.3339844 + - 4.1132813 + - -3.0664063 + - -5.390625 + - -0.29589844 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.093444824 + - -1.4394531 + - 2.6972656 + - 2.3828125 + - -0.29467773 + - -1.8320313 + - -1.3818359 + - 2.1191406 + - 0.82128906 + - 3.8769531 + - 1.8378906 + - -0.46313477 + - 3.375 + - 1.1123047 + - 1.0087891 + - 2.1347656 + - -3.4277344 + - -2.8945313 + - -2.65625 + - 2.4277344 + - 2.7734375 + - -1.9775391 + - -3.71875 + - -3.6953125 + - -1.5332031 + - -4.8945313 + - 0.98828125 + - -1.0302734 + - 2.1640625 + - 0.5756836 + - -2.96875 + - -4.15625 + - -0.06274414 + - 0.03515625 + - 3.4160156 + - 0.92285156 + - -0.64697266 + - -1.0117188 + - 20.421875 + - 1.1201172 + - 0.58251953 + - 2.1933594 + - 8.015625 + - -0.35546875 + - -0.2253418 + - 0.3088379 + - 0.7392578 + - -3.4335938 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.66845703 + - 0.73535156 + - -0.64697266 + - 0.68310547 + - -2.9316406 + - -2.5644531 + - 5.1523438 + - -0.84277344 + - 0.48046875 + - 3.7089844 + - 0.16040039 + - -3.9765625 + - 1.3769531 + - 2.2441406 + - 0.9951172 + - 0.20532227 + - 0.63134766 + - 0.3720703 + - 3.1738281 + - 0.61279297 + - -4.0507813 + - 0.96191406 + - -0.62353516 + - -0.9472656 + - -1.0126953 + - -4.5390625 + - 5.3164063 + - 2.5136719 + - -6.2109375 + - -1.0478516 + - 1.4082031 + - 2.2832031 + - -1.5019531 + - 1.1425781 + - 1.7949219 + - -2.5058594 + - 3.6738281 + - 0.515625 + - 2.3613281 + - 0.29858398 + - 6.1289063 + - 1.1318359 + - 0.29174805 + - 1.046875 + - -2.0136719 + - -3.8242188 + - 4.546875 + - 3.0429688 + - 2.7207031 + - 0.028457642 + - 0.33691406 + - 0.15515137 + - 2.9394531 + - -3.4550781 + - 0.39282227 + - 0.38305664 + - -4.5078125 + - -1.8945313 + - 1.9765625 + - 2.75 + - -4.6992188 + - -2.0136719 + - -1.1396484 + - -3.2890625 + - -1.2226563 + - -2.7890625 + - 1.3349609 + - 1.0654297 + - 0.18237305 + - -3.5683594 + - -0.7392578 + - 2.5644531 + - 1.5683594 + - -1.3681641 + - -2.8691406 + - 1.3779297 + - -1.5214844 + - -0.83691406 + - -4.0742188 + - -2.375 + - -4.5429688 + - 2.6953125 + - 0.6816406 + - -3.203125 + - -2.5175781 + - -2.1894531 + - 1.2763672 + - 0.5151367 + - -0.6088867 + - 4.1289063 + - -3.0625 + - 0.6694336 + - -0.07446289 + - -1.6347656 + - 4.0546875 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0566406 + - -0.37890625 + - -4.78125 + - -1.0332031 + - 3.9765625 + - 0.3557129 + - 1.2753906 + - -2.8867188 + - 2.3613281 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.89160156 + - 3.6640625 + - 3.5039063 + - 1.4873047 + - 2.4082031 + - -0.64160156 + - 0.66015625 + - -2.4589844 + - -3.3144531 + - -2.1328125 + - 2.8867188 + - 0.7421875 + - -1.4570313 + - 1.7060547 + - 1.0664063 + - -0.52685547 + - 2.5371094 + - -1.890625 + - -1.6679688 + - 1.2255859 + - -0.51953125 + - -1.5722656 + - 1.5800781 + - 0.42919922 + - 0.4934082 + - 3.7558594 + - 2.6347656 + - 0.0892334 + - -1.2910156 + - -5.2148438 + - 3.09375 + - 1.4492188 + - -2.1113281 + - 2.4453125 + - 1.5205078 + - -3.7050781 + - 2.1386719 + - 1.9863281 + - -1.7480469 + - 2.6875 + - -2.9941406 + - -1.9804688 + - -1.8417969 + - 0.51708984 + - 1.8808594 + - 0.34106445 + - -1.5683594 + - -5.5898438 + - -0.23840332 + - -1.6435547 + - -0.86816406 + - -1.3125 + - -5.1445313 + - 3.1347656 + - 0.6113281 + - -2.2421875 + - 1.0253906 + - -1.7421875 + - 3.6621094 + - -2.1660156 + - 2.3730469 + - -1.4462891 + - 0.33862305 + - -0.83984375 + - -0.49267578 + - 1.8681641 + - -0.2175293 + - -0.25854492 + - -3.2089844 + - 0.10430908 + - -1.5869141 + - 1.0126953 + - 1.2773438 + - 3.75 + - -1.6982422 + - -2.1621094 + - -0.034454346 + - 3.90625 + - 2.0703125 + - -1.0029297 + - -3.7441406 + - -1.1357422 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.11102295 + - -1.7871094 + - 4.3984375 + - 1.2919922 + - 1.1982422 + - 0.79785156 + - -1.3037109 + - 0.2175293 + - -0.7133789 + - 2.1738281 + - -5.390625 + - -2.6777344 + - 5.7382813 + - -4.1210938 + - 3.6914063 + - -1.0966797 + - 0.49926758 + - 0.63720703 + - 3.8164063 + - 0.39770508 + - -1.3974609 + - -0.011154175 + - 0.9560547 + - 2.171875 + - -4.8320313 + - 1.7783203 + - 0.55126953 + - -3.1738281 + - -1.4326172 + - -0.23596191 + - -1.140625 + - -0.22290039 + - -1.1679688 + - 0.34204102 + - 1.5605469 + - -0.85595703 + - -2.0996094 + - -3.8925781 + - 0.55126953 + - -1.4453125 + - -1.6191406 + - 0.23510742 + - 2.6875 + - 0.5488281 + - 2.5390625 + - -0.30566406 + - -0.31054688 + - -1.75 + - 3.4765625 + - 2.8691406 + - -1.8105469 + - -0.67822266 + - -3.6894531 + - -2.2324219 + - 1.7548828 + - 0.15344238 + - -2.2128906 + - -2.3222656 + - -0.578125 + - 1.2382813 + - -0.4765625 + - 0.88134766 + - 2.4453125 + - -0.92285156 + - -3.0878906 + - -2.65625 + - 0.1439209 + - -2.96875 + - -1.8652344 + - -1.0390625 + - -2.1757813 + - -2.8847656 + - -0.6171875 + - -0.8310547 + - -1.3662109 + - 5.4140625 + - 4.6992188 + - -4.21875 + - -0.35668945 + - -1.2822266 + - 1.4794922 + - -2.3300781 + - -2.2949219 + - 3.5800781 + - -1.3066406 + - -2.5527344 + - 1.4326172 + - 2.2753906 + - -2.203125 + - -3.6445313 + - -0.66503906 + - -1.7519531 + - -1.0224609 + - 0.15905762 + - -0.32299805 + - -0.7036133 + - -1.9609375 + - -1.0732422 + - -1.2900391 + - -0.7626953 + - -2.0644531 + - -2.2519531 + - -0.75390625 + - -0.3725586 + - 3.9863281 + - -2.7480469 + - 3.9023438 + - -1.9814453 + - -0.93847656 + - 6.5117188 + - 0.60546875 + - -0.82666016 + - -1.3544922 + - 0.6323242 + - -2.96875 + - 3.3164063 + - 6.4257813 + - -2.3164063 + - -0.70703125 + - 5.7226563 + - 0.9033203 + - 1.3867188 + - 0.39868164 + - -1.9765625 + - 1.0751953 + - 0.51123047 + - -2.9804688 + - 1.3408203 + - -0.8623047 + - -0.3305664 + - 2.6601563 + - -7.1601563 + - 0.71728516 + - 4.21875 + - -2.4765625 + - -0.79003906 + - -2.1503906 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23156738 + - 1.5947266 + - 2.4082031 + - -0.6894531 + - 1.6523438 + - -2.3300781 + - -2.6777344 + - 2.3339844 + - -0.69189453 + - 0.39379883 + - -2.3339844 + - 3.765625 + - 0.6713867 + - -1.71875 + - -2.4199219 + - -1.2382813 + - -0.22509766 + - 0.57373047 + - -0.34472656 + - 0.5488281 + - 2.0214844 + - -2.5917969 + - -0.09649658 + - -2.7949219 + - 0.71972656 + - 0.95751953 + - 1.1845703 + - -1.2763672 + - -2.2324219 + - -3.1464844 + - 1.2744141 + - 0.5834961 + - 1.15625 + - -0.36157227 + - -2.1542969 + - -2.1152344 + - 1.2978516 + - -3.0253906 + - -2.5078125 + - -1.9648438 + - 3.6992188 + - -3.4804688 + - -1.9482422 + - -0.6015625 + - 2.3535156 + - -1.609375 + - 0.017578125 + - -1.0625 + - -0.9248047 + - -0.30395508 + - -4.1132813 + - 0.8129883 + - 1.6357422 + - 4.8632813 + - -1.6777344 + - 1.4501953 + - -0.2841797 + - 6.375 + - 1.9326172 + - -0.73095703 + - 1.4150391 + - 1.7363281 + - -0.64941406 + - -1.9150391 + - -1.2910156 + - 1.2724609 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3691406 + - -0.04574585 + - -0.054595947 + - 2.40625 + - -0.54248047 + - -0.9785156 + - 1.7080078 + - -1.4541016 + - -2.8515625 + - 0.9140625 + - 0.92041016 + - -3.3164063 + - -0.5415039 + - 1.859375 + - -1.9082031 + - -1.2275391 + - -0.16516113 + - -0.29711914 + - 4.4257813 + - 6.828125 + - -1.8183594 + - -0.18664551 + - -3.7402344 + - -2.1445313 + - 0.515625 + - 1.0849609 + - -2.375 + - 1.8476563 + - -3.6679688 + - -2.8671875 + - -0.51171875 + - -2.3496094 + - -0.9980469 + - -2.3925781 + - -0.021759033 + - 1.8232422 + - 1.421875 + - -0.38916016 + - 1.7294922 + - 2.8515625 + - -0.71875 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8647461 + - -1.6259766 + - -0.9580078 + - 0.50634766 + - 0.05996704 + - -0.2841797 + - -3.6992188 + - -1.28125 + - -1.3017578 + - 1.7587891 + - -0.9296875 + - 0.9707031 + - 0.14562988 + - 2.8203125 + - -0.19946289 + - -1.4619141 + - 8.03125 + - -2.1171875 + - 3.65625 + - -4.03125 + - 3.6367188 + - 4.2148438 + - -4.0703125 + - 1.1347656 + - 1.7832031 + - -0.21923828 + - -1.1455078 + - -0.35864258 + - -0.16906738 + - 1.8251953 + - -1.71875 + - -1.2568359 + - -1.7851563 + - 3.9589844 + - -0.72753906 + - 1.2275391 + - 0.44628906 + - -1.2568359 + - 0.9194336 + - -0.515625 + - -0.5131836 + - -1.1142578 + - 3.3339844 + - 0.8959961 + - -2.1777344 + - 1.6064453 + - -0.6953125 + - -2.7265625 + - 0.44482422 + - -2.1367188 + - -0.85253906 + - 2.6328125 + - 2.1464844 + - 2.1816406 + - -8.9609375 + - 4.40625 + - -0.578125 + - 0.32617188 + - 0.48632813 + - -3.5039063 + - 1.9033203 + - 0.44970703 + - -1.4980469 + - 1.4433594 + - -4.6289063 + - 0.4033203 + - -0.2097168 + - -0.4741211 + - 0.07739258 + - 0.23547363 + - 1.1494141 + - -0.3383789 + - -0.7475586 + - 0.73291016 + - 2.0761719 + - -2.421875 + - 1.4589844 + - -2.5488281 + - 1.5820313 + - 2.3574219 + - 0.77978516 + - 1.0751953 + - 1.9609375 + - -0.33642578 + - 0.08258057 + - -1.2607422 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0185547 + - -4.046875 + - 0.6635742 + - -0.4050293 + - -0.3876953 + - -0.26391602 + - 1.1337891 + - -0.93896484 + - 1.3505859 + - 6.3554688 + - 1.0771484 + - -8.7421875 + - 1.2646484 + - 1.3359375 + - -0.11853027 + - -0.98535156 + - 2.9433594 + - 6.1757813 + - -1.8076172 + - -0.09399414 + - -0.6176758 + - -1.4550781 + - 1.4707031 + - -0.77441406 + - 0.2220459 + - -0.23046875 + - -2.4199219 + - -0.43237305 + - -0.49902344 + - 4.078125 + - -1.9355469 + - -1.4414063 + - 0.12658691 + - 1.7949219 + - 3.6269531 + - 2.203125 + - 1.0576172 + - 0.4970703 + - 2.703125 + - 0.66748047 + - -24.875 + - 1.6738281 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2578125 + - -0.6875 + - 3.0644531 + - -3.7109375 + - 2.6074219 + - -7.5507813 + - -7.9296875 + - 0.8076172 + - -0.953125 + - 2.0195313 + - -1.1660156 + - 0.38110352 + - 4.4414063 + - -0.9458008 + - 1.5400391 + - 1.0097656 + - 2.0351563 + - 1.9921875 + - -2.9023438 + - -2.4785156 + - 3.6640625 + - -2.578125 + - 1.8388672 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31152344 + - -0.0836792 + - 2.3574219 + - 0.6328125 + - -1.6601563 + - 1.71875 + - -1.8515625 + - 0.73095703 + - -0.04421997 + - 0.4597168 + - 0.034576416 + - 3.46875 + - 1.4013672 + - 0.056915283 + - 3.71875 + - 2.7539063 + - 1.515625 + - -1.0654297 + - -1.0966797 + - 1.7587891 + - -1.0693359 + - -2.015625 + - 2.0742188 + - 1.3916016 + - 3.1171875 + - -1.6464844 + - -4.7148438 + - 0.67529297 + - -2.6191406 + - 0.16125488 + - 2.4453125 + - -3.1289063 + - -0.6386719 + - -0.37548828 + - -0.41308594 + - -0.12719727 + - 4.5664063 + - 2.8710938 + - 1.4658203 + - -4.6757813 + - -0.140625 + - 3.0175781 + - 0.5756836 + - -0.4440918 + - 1.3955078 + - 0.27856445 + - -0.7294922 + - -1.0048828 + - 2.1171875 + - -3.4804688 + - -0.22387695 + - 1.3056641 + - -0.33764648 + - 0.57910156 + - 4.0429688 + - -0.57177734 + - 0.72314453 + - -1.4560547 + - -3.84375 + - 0.8569336 + - -1.7167969 + - 0.9316406 + - -1.5507813 + - -2.4707031 + - 0.9458008 + - -3.0820313 + - -8.6328125 + - 0.87353516 + - -3.7128906 + - 0.2854004 + - 2.3984375 + - 1.1992188 + - -3.4628906 + - 0.6176758 + - -3.5625 + - -1.8496094 + - -5.140625 + - -0.8227539 + - 0.005859375 + - -0.0052986145 + - 3.953125 + - -0.890625 + - 1.4560547 + - -3.1464844 + - -2.7402344 + - -1.1064453 + - 0.2019043 + - -0.8989258 + - -3.078125 + - 0.8232422 + - -2.5 + - -0.43896484 + - -0.1282959 + - 1.2353516 + - -0.3251953 + - 0.5102539 + - -3.4140625 + - -1.6064453 + - 0.57910156 + - -5.2148438 + - -2.2265625 + - 2.5878906 + - 5.3945313 + - 5.4765625 + - -0.2890625 + - 0.234375 + - 4.4335938 + - 3.2617188 + - -1.6669922 + - -0.90234375 + - -2.3027344 + - 0.3310547 + - 2.8554688 + - -1.0009766 + - -0.7446289 + - -0.61035156 + - -0.75390625 + - -2.0234375 + - -2.2988281 + - 2.4609375 + - -1.8125 + - 1.2353516 + - -0.21203613 + - -2.3457031 + - -0.0234375 + - 0.78027344 + - 1.3662109 + - -0.5136719 + - -0.7988281 + - 0.52685547 + - 2.2109375 + - -0.9453125 + - -1.5009766 + - -4.6523438 + - -0.0446167 + - 0.20629883 + - 3.40625 + - -0.46484375 + - 0.18688965 + - 2.3476563 + - 23.5 + - -0.89501953 + - -3.078125 + - 4.3554688 + - 0.5859375 + - 4.0507813 + - -2.0214844 + - -13.3359375 + - 1.4970703 + - -1.0517578 + - 4.7578125 + - 0.66796875 + - 0.11383057 + - 1.2236328 + - 0.84375 + - 2.2851563 + - 1.4814453 + - -4.9257813 + - 0.3095703 + - -4.7148438 + - 1.0253906 + - -3.7539063 + - 0.3647461 + - -0.20080566 + - -1.4785156 + - 3.5820313 + - -0.93603516 + - -2.2539063 + - 0.28979492 + - 3.0644531 + - -0.5317383 + - -0.69189453 + - 1.3955078 + - -1.6269531 + - -1.3457031 + - -2.0546875 + - -0.33032227 + - -0.26245117 + - -0.96191406 + - 0.11212158 + - -2.59375 + - 2.2695313 + - -1.0654297 + - -1.7246094 + - 1.9658203 + - -0.79833984 + - 0.2915039 + - 1.7851563 + - -3.4238281 + - 3.5742188 + - 1.0439453 + - -1.3769531 + - 5.90625 + - -2.6601563 + - -2.3691406 + - 0.82666016 + - 0.78759766 + - 2.9375 + - -2.3515625 + - 1.5 + - -2.4375 + - 3.8339844 + - 0.71240234 + - -1.1992188 + - -0.064697266 + - 6.109375 + - 3.3691406 + - -0.4128418 + - -1.7158203 + - -0.36547852 + - -1.1796875 + - -0.25268555 + - -0.30004883 + - -0.19189453 + - -2.7128906 + - -5.9140625 + - 6.5351563 + - 0.93652344 + - -2.375 + - -1.8955078 + - 1.6201172 + - 0.37719727 + - -0.3203125 + - -0.21618652 + - 0.5834961 + - 1.2314453 + - 0.7866211 + - 1.6142578 + - -3.2421875 + - 0.8457031 + - 1.3232422 + - -1.9501953 + - 0.4663086 + - 0.171875 + - 5.1757813 + - 2.1445313 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4765625 + - 4.703125 + - -0.546875 + - -1.9902344 + - 5.75 + - 0.78759766 + - 0.38598633 + - -1.2539063 + - -0.17272949 + - 2.4550781 + - 1.6503906 + - -1.2587891 + - -1.6191406 + - -1.8496094 + - -0.71777344 + - -0.42578125 + - 0.38891602 + - 0.73339844 + - 0.124572754 + - 0.29614258 + - -2.078125 + - 2.2597656 + - 23.0625 + - -3.9101563 + - 2.9414063 + - -0.17468262 + - 0.92871094 + - 2.359375 + - 0.18408203 + - -2.0410156 + - 0.2841797 + - -0.84375 + - -1.4482422 + - 1.9472656 + - -2.3066406 + - -1.7001953 + - -0.2607422 + - 0.31054688 + - -5.1601563 + - 1.984375 + - 2.1582031 + - 14.546875 + - -2.6972656 + - 1.4003906 + - -0.11602783 + - -1.4023438 + - 0.2097168 + - -0.65283203 + - 0.63623047 + - 0.6635742 + - -0.21679688 + - -1.2744141 + - -26 + - -0.5024414 + - 0.55078125 + - 1.0732422 + - -2.9140625 + - -0.4934082 + - -0.6484375 + - 0.9169922 + - -2.46875 + - 0.9277344 + - 0.59472656 + - -3.8222656 + - -1.3505859 + - -0.8232422 + - -0.15454102 + - -1.0322266 + - -1.2919922 + - -2.9804688 + - 0.62353516 + - -0.2298584 + - -2.3261719 + - 0.8232422 + - 2.6308594 + - 0.26000977 + - 3.421875 + - -1.4072266 + - 3.1738281 + - -0.5625 + - 7.6953125 + - -1.9335938 + - 2.5839844 + - 4.0078125 + - -6.6484375 + - 2.421875 + - -2.1796875 + - 4.359375 + - -0.8208008 + - -0.51123047 + - -1.7314453 + - 0.5083008 + - 0.62841797 + - 0.9926758 + - -5.5351563 + - 2.9492188 + - -0.17919922 + - -2.4003906 + - 0.0287323 + - 2.7089844 + - 2.53125 + - 2.6328125 + - 2.5039063 + - -1.953125 + - -1.2744141 + - 1.8378906 + - 4.15625 + - 1.4326172 + - -1.4902344 + - -3.828125 + - -0.64501953 + - -4.1679688 + - -1.1298828 + - 2.1113281 + - 2.2246094 + - 3.640625 + - -1.1396484 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.7363281 + - -1.0830078 + - 0.77001953 + - -1.2724609 + - 1.3398438 + - -1.2626953 + - 1.3603516 + - -1.4814453 + - -2.6640625 + - 0.6230469 + - -3.5585938 + - -0.33764648 + - -3.3710938 + - -3.9375 + - -0.76416016 + - 0.515625 + - 3.0039063 + - -1.4169922 + - -0.14941406 + - 2.9160156 + - 0.7988281 + - 0.52783203 + - -2.7890625 + - 3.3554688 + - 2.0605469 + - -1.4150391 + - -3.3203125 + - 3.6054688 + - -0.5683594 + - 3.9394531 + - -2.7871094 + - -0.92089844 + - -1.0517578 + - 0.8227539 + - 3.4941406 + - 2.4726563 + - -0.17443848 + - 0.9404297 + - -3.7363281 + - -6.046875 + - -0.46191406 + - -1.4882813 + - 2.6621094 + - 2.6914063 + - 0.81933594 + - 1.0390625 + - 2.1582031 + - 0.5991211 + - -0.0715332 + - 2.3574219 + - -1.8457031 + - 2.953125 + - 1 + - -0.45532227 + - -0.33251953 + - -0.8066406 + - -0.6645508 + - 12.1953125 + - 0.5239258 + - 2.53125 + - 5.7851563 + - 7.796875 + - -1.2158203 + - 0.42822266 + - -1.0888672 + - 1.4638672 + - -2.6542969 + - -1.7939453 + - 1.3466797 + - 0.6689453 + - 0.30126953 + - -2.5625 + - -0.71875 + - 1.0185547 + - 1.890625 + - 1.9335938 + - 0.34350586 + - -0.17382813 + - -0.18469238 + - -0.78125 + - -1.9404297 + - -2.1035156 + - -1.4277344 + - 1.2451172 + - -0.46313477 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9921875 + - 1.015625 + - 0.2241211 + - -0.98291016 + - 1.9423828 + - -1.75 + - 0.74072266 + - 1.8212891 + - -1.4931641 + - 1.2539063 + - -1.7744141 + - -0.55615234 + - 3.9394531 + - -0.7192383 + - 1.7138672 + - -2.6484375 + - -1.0947266 + - -2.9023438 + - 3.21875 + - 1.0126953 + - -2.4042969 + - -1.1142578 + - 4.1015625 + - 1.8300781 + - 1.0361328 + - 1.5976563 + - 4.1875 + - 0.8457031 + - -1.8183594 + - -1.6669922 + - 1.4794922 + - 1.5244141 + - 1.203125 + - 4.1875 + - 2.5175781 + - 2.2617188 + - 1.9628906 + - -1.4160156 + - -0.6542969 + - -1.8525391 + - 1.2382813 + - 0.2019043 + - -0.050201416 + - -1.1044922 + - 0.3461914 + - 1.390625 + - 0.10290527 + - 3.0859375 + - -0.97753906 + - 0.08258057 + - 0.86376953 + - -0.26757813 + - 23.46875 + - -3.4707031 + - -1.1474609 + - -4.2460938 + - -0.22851563 + - 0.73583984 + - 2.34375 + - -0.092041016 + - -4.7851563 + - 1.6845703 + - 2.5976563 + - -1.359375 + - 3.3945313 + - 2.5351563 + - 1.9492188 + - 0.52001953 + - 1.6367188 + - -3.0742188 + - 1.7148438 + - 0.96191406 + - -2.2128906 + - 1.7011719 + - -3.6757813 + - 1.7763672 + - 0.0758667 + - 0.82177734 + - -2.2089844 + - 0.11645508 + - 2.3359375 + - -3.7753906 + - -0.76953125 + - 1.3154297 + - 2.078125 + - 2.1328125 + - 2.4160156 + - -1.5634766 + - 6.2851563 + - -0.03125 + - 0.32592773 + - -0.65625 + - -4.3359375 + - -3.5664063 + - 0.5019531 + - 4.9257813 + - 0.38012695 + - 0.20166016 + - -1.5683594 + - 1.7353516 + - 2.8164063 + - 3.9121094 + - -0.57470703 + - -1.8261719 + - 0.39379883 + - 8.6640625 + - -3.2226563 + - -1.2158203 + - 0.6328125 + - -1.2607422 + - 1.1367188 + - 0.51123047 + - 1.3037109 + - -0.11773682 + - -0.11462402 + - -4.2421875 + - -3.546875 + - -2.6640625 + - -3.1269531 + - -2.9941406 + - 0.49536133 + - -2.1972656 + - -1.2841797 + - 3.2851563 + - -0.7211914 + - -1.8222656 + - 0.68310547 + - -3.3378906 + - -4.3945313 + - -0.29614258 + - 2.0722656 + - -2.6777344 + - -0.19885254 + - 1.1748047 + - 2.1855469 + - 1.2265625 + - -1.1201172 + - -3.0878906 + - -1.4257813 + - -0.8696289 + - -2.9550781 + - 0.012275696 + - -0.5029297 + - -0.26831055 + - 4.1679688 + - -1.1015625 + - 2.6386719 + - -3.3066406 + - -2.3125 + - -1.2939453 + - -0.6850586 + - 1.2021484 + - -1.3095703 + - 1.4707031 + - 1.0224609 + - 0.8652344 + - 0.40429688 + - -1.2783203 + - -1.6054688 + - 1.5166016 + - -1.4238281 + - 1.6367188 + - 0.48046875 + - -0.32885742 + - 2.7402344 + - 0.9326172 + - 0.21398926 + - 1.2578125 + - -3.8359375 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.29956055 + - -0.22302246 + - 0.52734375 + - 1.0439453 + - 1.1669922 + - 1.2773438 + - -1.2041016 + - -2.421875 + - 1.2001953 + - 2.1035156 + - -2.71875 + - 2.1171875 + - 0.453125 + - 0.3317871 + - 1.2675781 + - 0.6713867 + - -5.578125 + - -3.3398438 + - -1.0908203 + - 1.5175781 + - 0.0262146 + - -2.25 + - -0.95703125 + - 4.9179688 + - -0.171875 + - 1.3681641 + - 6.5859375 + - 2.5625 + - -2.6875 + - 0.84033203 + - -0.055236816 + - 6.015625 + - -4.9648438 + - -2.1777344 + - 0.98876953 + - -2.1269531 + - -0.57470703 + - -2.3886719 + - 1.8857422 + - -3.3496094 + - 3.1972656 + - -1.1943359 + - 0.71972656 + - 0.15234375 + - -0.51708984 + - -1.1992188 + - 0.9658203 + - -0.23144531 + - -1.9414063 + - 5.9726563 + - 0.78759766 + - 2.4453125 + - -0.31518555 + - -4.4648438 + - 2.4316406 + - 0.24658203 + - 1.3349609 + - -0.71484375 + - -1.3564453 + - -0.7675781 + - 1.1240234 + - -2.0175781 + - -3.0800781 + - -0.032348633 + - 0.69873047 + - 1.7294922 + - 2.8203125 + - -2.3183594 + - 1.2373047 + - 0.30688477 + - -2.703125 + - 0.3466797 + - 3.5585938 + - 1.3242188 + - 5.7539063 + - 0.24804688 + - 0.0625 + - 16.203125 + - -0.41845703 + - 2.3027344 + - -3.5488281 + - -0.90771484 + - -0.89697266 + - 0.5410156 + - 1.4794922 + - 4.1484375 + - -0.92089844 + - -3.5253906 + - -1.8222656 + - 0.8720703 + - 1.9169922 + - 1.0517578 + - -1.1318359 + - 4.453125 + - -0.26391602 + - -0.66796875 + - 0.24523926 + - -1.6455078 + - 0.3034668 + - -1.5175781 + - -2.2949219 + - -1.6777344 + - 2.3652344 + - -0.2253418 + - -3.9960938 + - -3.1015625 + - 0.74316406 + - -0.99609375 + - -0.87890625 + - -1.8613281 + - -1.890625 + - 0.1751709 + - -0.083984375 + - 3.0117188 + - 0.75634766 + - 2.7890625 + - 0.2861328 + - 1.9648438 + - -4.5898438 + - 0.88720703 + - 0.65283203 + - -0.06890869 + - 4.2070313 + - -1.3691406 + - -1.3691406 + - -2.0625 + - -5.4882813 + - 2.1308594 + - 1.9013672 + - -0.30786133 + - 2.8808594 + - 4.703125 + - -1.6386719 + - -0.17785645 + - -3.8339844 + - -0.13439941 + - -1.8310547 + - -0.77441406 + - -1.1064453 + - 1.7431641 + - -2.7011719 + - -0.38720703 + - 1.0185547 + - 1.9091797 + - -4.953125 + - 3.3925781 + - 0.92626953 + - -0.5727539 + - -1.6923828 + - 4.6914063 + - 0.94384766 + - 1.1826172 + - 1.0126953 + - -1.9609375 + - -2.4472656 + - 1.6650391 + - 1.3632813 + - 2.3925781 + - 0.17211914 + - 4.7539063 + - -1.6230469 + - -1.1386719 + - 0.9663086 + - -1.5556641 + - -0.7675781 + - -1.5439453 + - 0.62353516 + - -4.34375 + - -0.8286133 + - 1.6669922 + - 1.9033203 + - -2.3789063 + - 2.5566406 + - -3.9316406 + - 2.6816406 + - 0.78759766 + - -0.73876953 + - 4.6054688 + - -0.89160156 + - -2.6074219 + - 1.9169922 + - 2.4316406 + - 3.3085938 + - 1.7695313 + - -1.0097656 + - -0.22338867 + - 0.45361328 + - 33.40625 + - 13.4765625 + - -9.1796875 + - 2.265625 + - -1.0507813 + - 1.4277344 + - -2.734375 + - -4.1757813 + - -0.36376953 + - -0.20703125 + - 1.9589844 + - 0.51464844 + - -0.34057617 + - 1.5166016 + - -2.7890625 + - 1.9707031 + - -1.0009766 + - 0.91259766 + - -2.6933594 + - 0.7138672 + - 1.8779297 + - 3.4140625 + - -1.3193359 + - -1.1445313 + - -0.2253418 + - -2.1523438 + - 0.08703613 + - -0.4038086 + - -4.6054688 + - 0.75097656 + - -0.119384766 + - -0.16101074 + - 1.4169922 + - 2.4785156 + - 1.6337891 + - -4.3789063 + - -1.8554688 + - 2.0644531 + - -2.1699219 + - 1.2451172 + - 2.2324219 + - 1.5371094 + - -0.27978516 + - 4.2304688 + - -1.2050781 + - 0.29345703 + - -3.4941406 + - 2.1425781 + - 1.3066406 + - 0.5107422 + - 2.2910156 + - 8.7265625 + - -0.5673828 + - -1.4306641 + - 1.7226563 + - -0.9453125 + - -0.84521484 + - 0.05606079 + - 1.4580078 + - 0.2175293 + - 2.9785156 + - 2.3984375 + - 1.2050781 + - -3.9238281 + - -1.7402344 + - -1.1376953 + - 1.9384766 + - -0.83203125 + - -2.6855469 + - 0.2565918 + - -2.9277344 + - -0.20385742 + - -1.5039063 + - -2.265625 + - 0.92822266 + - -2.6640625 + - -0.18579102 + - 1.3486328 + - 5.4453125 + - 0.41503906 + - -1.7626953 + - -1.4189453 + - 1.6337891 + - 1.8632813 + - 1.6875 + - 2.3808594 + - 1.1025391 + - 0.22314453 + - 1.9453125 + - -1.5341797 + - 1.3691406 + - 0.5053711 + - -0.8886719 + - -0.99902344 + - 3.6582031 + - 1.2080078 + - -1.3974609 + - 4.03125 + - -1.9023438 + - 0.5214844 + - -3.4609375 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.11743164 + - 0.4892578 + - 0.32250977 + - -2.3222656 + - -0.081970215 + - 1.4853516 + - -3.2910156 + - 3.6777344 + - -0.69384766 + - 4.28125 + - 1.8076172 + - 2.8300781 + - -2.9140625 + - -1.3212891 + - 3.5175781 + - 0.42773438 + - -2.3886719 + - -1.8847656 + - 0.8803711 + - 1.109375 + - 3.6132813 + - 1.3603516 + - -3.2714844 + - 2.0566406 + - 2.4140625 + - 0.1307373 + - -0.87890625 + - -1.2529297 + - -1.1123047 + - 1.2490234 + - 0.28198242 + - 0.3125 + - -0.18469238 + - -3.4375 + - 1.5390625 + - -1.3007813 + - -0.4399414 + - 1.9648438 + - 1.7783203 + - -2.1347656 + - -0.296875 + - -0.17236328 + - 2.0097656 + - -1.2041016 + - -0.14453125 + - -4.1132813 + - 1.1660156 + - 1.3193359 + - -1.4667969 + - -1.4375 + - 0.4111328 + - -0.91552734 + - -1.1474609 + - 0.41748047 + - 0.4025879 + - 2.1621094 + - 0.09051514 + - -2.5625 + - 2.7890625 + - 1.7763672 + - -0.9404297 + - 0.4248047 + - 0.32739258 + - 2.3457031 + - -0.119506836 + - -2.5625 + - -0.5102539 + - -0.26660156 + - -2.6132813 + - -1.3476563 + - 0.5800781 + - 0.7158203 + - 1.4140625 + - 1.9658203 + - -1.1708984 + - -1.7529297 + - -0.59765625 + - 0.38500977 + - -0.5258789 + - 0.9008789 + - 1.5195313 + - -1.5722656 + - -0.06945801 + - 1.7695313 + - 1.7246094 + - -1.2783203 + - 2.3789063 + - 2.3203125 + - 1.78125 + - 0.7128906 + - -2.4902344 + - -1.8623047 + - 2.984375 + - 1.1738281 + - 0.92285156 + - -3.3925781 + - -2.7636719 + - -1.4267578 + - -2.8496094 + - -0.41601563 + - 0.39208984 + - -12.4453125 + - -0.31689453 + - -0.46142578 + - 0.21984863 + - -0.89160156 + - 0.5493164 + - -1.2490234 + - 1.6689453 + - 0.4597168 + - -1.7109375 + - 2.34375 + - -5.3710938 + - 0.48706055 + - 0.3251953 + - -1.1757813 + - 1.375 + - 1.5214844 + - -2.0566406 + - -0.022598267 + - 3.4277344 + - 0.61816406 + - 1.828125 + - -0.5341797 + - 9.390625 + - 1.4433594 + - -2.1386719 + - 0.72509766 + - -0.5239258 + - 0.89208984 + - -0.89160156 + - -0.083618164 + - -2.6601563 + - 6.7539063 + - 0.6816406 + - -1.7734375 + - 0.74072266 + - 1.0400391 + - -6.0976563 + - 0.71777344 + - 0.2915039 + - 1.3701172 + - 0.43798828 + - 6.2929688 + - -0.5932617 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4609375 + - 2.1035156 + - 1.1425781 + - -2.8378906 + - 1.5439453 + - 1.7998047 + - -3.1582031 + - -1.0820313 + - -0.32714844 + - -0.43115234 + - -3.2050781 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6953125 + - -1.7978516 + - 3.5683594 + - -2.4199219 + - 0.19494629 + - -1.6347656 + - -1.6376953 + - 2.0566406 + - -0.3552246 + - -1.3388672 + - 1.7587891 + - 1.6367188 + - -0.61572266 + - 0.6455078 + - 0.6113281 + - 2.1738281 + - 0.86376953 + - 3.7558594 + - 0.019104004 + - -0.2692871 + - -1.7851563 + - 2.6640625 + - 0.18725586 + - -2.0234375 + - -1.2880859 + - -1.5732422 + - -0.09063721 + - 5.2382813 + - 4.703125 + - -1.1416016 + - 1.9345703 + - 2.3378906 + - -0.7207031 + - -1.2539063 + - -0.4033203 + - 2.0351563 + - -1.9433594 + - 2.2792969 + - -3.4765625 + - 2.8359375 + - 0.7871094 + - -3.9589844 + - -0.11071777 + - -2.6660156 + - 3.2460938 + - 0.30151367 + - -5.5117188 + - -0.2685547 + - -1.7626953 + - 1.6542969 + - 0.42626953 + - 0.66503906 + - 3.4492188 + - 0.47387695 + - 1.28125 + - -0.3215332 + - -3.09375 + - -1.6669922 + - -0.59765625 + - -3.7890625 + - 8.9296875 + - 1.1962891 + - 1.4658203 + - -0.5292969 + - 0.5283203 + - -1.4980469 + - 0.4362793 + - 1.1601563 + - -1.2988281 + - -5.4726563 + - -3.3964844 + - 4.6328125 + - -4.1757813 + - 1.8066406 + - -1.8466797 + - -2.8164063 + - 1.296875 + - 0.8886719 + - -0.58203125 + - 0.27270508 + - 1.25 + - 1.1113281 + - -3.1777344 + - 0.07476807 + - -4.0429688 + - 1.7041016 + - -1.5908203 + - 1.2070313 + - -3.5976563 + - 0.81103516 + - -1.4306641 + - 0.9394531 + - -2.4980469 + - -1.0517578 + - 0.07281494 + - 2.2519531 + - 3.2441406 + - 0.49902344 + - 1.6640625 + - -1.6152344 + - 2.421875 + - 1.2851563 + - -0.71875 + - -1.1757813 + - -2.6894531 + - -0.24438477 + - 0.5205078 + - 2.5664063 + - -2.8769531 + - -0.093566895 + - -0.00390625 + - 4.234375 + - -0.012275696 + - -2.2246094 + - 0.36572266 + - 1.9814453 + - -2.2167969 + - -2.3164063 + - -0.9794922 + - 1.2119141 + - 1.9492188 + - -0.5366211 + - 0.7207031 + - -1.4638672 + - -0.29589844 + - 0.8256836 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8466797 + - 5.8125 + - 2.6308594 + - -1.5351563 + - 1.4619141 + - -0.5991211 + - 1.0800781 + - -1.6582031 + - -2.0136719 + - -0.91308594 + - 1.2207031 + - -1.9169922 + - 1.1708984 + - -1.0449219 + - 3.5253906 + - 4.34375 + - -0.51708984 + - 0.18188477 + - -0.23486328 + - -1.4326172 + - -3.3300781 + - -2.8691406 + - -0.890625 + - 1.3818359 + - -1.0712891 + - 0.85791016 + - 2.171875 + - 1.5488281 + - 1.4101563 + - -0.41503906 + - 0.8691406 + - -4.9179688 + - -0.90283203 + - -8.3046875 + - -1.7314453 + - -2.0175781 + - -2.2753906 + - -2.9023438 + - -0.96533203 + - 2.8378906 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7314453 + - -1.6464844 + - -0.65722656 + - -0.1796875 + - 0.51416016 + - 2.3203125 + - 3.0976563 + - -2.1542969 + - 1.1396484 + - 1.6914063 + - -0.0390625 + - 0.88378906 + - -1.4277344 + - 0.4267578 + - 0.08758545 + - -3.4179688 + - 0.72802734 + - 4.8867188 + - -0.75634766 + - -0.5488281 + - -1.4765625 + - -2.4765625 + - 0.65625 + - -0.3408203 + - 3.7578125 + - 0.36083984 + - -2.0878906 + - 2.2285156 + - -0.27612305 + - 1.5869141 + - -2.5488281 + - 0.7753906 + - 0.4025879 + - 1.2587891 + - -0.55908203 + - 1.6416016 + - 2.9863281 + - 4.1796875 + - 0.13830566 + - -0.85595703 + - -0.55566406 + - 2.0410156 + - -3.8964844 + - 0.77978516 + - -0.2824707 + - 3.2734375 + - 1.1845703 + - -2.0351563 + - 0.7270508 + - 2.3515625 + - 0.83691406 + - -3.1015625 + - -1.3193359 + - -2.0195313 + - -1.6425781 + - -2.9023438 + - -0.42871094 + - 2.3789063 + - -3.4550781 + - -2.8339844 + - 1.1816406 + - -0.5722656 + - 2.453125 + - -2.5 + - -0.10070801 + - -1.1962891 + - -0.010597229 + - -2.734375 + - 1.5898438 + - -4.609375 + - -4.359375 + - -0.1171875 + - -1.5556641 + - 1.4550781 + - 8.6328125 + - 0.89501953 + - 3.6816406 + - -4.7578125 + - 1.1894531 + - -0.67626953 + - 1.3095703 + - 0.9038086 + - 0.67626953 + - -0.16235352 + - -4.78125 + - 0.53125 + - 0.7607422 + - 2.5625 + - -0.83447266 + - -2.8378906 + - 0.44628906 + - -0.08538818 + - -0.5522461 + - -2.4765625 + - 1.4394531 + - 2.1074219 + - -2.5625 + - 5.3554688 + - 0.30908203 + - 0.36865234 + - 0.9243164 + - 0.52734375 + - 4.0117188 + - 0.27416992 + - 2.0800781 + - -1.8203125 + - -0.51904297 + - 0.5410156 + - 2.3886719 + - 7.1640625 + - 1.7148438 + - 1.0996094 + - -1.0556641 + - 3.5546875 + - 0.050476074 + - 1.7128906 + - 1.7871094 + - 2.2246094 + - -0.30566406 + - 3.09375 + - -0.69628906 + - 3.6015625 + - -4.4882813 + - -1.4697266 + - -2.0253906 + - 0.94189453 + - 0.001115799 + - 1.3408203 + - -0.42285156 + - 4.0742188 + - -1.9775391 + - -2.1054688 + - -0.84228516 + - 0.016174316 + - 2.9785156 + - 2.40625 + - 0.7363281 + - 1.1787109 + - 3.2851563 + - 4.1992188 + - 0.75634766 + - -0.5756836 + - 1.3769531 + - 2.0800781 + - -4.9882813 + - -4.578125 + - -0.9609375 + - 3.3125 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.265625 + - -0.8544922 + - -0.28344727 + - 1.3613281 + - -1.3515625 + - -0.44604492 + - 2.5839844 + - 2.6875 + - -0.9711914 + - -0.3581543 + - 0.4165039 + - 1.7861328 + - 0.39453125 + - -0.12207031 + - -0.35864258 + - 1.2529297 + - 2.140625 + - 0.9091797 + - -2.1191406 + - -0.3251953 + - -3.6425781 + - -4.8789063 + - -0.092163086 + - 2.5820313 + - -0.86035156 + - -0.36767578 + - 3.125 + - -2.1777344 + - 2.0097656 + - 0.5566406 + - -0.9897461 + - -2.9140625 + - 1.4013672 + - -0.5180664 + - 3.0625 + - 3.3476563 + - 1.2998047 + - -6.8359375 + - -0.47680664 + - -0.41845703 + - -5.390625 + - 2.1210938 + - -2.6621094 + - 2.4355469 + - 1.3867188 + - -6.4453125 + - 1.3076172 + - -0.65478516 + - -2.7988281 + - -2.4296875 + - 1.1220703 + - -0.37597656 + - 2.0761719 + - -0.4309082 + - -0.8129883 + - -33.875 + - -2.53125 + - -2.4140625 + - -0.3881836 + - -1.4277344 + - 2.09375 + - 2.4121094 + - -4.7539063 + - -4.6601563 + - -0.9038086 + - 1.1162109 + - -1.4375 + - -1.0976563 + - 6.7734375 + - 0.4885254 + - 4.7304688 + - -1.6601563 + - 4.3242188 + - -0.25097656 + - -1.4335938 + - 0.11437988 + - -0.45507813 + - 1.0791016 + - 1.8134766 + - -0.4350586 + - -4.0117188 + - -1.2519531 + - 0.053833008 + - 1.8681641 + - -0.36206055 + - 0.5722656 + - -1.265625 + - 0.3642578 + - -0.5629883 + - -3.4941406 + - 4.8632813 + - -3.3046875 + - -0.8071289 + - -2.328125 + - -3.4863281 + - 0.029571533 + - 1.9746094 + - 2.6328125 + - 0.01576233 + - 0.25268555 + - 1.7089844 + - 4.0039063 + - -0.63720703 + - 1.90625 + - -2.8339844 + - 2.6796875 + - -1.0927734 + - 0.26220703 + - -3.9238281 + - 3.0117188 + - 2.6074219 + - -2.9648438 + - 3.4550781 + - 2.6816406 + - 0.6645508 + - -1.0673828 + - -4.0117188 + - 3.0097656 + - 1.3544922 + - 1.5175781 + - -0.3876953 + - 0.039611816 + - -5.0078125 + - 0.8300781 + - 1.3789063 + - -2.2207031 + - 0.77441406 + - 2.6035156 + - 0.40454102 + - -0.56103516 + - 2.2070313 + - -1.4003906 + - -2.6953125 + - 0.8046875 + - 0.42114258 + - -1.2441406 + - 2.0878906 + - 0.47314453 + - 1.0439453 + - 3.0527344 + - 0.85058594 + - -1.2832031 + - 1.1123047 + - 2.0527344 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0400391 + - 8.5703125 + - -1.4746094 + - 2.03125 + - -0.5991211 + - -0.8847656 + - -0.44628906 + - -0.66796875 + - 2.8222656 + - 0.049102783 + - 3.53125 + - 1.0810547 + - 2.125 + - -2.1464844 + - -2.4277344 + - 3.5800781 + - -0.17236328 + - 5.921875 + - -1.0566406 + - 5.921875 + - -2.0253906 + - -0.95410156 + - -1.4013672 + - 1.5019531 + - 0.3852539 + - 0.79003906 + - -1.5839844 + - 4.1132813 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7216797 + - -2.0976563 + - 1.7167969 + - -1.4580078 + - -4.0742188 + - -3.1113281 + - 0.44921875 + - -4.3554688 + - -0.16064453 + - 1.7939453 + - 3.7304688 + - -1.1054688 + - -0.67529297 + - -30.3125 + - -0.85595703 + - -0.027618408 + - -0.6660156 + - 0.7626953 + - 3.5800781 + - 0.79296875 + - 1.8632813 + - 0.12609863 + - 2.0976563 + - 0.012275696 + - -0.1484375 + - -2.9160156 + - -2.2011719 + - 1.3662109 + - -2.3691406 + - 0.55859375 + - 0.073791504 + - -0.63134766 + - -1.5576172 + - 1.4433594 + - 10.890625 + - 3.125 + - -1.265625 + - 1.1884766 + - 0.94140625 + - -0.84814453 + - 2.3105469 + - 0.37841797 + - -2.6035156 + - 1.296875 + - 0.2529297 + - -2.203125 + - 0.34057617 + - 0.38110352 + - -2.0644531 + - -3.2285156 + - 0.17248535 + - -0.55126953 + - -1.90625 + - 5.6289063 + - 1.6572266 + - -1.2236328 + - 3.1679688 + - 1.0341797 + - 1.2763672 + - 0.0011701584 + - 3.1445313 + - 0.6489258 + - -1.7949219 + - 0.19189453 + - 3.5175781 + - -2.3945313 + - 2.4589844 + - -1.5351563 + - -2.0097656 + - -0.9692383 + - 4.3242188 + - 0.4519043 + - -4.0820313 + - 1.6386719 + - -0.49804688 + - -0.6801758 + - -1.8076172 + - -2.5019531 + - 0.077819824 + - -3.75 + - 0.7397461 + - 3.0078125 + - -6.9453125 + - 0.48876953 + - -1.3095703 + - -3.3691406 + - -3.0175781 + - 1.7734375 + - -0.8691406 + - -3.1191406 + - 0.06640625 + - 0.18615723 + - -0.3959961 + - -1.3349609 + - -0.6459961 + - 1.8984375 + - 1.75 + - 6.6757813 + - -1.4882813 + - -0.46704102 + - -1.2744141 + - -1.8183594 + - 2.0644531 + - -1.9638672 + - -0.7011719 + - 2.0664063 + - 0.15258789 + - 3.4492188 + - 0.890625 + - 0.921875 + - -1.0634766 + - 3.0039063 + - -0.6928711 + - 1.6298828 + - 0.5488281 + - -2.703125 + - -1.1425781 + - 0.41503906 + - -0.5839844 + - -0.2109375 + - 4.5625 + - 1.4433594 + - -0.11102295 + - -1.6738281 + - 4.5078125 + - -0.49682617 + - 2.0371094 + - -2.7558594 + - -1.8857422 + - 2.1015625 + - 2.515625 + - -0.82177734 + - 0.87597656 + - 1.6611328 + - -1.1982422 + - -1.96875 + - -1.2451172 + - 0.07476807 + - -0.46923828 + - -4.9023438 + - 0.047424316 + - -1.0195313 + - 3.3046875 + - 0.25048828 + - 0.66015625 + - -0.43066406 + - -0.13110352 + - 1.1132813 + - -0.35327148 + - -0.6738281 + - -0.47021484 + - -1.140625 + - -4.4179688 + - 0.7680664 + - 4.2070313 + - 0.112854004 + - 1.3613281 + - 1.8691406 + - 0.6191406 + - 3.9082031 + - -1.546875 + - 0.0418396 + - 2.265625 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6796875 + - 1.6044922 + - -2.3691406 + - 0.18969727 + - 1.0859375 + - 2.8300781 + - -0.6640625 + - 2.6914063 + - 2.7753906 + - 1.3164063 + - 2.5449219 + - -2.40625 + - 4.4960938 + - -2.4257813 + - -0.54003906 + - 1.7001953 + - -0.63427734 + - -2.5 + - 1.7324219 + - 0.1015625 + - -2.2871094 + - -1.5751953 + - -1.5019531 + - -1.6982422 + - -2.8789063 + - 3.1425781 + - 1.8701172 + - 1.7558594 + - -2.7441406 + - -0.32348633 + - -0.13171387 + - 2.4902344 + - 0.3330078 + - 2.4199219 + - -3.0214844 + - -0.18884277 + - 0.44799805 + - 1.0439453 + - 0.17492676 + - 4.0351563 + - -0.08843994 + - 1.4238281 + - -0.7919922 + - -1.9882813 + - -0.9272461 + - 1.3662109 + - 1.046875 + - 0.63427734 + - 1.2451172 + - -3.4550781 + - 0.17297363 + - 1.7441406 + - 0.62353516 + - -0.3647461 + - 1.515625 + - -1.1552734 + - -2.4160156 + - -5.5429688 + - -4.09375 + - 6.078125 + - -1.3701172 + - -0.91015625 + - 1.1992188 + - -1.7529297 + - 2.0800781 + - -1.6416016 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.6425781 + - 0.7397461 + - 0.2734375 + - 1.4511719 + - -0.7939453 + - -1.1513672 + - 0.75683594 + - 0.1204834 + - -3.5039063 + - -1.7607422 + - -1.4775391 + - 3.1015625 + - 2.0839844 + - 6.2929688 + - -0.44384766 + - 2.5175781 + - -1.7080078 + - 1.8369141 +- - 1.3066406 + - -2.1523438 + - 0.703125 + - 0.2529297 + - 1.2626953 + - -1.46875 + - -0.19042969 + - -0.14892578 + - 3.3066406 + - -1.8222656 + - 1.0253906 + - -0.51953125 + - 0.8203125 + - 0.2109375 + - 1.1699219 + - 0.109680176 + - 1.5429688 + - 1.2597656 + - 2.3242188 + - -2.4765625 + - -1.4189453 + - -0.6923828 + - -0.0078125 + - 0.44189453 + - 2.7128906 + - 1.8183594 + - -0.043762207 + - 1.6103516 + - 0.77734375 + - 1.21875 + - 3.8847656 + - -0.7583008 + - 5.4765625 + - 1.6425781 + - -2.4707031 + - 1.5048828 + - -1.8222656 + - -1.1347656 + - -6.5820313 + - -0.45825195 + - 0.9609375 + - -1.4111328 + - 1.1171875 + - -1.0078125 + - -0.67578125 + - 1.3095703 + - 0.9667969 + - -3.625 + - 0.6777344 + - 2.6757813 + - 3.109375 + - -0.94970703 + - -3.96875 + - -79.125 + - -2.3476563 + - -1.6230469 + - 3.4257813 + - -1.3222656 + - -2.5878906 + - -10.5 + - -1.8828125 + - -0.7763672 + - -0.20166016 + - -0.38671875 + - 0.066223145 + - 0.24121094 + - -2.9160156 + - 2.1953125 + - -0.5649414 + - -0.8515625 + - -5.0117188 + - -1.8183594 + - -1.2324219 + - -2.1738281 + - -1.2753906 + - 0.38012695 + - 2.3984375 + - 1.7548828 + - 0.31445313 + - 0.1796875 + - 0.74609375 + - -1.5439453 + - -0.69970703 + - 1.3261719 + - -2.4179688 + - 3.9316406 + - -2.2070313 + - 0.7993164 + - 3.7070313 + - 2.0117188 + - -0.48486328 + - 2.3808594 + - 2.2070313 + - -26.71875 + - 0.13146973 + - -4.5546875 + - -5.8632813 + - -0.53515625 + - -0.08850098 + - -5.8359375 + - -1.0390625 + - -2.6054688 + - -6.5507813 + - -2.9179688 + - -1.4267578 + - -2.7207031 + - 1.1035156 + - -1.9316406 + - -1.3251953 + - 0.1217041 + - -0.5 + - 0.953125 + - 3.2734375 + - -1.8398438 + - -1.109375 + - 5.4570313 + - 2.2636719 + - 1.78125 + - -2.0039063 + - 0.7607422 + - 3.6132813 + - 1 + - -2.1503906 + - 0.3461914 + - -0.95410156 + - -0.73535156 + - 3.3984375 + - -1.7480469 + - 0.08428955 + - 2.4414063 + - 1.2148438 + - 1.2958984 + - -2.2597656 + - 1.1669922 + - 0.5546875 + - 0.6875 + - 1.953125 + - 0.578125 + - -2.1875 + - -1.5830078 + - 1.1005859 + - -0.66015625 + - 2.1269531 + - 0.39160156 + - 2.5273438 + - 0.61035156 + - -1.8222656 + - -1.2480469 + - -3.453125 + - 5.515625 + - 1.0234375 + - -1.2080078 + - -2.0703125 + - -0.7324219 + - -0.64697266 + - -4.796875 + - -1.21875 + - -0.30126953 + - -1.1337891 + - -2.234375 + - -0.036132813 + - -1.7109375 + - -3.625 + - -2.1074219 + - -0.7133789 + - 0.78759766 + - 1.7910156 + - -0.48364258 + - -0.57128906 + - -1.4111328 + - -1.8066406 + - -1.0322266 + - -0.9736328 + - -1.2832031 + - -1.4316406 + - -0.91503906 + - -2.0410156 + - 3.2207031 + - -1.1191406 + - -0.4609375 + - 3.4726563 + - 0.73046875 + - -1.2910156 + - -1.8994141 + - -0.70166016 + - 5.953125 + - -4.6757813 + - -0.33642578 + - -1.3808594 + - -1.0087891 + - -3.4550781 + - -2.0703125 + - -0.11456299 + - 1.4150391 + - -2.3164063 + - 4.3203125 + - 3.0625 + - -3.1289063 + - -1.7910156 + - 2.7265625 + - 0.49414063 + - -3.7148438 + - 1.8212891 + - 0.04296875 + - 1.7988281 + - 6.609375 + - 7.0976563 + - -2.7851563 + - -2.453125 + - -4.2226563 + - -2.7910156 + - -0.026031494 + - -2.6015625 + - -0.49658203 + - 0.26220703 + - 3.2597656 + - 1.1660156 + - -2.0742188 + - 6 + - 1.4511719 + - -2.2148438 + - 2.4785156 + - -3.1953125 + - 2.0566406 + - -0.5751953 + - -2.5722656 + - 1.0351563 + - 1.0371094 + - 0.7368164 + - -0.65478516 + - 2.015625 + - -0.5395508 + - -0.77197266 + - -1.8203125 + - -0.59814453 + - 0.77197266 + - 2.0957031 + - 2.0429688 + - 4.4296875 + - 0.26733398 + - 11.1640625 + - 0.024246216 + - -6.1328125 + - -0.7373047 + - -1.765625 + - -1.8984375 + - 5.2890625 + - 3.6191406 + - -0.52685547 + - 0.5571289 + - -0.6923828 + - -0.18676758 + - -2.1582031 + - -1.0644531 + - -1.4501953 + - -0.65527344 + - -3.2617188 + - -1.4257813 + - -2.375 + - 2.4433594 + - 0.8105469 + - -0.2290039 + - 3.6132813 + - 1.6386719 + - 0.17578125 + - -0.28222656 + - -3.4179688 + - 5.8007813 + - -0.8408203 + - -7.125 + - 0.4477539 + - 1.1816406 + - 2.8007813 + - -1.1210938 + - 1.6542969 + - 0.024734497 + - -3.390625 + - 2.2402344 + - 0.5571289 + - -0.67089844 + - -3.1210938 + - -0.091796875 + - 1.8320313 + - 2.421875 + - -0.43115234 + - -0.41845703 + - 1.9492188 + - -1.0253906 + - 1.8066406 + - -1.1699219 + - -0.04067993 + - -1.3125 + - 18.59375 + - -0.49267578 + - 2.1640625 + - -1.1904297 + - 2.046875 + - -2.9882813 + - 3.0351563 + - 0.070129395 + - -0.2932129 + - 0.14709473 + - 3.140625 + - 0.6411133 + - -1.734375 + - 1.0273438 + - 3.25 + - 0.66796875 + - -0.24633789 + - 1.0820313 + - -0.81152344 + - 2.8691406 + - -0.22851563 + - 0.8828125 + - -0.84765625 + - -3.078125 + - -0.53466797 + - -1.3183594 + - -2.9101563 + - 2.5097656 + - 0.9892578 + - -0.7841797 + - 1.0058594 + - 2.09375 + - -0.4638672 + - -0.27783203 + - -1.4726563 + - -0.58935547 + - 1.0644531 + - -3.0273438 + - -5.5820313 + - 2.59375 + - 0.8964844 + - 1.4658203 + - 2.8945313 + - -2.796875 + - 3.1347656 + - 0.73535156 + - -0.9921875 + - 0.6640625 + - 2.2148438 + - -0.47998047 + - 2.6660156 + - 0.028152466 + - 0.88671875 + - 1.6191406 + - 0.18554688 + - 1.1972656 + - -4.5234375 + - -0.7114258 + - 1.9296875 + - -0.3076172 + - 1.2744141 + - -0.19140625 + - -3.65625 + - -0.27856445 + - -5.1523438 + - -2.9882813 + - -1.6640625 + - -1.6660156 + - -1.7089844 + - 2.65625 + - 3.1875 + - -2.65625 + - 2.140625 + - -2.5976563 + - 5.9453125 + - 0.00032544136 + - 0.24072266 + - -2.453125 + - 0.00390625 + - -3.0390625 + - -2.8125 + - 2.1640625 + - 0.04296875 + - 3.2910156 + - -3.5351563 + - 1.5039063 + - -0.6879883 + - 2.1210938 + - -0.13867188 + - 1.2568359 + - -2.7675781 + - -1.9736328 + - -3.2578125 + - 2.8164063 + - 4.2734375 + - -2.6953125 + - -8.328125 + - -1.2773438 + - 0.95214844 + - -1.4785156 + - -2.8066406 + - -2.5625 + - 0.31762695 + - -0.07287598 + - 2.9238281 + - 1.5556641 + - -1.234375 + - 1.2900391 + - -3 + - 3.5097656 + - 1.1171875 + - -4.359375 + - 3.1347656 + - 2.8691406 + - 4.7421875 + - -2.5039063 + - -11.0078125 + - 0.47558594 + - -2.21875 + - -2.3964844 + - 2.8046875 + - -2.3085938 + - -0.24182129 + - 2.6953125 + - -3.296875 + - -2.3847656 + - -3.3535156 + - 4.9257813 + - -2.2988281 + - 0.1973877 + - -0.5859375 + - 0.66308594 + - 0.53564453 + - 0.9667969 + - 1.984375 + - 2.1015625 + - 2.3496094 + - -1.4863281 + - -1.3291016 + - -1.640625 + - -3.546875 + - -1.1943359 + - -0.7705078 + - -2.5976563 + - 3.5039063 + - -2.75 + - 0.234375 + - 3.1796875 + - -4.5703125 + - -1.8574219 + - -0.6586914 + - -3.6054688 + - -2.5800781 + - -0.04034424 + - 0.48876953 + - 1.9150391 + - -2.6191406 + - -4.1875 + - 1.2519531 + - 0.5439453 + - -0.16992188 + - -2.0195313 + - -0.70751953 + - 5.5 + - 6.0625 + - 1.9619141 + - 4.0234375 + - 2.5332031 + - -0.94384766 + - -3.8242188 + - -2.4726563 + - 2.765625 + - -2.5703125 + - 0.14868164 + - 2.1289063 + - -0.029937744 + - -0.19921875 + - -1.5585938 + - 6.5546875 + - 1.2070313 + - 2.3320313 + - 1.4941406 + - 0.030761719 + - 0.42529297 + - 0.30664063 + - -2.03125 + - -0.46142578 + - 3.5019531 + - -0.21740723 + - -0.52441406 + - -1.015625 + - -4.1601563 + - -1.5078125 + - 0.44873047 + - -8.125 + - 0.90625 + - 2.7226563 + - -0.7109375 + - 1.4423828 + - 2.125 + - -2.3691406 + - -1.2714844 + - -0.7314453 + - -0.96484375 + - 3.7441406 + - -3.65625 + - -2.484375 + - 2.5 + - 0.27734375 + - -4.84375 + - 2.875 + - 0.5957031 + - 0.23510742 + - 3.8359375 + - -3.4023438 + - -0.5209961 + - -3.359375 + - 3.0253906 + - 2.9003906 + - -2.6640625 + - -0.9140625 + - 2.1484375 + - -3.6914063 + - 0.123535156 + - -2.3554688 + - 0.50146484 + - -1.9921875 + - -0.22851563 + - 0.5620117 + - 1.7978516 + - 3.9921875 + - -0.01626587 + - -0.1796875 + - 2.0039063 + - 1.5117188 + - -2.890625 + - 0.7758789 + - 3.7070313 + - 0.9814453 + - 0.9794922 + - -0.5517578 + - -0.6455078 + - 2.3554688 + - -0.01953125 + - -2.6328125 + - 1.1054688 + - -2.5917969 + - -3.5273438 + - -1.4472656 + - -1.1289063 + - 2.1367188 + - -2.8125 + - -4.703125 + - -3.0390625 + - -0.091796875 + - 1.2519531 + - 2.8691406 + - 3.484375 + - 2.6757813 + - 0.5048828 + - -7.5664063 + - -2.5976563 + - -1.0341797 + - -2.0488281 + - -0.90234375 + - 1.21875 + - 0.26953125 + - 3.9453125 + - 2.328125 + - -4.9609375 + - -1.1132813 + - -2.7910156 + - 2.3945313 + - -1.1445313 + - 1.0087891 + - -0.83447266 + - -2.4648438 + - -0.38891602 + - -3.0117188 + - 0.21484375 + - -0.48168945 + - 2.1523438 + - 0.15002441 + - -2.8925781 + - 1.7236328 + - 0.44360352 + - 3.9707031 + - -1.6025391 + - -2.2929688 + - 0.46020508 + - 0.028640747 + - -2.1523438 + - -1.9892578 + - 1.4970703 + - 2.3457031 + - -0.55859375 + - -3.0625 + - -1.9150391 + - 0.8359375 + - -4.4101563 + - -0.057281494 + - -0.71777344 + - -0.5722656 + - 1.0957031 + - 2.4804688 + - 1.4980469 + - 3.0410156 + - 2.765625 + - -0.54296875 + - 0.7167969 + - -0.38964844 + - 0.04360962 + - -2.7753906 + - 0.73828125 + - -4.2109375 + - 0.7705078 + - -3.4160156 + - 1.1552734 + - 3.4472656 + - -4.21875 + - -1.2353516 + - 0.2746582 + - -1.8798828 + - -1.2822266 + - 0.84765625 + - 4.1015625 + - -0.5810547 + - -0.74316406 + - 3.453125 + - 3.3007813 + - 1.7714844 + - -0.7939453 + - -1.4003906 + - 1.6298828 + - 0.5395508 + - 1.3300781 + - 1.0800781 + - 0.8129883 + - 3.5078125 + - 0.4074707 + - -3.0820313 + - -2.296875 + - 1.3847656 + - 1.1904297 + - -1.0195313 + - -1.5390625 + - -0.69384766 + - 0.39990234 + - -3.1875 + - -2.2578125 + - -0.12902832 + - 0.36132813 + - 5.0039063 + - -0.61376953 + - -0.73291016 + - -1.8564453 + - 7.7382813 + - -3.71875 + - 2.96875 + - 1.3554688 + - -5.4609375 + - -3.0410156 + - 2.6503906 + - -0.4189453 + - -1.3085938 + - 0.0390625 + - 2.78125 + - -0.47607422 + - 1.9746094 + - 2.7519531 + - 2.3769531 + - 2.3945313 + - -1.4921875 + - 3.109375 + - 5.734375 + - -2.0976563 + - 1.2939453 + - 3.3359375 + - -3.3144531 + - -1.0683594 + - 0.3671875 + - -0.02017212 + - 0.77734375 + - -4.2382813 + - 0.35351563 + - -1.6689453 + - -0.40673828 + - 2.2109375 + - 1.5234375 + - 1.8798828 + - 1.8173828 + - -2.5605469 + - 6.0390625 + - 3.828125 + - 4.6328125 + - 2.7285156 + - -5.1875 + - -4.4101563 + - -1.4423828 + - -1.8642578 + - 0.46923828 + - -1.4111328 + - 0.05987549 + - -0.39941406 + - -1.3876953 + - 2.8222656 + - -3.46875 + - 1.0136719 + - 4.4101563 + - 6.9453125 + - 1.0126953 + - -2.71875 + - 0.9794922 + - 7.3203125 + - 2.2539063 + - 0.49658203 + - -0.67871094 + - -3.296875 + - 0.38500977 + - 1.3925781 + - -0.42626953 + - -3.1289063 + - 0.78515625 + - 4.7421875 + - 3.6015625 + - 0.7763672 + - 0.049621582 + - 1.4746094 + - 3.625 + - -0.47192383 + - 2.3632813 + - -5.40625 + - 0.7128906 + - -3.8945313 + - -1.4023438 + - -3.8359375 + - 1.1113281 + - 0.042297363 + - 3.78125 + - 1.6738281 + - -1.609375 + - 2.7207031 + - 1.1787109 + - -3.2285156 + - -3.4550781 + - 0.21582031 + - -3.3847656 + - -3.75 + - 3.0039063 + - -2.6367188 + - 2.1953125 + - 3.9414063 + - -1.2861328 + - -2.6171875 + - -2.7128906 + - 0.99658203 + - 1.4394531 + - -0.3371582 + - 1.3027344 + - -0.4399414 + - 2.7578125 + - 0.38012695 + - -0.80566406 + - -0.5805664 + - -2.9101563 + - 1.9453125 + - 0.02734375 + - -0.24279785 + - -2.90625 + - -2.3476563 + - 3.9804688 + - -1.3994141 + - 0.4699707 + - -1.8886719 + - 2.40625 + - -1.8144531 + - -2.8046875 + - -1.7939453 + - -0.06768799 + - 2.1445313 + - 0.60546875 + - -1.5830078 + - -0.48486328 + - 3.7910156 + - 0.011062622 + - 1.453125 + - 3.6347656 + - -2.609375 + - 2.3496094 + - -0.98828125 + - -4.1445313 + - -2.1210938 + - -1.0595703 + - 3.1601563 + - -2.0371094 + - 4.6328125 + - 1.4697266 + - 1.0527344 + - 0.29003906 + - -1.2949219 + - 0.875 + - 2.2636719 + - -0.86572266 + - -0.8051758 + - -0.8642578 + - -0.5673828 + - -1.8525391 + - -3.09375 + - 2.2988281 + - -5.9726563 + - -3.4921875 + - -4.34375 + - 1.7275391 + - 4.8203125 + - 1.8798828 + - -1.0244141 + - 0.47314453 + - 3.2109375 + - -0.9238281 + - -4.3125 + - -0.35668945 + - 0.37109375 + - -2.796875 + - -1.0546875 + - 5.34375 + - 2.2519531 + - -0.37158203 + - 0.5292969 + - -1.9462891 + - 1.5556641 + - 2.5175781 + - -1.3378906 + - 0.7993164 + - 3.6796875 + - -2.2441406 + - -1.6298828 + - 1.9345703 + - -0.6977539 + - -0.5083008 + - 1.5673828 + - -1.5605469 + - -9.109375 + - 1.8837891 + - -34.78125 + - 1.3105469 + - -0.103149414 + - -1.1875 + - -4.9765625 + - 1.0761719 + - 0.13500977 + - 0.5058594 + - 1.7402344 + - 0.8461914 + - 0.7192383 + - -1.0214844 + - 5.6796875 + - -0.13208008 + - -0.94921875 + - 2.671875 + - 0.30297852 + - -1.2099609 + - 12.359375 + - -3.2695313 + - -0.25585938 + - -0.054016113 + - 0.5961914 + - -0.43896484 + - 0.040039063 + - 6.9609375 + - -1.2011719 + - -1.4970703 + - 1.1767578 + - -2.3085938 + - -1.6259766 + - -3.5644531 + - 1.71875 + - 1.3642578 + - -1.265625 + - 2.4648438 + - 0.8828125 + - -0.21289063 + - 1.4453125 + - -1.09375 + - 3.5644531 + - -2.21875 + - -0.5566406 + - -0.55029297 + - -2.71875 + - 2.5644531 + - -0.98095703 + - 1.7158203 + - 1.4765625 + - -2.6171875 + - 0.5673828 + - -3.3632813 + - 0.09112549 + - -2.0703125 + - -1.0898438 + - 0.40039063 + - 4.875 + - -2.7441406 + - 0.22814941 + - 0.11846924 + - 0.8798828 + - -1.6914063 + - -2.1640625 + - 0.18225098 + - 7.140625 + - -0.023101807 + - 1.1025391 + - 4.8828125 + - -2.0175781 + - 2.109375 + - -1 + - -0.2578125 + - 1.65625 + - -2.5703125 + - 3.0019531 + - -2.7304688 + - 0.52197266 + - 0.45825195 + - 2.9921875 + - 0.4621582 + - -3.1210938 + - -3.3046875 + - 2.5996094 + - 0.71728516 + - 3.1191406 + - 2.5332031 + - -3.1132813 + - -0.6665039 + - 1.0673828 + - -1.2158203 + - 1.890625 + - -1.8837891 + - -0.33325195 + - -2.2519531 + - 0.7036133 + - -0.5732422 + - -3.0039063 + - 0.17382813 + - -1.0527344 + - -1.3515625 + - -2.8925781 + - -5.5546875 + - -1.2675781 + - -0.6269531 + - 0.14086914 + - 3.40625 + - 3.8125 + - 0.027496338 + - 2.4101563 + - 0.11578369 + - 1.0292969 + - 0.5839844 + - -3.0976563 + - 4.7382813 + - 0.32885742 + - 2.6835938 + - -0.51708984 + - 3.2363281 + - -1.53125 + - 3.2910156 + - 1.8261719 + - -0.6567383 + - -1.8789063 + - -1.4707031 + - 0.6298828 + - 3.1035156 + - 2.4707031 + - -0.15686035 + - 0.28808594 + - 2.7851563 + - 3.125 + - 1.9501953 + - -1.8330078 + - 1.6298828 + - 0.8754883 + - -0.6196289 + - 3.0664063 + - -1.8173828 + - -3.4101563 + - 0.859375 + - -0.61328125 + - -1.0517578 + - -2.4921875 + - -2.8378906 + - 1.5820313 + - -1.5546875 + - 3.2910156 + - -2.1308594 + - 0.8564453 + - -3.296875 + - 0.09240723 + - -1.2421875 + - 0.74072266 + - 4.7695313 + - -0.0982666 + - -0.59228516 + - 0.45825195 + - -2.6972656 + - 4.3203125 + - -2.3066406 + - 2.21875 + - -4.6015625 + - -5.1171875 + - -0.2705078 + - -2.2597656 + - -0.6220703 + - -4.3164063 + - -14.125 + - 0.76416016 + - -0.33007813 + - 6.03125 + - 2.125 + - 2.6347656 + - 0.8642578 + - 1.6621094 + - -0.38916016 + - 0.22521973 + - -1.3671875 + - -2.5566406 + - 1.9296875 + - 3.03125 + - 0.859375 + - -4.3398438 + - 1.1103516 + - -1.6923828 + - 0.54003906 + - 0.30200195 + - 2.8222656 + - 1.9316406 + - 1.0556641 + - 2.0976563 + - 2.4023438 + - -2.8769531 + - 0.9243164 + - -1.2138672 + - -20.15625 + - 1.4511719 + - -0.03125 + - 0.9589844 + - -2.6992188 + - -1.0195313 + - 1.3925781 + - 0.34179688 + - -3.6875 + - -3.0175781 + - -0.3359375 + - 1.4033203 + - -1.140625 + - -1.1269531 + - -1.1074219 + - 1.0742188 + - -6.1171875 + - -0.8149414 + - 0.15356445 + - -0.53222656 + - 1.6142578 + - 0.95166016 + - 3.1582031 + - -1.6103516 + - -0.7763672 + - 1.5488281 + - -5.1132813 + - -0.63720703 + - 1.2666016 + - -0.25048828 + - 4.2421875 + - -3.3457031 + - 0.8129883 + - 0.28076172 + - 0.28637695 + - 4.4453125 + - 0.453125 + - 1.8876953 + - -15.375 + - 0.6738281 + - -1.4277344 + - 1.5019531 + - -3.5664063 + - 2.2441406 + - -1.1171875 + - 1.8828125 + - 1.7548828 + - -0.8828125 + - 2.3339844 + - -2.0078125 + - 0.8935547 + - -0.69628906 + - 0.10107422 + - -1.4277344 + - 1.234375 + - 3.796875 + - 2.2988281 + - -5.8632813 + - -2.6738281 + - 2.9316406 + - -3.5800781 + - 0.058898926 + - 2.8007813 + - -0.007484436 + - 4.3828125 + - -2.140625 + - -3.0820313 + - 1.2695313 + - 1.8994141 + - 1.8564453 + - -0.27270508 + - -0.09033203 + - -2.21875 + - -0.3930664 + - -1.734375 + - -0.4819336 + - 0.97558594 + - 1.6064453 + - 5.0664063 + - 0.82910156 + - 1.2167969 + - 2.671875 + - -2.7382813 + - 2.1132813 + - -2.8320313 + - -1.8486328 + - -1.7109375 + - 1.9003906 + - 6.0820313 + - 1.2011719 + - 1.7392578 + - -2.7890625 + - -1.9960938 + - 2.4023438 + - 1.515625 + - 4.5390625 + - 1.1542969 + - -3.7695313 + - 2.203125 + - -0.9223633 + - 1.0097656 + - 1.5361328 + - -1.9609375 + - -3.4316406 + - 1.15625 + - 2.15625 + - -0.53125 + - 0.9609375 + - 0.53515625 + - -3.2910156 + - 2.3496094 + - -0.46484375 + - 2.5195313 + - 3.8847656 + - 0.37109375 + - -0.8173828 + - 3.7128906 + - 1.5595703 + - -2.5234375 + - -2.140625 + - 3.734375 + - -0.25878906 + - 2.7207031 + - -3.15625 + - 0.640625 + - 1.7597656 + - -2.0703125 + - 1.5878906 + - 4.65625 + - -2.2460938 + - -1.2089844 + - 0.4621582 + - 0.23046875 + - 0.65234375 + - 2.0859375 + - 1.1845703 + - 4.453125 + - 0.6455078 + - -1.2285156 + - -2.4882813 + - -2.3222656 + - 2.375 + - 0.95703125 + - 0.7109375 + - 0.83447266 + - -1.1503906 + - -4.890625 + - -0.58935547 + - 3.8535156 + - -3.0878906 + - -0.23120117 + - -2.2773438 + - -0.82421875 + - 3.7207031 + - 5.15625 + - -0.5644531 + - -3.6894531 + - 0.49169922 + - -1.1660156 + - -0.7832031 + - -1.6738281 + - 1.171875 + - -4.4453125 + - 1.03125 + - 2.7285156 + - 7.9257813 + - -1.6503906 + - 1.8007813 + - -0.10284424 + - 0.84765625 + - -1.7128906 + - -3.0039063 + - 5.2109375 + - -1.3691406 + - 3.3125 + - 3.4570313 + - -2.9375 + - -1.640625 + - -5.34375 + - 2.0117188 + - 1.3642578 + - -0.19213867 + - -2.0703125 + - -3.9003906 + - 3.3359375 + - -1.1699219 + - -1.5244141 + - 1.2226563 + - 0.6279297 + - 0.15734863 + - 2.0175781 + - 5.6484375 + - -0.7236328 + - -1.1660156 + - 0.6064453 + - 3.34375 + - 1.7587891 + - -0.8173828 + - -4.1953125 + - -2.0117188 + - -1.7128906 + - 0.82910156 + - 1.3769531 + - 4.546875 + - -1.8222656 + - 2.21875 + - 1.09375 + - -2.6308594 + - 4.1640625 + - 1.5439453 + - 0.26367188 + - -1.7441406 + - -3.578125 + - 3.9882813 + - -3.328125 + - 0.90722656 + - -2.671875 + - 2.7753906 + - 2.3183594 + - -1.0273438 + - -0.5024414 + - 1.0234375 + - -2.6289063 + - 2.1738281 + - -0.72265625 + - 3.3769531 + - -0.25805664 + - 6.3945313 + - -2.5878906 + - -2.703125 + - 1.6796875 + - -1.2431641 + - 7.5664063 + - 3.5898438 + - 0.035949707 + - 0.5727539 + - -0.50683594 + - -0.36083984 + - 4.1171875 + - -0.6035156 + - 0.020828247 + - -0.05987549 + - 0.39941406 + - 2.5273438 + - -1.7587891 + - -2.0585938 + - -1.0625 + - -4.734375 + - 2.828125 + - -3.1738281 + - -2.3417969 + - 0.9707031 + - 1.2626953 + - -5.4726563 + - -1.2929688 + - -0.06347656 + - 1.7470703 + - 0.00504303 + - -1.1835938 + - 1.6425781 + - 0.033233643 + - -2.4277344 + - 3.703125 + - -0.30297852 + - 2.53125 + - 2.7460938 + - -3.7070313 + - -0.54589844 + - 2.6015625 + - -5.0039063 + - -0.7246094 + - -0.12365723 + - 0.7236328 + - 1.2978516 + - -1.3496094 + - -1.1367188 + - 1.421875 + - -0.7368164 + - 4.34375 + - -0.6015625 + - 4.796875 + - -0.0065078735 + - 2.9765625 + - -3.8984375 + - -2.9101563 + - -1.9511719 + - -3.1132813 + - -0.38012695 + - 0.099609375 + - 2.0019531 + - -3.5 + - -0.16796875 + - -0.16796875 + - -4.3671875 + - 2.1914063 + - 1.4023438 + - 1.7861328 + - -1.3066406 + - -0.28515625 + - -12.4453125 + - 4.234375 + - 2.2773438 + - 0.4777832 + - 2.3027344 + - -1.7939453 + - -3.65625 + - -0.48291016 + - 0.83447266 + - 3.3320313 + - -1.3720703 + - -0.60253906 + - 3.6035156 + - 2.3222656 + - 0.12719727 + - -3.0273438 + - -3.0878906 + - -0.09765625 + - -1.046875 + - -3.7695313 + - -1.5283203 + - 0.57910156 + - -1.3457031 + - 2.0332031 + - -0.2524414 + - -4.9101563 + - 3.1757813 + - 5.2890625 + - 0.6801758 + - 2.0097656 + - 0.36767578 + - 1.0224609 + - 3.0175781 + - 1.7402344 + - 2.921875 + - -0.20898438 + - 0.8227539 + - -1.5205078 + - 1.2421875 + - 1.5644531 + - 2.0195313 + - 1.1933594 + - -2.1523438 + - 5.171875 + - 2.9472656 + - -4.359375 + - -74 + - 2.8378906 + - -2.5117188 + - -1.3486328 + - 2.9960938 + - 4.4765625 + - 1.4042969 + - 1.7890625 + - -0.31225586 + - -3.9003906 + - 0.15649414 + - 0.43408203 + - 1.59375 + - 1.7929688 + - 0.35351563 + - -4.7421875 + - -1.1943359 + - -4.5 + - 0.43603516 + - 1.1015625 + - 2.3300781 + - 0.76416016 + - 1.6015625 + - 0.009765625 + - -3.1367188 + - -3.609375 + - 0.69384766 + - -2.5351563 + - 2.0429688 + - -0.9970703 + - 0.6977539 + - -4.625 + - 1.1503906 + - -1.109375 + - -2.8691406 + - 0.057617188 + - 2.0605469 + - -0.8798828 + - -0.65625 + - -3.3476563 + - 1.0224609 + - 1.2070313 + - 2.9316406 + - 2.0273438 + - 0.46044922 + - -1.5625 + - 0.9404297 + - 0.9863281 + - 1.1357422 + - 0.92871094 + - 3.03125 + - -0.49072266 + - -0.23156738 + - 19.15625 + - -5.7578125 + - 2.671875 + - -0.35791016 + - 2.8398438 + - 1.6015625 + - -7.21875 + - 4.8789063 + - 3.3378906 + - -0.16320801 + - -1.0761719 + - 0.14282227 + - 1.4921875 + - -4.6132813 + - 1.3359375 + - -1.4375 + - -1.1367188 + - -2.4160156 + - 3.5351563 + - 3.3359375 + - 2.9257813 + - 1.546875 + - -1.859375 + - -2.5507813 + - -0.75439453 + - 0.39257813 + - 1.6806641 + - -0.29638672 + - 0.5517578 + - -2.9238281 + - -2.5488281 + - -0.09875488 + - -2.3613281 + - 0.80859375 + - 3.3671875 + - -0.37353516 + - -0.94189453 + - -2.9472656 + - -1.59375 + - 0.87353516 + - 3.4414063 + - -0.61572266 + - 6.9140625 + - 2.8085938 + - 4.1640625 + - -2.9472656 + - 0.04425049 + - -0.2512207 + - -0.36157227 + - -1.2441406 + - 2.7734375 + - 0.2548828 + - -1.2197266 + - -0.13867188 + - -0.88134766 + - 1.8203125 + - -0.86328125 + - 6.1328125 + - 23.078125 + - -0.640625 + - -1.1552734 + - -3.1484375 + - 1.96875 + - 0.2619629 + - 3.5 + - 2.5332031 + - -2.0078125 + - -2.0585938 + - 5.171875 + - 1.8515625 + - 0.49267578 + - -1.8642578 + - 1.5039063 + - 1.1074219 + - -3.0820313 + - 0.1126709 + - 0.020507813 + - 4.2539063 + - 0.5571289 + - 1.0449219 + - 1.2050781 + - -0.7529297 + - 1.6533203 + - 0.54345703 + - -1.1298828 + - 4.90625 + - 2.0253906 + - -1.7011719 + - -2.59375 + - 2.421875 + - 0.57714844 + - -2.9003906 + - 0.32543945 + - -2.1386719 + - -1.9335938 + - -2.2304688 + - 3.2929688 + - 1.0253906 + - 1.3085938 + - 3.3359375 + - 1.0859375 + - -2.28125 + - -0.46533203 + - 5.328125 + - -0.6411133 + - 0.8408203 + - 1.609375 + - 2.7539063 + - 1.0498047 + - -5.109375 + - -1.2265625 + - 2.2773438 + - 6.6171875 + - -0.80566406 + - -1.7910156 + - 0.9345703 + - -3.9726563 + - -0.38012695 + - 2.0957031 + - -2.3828125 + - -0.13085938 + - -0.83251953 + - 3.265625 + - 2.40625 + - 1.1796875 + - 1.0087891 + - 1.0927734 + - -1.578125 + - -1.7167969 + - -4.4414063 + - 1.3691406 + - 1.1953125 + - -0.39892578 + - -1.78125 + - 0.022125244 + - -1.5292969 + - -0.37841797 + - -12.890625 + - 0.45507813 + - 0.3371582 + - -2.0722656 + - 1.0898438 + - -2.3398438 + - -1.0986328 + - 0.5566406 + - -0.47998047 + - 0.8769531 + - 2.7753906 + - 1.2236328 + - 4.3203125 + - 0.9736328 + - -1.7363281 + - 1.8417969 + - -3.8476563 + - -4.1875 + - -3.3710938 + - 0.15356445 + - -0.93847656 + - -3.78125 + - 2.765625 + - 0.87597656 + - -0.59814453 + - 0.7939453 + - 2.0429688 + - 5.7382813 + - 1.1347656 + - 0.28833008 + - 1.3955078 + - 4.2421875 + - -3.3125 + - -3.8554688 + - -0.09729004 + - 0.62353516 + - 2.703125 + - 0.68652344 + - -0.009109497 + - -2.28125 + - 2.0820313 + - 1.9179688 + - 0.4663086 + - -1.8876953 + - -2.1523438 + - 1.4589844 + - -2.4394531 + - 2.921875 + - 1.8095703 + - 0.32348633 + - 2.796875 + - 2.1875 + - -0.23535156 + - 1.4736328 + - -5.1484375 + - -4.3945313 + - -2.734375 + - 1.6347656 + - 2.125 + - -2.2695313 + - -2.4472656 + - -2.3398438 + - -4.4101563 + - -5.8007813 + - 1.4511719 + - -0.27783203 + - 2.2617188 + - -0.6044922 + - -1.1474609 + - -4.0625 + - -0.54589844 + - 1.5429688 + - 0.8984375 + - -0.3857422 + - 0.41015625 + - 0.8071289 + - 18 + - 0.61035156 + - -0.3479004 + - 1.5517578 + - 15.2578125 + - 0.20629883 + - 0.33007813 + - -0.16113281 + - 1.203125 + - -3.4609375 + - -0.73876953 + - 5.375 + - -0.5419922 + - 6.1171875 + - 0.9165039 + - 2.5566406 + - 0.52783203 + - -0.033843994 + - -2.7851563 + - -3.9609375 + - 7.0195313 + - -0.013832092 + - 2.2988281 + - 5.2890625 + - 0.9433594 + - -4.2109375 + - 0.5439453 + - 3.828125 + - 1.3691406 + - 0.084472656 + - -0.51416016 + - 1.9941406 + - 1.6728516 + - -0.5073242 + - -5.7734375 + - 0.1652832 + - -0.6064453 + - -0.9238281 + - -1.2880859 + - -3.7226563 + - 2.8769531 + - -0.27929688 + - -5.875 + - -1.0927734 + - 2.8789063 + - 0.14172363 + - -0.5678711 + - 0.37646484 + - 0.35205078 + - -4.265625 + - 4.203125 + - -1.1142578 + - 4.21875 + - 2.7851563 + - 2.6621094 + - -2.9238281 + - -0.36621094 + - -0.20227051 + - -2.7597656 + - -3.7851563 + - 4.2851563 + - 2.3164063 + - 0.47387695 + - -1.5878906 + - 1.0175781 + - -2.8925781 + - 2.2695313 + - -3.6914063 + - -2.90625 + - 1.0556641 + - -2.7617188 + - -2.3828125 + - 1.1035156 + - 3.6796875 + - -4.1796875 + - -3.6328125 + - -1.0761719 + - -3.8164063 + - -1.3251953 + - -3.2695313 + - 0.6142578 + - 0.33642578 + - -0.60546875 + - -3.3632813 + - 0.27856445 + - 2.4804688 + - -0.005859375 + - -3.453125 + - -3.1875 + - -0.30273438 + - 0.27001953 + - -0.025390625 + - -5.6132813 + - -2.9941406 + - -5.875 + - 3.1484375 + - 0.44140625 + - -1.6796875 + - -1.0410156 + - -3.4160156 + - 3.5820313 + - -0.81347656 + - 3.03125 + - 2.9101563 + - -5.4765625 + - 0.8930664 + - 1.3232422 + - -0.7001953 + - 4.234375 + - -2.5605469 + - 1.375 + - -0.32641602 + - 0.43847656 + - -1.6894531 + - -3.4863281 + - -0.0013017654 + - 2.3457031 + - -1.5449219 + - 1.9824219 + - -2.0859375 + - 0.011390686 + - -6.4765625 + - -0.7265625 + - 1.3144531 + - 0.72265625 + - 1.9667969 + - 3.2285156 + - 2.4492188 + - 3.2753906 + - -0.6191406 + - -0.20715332 + - -0.6738281 + - -1.6425781 + - -2.0429688 + - 2.75 + - 0.39453125 + - -2.234375 + - 1.2246094 + - 1.4462891 + - -1.1611328 + - -0.14904785 + - -3.4726563 + - -3.0878906 + - -0.2697754 + - 0.72753906 + - -1.2978516 + - 1.9814453 + - 1.6972656 + - 2.2578125 + - 4.6132813 + - 2.875 + - -1.4121094 + - -1.1679688 + - -5.0742188 + - 3.8691406 + - 3.1660156 + - -0.63134766 + - 3.8515625 + - 3.4023438 + - -4.703125 + - 0.8173828 + - 1.71875 + - -3.1015625 + - 1.7080078 + - -2.8554688 + - -0.7597656 + - -0.9326172 + - -0.109191895 + - 2.6972656 + - -0.2130127 + - -1.6132813 + - -4.0234375 + - 0.5908203 + - 1.0527344 + - -0.95751953 + - 1.6660156 + - -5.7226563 + - 3.6679688 + - -0.9609375 + - 1.8105469 + - 1.2666016 + - -2.5253906 + - 4.5742188 + - -2.3535156 + - 1.1855469 + - -1.7353516 + - 0.3647461 + - 0.4621582 + - -0.17773438 + - 2.1914063 + - -0.123046875 + - -1.8798828 + - -2.0722656 + - 2.4160156 + - -0.6821289 + - 0.9145508 + - -0.6699219 + - 3.6347656 + - -0.4506836 + - -2.5234375 + - 0.36083984 + - 3.8867188 + - 1.0419922 + - 0.26171875 + - -3.0488281 + - -1.7773438 + - -3.5644531 + - 8.484375 + - -2.2363281 + - 0.8208008 + - -1.0859375 + - 3.5 + - -1.0898438 + - 0.34301758 + - 3.1035156 + - -2.7539063 + - -0.7392578 + - -0.31958008 + - 1.5429688 + - -4.7421875 + - -1.5078125 + - 4.9453125 + - -2.2304688 + - 4.4765625 + - -0.57910156 + - 0.50097656 + - 0.8066406 + - 3.640625 + - 0.65185547 + - -1.6796875 + - -1.2626953 + - 1.1816406 + - -0.93847656 + - -5.1484375 + - 2.796875 + - -1.8652344 + - -3.5488281 + - -0.9433594 + - 1.9453125 + - 0.96191406 + - 2.0449219 + - -3.4863281 + - -1.5751953 + - 0.7236328 + - -0.9736328 + - -2.9609375 + - -4.0078125 + - 0.32543945 + - -3.0625 + - -1.9082031 + - 0.2536621 + - 1.0478516 + - -0.12597656 + - 2 + - 2.5058594 + - -1.6220703 + - -1.5644531 + - 2.1894531 + - 0.51660156 + - -0.79296875 + - -0.96533203 + - -2.53125 + - -1.0117188 + - 0.8876953 + - -1.3691406 + - -1.8613281 + - -3.0410156 + - -1.7900391 + - 1.9658203 + - -0.9121094 + - -0.27783203 + - 1.84375 + - 0.3996582 + - -1.0654297 + - -2.6601563 + - 2.1464844 + - -1.9316406 + - -2.9375 + - -2.375 + - -3.4160156 + - -2.4570313 + - 0.39501953 + - -1.2490234 + - 0.6035156 + - 4.7578125 + - 6.3125 + - -5.4570313 + - -1.9628906 + - -2.4863281 + - 4.7382813 + - -4.0429688 + - -2.8476563 + - 1.1337891 + - -2.4941406 + - -2.9492188 + - 0.68847656 + - 3.1503906 + - 1.1210938 + - -3.1191406 + - -0.6035156 + - -1.3535156 + - -1.6064453 + - 1.7626953 + - -1.9804688 + - -2.0917969 + - -1.3691406 + - -0.78222656 + - -3.7675781 + - 1.9072266 + - -1.2460938 + - 1.421875 + - -3.3378906 + - -0.48364258 + - 2.4375 + - -3.7910156 + - 9.40625 + - -3.3320313 + - -2.0078125 + - 4.4375 + - -0.16247559 + - 1.2167969 + - -1.5859375 + - -0.02961731 + - -2.2871094 + - 2.2089844 + - 6.4101563 + - -3.5625 + - -2.1816406 + - 5.1523438 + - -1.3691406 + - 1.7929688 + - -0.002603531 + - -2.6015625 + - 2.2851563 + - 3.7988281 + - -3.9414063 + - 1.6425781 + - -4.6875 + - -0.8071289 + - 3.3984375 + - -9.109375 + - -0.5864258 + - 5.3945313 + - -1.7861328 + - -1.1875 + - -0.7871094 + - 4.5507813 + - -3.2207031 + - -4.96875 + - -2.0664063 + - 0.5048828 + - 5.0429688 + - 1.0175781 + - 2.0585938 + - -0.9560547 + - -2.4648438 + - 0.03286743 + - -4.28125 + - -1.1728516 + - -0.59814453 + - 3.75 + - 1.2246094 + - -2.6386719 + - -3.546875 + - 0.17114258 + - -0.09472656 + - 1.046875 + - 1.3876953 + - 0.7265625 + - -0.47998047 + - -4.1953125 + - -1.9609375 + - -1.9501953 + - 1.5605469 + - 0.39990234 + - -0.71533203 + - -0.57470703 + - -3.5820313 + - -4.4570313 + - 2.1445313 + - 0.7578125 + - 0.18676758 + - -4.5039063 + - -0.08135986 + - -0.09631348 + - -1.8847656 + - -1.8984375 + - -0.3400879 + - -0.47998047 + - 3.1347656 + - -4.1328125 + - -0.8232422 + - 0.71777344 + - 2.1777344 + - -0.30322266 + - -1.8798828 + - -2.1523438 + - -0.1282959 + - 0.35302734 + - -5.2109375 + - 1.0439453 + - 3.7890625 + - 4.3203125 + - 0.9946289 + - 1.1191406 + - 0.5551758 + - 4.265625 + - 2.5566406 + - -3.1757813 + - 1.3759766 + - 1.7705078 + - 1.8789063 + - -3.515625 + - -0.57177734 + - 2.5957031 + - 2.7441406 + - 1.4775391 + - -1.7666016 + - 1.953125 + - -1.8046875 + - -0.12524414 + - 3.5 + - 0.18225098 + - -0.95703125 + - 4.3671875 + - -1.4648438 + - -0.9501953 + - -1.2714844 + - -1.8515625 + - -3.8671875 + - 0.9248047 + - 3.5644531 + - -3.2851563 + - -1.8759766 + - 0.5234375 + - 0.77441406 + - 5.0390625 + - 8.03125 + - -3.0878906 + - 0.10675049 + - -1.6738281 + - -1.5683594 + - 0.5629883 + - 0.98876953 + - -0.9711914 + - 3.5039063 + - -3.0117188 + - -4.2851563 + - -0.75097656 + - -2.6523438 + - -1.5585938 + - -0.95214844 + - -1.8955078 + - 2.4238281 + - 4.09375 + - 1.0087891 + - 2.1328125 + - 3.6210938 + - -1.8876953 + - -1.6953125 + - -0.9736328 + - 0.97509766 + - 1.7695313 + - 0.19726563 + - -2.953125 + - 0.07519531 + - -1.6572266 + - -0.55078125 + - -3.4492188 + - 0.86572266 + - -0.40283203 + - 0.51953125 + - -1.6298828 + - 1.9462891 + - -3.2382813 + - -0.4543457 + - 0.08459473 + - -0.3725586 + - 8.359375 + - -1.9736328 + - 3.078125 + - -6.90625 + - 3.5019531 + - 3.078125 + - -2.7441406 + - 1.2988281 + - 1.2304688 + - -0.87109375 + - -2.9941406 + - 0.11242676 + - -1.0742188 + - -1.0800781 + - -2.8847656 + - -0.8496094 + - -1.4003906 + - 4.9375 + - 0.011062622 + - 0.7714844 + - 0.9321289 + - -1.015625 + - 2.1484375 + - -3.4726563 + - 1.3017578 + - -0.2043457 + - 5.09375 + - -3.7441406 + - -3.4375 + - 2.5917969 + - -1.7236328 + - -2.96875 + - 2.671875 + - 0.48486328 + - -0.53515625 + - 1.5644531 + - 3.8925781 + - 1.5 + - -7.15625 + - 4.25 + - 0.5839844 + - -0.67089844 + - 1.4267578 + - -4.046875 + - 0.06085205 + - 1.5019531 + - -1.2285156 + - 3.0351563 + - -8 + - 2.3476563 + - -1.1425781 + - -0.47070313 + - -1.9033203 + - -1.4580078 + - 1.0644531 + - -0.9482422 + - 0.2734375 + - 1.9316406 + - 2.546875 + - 0.7626953 + - 0.62109375 + - -5.0507813 + - 0.8696289 + - 1.1464844 + - -0.50390625 + - 1.9472656 + - 0.26611328 + - -1.3447266 + - -1.2792969 + - -1.2011719 + - 2.8242188 + - 0.17150879 + - 2.7617188 + - 1.6142578 + - -4.9765625 + - 1.6386719 + - -1.9648438 + - -0.50683594 + - 0.005207062 + - 2.0917969 + - -1.3164063 + - -0.09765625 + - 7.171875 + - -1.4003906 + - -0.5078125 + - 4.2070313 + - 0.94628906 + - 0.2685547 + - -1.9238281 + - 2.2226563 + - 7 + - -1.4765625 + - -0.40161133 + - -0.4025879 + - -2.8945313 + - 4.7265625 + - -1.5859375 + - -3.6289063 + - -0.18481445 + - -1.7050781 + - -1.0244141 + - 0.16992188 + - 1.2441406 + - -4.1796875 + - 0.11584473 + - 0.12695313 + - 2.6210938 + - 3.7070313 + - 3.140625 + - 1.1640625 + - 0.17138672 + - 3.2753906 + - 0.6040039 + - -5.0703125 + - 3.1875 + - -3.40625 + - -3.4101563 + - -18.828125 + - -3.3867188 + - 0.34033203 + - 4.5078125 + - -4.2578125 + - 1.8261719 + - -15.546875 + - -6.8320313 + - -0.25146484 + - -1.1142578 + - 1.4101563 + - -2.1464844 + - -0.06311035 + - 5.6132813 + - 0.609375 + - 2.4941406 + - -0.095703125 + - 1.9628906 + - 1.8984375 + - -5.0390625 + - -1.5390625 + - 2.4101563 + - -1.3535156 + - 0.25048828 + - 1.6494141 + - -1.015625 + - 1.8330078 + - 0.032226563 + - -0.41333008 + - 1.9814453 + - -1.1152344 + - -5.0820313 + - 1.7158203 + - -2.3613281 + - 1.0039063 + - 1.1445313 + - 1.1855469 + - -2.3222656 + - 2.7597656 + - -2.234375 + - 0.30615234 + - 5.46875 + - 1.4003906 + - 0.33520508 + - -3.1113281 + - -0.9633789 + - 4.3125 + - -1.6455078 + - -1.6640625 + - 2.0117188 + - 2.4179688 + - 2.7929688 + - -1.6152344 + - -3.4414063 + - 0.44848633 + - -4.8984375 + - 1.0996094 + - 2.5820313 + - -3.7226563 + - -0.3215332 + - 0.93066406 + - -0.83447266 + - -0.38891602 + - 4.9296875 + - 2.3300781 + - 1.1542969 + - -2.9375 + - 0.4338379 + - 4.8984375 + - -0.52441406 + - -1.5908203 + - 2.5117188 + - -2.2929688 + - -0.87890625 + - -0.81347656 + - 1.4589844 + - -2.6425781 + - 0.38598633 + - 1.1855469 + - -2.0429688 + - 1.2470703 + - 4.2695313 + - 0.028320313 + - 0.12109375 + - -1.5 + - -4.3828125 + - 0.85791016 + - -2.6386719 + - 1.0341797 + - 0.2199707 + - -1.5253906 + - 1.3408203 + - -3.5625 + - -6.9882813 + - 0.3203125 + - -5.7578125 + - -0.9042969 + - 1.4853516 + - 1.3212891 + - -2.4160156 + - 1.0097656 + - -4.296875 + - -2.8925781 + - -3.3789063 + - -0.86572266 + - -1.8447266 + - -0.057922363 + - 4.3164063 + - -0.41357422 + - 2.2128906 + - -1.5957031 + - -3.0332031 + - -0.6298828 + - -1.1777344 + - -1.6542969 + - -0.5727539 + - 1.0410156 + - -2.8066406 + - 1.28125 + - -0.25708008 + - 2.5664063 + - -0.70214844 + - 2.6191406 + - -4.8320313 + - -2.2207031 + - 1.0322266 + - -4.5859375 + - -3.4707031 + - -0.82421875 + - 5.265625 + - 7.21875 + - -0.6113281 + - 0.14709473 + - 4.6757813 + - 3.2539063 + - -1.8515625 + - -0.8154297 + - -3.2285156 + - 1.9921875 + - 2.2148438 + - 0.71191406 + - -1.3535156 + - -1.4267578 + - 0.17541504 + - -3.3007813 + - -3.7207031 + - 1.2480469 + - -0.7211914 + - -1.2402344 + - -1.46875 + - -2.3671875 + - 1.3730469 + - 1.1972656 + - -1.9931641 + - 0.008460999 + - -2.7753906 + - -0.9765625 + - 1.4550781 + - 0.67089844 + - -2.78125 + - -3.9765625 + - -0.6464844 + - 0.97314453 + - 5.7226563 + - -1.7617188 + - 0.43798828 + - 2.4648438 + - 14.609375 + - -0.89160156 + - -3.5488281 + - 1.40625 + - -0.9633789 + - 4.6914063 + - -1.7617188 + - -9.1640625 + - 2.9785156 + - -1.6113281 + - 6.59375 + - 1.1025391 + - 0.38330078 + - 0.045898438 + - 1.7861328 + - 3.0253906 + - 1.6845703 + - -4.0664063 + - -0.6582031 + - -3.8476563 + - 1.6376953 + - -0.35473633 + - 1.7167969 + - -2.7832031 + - -1.6972656 + - 2.6484375 + - 0.05532837 + - -3.84375 + - -1.9736328 + - -1.2441406 + - -0.29760742 + - -0.20874023 + - 2.203125 + - -1.1289063 + - -1.96875 + - -1.7617188 + - -0.79589844 + - 2.0644531 + - -0.5283203 + - 0.4560547 + - -3.6113281 + - 4.2109375 + - 0.63623047 + - -3.1875 + - 1.65625 + - -2.8632813 + - -0.3671875 + - 2.3632813 + - -3.359375 + - 4.921875 + - 3.6289063 + - -0.55371094 + - 4.6875 + - -0.86621094 + - -1.6542969 + - 2.203125 + - 2.4003906 + - 2.4804688 + - -3.4003906 + - 2.6289063 + - -3.3457031 + - 4.8164063 + - 1.4804688 + - -1.8515625 + - -1.4667969 + - 2.953125 + - 0.6767578 + - -1.7666016 + - -2.9804688 + - -2.3554688 + - -0.016921997 + - 0.037261963 + - 1.6191406 + - 0.22387695 + - -1.9355469 + - -5.296875 + - 4.078125 + - -0.28320313 + - -2.9921875 + - -0.9472656 + - -0.5205078 + - 0.09436035 + - -0.024734497 + - -2.2226563 + - 0.18859863 + - 1.2792969 + - -1.7587891 + - 3.96875 + - -1.8046875 + - 1.1855469 + - 1.0712891 + - -3.03125 + - 1.1933594 + - -0.15588379 + - 1.9921875 + - 0.24865723 + - -1.7714844 + - 4.5234375 + - -2.078125 + - 1.8681641 + - 0.98046875 + - -0.33520508 + - -3.5195313 + - 4.7617188 + - 1.1386719 + - 0.24902344 + - -0.84277344 + - 0.40625 + - 3.7910156 + - -1.0361328 + - -2.6679688 + - -2.609375 + - -3.3378906 + - -0.018875122 + - -2.0644531 + - 1.3408203 + - 0.50146484 + - -1.4648438 + - -0.016921997 + - -3.7734375 + - 4.8984375 + - 22.46875 + - -2.5898438 + - 3.4765625 + - -0.9609375 + - 0.2861328 + - 0.2746582 + - 1.0527344 + - -3.6113281 + - 2.140625 + - -0.7060547 + - -2.6640625 + - 0.59277344 + - -2.5039063 + - -2.0117188 + - 0.6923828 + - 2.953125 + - -7.484375 + - 0.6113281 + - -0.24182129 + - 10.84375 + - -4.5 + - 2.25 + - 1.5820313 + - -0.46020508 + - 1.2763672 + - -1.4472656 + - -0.5859375 + - -2.4902344 + - 0.30664063 + - -0.7626953 + - -23.875 + - 0.13769531 + - -1.609375 + - 1.1171875 + - -2.3710938 + - -1.8945313 + - 1.0908203 + - 2.4921875 + - -3.21875 + - 0.11340332 + - -0.6767578 + - -0.44580078 + - -2.875 + - -1.1230469 + - -1.984375 + - -0.86376953 + - -3.296875 + - -0.4555664 + - -0.8203125 + - -0.15454102 + - -3.6738281 + - 2.9804688 + - 0.12854004 + - -1.1914063 + - 4.0234375 + - -1.8564453 + - -0.83984375 + - -1.3613281 + - 4.6640625 + - -1.8671875 + - 0.28735352 + - 2.7363281 + - -6.1015625 + - 0.7290039 + - -1.3056641 + - 3.7695313 + - -1.1601563 + - 1.0625 + - -3.78125 + - 2.2773438 + - 0.2277832 + - -0.37817383 + - -5.8515625 + - 3.671875 + - -1.3378906 + - -2.1328125 + - 2.2304688 + - 1.4345703 + - 1.7617188 + - 3.8515625 + - 1.5800781 + - -0.875 + - -2.1171875 + - 2.2539063 + - 4.5703125 + - 1.1855469 + - -1.3242188 + - -2.28125 + - -1.7871094 + - -0.83691406 + - -1.1425781 + - 0.06542969 + - 2.5722656 + - 3.4179688 + - 0.3774414 + - 3.0566406 + - 4.8046875 + - 3.234375 + - -0.27661133 + - -0.28564453 + - 0.32421875 + - -2.1894531 + - -0.26611328 + - -1.7158203 + - -0.8017578 + - 0.16564941 + - -3.03125 + - 0.86035156 + - -4.609375 + - -0.38916016 + - -3.0253906 + - -3.7070313 + - 1.2519531 + - 0.6308594 + - 2.625 + - -1.171875 + - 1.8955078 + - 4.3671875 + - 0.7158203 + - 0.41308594 + - -3.3222656 + - 3.0195313 + - 2.3242188 + - -1.4941406 + - -1.5791016 + - 5.890625 + - 0.2578125 + - 3.5039063 + - -1.0683594 + - -0.35864258 + - 1.4765625 + - 0.49047852 + - 3.7050781 + - 0.25341797 + - 0.31298828 + - -0.7685547 + - -3.1914063 + - -8.0859375 + - 1.5517578 + - -0.95751953 + - 2.3789063 + - 2.1582031 + - 0.8828125 + - 0.17248535 + - 2.7675781 + - 0.2130127 + - 0.421875 + - 1.1416016 + - -0.037750244 + - 3.7109375 + - 2.0234375 + - -0.0234375 + - -0.38476563 + - 0.5810547 + - -3.2597656 + - 7.3515625 + - 1.3300781 + - 2.2382813 + - 8.9453125 + - 14.390625 + - -0.80566406 + - -2.8847656 + - -0.19458008 + - -1.0244141 + - -0.7836914 + - 2.0332031 + - -0.25024414 + - 1.1953125 + - 0.16796875 + - -2.890625 + - 0.45751953 + - 2.0722656 + - 1.1640625 + - 0.4345703 + - 1.5634766 + - -0.96972656 + - 2.1953125 + - -1.9414063 + - -2.859375 + - -4.1640625 + - -1.1455078 + - 1.7265625 + - -0.72753906 + - -1.5800781 + - -4.5078125 + - -0.3244629 + - 0.98828125 + - 0.46923828 + - -1.0166016 + - -0.921875 + - -1.7265625 + - 3.3476563 + - -1.6611328 + - 1.7001953 + - 3.6132813 + - -0.921875 + - 0.4807129 + - -1.1152344 + - -1.2421875 + - 5.4375 + - -0.59765625 + - 0.88134766 + - -2.1542969 + - -0.44482422 + - -2.8945313 + - 4.2382813 + - -0.16369629 + - -3.4921875 + - -0.6894531 + - 3.8164063 + - -0.084472656 + - -0.40820313 + - 2.1269531 + - 1.9228516 + - 0.33813477 + - -3.0234375 + - -1.9277344 + - 0.22521973 + - 1.9921875 + - -1.0722656 + - 4.4375 + - 1.8457031 + - 3.5722656 + - 2.5078125 + - -2.7578125 + - 1.578125 + - -2.203125 + - 1.3535156 + - -0.59228516 + - -2.2070313 + - -1.0908203 + - 0.69628906 + - -0.20605469 + - 1.6328125 + - 2.4882813 + - -0.27734375 + - 0.00894928 + - 1.8417969 + - 0.70947266 + - 19.9375 + - -5.421875 + - -0.47705078 + - -4.2617188 + - -0.38085938 + - -0.26123047 + - 3.9101563 + - -0.67578125 + - -5.5078125 + - 3.8789063 + - 2.0234375 + - -0.032958984 + - 3.9257813 + - 3.5195313 + - 1.5126953 + - -0.68847656 + - 1.3222656 + - -5.328125 + - 3.4375 + - 1.8378906 + - -2.4726563 + - -0.5859375 + - -5.9882813 + - 2.4960938 + - -1.7119141 + - 0.8515625 + - -2.0839844 + - -0.019195557 + - 3.28125 + - -4.8828125 + - -1.3984375 + - -0.5126953 + - 0.5415039 + - 1.3134766 + - 3.7304688 + - 3.6660156 + - 5.8046875 + - 2.1132813 + - 2.4023438 + - 1.6210938 + - -3.3398438 + - -3.9472656 + - -1.1796875 + - 3.84375 + - 0.10559082 + - -1.4814453 + - -0.6899414 + - 4.0078125 + - 3.6445313 + - 2.0800781 + - -1.0830078 + - -2.6660156 + - 0.17626953 + - 15.890625 + - -3.5195313 + - -0.6542969 + - 1.1113281 + - -1.2714844 + - 0.5058594 + - 0.9790039 + - 2.1953125 + - -0.5185547 + - -0.015296936 + - -4.8710938 + - 0.45214844 + - -2.0976563 + - -1.7587891 + - -2.125 + - 1.3242188 + - -4.9453125 + - 0.9404297 + - 4.203125 + - -0.4453125 + - -2.0117188 + - 0.36254883 + - -2.5371094 + - -2.7109375 + - -0.4736328 + - 2.5546875 + - -3.6171875 + - 0.15441895 + - 0.32421875 + - 2.2421875 + - -0.05859375 + - -3.4414063 + - -2.7285156 + - -1.0400391 + - -1.2080078 + - -3.3789063 + - 0.6201172 + - -1.7148438 + - 0.9399414 + - 1.8457031 + - -1.9355469 + - 3.90625 + - -4.4609375 + - -2.8554688 + - -2.0859375 + - 1.0449219 + - 1.4804688 + - -0.51953125 + - -1.2929688 + - -0.90527344 + - 0.8515625 + - 1.4267578 + - -3.1972656 + - -1.7519531 + - 2.1191406 + - -2.0507813 + - 3.3066406 + - -0.96972656 + - -1.0117188 + - 3.6445313 + - 1.2128906 + - 0.75097656 + - -1.8925781 + - -4.4296875 + - 0.74072266 + - -2.7304688 + - 0.15820313 + - 2.0390625 + - 1.1806641 + - 0.02407837 + - 0.5703125 + - 0.74072266 + - -0.08947754 + - -0.68359375 + - -1.7851563 + - 1.2402344 + - 3.0722656 + - -3.7363281 + - 3.4804688 + - 1.5947266 + - -0.026687622 + - 1.8457031 + - 0.85595703 + - -8.34375 + - -4.5585938 + - -3.8925781 + - 0.21704102 + - -1.9277344 + - -0.074035645 + - -3.1953125 + - 3.359375 + - -2.5019531 + - 2.3535156 + - 5.03125 + - 7.1015625 + - -1.28125 + - 2.2109375 + - -1.2626953 + - 4.90625 + - -2.3300781 + - -0.8876953 + - 3.109375 + - -2.2070313 + - 1.9785156 + - 0.4543457 + - 0.93359375 + - -4.9882813 + - 2.4570313 + - -3.2910156 + - 0.19396973 + - 1.6191406 + - 1.2207031 + - -0.625 + - 0.5185547 + - 0.04751587 + - -2.078125 + - 4.3671875 + - 0.640625 + - 1.1728516 + - -0.67871094 + - -2.7265625 + - 1.984375 + - 2.21875 + - 4.2890625 + - 0.5439453 + - 0.80371094 + - 0.15490723 + - 3.796875 + - -1.3603516 + - -1.71875 + - -1.0683594 + - 0.6743164 + - 2.1289063 + - 3.1289063 + - -0.6176758 + - 3.4003906 + - 0.15136719 + - -2.7050781 + - 0.34594727 + - 2.5898438 + - 0.5234375 + - 5.5625 + - 0.91015625 + - 1.4609375 + - 14.859375 + - -1.3017578 + - 1.3212891 + - -5.2421875 + - -0.5214844 + - -2.3046875 + - 1.4150391 + - -1.203125 + - 3.953125 + - -2.0097656 + - -2.6992188 + - -0.8046875 + - 0.28833008 + - 2.7597656 + - 0.049804688 + - 0.91308594 + - -5.5703125 + - 0.25390625 + - 0.22265625 + - 0.024734497 + - -0.67626953 + - 1.3320313 + - -1.0410156 + - -3.640625 + - -0.25341797 + - 1.3417969 + - -1.5166016 + - -4.3671875 + - -2.4472656 + - 0.5439453 + - -1.8212891 + - -2.5585938 + - 0.5361328 + - -1.5664063 + - -1.0214844 + - 0.5654297 + - 2.5019531 + - 0.17297363 + - 4.5625 + - 0.49658203 + - 3.0566406 + - -4.6679688 + - 3.8378906 + - 0.25195313 + - -0.8876953 + - 8.140625 + - -1.640625 + - 0.22387695 + - -0.65722656 + - -5.0351563 + - 1.9902344 + - 1.2021484 + - -1.2587891 + - 4.3320313 + - 4.015625 + - -2.5078125 + - 0.609375 + - -3.09375 + - 0.4572754 + - -0.23364258 + - 0.1171875 + - 0.32739258 + - -0.19165039 + - -0.090148926 + - -1.8798828 + - 1.4228516 + - 2.6015625 + - -6.5703125 + - 2.609375 + - 1.6796875 + - 0.5102539 + - -0.8652344 + - 5.8476563 + - 1.5175781 + - 2.625 + - -0.23364258 + - -3.2832031 + - -1.5703125 + - 2.1601563 + - 2.2910156 + - 1.8681641 + - -0.49804688 + - 3.2441406 + - -0.22753906 + - -1.3798828 + - -0.14465332 + - -2.7597656 + - 2.3730469 + - -1.8300781 + - 1.2392578 + - -3.3203125 + - -2.5234375 + - 1.4462891 + - 2.6601563 + - -4.4882813 + - 2.1523438 + - -3.96875 + - 4.1875 + - 1.296875 + - -0.87109375 + - 4.6132813 + - -2.2578125 + - -2.4394531 + - 4.5039063 + - 1.5625 + - 4.5234375 + - 1.3134766 + - 0.890625 + - 0.9296875 + - 3.125 + - 35.3125 + - 14.140625 + - -9.8046875 + - 0.80566406 + - 0.46679688 + - 0.2388916 + - -1.8359375 + - -3.5703125 + - 1.5048828 + - 1.1679688 + - 1.9238281 + - -1.9316406 + - 0.390625 + - 1.7314453 + - -5.75 + - 0.51953125 + - -0.0259552 + - 0.54003906 + - -3.21875 + - 2.3359375 + - 0.29492188 + - 1.3408203 + - -1.4785156 + - -0.18762207 + - -0.43286133 + - -0.8017578 + - 1.234375 + - -0.73095703 + - -7.3320313 + - 1.9111328 + - 0.08721924 + - -0.56152344 + - 0.66552734 + - 1.2216797 + - 1.6660156 + - -3.3242188 + - 0.15881348 + - 5.359375 + - -1.8066406 + - 0.46606445 + - 1.8408203 + - 1.3925781 + - -1.0996094 + - 6.0195313 + - -1.1767578 + - 0.33618164 + - -1.9609375 + - 0.6040039 + - 1.3525391 + - 0.8286133 + - 2.8378906 + - 4.71875 + - -0.98339844 + - 0.24768066 + - 2.6523438 + - 1.0644531 + - -0.2685547 + - 0.8671875 + - -0.013015747 + - -2.2851563 + - 2.7597656 + - 4.7695313 + - 1.984375 + - -1.7236328 + - -0.20532227 + - -1.1162109 + - 2.0976563 + - -0.56933594 + - -6.0820313 + - 0.03515625 + - -1.5283203 + - -0.24816895 + - -2.9453125 + - -1.2636719 + - -0.31640625 + - -0.9946289 + - -0.3227539 + - -0.3232422 + - 5.5195313 + - 1.3876953 + - -1.6103516 + - 1.1777344 + - 0.8798828 + - 3.0117188 + - 1.7539063 + - 3.1132813 + - 0.38916016 + - 1.0009766 + - -0.27954102 + - -0.52734375 + - -1.2441406 + - 1.7978516 + - -0.52734375 + - -1.4316406 + - 4.7734375 + - 1.0517578 + - -0.8417969 + - 0.37353516 + - -1.390625 + - 0.013504028 + - -1.3125 + - -1.3105469 + - 0.3564453 + - 2.1289063 + - -0.7817383 + - 2.1816406 + - 0.61816406 + - -1.8378906 + - 2.3085938 + - 2.7304688 + - -2.4121094 + - 3.546875 + - -1.6015625 + - 5.25 + - 1.9033203 + - 1.71875 + - -3.9765625 + - -1.1386719 + - 2.6113281 + - 0.66503906 + - -3.75 + - -1.7431641 + - -0.765625 + - 2.6972656 + - 3.9335938 + - 2.4726563 + - -4.3320313 + - 2.8984375 + - -1.078125 + - -0.80126953 + - -0.14318848 + - -2.6601563 + - -0.91064453 + - 1.7587891 + - 2.2011719 + - -0.89697266 + - -1.9863281 + - -1.7695313 + - 2.6445313 + - -0.3449707 + - -0.8852539 + - 2.5625 + - 3.5722656 + - -1.4150391 + - 0.81152344 + - -0.9423828 + - 1.53125 + - -3.6367188 + - -4.6640625 + - -4.0390625 + - -1.5390625 + - -0.7294922 + - -2.1933594 + - 1.3330078 + - -0.35986328 + - 0.27075195 + - -1.8251953 + - -1.9804688 + - -1.609375 + - 2.4960938 + - -0.062408447 + - -2.3222656 + - 2.921875 + - 2.0546875 + - -3.0273438 + - 0.9316406 + - 0.48950195 + - 1.6035156 + - -0.19384766 + - -4.3203125 + - 0.21594238 + - 0.65722656 + - -2.4511719 + - -2.4238281 + - 9.5078125 + - 0.79296875 + - 3.9570313 + - 1.9072266 + - -2.578125 + - -2.5 + - 2.2050781 + - -1.2763672 + - -0.19104004 + - 1.3164063 + - 1.421875 + - 1.8671875 + - 0.62402344 + - 1.4189453 + - 2.0761719 + - -4.0859375 + - 1.6621094 + - 4.0234375 + - 0.7451172 + - 1.3007813 + - -1.7988281 + - -2.0234375 + - 0.93603516 + - 1.6611328 + - 1.7460938 + - -3.5039063 + - -1.8339844 + - 0.15356445 + - 1.8222656 + - -0.3371582 + - -1.3486328 + - -6.3789063 + - 0.18481445 + - -0.3762207 + - -1.1855469 + - -2.1796875 + - 1.3945313 + - -1.2001953 + - 0.9951172 + - 0.8515625 + - -1.3046875 + - 1.8066406 + - -4.6328125 + - -3.4648438 + - 2.0019531 + - -0.92089844 + - 1.7695313 + - 0.84228516 + - -2.453125 + - 0.89746094 + - 3.015625 + - 2.4082031 + - 3.3359375 + - 2.0429688 + - 3.359375 + - 0.98828125 + - -0.5395508 + - 0.7734375 + - -0.69921875 + - -0.022125244 + - -1.6035156 + - -0.92089844 + - -3.9453125 + - 3.2265625 + - 2.0742188 + - -1.7558594 + - 1.2539063 + - -1.7109375 + - -8.46875 + - 1 + - -0.0859375 + - -0.49853516 + - -0.5776367 + - 5.2109375 + - 0.15356445 + - -1.2011719 + - 0.51464844 + - 2.9941406 + - 3.5019531 + - 2.7988281 + - 1.4394531 + - -3.5 + - 3.3242188 + - 2.9238281 + - -3.0585938 + - 0.61035156 + - -2.3632813 + - -0.014320374 + - -3.9335938 + - -0.12188721 + - -3.6894531 + - -3.5351563 + - -3.5097656 + - 0.7763672 + - -3.6132813 + - -0.8251953 + - 4.8164063 + - -2.1816406 + - 0.08496094 + - -1.7275391 + - -2.546875 + - 1.9179688 + - -0.07159424 + - 0.5600586 + - 0.26953125 + - 0.8930664 + - 1.5214844 + - -0.3852539 + - 0.3918457 + - 1.9765625 + - -1.1972656 + - 10.28125 + - 0.10675049 + - 1.5996094 + - -5.140625 + - 1.5917969 + - 1.3613281 + - -1.1572266 + - -2.6503906 + - -0.92041016 + - 0.5595703 + - 5.9570313 + - 2.8691406 + - -0.47265625 + - -0.8173828 + - 2.4121094 + - -0.7080078 + - -1.546875 + - -1.1708984 + - 3.6347656 + - -2.0546875 + - 2.40625 + - -1.9707031 + - 3.3222656 + - -0.9892578 + - -2.9726563 + - 0.78759766 + - -3.1445313 + - 2.5390625 + - -0.1640625 + - -4.8203125 + - -1.359375 + - -2.4140625 + - 2.3359375 + - 1.0957031 + - 1.09375 + - 3.4804688 + - 0.09698486 + - 2.84375 + - -1.0722656 + - -2.6835938 + - -2.4023438 + - 0.3305664 + - -4.7421875 + - 7.9765625 + - 1.1757813 + - 2.3632813 + - 0.9433594 + - 0.9375 + - -2.1933594 + - 0.8671875 + - -0.35546875 + - -1.7910156 + - -4.7421875 + - -1.6884766 + - 2.75 + - -1.2597656 + - 1.5048828 + - -0.9902344 + - -3.4726563 + - 2.3359375 + - 1.4394531 + - -3.65625 + - 0.037109375 + - 1.6533203 + - 1.5869141 + - -3.453125 + - 1.9628906 + - -3.1289063 + - 0.921875 + - 1.0673828 + - 0.7294922 + - -2.640625 + - 1.59375 + - -3.2617188 + - -0.11260986 + - -0.56640625 + - -2.5410156 + - -1.296875 + - 2.8691406 + - 1.8642578 + - 0.81640625 + - 2.1640625 + - 1.4238281 + - 1.0595703 + - 2.5351563 + - 1.7939453 + - -0.1899414 + - -0.11529541 + - -0.007648468 + - -1.6503906 + - 2.78125 + - -2.3671875 + - -2.2753906 + - 1.2001953 + - 6.1796875 + - -0.62939453 + - -0.3984375 + - 0.7734375 + - 1.0205078 + - -1.7363281 + - -1.2089844 + - -0.32470703 + - 1.5488281 + - 1.8359375 + - -0.09472656 + - 3.4472656 + - -1.796875 + - -0.21679688 + - -1.1171875 + - 4.1171875 + - -4.84375 + - -1.0039063 + - 1.3798828 + - 2.1679688 + - 5.96875 + - -0.007160187 + - -0.7524414 + - 1.1494141 + - -1.4423828 + - 1.3359375 + - -1.6533203 + - -1.8291016 + - -2.3164063 + - 2.4257813 + - -3.3164063 + - 0.5654297 + - -0.17504883 + - -3.1523438 + - 3.0625 + - -1.0107422 + - 0.78759766 + - -2.0078125 + - 0.5644531 + - -3.609375 + - -3.875 + - -0.26171875 + - 4.7421875 + - -2.390625 + - 0.8071289 + - 2.5175781 + - 2.7539063 + - -0.8203125 + - -0.49731445 + - 0.005531311 + - -2.4589844 + - -0.3383789 + - 0.4633789 + - -1.3798828 + - -2.9238281 + - -1.0244141 + - -0.5551758 + - 1.4628906 + - 1.6816406 + - -7.8007813 + - -4.0703125 + - 18.453125 + - -1.7832031 + - -2.6523438 + - 0.90478516 + - 1.1425781 + - 1.1152344 + - 2.2109375 + - 2.9648438 + - 0.5527344 + - -0.3161621 + - 1.8134766 + - 0.8046875 + - 0.30908203 + - -3.5117188 + - 0.13476563 + - -3.0253906 + - -2.6484375 + - -1.6220703 + - 4.3789063 + - -0.81689453 + - -2.5 + - -3.0664063 + - -4.0078125 + - 0.69140625 + - -0.9267578 + - 3.2617188 + - 1.1308594 + - 0.01399231 + - 1.7246094 + - 0.4326172 + - 2.9375 + - -0.28857422 + - 6.5820313 + - 3.9335938 + - 0.7285156 + - -0.53808594 + - 0.20117188 + - 2.3007813 + - 4.6914063 + - -1.5195313 + - -0.71484375 + - 0.98046875 + - 1.3720703 + - -2.484375 + - 2.3574219 + - -2.6015625 + - 1.2705078 + - 2.6816406 + - 0.4543457 + - 0.53222656 + - 0.7138672 + - 0.2709961 + - -1.7832031 + - -1.7080078 + - 0.13085938 + - -4.7617188 + - -0.35498047 + - -1.5439453 + - 2.1484375 + - -3.4003906 + - -3.0546875 + - 0.06964111 + - -0.3400879 + - 3.3007813 + - -2.4648438 + - 0.42578125 + - 2.4003906 + - 3.015625 + - -2.0273438 + - 3.03125 + - -4.875 + - -3.0742188 + - 0.037750244 + - -1.5507813 + - 2.0078125 + - 8.1796875 + - 0.9716797 + - 4.4101563 + - -6.3320313 + - 0.41015625 + - -1.1025391 + - 3.03125 + - 0.037109375 + - -0.12988281 + - 0.2265625 + - -5.8671875 + - -0.8408203 + - -0.2854004 + - 2.4570313 + - -1.3232422 + - -1.3886719 + - 1.3066406 + - -2.6894531 + - -2.40625 + - -3.0625 + - 2.8867188 + - 3.0722656 + - -1.0683594 + - 5.109375 + - -3.4726563 + - -1.0136719 + - 0.5371094 + - 0.97265625 + - 2.5136719 + - 1.265625 + - 0.55908203 + - -0.33984375 + - -0.796875 + - 0.83691406 + - 0.42236328 + - 5.5390625 + - 1.5234375 + - 1.609375 + - 1.1035156 + - 3.9726563 + - 0.56689453 + - 0.7675781 + - 0.8461914 + - 1.125 + - -0.07092285 + - 2.8300781 + - 0.44262695 + - 4.7226563 + - -1.2949219 + - -1.296875 + - -3.4394531 + - 0.82910156 + - -0.0390625 + - -0.35302734 + - -0.41064453 + - 2 + - -0.5859375 + - -5.6640625 + - -0.95166016 + - 0.6816406 + - 2.5839844 + - 2.2539063 + - 1.7753906 + - -0.2446289 + - 3.1757813 + - 2.1015625 + - 2.6113281 + - 0.2355957 + - 2.0449219 + - 2.7207031 + - -2.1035156 + - -7.1914063 + - -2.6035156 + - 1.9921875 + - -3.4628906 + - -1.4902344 + - -0.55566406 + - 2.8378906 + - 3.9375 + - 3.6445313 + - -0.11584473 + - 0.31054688 + - 1.0019531 + - -0.61328125 + - -0.2763672 + - 3.5175781 + - 3.4804688 + - -3.5957031 + - 0.012039185 + - -0.38110352 + - 3.6601563 + - 0.25683594 + - -0.40551758 + - -0.64160156 + - 0.25732422 + - 0.79003906 + - -0.89697266 + - -2.1835938 + - -1.0742188 + - -1.6757813 + - -1.7851563 + - -2.0585938 + - 2.5898438 + - -1.0957031 + - 0.6035156 + - 2.265625 + - -3.1445313 + - -0.5493164 + - 1.2929688 + - -1.7363281 + - -2.3945313 + - -1.0546875 + - -2.1835938 + - 3.8320313 + - 3.1191406 + - 2.3144531 + - -6.7578125 + - -1.0976563 + - 0.35668945 + - -5.2851563 + - 1.7636719 + - -2.6367188 + - 0.97509766 + - 0.6538086 + - -8.5703125 + - 1 + - 0.4169922 + - 0.2602539 + - -2.1210938 + - -1.5859375 + - -1.46875 + - 0.5834961 + - 0.28320313 + - -0.33911133 + - -25.625 + - -1.5126953 + - -5.8125 + - 2.9765625 + - 0.24145508 + - 2.3144531 + - 3.0878906 + - -3.5878906 + - -5.1640625 + - 0.020828247 + - 0.49243164 + - -1.0859375 + - -1.9501953 + - 5.7734375 + - -0.13366699 + - 5.1953125 + - 0.08850098 + - 4.9921875 + - -0.98339844 + - 1.5410156 + - -0.08721924 + - -0.72509766 + - 1.2910156 + - 3.8125 + - -1.3193359 + - -3.4960938 + - -0.44189453 + - -0.16748047 + - 3.4414063 + - -0.5678711 + - 0.37939453 + - -0.43286133 + - 2.3046875 + - 0.40356445 + - -6.2226563 + - 4.4296875 + - -2.4609375 + - -1.8955078 + - -4.2421875 + - -1.4931641 + - -0.85791016 + - 1.5517578 + - 2.6621094 + - -0.15686035 + - -3.5273438 + - 3.125 + - 2.96875 + - -1.0556641 + - 0.40283203 + - -5.1601563 + - 3.0507813 + - -0.55029297 + - -2.0722656 + - -3.703125 + - 1.7236328 + - 3.7421875 + - -1.4472656 + - 2.5976563 + - 1.6269531 + - 0.29492188 + - 0.12524414 + - -2.1269531 + - 1.8564453 + - -1.2783203 + - 0.90527344 + - 0.0960083 + - 0.92041016 + - -3.8691406 + - 2.2910156 + - -1.1074219 + - -2.6953125 + - 1.5048828 + - 1.3212891 + - 1.3105469 + - -0.69921875 + - 1.109375 + - -0.84765625 + - -2.1894531 + - 1.7773438 + - 0.46289063 + - 1.0683594 + - 1.5205078 + - 0.45947266 + - 0.6953125 + - 2.515625 + - 1.7626953 + - -0.017410278 + - 0.37109375 + - 2.5585938 + - 0.52685547 + - -0.4777832 + - 2.1425781 + - -0.33813477 + - 6.3203125 + - -0.26220703 + - 2.9394531 + - -0.91015625 + - 0.6923828 + - 1.2431641 + - -0.40356445 + - 1.5996094 + - -1.4775391 + - 3.7519531 + - -1.3554688 + - 1.9160156 + - -1.5986328 + - -3.5078125 + - 5.140625 + - -1.1523438 + - 5.8007813 + - -1.2900391 + - 7.9765625 + - -1.7509766 + - 0.32861328 + - -2.2382813 + - 0.93652344 + - -0.7392578 + - 2.2539063 + - -1.0869141 + - -0.8466797 + - 2.7597656 + - 1.7753906 + - 4.6328125 + - -0.29882813 + - -0.6533203 + - 0.57910156 + - -0.515625 + - -3.8828125 + - -1.7470703 + - 0.18225098 + - -3.9160156 + - -1.1816406 + - 2.4863281 + - 3.9570313 + - -0.8852539 + - -2.1601563 + - -28.90625 + - 0.2919922 + - 2.2734375 + - -0.76660156 + - 0.6015625 + - 3.8164063 + - -0.01789856 + - 1.8408203 + - 1.7519531 + - 2.5898438 + - -0.31176758 + - -0.4230957 + - -1.1376953 + - -0.7158203 + - -2.2890625 + - -0.734375 + - 0.34375 + - 1.4375 + - 1.8173828 + - -2.7070313 + - 2.7675781 + - 8.484375 + - 3.6015625 + - -2.203125 + - 0.8564453 + - 0.796875 + - -0.41333008 + - 0.9296875 + - 1.9941406 + - -3.4882813 + - 0.7446289 + - 0.020996094 + - -0.27001953 + - -0.5830078 + - 2.6367188 + - -3.4160156 + - -3.4082031 + - -0.86816406 + - -0.6953125 + - -1.28125 + - 5.4765625 + - 0.37890625 + - -0.4609375 + - 3.0097656 + - -2.2636719 + - 3.6289063 + - 0.0012741089 + - 3.1953125 + - 1.0205078 + - -2.0507813 + - -0.6533203 + - 4.0703125 + - -0.9589844 + - 2.4824219 + - 1.3720703 + - 0.19848633 + - -1.6601563 + - 2.2304688 + - -0.88378906 + - -3.2988281 + - 1.7441406 + - -1.4970703 + - -0.6040039 + - -2.4921875 + - -4.8007813 + - 0.8598633 + - -4.3984375 + - 1.9423828 + - 4.296875 + - -8.7109375 + - 1.3457031 + - -0.068359375 + - -1.9345703 + - -4.8671875 + - 3.1914063 + - 1.0673828 + - -1.9160156 + - 2.15625 + - -1.0566406 + - 2.7050781 + - 1.0644531 + - 0.044921875 + - 1.9609375 + - 0.53759766 + - 1.7822266 + - -1.8515625 + - -0.28759766 + - -1.8173828 + - -0.82910156 + - 0.34765625 + - -2.0625 + - -1.6425781 + - 0.8466797 + - 0.7636719 + - 3.6132813 + - 2.0976563 + - 0.7114258 + - -0.21289063 + - 2.4335938 + - 0.03579712 + - 3.9882813 + - -0.88671875 + - -4.7070313 + - -1.7285156 + - 1.5078125 + - 0.094055176 + - -0.012367249 + - 3.2851563 + - 4.1523438 + - 1.1933594 + - -1.453125 + - 3.5820313 + - 0.89697266 + - 2.5136719 + - -2.203125 + - 0.107421875 + - 1.2734375 + - 4.0390625 + - -0.3244629 + - -0.6425781 + - 3.8125 + - -3.5703125 + - -4.6640625 + - -0.10461426 + - 0.107055664 + - -3.3007813 + - -4.375 + - 1.1699219 + - -0.87597656 + - 2.4726563 + - 3.265625 + - 0.8408203 + - 2.9882813 + - -0.35546875 + - 1.6015625 + - -1.0097656 + - -2.5429688 + - 0.014320374 + - 0.7524414 + - -1.5390625 + - 1.0507813 + - 3.59375 + - -0.16918945 + - 0.25976563 + - 2.7695313 + - 0.48168945 + - 3.7539063 + - -2.1289063 + - -1.890625 + - 0.53808594 + - 3.9726563 + - 4.609375 + - -0.17053223 + - 3.21875 + - -1.828125 + - 1.2353516 + - -2.8007813 + - 0.14550781 + - 0.9404297 + - 0.9580078 + - -0.76660156 + - 2.3359375 + - 2.0234375 + - 3.0253906 + - 2.5703125 + - -3.4179688 + - 4.515625 + - -3.578125 + - 1.1767578 + - -0.31396484 + - -0.3088379 + - -1.5947266 + - 0.2421875 + - -0.4482422 + - -3.765625 + - 0.39746094 + - 2.2148438 + - -0.29541016 + - -0.5517578 + - 2.65625 + - 0.48657227 + - -0.29711914 + - -2.671875 + - 1.4628906 + - 1.0449219 + - 4.421875 + - -1.2089844 + - 2.4667969 + - -3.2109375 + - -0.8457031 + - -0.15783691 + - -0.5551758 + - -0.73291016 + - 5.1835938 + - 0.078125 + - -1.5830078 + - -0.33081055 + - 0.07092285 + - -1.8925781 + - 0.57128906 + - 0.515625 + - -1.1679688 + - -1.2685547 + - -3.4785156 + - -0.05206299 + - -0.38623047 + - -0.98828125 + - -0.30981445 + - 0.98535156 + - -2.3984375 + - -1.1425781 + - -7.2890625 + - -4.9921875 + - 3.40625 + - -2.6191406 + - -1.9726563 + - 1.875 + - -0.65283203 + - 3.1640625 + - -3.1445313 + - -2.3847656 + - -5.6875 + - -1.5703125 + - -4.234375 + - 1.3476563 + - -0.11682129 + - 1.765625 + - 1.984375 + - -2.078125 + - 1.0410156 + - -1.4189453 + - -2.9609375 + - 0.45947266 + - -0.41918945 + - -1.3798828 + - 2.2890625 + - -0.97265625 + - 0.35766602 + - 4.2890625 + - -1.2666016 + - 4.546875 +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0292969 + - 1.609375 + - -1.0048828 + - 0.43676758 + - -0.8769531 + - 0.79785156 + - -0.27612305 + - 0.4963379 + - -0.82128906 + - 0.16906738 + - -0.734375 + - -0.34936523 + - 0.03515625 + - 0.34375 + - 1.3769531 + - 1.5234375 + - -1.875 + - -1.4082031 + - 1.6289063 + - -1.1650391 + - 0.65234375 + - 1.796875 + - 1.984375 + - -0.4350586 + - 1.4003906 + - -0.34985352 + - -2.5253906 + - 2.5351563 + - 0.32348633 + - 2.3007813 + - 1.5195313 + - -0.28295898 + - 1.1650391 + - -3.4472656 + - 0.07421875 + - -5.28125 + - -0.8310547 + - 0.7524414 + - -2.4257813 + - -0.91845703 + - -0.9814453 + - -1.7285156 + - 2.0761719 + - 0.23657227 + - -3.9003906 + - -1.4052734 + - 0.8310547 + - 3.9140625 + - -0.43408203 + - -3.0429688 + - -100.5625 + - -3.0703125 + - -0.93652344 + - 2.71875 + - -1.0527344 + - -1.3789063 + - -7.3671875 + - -2.3789063 + - 0.58251953 + - 0.8388672 + - 0.13110352 + - 2.4003906 + - 0.07421875 + - -2.5488281 + - 0.5126953 + - 2.0644531 + - -1.5556641 + - -4.6679688 + - 0.055236816 + - -2.9921875 + - -0.9038086 + - -1.2294922 + - -0.3984375 + - 2.9863281 + - 3.1328125 + - -0.13867188 + - -0.36523438 + - -0.63916016 + - -0.6064453 + - -1.5869141 + - -0.3425293 + - -2.0234375 + - 0.5336914 + - -1.8027344 + - -0.15185547 + - 2.2578125 + - 0.86376953 + - -1.234375 + - 5.9453125 + - 2.7089844 + - -19.703125 + - -2.8125 + - -2.7832031 + - -4.4375 + - 0.35595703 + - 1.5751953 + - -4.09375 + - 1.6884766 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.0055770874 + - -2.7949219 + - 0.08062744 + - -1.3369141 + - -1.5839844 + - -0.056915283 + - 0.04058838 + - 0.4296875 + - 0.47753906 + - -1.5585938 + - -0.055511475 + - 3.03125 + - 2.8515625 + - 0.70947266 + - -0.18884277 + - 0.29467773 + - 2.2421875 + - 0.59472656 + - 0.15393066 + - -2.4863281 + - -2.1992188 + - -0.27172852 + - 2.40625 + - -0.73095703 + - 0.32299805 + - 1.59375 + - 2.3808594 + - 0.17297363 + - -3.2519531 + - 1.1630859 + - 1.234375 + - 2.40625 + - -0.3088379 + - 0.78564453 + - -1.2050781 + - -1.4824219 + - 1.5166016 + - -0.4206543 + - 1.3535156 + - -2.7734375 + - 1.1757813 + - -2.8027344 + - -1.7998047 + - -0.9379883 + - -2.5703125 + - 4.5820313 + - 0.78564453 + - -1.9257813 + - -1.0478516 + - 0.03515625 + - 0.5151367 + - -2.7832031 + - 0.90722656 + - -0.5102539 + - -3.0390625 + - -3.1289063 + - -1.2509766 + - -2.6191406 + - -0.5546875 + - -1.1376953 + - 0.51416016 + - 1.3994141 + - 3.3613281 + - -1.1591797 + - -0.7583008 + - -0.46289063 + - -2.6386719 + - -1.9306641 + - -0.43896484 + - -2.9863281 + - -0.09875488 + - 0.25195313 + - -1.3115234 + - 2.09375 + - -4.265625 + - -2.2519531 + - 1.7910156 + - 0.8022461 + - -1.8603516 + - -1.8544922 + - 0.13891602 + - 5.1054688 + - -3.4863281 + - -0.85253906 + - -1.1806641 + - 0.07336426 + - -1.9082031 + - -3.7753906 + - -0.5541992 + - 0.640625 + - -2.2460938 + - 1.4951172 + - 3.6328125 + - -2.1640625 + - -1.4921875 + - 0.13476563 + - 0.44189453 + - -2.359375 + - 1.9189453 + - 0.7114258 + - 7.9375 + - 3.2929688 + - 4.2617188 + - -2.8378906 + - -0.3474121 + - -2.2304688 + - -2.0644531 + - -0.7504883 + - -2.9101563 + - -0.859375 + - 0.8330078 + - 3.9570313 + - -0.0036258698 + - -2.5214844 + - 3.0898438 + - -0.70458984 + - -3.8535156 + - 0.6298828 + - -0.32739258 + - 3.1289063 + - -0.08618164 + - -1.21875 + - 0.09649658 + - 0.7675781 + - 0.39672852 + - -3.1464844 + - 0.7763672 + - -0.7680664 + - -1.0068359 + - -0.88671875 + - -0.2064209 + - 1.5820313 + - 0.7441406 + - 2.3671875 + - 2.8554688 + - 1.6601563 + - 6.0390625 + - -0.35351563 + - -3.4589844 + - 0.23046875 + - -2.2324219 + - -1.7626953 + - 3.2714844 + - 2.5566406 + - -0.61572266 + - 0.20751953 + - 1.2539063 + - 0.4423828 + - -2.1269531 + - 0.5131836 + - 0.62353516 + - -0.6958008 + - -0.33032227 + - -2.28125 + - 0.032348633 + - 0.3408203 + - 1.4726563 + - 1.8486328 + - 1.890625 + - 1.8886719 + - -0.37426758 + - 2.4140625 + - -2.3027344 + - 3.9121094 + - 0.85546875 + - -4.6953125 + - 0.32983398 + - 0.8154297 + - 3.2304688 + - 0.8305664 + - -0.42773438 + - -1.1630859 + - -3.9277344 + - 1.3681641 + - 0.18469238 + - 1.0292969 + - -2.1328125 + - -2.6738281 + - 1.3876953 + - 0.1361084 + - 0.99902344 + - -0.77783203 + - -0.064697266 + - 1.828125 + - 0.65771484 + - 0.03390503 + - 1.7265625 + - 1.2138672 + - 10.0703125 + - 0.064697266 + - 0.6723633 + - -0.4819336 + - 1.8457031 + - -1.4023438 + - 2.2148438 + - -0.5493164 + - -0.07574463 + - -0.20422363 + - 2.7597656 + - 3.3242188 + - -1.6425781 + - 1.5322266 + - 2.4785156 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6650391 + - -0.10546875 + - -0.8964844 + - 0.072509766 + - 1.1875 + - -2.4375 + - 0.08258057 + - -0.14453125 + - -3.1816406 + - 1.2851563 + - 1.8339844 + - 1.2412109 + - -3.8457031 + - 2.5703125 + - -1.4052734 + - -0.78564453 + - -1.3427734 + - -1.5039063 + - 2.3652344 + - -3.5820313 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7709961 + - 2.34375 + - -0.11657715 + - 2.7832031 + - -0.49926758 + - 0.08984375 + - 0.105285645 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5488281 + - 1.9433594 + - 1.1533203 + - -0.21252441 + - 2.6777344 + - -5.0664063 + - -0.8847656 + - 2.1464844 + - -1.265625 + - 0.3330078 + - 0.5102539 + - -2.1738281 + - -0.7841797 + - -4.1015625 + - -1.609375 + - -1.6220703 + - -1.4111328 + - -1.4921875 + - 1.7324219 + - 4.359375 + - -1.3857422 + - 2.9726563 + - -2.90625 + - 6.1757813 + - 1.6982422 + - 1.4638672 + - -2.6894531 + - 0.7714844 + - -1.5244141 + - -2.125 + - 3.5058594 + - -0.3996582 + - 3.5996094 + - -1.4482422 + - 0.3935547 + - 0.7109375 + - 2.4746094 + - -1.3896484 + - -1.2880859 + - -1.9433594 + - -0.859375 + - -0.703125 + - 1.8554688 + - 1.8632813 + - -4.2226563 + - -8.125 + - -2.1074219 + - 0.453125 + - -0.09375 + - -2.6660156 + - -0.95751953 + - 0.047698975 + - -0.29663086 + - 2.6464844 + - 2.1074219 + - -2.1464844 + - 1.5498047 + - -2.3339844 + - 1.5898438 + - -0.5654297 + - -4.3476563 + - -0.1673584 + - 1.7988281 + - 2.0488281 + - -2.1660156 + - -14.390625 + - -0.12243652 + - -2.2089844 + - -1.6064453 + - 3.1171875 + - -1.1591797 + - 1.4433594 + - -0.19689941 + - -3.6835938 + - -1.4238281 + - -3.6152344 + - 5.109375 + - -0.5004883 + - -0.4736328 + - 2.7988281 + - -0.32592773 + - -0.75927734 + - 1.0458984 + - 0.1619873 + - -2.0371094 + - 2.2246094 + - -1.4375 + - -1.921875 + - -1.7138672 + - -3.8613281 + - 0.85009766 + - -0.37939453 + - -1.8525391 + - 0.5839844 + - -1.9013672 + - 0.7519531 + - 1.6748047 + - -1.3095703 + - -1.5087891 + - -0.6269531 + - -1.6445313 + - -2.2011719 + - -0.9091797 + - 0.06640625 + - 2.7050781 + - -2.1679688 + - -3.5800781 + - -0.009483337 + - 1.5244141 + - -0.58935547 + - -2.0390625 + - -0.47583008 + - 5.609375 + - 4.625 + - -0.033477783 + - 0.07110596 + - 3.2851563 + - -0.44482422 + - -2.8945313 + - -1.7675781 + - 2.7714844 + - -0.9301758 + - -0.84521484 + - -0.9785156 + - 0.27197266 + - 0.33666992 + - -2.3515625 + - 4.9375 + - 2.3125 + - 0.29882813 + - 1.015625 + - 0.35131836 + - 0.43896484 + - 0.8076172 + - -0.91064453 + - -0.6064453 + - 3.8203125 + - 0.5683594 + - 0.55908203 + - 0.9736328 + - -1.9970703 + - -0.3269043 + - 1.2158203 + - -6.0039063 + - 0.13977051 + - 3.71875 + - -0.5605469 + - 0.46313477 + - 1.5683594 + - -0.7011719 + - -0.46362305 + - -2.6328125 + - -1.3330078 + - 2.4570313 + - -2.0488281 + - -2.9238281 + - 5.375 + - 0.21679688 + - -5.9726563 + - 2.0390625 + - 0.055786133 + - 1.3359375 + - 3.8378906 + - -0.6225586 + - -0.6113281 + - -1.5830078 + - 2.8535156 + - 3.6679688 + - -2.5703125 + - -1.5019531 + - 0.69091797 + - -2.0332031 + - 1.6210938 + - -0.3408203 + - -0.5522461 + - -1.4355469 + - -0.5078125 + - 0.5957031 + - 1.5869141 + - 3.6757813 + - -0.018692017 + - 0.55566406 + - 1.4609375 + - 0.20336914 + - -1.3769531 + - 1.6767578 + - 2.1894531 + - 0.85253906 + - 0.4519043 + - -0.00390625 + - -1.8789063 + - 3.5800781 + - 0.16516113 + - -4.5117188 + - -0.12890625 + - -0.3557129 + - -1.6269531 + - -1.9589844 + - -1.0107422 + - 3.1054688 + - -0.8457031 + - -4.8476563 + - -2.3652344 + - -1.3818359 + - 0.20703125 + - 1.9863281 + - 1.4814453 + - 0.6333008 + - 1.9667969 + - -17.671875 + - -1.453125 + - -1.0478516 + - -2.0019531 + - -1.3818359 + - 0.61279297 + - 0.20227051 + - 0.0055770874 + - 2.3476563 + - -3.4804688 + - -1.0546875 + - -2.2363281 + - 1.2685547 + - -1.0302734 + - 0.87597656 + - -2.4453125 + - -1.4394531 + - -2.3496094 + - -2.2890625 + - -0.8925781 + - -1.9296875 + - 0.9921875 + - 0.2939453 + - -1.2851563 + - 1.1201172 + - 0.578125 + - 0.30908203 + - 0.7246094 + - -3.2089844 + - 0.65478516 + - 2.5683594 + - -3.2148438 + - -2.9394531 + - 1.6816406 + - 1.6416016 + - -2.3417969 + - -3.5 + - -1.1904297 + - 1.4462891 + - -3.1875 + - -1.890625 + - -0.1015625 + - -1.9082031 + - 1.4306641 + - 5.1757813 + - 3.9101563 + - 1.0263672 + - 3.2402344 + - -0.8222656 + - -0.68603516 + - 0.055786133 + - -2.2578125 + - -2.3261719 + - 0.15234375 + - -3.6972656 + - 0.5625 + - -4.3789063 + - 0.9506836 + - 2.5957031 + - -1.7587891 + - -1.9824219 + - 1.9609375 + - -0.60595703 + - -0.2524414 + - -1.5576172 + - 1.8701172 + - -2.1386719 + - 0.00390625 + - 1.4619141 + - 1.8613281 + - 0.00027894974 + - 0.44140625 + - -1.6054688 + - 3.4902344 + - 0.036834717 + - 1.4169922 + - 0.7788086 + - -0.12384033 + - 1.7070313 + - -0.52197266 + - -3.2265625 + - -2.6875 + - 0.61572266 + - 2.6113281 + - -2.8164063 + - -0.83251953 + - -0.25439453 + - 0.037384033 + - -2.2226563 + - -2.5703125 + - -0.08013916 + - 2.7851563 + - 4.390625 + - -1.0810547 + - 0.59375 + - -4.6757813 + - 7.9140625 + - -3.1503906 + - 0.73339844 + - 3.3554688 + - -1.6220703 + - -2.59375 + - 0.984375 + - -1.6298828 + - -0.5546875 + - 2.6933594 + - 3.8125 + - -0.45922852 + - 1.4638672 + - 1.0556641 + - 1.6621094 + - 3.1113281 + - -0.55126953 + - 2.4003906 + - 1.8222656 + - -2.0507813 + - 0.22314453 + - 0.98535156 + - -0.5253906 + - -1.0029297 + - 0.6152344 + - 0.6113281 + - -0.71191406 + - -2.9492188 + - -0.19580078 + - -0.98828125 + - -0.1899414 + - 0.044067383 + - 1.5214844 + - 1.734375 + - 1.0146484 + - -1.4179688 + - 7.7578125 + - 3.3652344 + - 7.0976563 + - 1.4726563 + - -5.7226563 + - -5.890625 + - -0.3828125 + - -1.3154297 + - -0.31958008 + - -1.5888672 + - 0.1907959 + - -0.23181152 + - -1.046875 + - 1.6132813 + - -1.9482422 + - 2.6699219 + - 3.2246094 + - 3.6679688 + - -0.9091797 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09313965 + - -3.0195313 + - 1.8251953 + - 0.71484375 + - 0.77197266 + - -2.15625 + - 1.1113281 + - 3 + - 2.96875 + - -0.28686523 + - -0.0496521 + - 0.5957031 + - 4.7929688 + - 1.4414063 + - 3.0625 + - -5.0664063 + - -0.17687988 + - -1.8623047 + - -1.8876953 + - -3.6367188 + - 0.9038086 + - -0.4519043 + - 1.453125 + - -0.27124023 + - -1.8652344 + - 2.1582031 + - 0.65771484 + - -3.4160156 + - -5.7304688 + - -0.22070313 + - -3.03125 + - -0.9975586 + - 1.8378906 + - -1.4101563 + - 1.4414063 + - 3.9804688 + - -1.9648438 + - -1.5292969 + - -1.8769531 + - 2.2949219 + - -0.23254395 + - -0.5600586 + - 1.2783203 + - 0.60791016 + - 1.453125 + - 0.8408203 + - -0.73535156 + - -0.99658203 + - -3.1132813 + - 2.9472656 + - -0.5136719 + - 0.32617188 + - -2.6640625 + - -1.5917969 + - 1.0527344 + - 0.119384766 + - -1.2695313 + - -1.6621094 + - 2.1621094 + - -1.7226563 + - -1.7275391 + - -0.45898438 + - -0.26733398 + - 2.6152344 + - 0.4230957 + - -1.1201172 + - -0.47021484 + - 4.1289063 + - 1.4775391 + - -0.26342773 + - 2.9726563 + - -2.859375 + - 2.3222656 + - 0.52197266 + - -1.1865234 + - -3.2050781 + - -1.1943359 + - 2.2285156 + - -2.5 + - 5.8789063 + - -0.001953125 + - 2.4101563 + - -0.78027344 + - -1.4560547 + - 0.8540039 + - 2.6914063 + - 0.49853516 + - -1.1474609 + - -0.55566406 + - 0.46972656 + - 1.1582031 + - -3.6191406 + - 2.3203125 + - -4.75 + - -4.75 + - -3.7871094 + - 1.0068359 + - 3.9179688 + - 1.4345703 + - -1.3925781 + - 0.171875 + - 2.4257813 + - 1.21875 + - -2.6074219 + - 1.1171875 + - -1.5332031 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.23010254 + - 2.109375 + - 1.9853516 + - -0.9951172 + - 2.140625 + - -0.2705078 + - -2.8164063 + - -0.19946289 + - 4.5820313 + - -2.5664063 + - -0.3581543 + - 2.8847656 + - -1.4316406 + - 0.06585693 + - 1.0810547 + - -1.1972656 + - -9.3359375 + - 1.4482422 + - -47.25 + - -1.2919922 + - -0.6015625 + - -2.0625 + - -3.9179688 + - -0.47729492 + - 0.296875 + - 1.0654297 + - 1.6640625 + - 1.0595703 + - 0.18188477 + - -1.796875 + - 4.6875 + - -0.5253906 + - -2.0019531 + - 1.5869141 + - 1.1044922 + - -0.7211914 + - 16.984375 + - 0.42285156 + - -0.9765625 + - -1.2626953 + - -0.9379883 + - -0.57958984 + - 0.4038086 + - 2.8007813 + - 0.87353516 + - -1.625 + - -0.4267578 + - -2.6699219 + - -0.9609375 + - -2.4199219 + - 0.1784668 + - 0.49438477 + - -0.88183594 + - 2.4472656 + - 1.0351563 + - 0.8046875 + - 1.4453125 + - 0.5073242 + - 3.921875 + - -0.3798828 + - 1.046875 + - 0.2524414 + - -3.1367188 + - 2.5292969 + - 0.12658691 + - -1.2939453 + - -0.52246094 + - -2.9902344 + - 0.3515625 + - -1.6132813 + - -0.08203125 + - -0.66015625 + - -0.059143066 + - 0.21252441 + - 1.9482422 + - -4.1484375 + - -2.4863281 + - 0.35864258 + - 0.18481445 + - -1.0009766 + - -2.59375 + - 1.2685547 + - 6.6015625 + - -0.65283203 + - -0.7451172 + - 4.7226563 + - -2.2519531 + - 2.3105469 + - -2.0625 + - -0.16796875 + - 0.17907715 + - -2.3144531 + - 2.8964844 + - -4.5703125 + - 3.5996094 + - -1.0625 + - 5.2304688 + - 0.46972656 + - 0.31811523 + - -3.0722656 + - 1.9150391 + - 0.18713379 + - 1.9267578 + - 2.9316406 + - -1.0644531 + - -0.28515625 + - 0.26489258 + - -0.71972656 + - 2.5703125 + - -1.4707031 + - -1.5351563 + - -2.7070313 + - 1.2441406 + - -0.47607422 + - -0.3474121 + - -0.8457031 + - -3.4179688 + - -1.0927734 + - -2.1328125 + - -5.7382813 + - -1.1689453 + - 0.2512207 + - 1.3505859 + - 3.4101563 + - 3.4472656 + - 0.40112305 + - 0.56689453 + - 0.064697266 + - 0.7753906 + - 0.9980469 + - -1.6445313 + - 2.921875 + - 0.97314453 + - 1.3320313 + - -2.6816406 + - 2.3125 + - -2.0449219 + - 2.2089844 + - 1.6376953 + - 0.4819336 + - -1.6738281 + - -1.7792969 + - 0.17663574 + - 0.31298828 + - 4.0273438 + - -0.7270508 + - 3.1933594 + - 2.3964844 + - 2.65625 + - 1.4794922 + - -0.0524292 + - 1.9814453 + - 0.39282227 + - 0.23828125 + - 2.7226563 + - -0.80126953 + - -2.8105469 + - 0.1665039 + - -2.1660156 + - -2.0292969 + - -2.4453125 + - -3.0078125 + - 1.9033203 + - 2.8339844 + - 2.7753906 + - -2.4765625 + - 0.8408203 + - -3.203125 + - 2.265625 + - -1.7246094 + - 4.75 + - 4.6875 + - 0.59472656 + - -0.53466797 + - 1.7792969 + - 0.2956543 + - 2.3515625 + - -4.1757813 + - 3.9179688 + - -1.46875 + - -4.9453125 + - -1.9033203 + - -1.0390625 + - -0.34399414 + - -2.9414063 + - -15.546875 + - 2.0390625 + - -1.2695313 + - 4.1445313 + - 1.2197266 + - 3.3535156 + - 1.3818359 + - 1.5996094 + - -0.45141602 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4921875 + - 2.0800781 + - -3.2675781 + - 0.96191406 + - -0.0072517395 + - -0.21252441 + - 1.2314453 + - 2.2519531 + - -1.0253906 + - 0.35327148 + - -0.015625 + - 1.5966797 + - -4.4726563 + - 0.20471191 + - -1.7744141 + - -16.671875 + - 0.61865234 + - 0.1204834 + - 2.9863281 + - -4.984375 + - -1.5673828 + - 0.2685547 + - 1.1904297 + - -5.015625 + - -2.6191406 + - -2.6132813 + - 3.6992188 + - -0.53271484 + - -0.45141602 + - -2.3652344 + - 0.70166016 + - -6.203125 + - -1.1904297 + - -0.35180664 + - 0.74072266 + - 1.1875 + - -0.9941406 + - -0.24536133 + - -2.4628906 + - -0.63623047 + - 2.921875 + - -3.5 + - -0.0418396 + - -0.52783203 + - 1.5361328 + - 3.4628906 + - -1.8183594 + - 0.32592773 + - -1.4794922 + - -0.74853516 + - 2.2285156 + - -0.75097656 + - 0.43237305 + - -18.859375 + - -0.33251953 + - -1.9013672 + - 2.4355469 + - -4.1875 + - 2.4121094 + - 0.5698242 + - 1.2294922 + - 1.6337891 + - -0.6972656 + - 1.4189453 + - -1.1513672 + - 2.2636719 + - -1.9921875 + - 0.50927734 + - -0.11621094 + - 0.58740234 + - 0.045196533 + - 1.4101563 + - -4.8007813 + - -1.421875 + - 2.3144531 + - -2.7324219 + - -0.19055176 + - 2.9023438 + - -1.4501953 + - 3.1484375 + - -2.5957031 + - -1.5234375 + - 2.0722656 + - 1.359375 + - 3.15625 + - -2.1503906 + - -1.5009766 + - -1.6464844 + - -0.4116211 + - -0.60595703 + - -1.6875 + - 1.4931641 + - 1.8671875 + - 3.7695313 + - 1.6650391 + - 2.296875 + - 3.6601563 + - -2.0839844 + - 0.4116211 + - -2.2988281 + - -1.4267578 + - -6.0625 + - 1.0380859 + - 2.4628906 + - 0.46191406 + - 0.2548828 + - 0.19689941 + - -2.0976563 + - 0.6020508 + - 0.14929199 + - 8.09375 + - -0.37939453 + - -1.6357422 + - -1.1328125 + - 1.1572266 + - 1.5166016 + - 1.8105469 + - -1.7607422 + - -1.9306641 + - 0.43115234 + - 2.6933594 + - 0.68603516 + - 3.0800781 + - -3.4238281 + - -4.5898438 + - 0.8173828 + - 0.81689453 + - 1.5869141 + - 0.9785156 + - 0.3359375 + - -0.2454834 + - 4.140625 + - 0.45922852 + - 0.1227417 + - -2.3183594 + - 1.6416016 + - -0.86376953 + - 1.2724609 + - -3.3242188 + - -0.48486328 + - 1.7539063 + - -2.6875 + - 1.2851563 + - 3.9628906 + - 2.2578125 + - -0.9003906 + - -0.890625 + - 1.5214844 + - 1.3681641 + - 0.6738281 + - 2.875 + - 4.9257813 + - -0.41552734 + - 1.0478516 + - -0.67822266 + - 0.17907715 + - 0.7519531 + - 2.2324219 + - 1.2285156 + - 1.1103516 + - 0.13671875 + - -4.5898438 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.5 + - -3.109375 + - -0.7890625 + - 2.46875 + - 6.3671875 + - 1.0234375 + - -1.5839844 + - 1.7226563 + - 2.2578125 + - -0.53271484 + - -1.3720703 + - 1.2597656 + - -5.4179688 + - 1.2451172 + - 2.6855469 + - 5.4140625 + - -0.4560547 + - 0.5136719 + - -1.0898438 + - -0.8725586 + - -2.5917969 + - -3.6132813 + - 3.6015625 + - -0.8730469 + - 0.97802734 + - 5.375 + - -2.1015625 + - -1.2539063 + - -2.5039063 + - -0.38916016 + - -0.047546387 + - 0.2939453 + - -1.1806641 + - -0.13952637 + - 3.3027344 + - -0.9951172 + - 0.3881836 + - 1.9726563 + - 0.578125 + - -0.53564453 + - -0.30908203 + - 3.3164063 + - -0.27539063 + - 0.8676758 + - 1.8466797 + - 2.5957031 + - 0.625 + - -0.63427734 + - -3.7246094 + - -3.3027344 + - 0.061645508 + - 3.0683594 + - -0.9375 + - 2.4726563 + - -0.6616211 + - 1.5009766 + - -0.15673828 + - -3.625 + - 0.9790039 + - 0.10180664 + - -0.1430664 + - -1.1445313 + - -2.4355469 + - 6.703125 + - -2.4082031 + - 0.82666016 + - -1.2753906 + - 2.6503906 + - 0.7402344 + - -0.68408203 + - -2.0527344 + - 0.01701355 + - -3.9707031 + - 0.9741211 + - 0.3684082 + - 1.9746094 + - 1.2275391 + - 11.5703125 + - -1.9726563 + - -1.2568359 + - 1.5556641 + - 0.38720703 + - 6.0625 + - 4.03125 + - 0.3269043 + - -1.5058594 + - -0.7089844 + - 0.52783203 + - 8.3125 + - 0.38867188 + - -0.64453125 + - 0.23876953 + - -1.2001953 + - 0.69921875 + - -3.109375 + - -2.7402344 + - -2.3964844 + - -3.6738281 + - 1.8652344 + - -3.6816406 + - -1.0703125 + - 1.0126953 + - 0.83251953 + - -4.9414063 + - -0.2487793 + - 0.36669922 + - 1.9873047 + - -0.4453125 + - -1.421875 + - 1.3291016 + - -1.1318359 + - -1.125 + - 2.25 + - 0.49023438 + - 1.9892578 + - 4.171875 + - -1.8466797 + - 1.5117188 + - 0.41845703 + - -4.1914063 + - -1.8828125 + - -0.3010254 + - -1.7539063 + - 3.1015625 + - -1.0146484 + - 0.4970703 + - 3.1601563 + - 0.080078125 + - 3.5722656 + - -0.74072266 + - 3.1738281 + - -1.8457031 + - 3.15625 + - -0.88671875 + - -3.90625 + - -2.7324219 + - -3.7539063 + - 1.6591797 + - 1.1328125 + - -0.9873047 + - -0.70703125 + - -0.78564453 + - -0.30078125 + - -2.2480469 + - -1.0400391 + - 1.1386719 + - 1.0878906 + - -0.74658203 + - 2.7128906 + - -9.265625 + - 3.6757813 + - 3.4140625 + - -0.7910156 + - 0.8730469 + - -2.4628906 + - -0.8623047 + - 0.82128906 + - -0.09765625 + - 1.9785156 + - 0.9145508 + - -0.8256836 + - 3.8378906 + - 0.45043945 + - -1.5556641 + - -2.703125 + - -0.60546875 + - 1.1132813 + - -0.43652344 + - -2.0175781 + - -0.31958008 + - -0.07867432 + - -1.5126953 + - 3.2539063 + - 0.37036133 + - -6.2109375 + - 1.9072266 + - 4.3515625 + - -0.01171875 + - 0.04852295 + - 0.296875 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.5605469 + - -0.43188477 + - -0.09667969 + - 1.4482422 + - 2.7324219 + - -0.17468262 + - -3.9589844 + - 10.7734375 + - 2.2988281 + - -3.1738281 + - -71 + - 0.8598633 + - -1.671875 + - -0.8847656 + - 2.8320313 + - 4.7929688 + - 1.6953125 + - 0.8984375 + - -0.09063721 + - -2.2050781 + - -2.765625 + - 1.6904297 + - -0.7163086 + - 2.3457031 + - 0.35083008 + - -5.0625 + - -2.6972656 + - -3.0078125 + - -0.32592773 + - 1.7851563 + - 2.4550781 + - 0.5205078 + - 1.1357422 + - -0.9584961 + - -1.6064453 + - -2.7480469 + - -1.6689453 + - -3.2753906 + - 1.0966797 + - -1.7207031 + - 1.1298828 + - -4.6367188 + - 0.08984375 + - -1.109375 + - -3.8867188 + - 1.0859375 + - 1.0166016 + - -0.043792725 + - 1.3095703 + - -2.6269531 + - -0.30297852 + - -1.3212891 + - 4.2148438 + - 1.796875 + - 1.2851563 + - -2.6074219 + - 2.0527344 + - 1.4707031 + - 2.9453125 + - 0.33374023 + - 1.2978516 + - -0.5600586 + - 1.0791016 + - 9.7578125 + - -4.8945313 + - 1.8242188 + - 0.14147949 + - 0.9223633 + - 0.3815918 + - -2.0175781 + - 0.9194336 + - 2.046875 + - 0.3852539 + - -3.15625 + - -0.7392578 + - 0.11602783 + - -4.640625 + - 0.7426758 + - -0.93603516 + - 0.4621582 + - -2.9628906 + - 2.0625 + - 2.890625 + - 0.58935547 + - 1.4394531 + - 0.2878418 + - -2.2128906 + - -0.7866211 + - 0.54345703 + - 1.0351563 + - -0.11187744 + - 0.4152832 + - -1.7988281 + - -1.1962891 + - 0.7685547 + - -2.7597656 + - 2.4375 + - 3.6503906 + - -0.6088867 + - -1.0214844 + - -1.2431641 + - 2.0878906 + - -0.15905762 + - 2.8632813 + - 2.4941406 + - 7.8046875 + - 1.8417969 + - 3.0839844 + - -1.7001953 + - 0.81103516 + - 1.5585938 + - -0.31445313 + - 0.3947754 + - 1.9375 + - -0.9941406 + - 0.13220215 + - -0.83740234 + - -2.9550781 + - 0.67822266 + - -1.1914063 + - 5.3007813 + - 16.75 + - 1.0976563 + - -0.65185547 + - -3.8984375 + - 1.375 + - -0.75 + - 1.6728516 + - 2.3945313 + - -0.31225586 + - -0.9316406 + - 3.2753906 + - 0.94970703 + - 1.359375 + - -1.875 + - 2.1777344 + - 2.2441406 + - -4.0898438 + - 1.3691406 + - 0.30395508 + - 2.1152344 + - 0.1126709 + - -1.7089844 + - 1.3037109 + - -0.82666016 + - 3.9414063 + - 1.4775391 + - -1.4306641 + - 3.2910156 + - 1.3632813 + - -1.796875 + - -3.2226563 + - 1.6689453 + - -0.072509766 + - -2.9960938 + - 0.76416016 + - 0.1616211 + - -2.6503906 + - 0.085510254 + - 1.9941406 + - 0.55908203 + - 0.34423828 + - 3.0351563 + - 1.4033203 + - -0.54785156 + - 0.37817383 + - 3.5644531 + - -0.7607422 + - 2.7578125 + - 0.76660156 + - 3.2304688 + - 2.390625 + - -2.2675781 + - -1.4804688 + - 2.2480469 + - 6.3867188 + - -2.7519531 + - -0.3305664 + - 3.0195313 + - -4.2539063 + - 0.103515625 + - -0.5175781 + - -2.2578125 + - 0.27441406 + - 0.76660156 + - 2.3105469 + - 1.1015625 + - 0.081726074 + - -0.16015625 + - -0.0078125 + - -1.9619141 + - -0.63720703 + - -2.21875 + - 0.4033203 + - 1.1953125 + - 0.39013672 + - -2.21875 + - -1.65625 + - -2.0566406 + - -1.6669922 + - -10.375 + - 0.6894531 + - 0.6230469 + - -0.0446167 + - -0.6328125 + - -1.4785156 + - -3.3125 + - 1.4169922 + - -0.5205078 + - 1.609375 + - 3.4453125 + - 1.1767578 + - 2.6171875 + - 5.765625 + - -1.453125 + - 1.8847656 + - -3.3789063 + - -3.6875 + - -2.703125 + - 1.6894531 + - 0.23828125 + - -2.6445313 + - 2.9140625 + - -2.3457031 + - -0.65478516 + - 0.69970703 + - 1.2314453 + - 5.4804688 + - -0.18164063 + - 0.48754883 + - 3.3339844 + - 4.1132813 + - -3.0664063 + - -5.390625 + - -0.29589844 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.093444824 + - -1.4394531 + - 2.6972656 + - 2.3828125 + - -0.29467773 + - -1.8320313 + - -1.3818359 + - 2.1191406 + - 0.82128906 + - 3.8769531 + - 1.8378906 + - -0.46313477 + - 3.375 + - 1.1123047 + - 1.0087891 + - 2.1347656 + - -3.4277344 + - -2.8945313 + - -2.65625 + - 2.4277344 + - 2.7734375 + - -1.9775391 + - -3.71875 + - -3.6953125 + - -1.5332031 + - -4.8945313 + - 0.98828125 + - -1.0302734 + - 2.1640625 + - 0.5756836 + - -2.96875 + - -4.15625 + - -0.06274414 + - 0.03515625 + - 3.4160156 + - 0.92285156 + - -0.64697266 + - -1.0117188 + - 20.421875 + - 1.1201172 + - 0.58251953 + - 2.1933594 + - 8.015625 + - -0.35546875 + - -0.2253418 + - 0.3088379 + - 0.7392578 + - -3.4335938 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.66845703 + - 0.73535156 + - -0.64697266 + - 0.68310547 + - -2.9316406 + - -2.5644531 + - 5.1523438 + - -0.84277344 + - 0.48046875 + - 3.7089844 + - 0.16040039 + - -3.9765625 + - 1.3769531 + - 2.2441406 + - 0.9951172 + - 0.20532227 + - 0.63134766 + - 0.3720703 + - 3.1738281 + - 0.61279297 + - -4.0507813 + - 0.96191406 + - -0.62353516 + - -0.9472656 + - -1.0126953 + - -4.5390625 + - 5.3164063 + - 2.5136719 + - -6.2109375 + - -1.0478516 + - 1.4082031 + - 2.2832031 + - -1.5019531 + - 1.1425781 + - 1.7949219 + - -2.5058594 + - 3.6738281 + - 0.515625 + - 2.3613281 + - 0.29858398 + - 6.1289063 + - 1.1318359 + - 0.29174805 + - 1.046875 + - -2.0136719 + - -3.8242188 + - 4.546875 + - 3.0429688 + - 2.7207031 + - 0.028457642 + - 0.33691406 + - 0.15515137 + - 2.9394531 + - -3.4550781 + - 0.39282227 + - 0.38305664 + - -4.5078125 + - -1.8945313 + - 1.9765625 + - 2.75 + - -4.6992188 + - -2.0136719 + - -1.1396484 + - -3.2890625 + - -1.2226563 + - -2.7890625 + - 1.3349609 + - 1.0654297 + - 0.18237305 + - -3.5683594 + - -0.7392578 + - 2.5644531 + - 1.5683594 + - -1.3681641 + - -2.8691406 + - 1.3779297 + - -1.5214844 + - -0.83691406 + - -4.0742188 + - -2.375 + - -4.5429688 + - 2.6953125 + - 0.6816406 + - -3.203125 + - -2.5175781 + - -2.1894531 + - 1.2763672 + - 0.5151367 + - -0.6088867 + - 4.1289063 + - -3.0625 + - 0.6694336 + - -0.07446289 + - -1.6347656 + - 4.0546875 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0566406 + - -0.37890625 + - -4.78125 + - -1.0332031 + - 3.9765625 + - 0.3557129 + - 1.2753906 + - -2.8867188 + - 2.3613281 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.89160156 + - 3.6640625 + - 3.5039063 + - 1.4873047 + - 2.4082031 + - -0.64160156 + - 0.66015625 + - -2.4589844 + - -3.3144531 + - -2.1328125 + - 2.8867188 + - 0.7421875 + - -1.4570313 + - 1.7060547 + - 1.0664063 + - -0.52685547 + - 2.5371094 + - -1.890625 + - -1.6679688 + - 1.2255859 + - -0.51953125 + - -1.5722656 + - 1.5800781 + - 0.42919922 + - 0.4934082 + - 3.7558594 + - 2.6347656 + - 0.0892334 + - -1.2910156 + - -5.2148438 + - 3.09375 + - 1.4492188 + - -2.1113281 + - 2.4453125 + - 1.5205078 + - -3.7050781 + - 2.1386719 + - 1.9863281 + - -1.7480469 + - 2.6875 + - -2.9941406 + - -1.9804688 + - -1.8417969 + - 0.51708984 + - 1.8808594 + - 0.34106445 + - -1.5683594 + - -5.5898438 + - -0.23840332 + - -1.6435547 + - -0.86816406 + - -1.3125 + - -5.1445313 + - 3.1347656 + - 0.6113281 + - -2.2421875 + - 1.0253906 + - -1.7421875 + - 3.6621094 + - -2.1660156 + - 2.3730469 + - -1.4462891 + - 0.33862305 + - -0.83984375 + - -0.49267578 + - 1.8681641 + - -0.2175293 + - -0.25854492 + - -3.2089844 + - 0.10430908 + - -1.5869141 + - 1.0126953 + - 1.2773438 + - 3.75 + - -1.6982422 + - -2.1621094 + - -0.034454346 + - 3.90625 + - 2.0703125 + - -1.0029297 + - -3.7441406 + - -1.1357422 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.11102295 + - -1.7871094 + - 4.3984375 + - 1.2919922 + - 1.1982422 + - 0.79785156 + - -1.3037109 + - 0.2175293 + - -0.7133789 + - 2.1738281 + - -5.390625 + - -2.6777344 + - 5.7382813 + - -4.1210938 + - 3.6914063 + - -1.0966797 + - 0.49926758 + - 0.63720703 + - 3.8164063 + - 0.39770508 + - -1.3974609 + - -0.011154175 + - 0.9560547 + - 2.171875 + - -4.8320313 + - 1.7783203 + - 0.55126953 + - -3.1738281 + - -1.4326172 + - -0.23596191 + - -1.140625 + - -0.22290039 + - -1.1679688 + - 0.34204102 + - 1.5605469 + - -0.85595703 + - -2.0996094 + - -3.8925781 + - 0.55126953 + - -1.4453125 + - -1.6191406 + - 0.23510742 + - 2.6875 + - 0.5488281 + - 2.5390625 + - -0.30566406 + - -0.31054688 + - -1.75 + - 3.4765625 + - 2.8691406 + - -1.8105469 + - -0.67822266 + - -3.6894531 + - -2.2324219 + - 1.7548828 + - 0.15344238 + - -2.2128906 + - -2.3222656 + - -0.578125 + - 1.2382813 + - -0.4765625 + - 0.88134766 + - 2.4453125 + - -0.92285156 + - -3.0878906 + - -2.65625 + - 0.1439209 + - -2.96875 + - -1.8652344 + - -1.0390625 + - -2.1757813 + - -2.8847656 + - -0.6171875 + - -0.8310547 + - -1.3662109 + - 5.4140625 + - 4.6992188 + - -4.21875 + - -0.35668945 + - -1.2822266 + - 1.4794922 + - -2.3300781 + - -2.2949219 + - 3.5800781 + - -1.3066406 + - -2.5527344 + - 1.4326172 + - 2.2753906 + - -2.203125 + - -3.6445313 + - -0.66503906 + - -1.7519531 + - -1.0224609 + - 0.15905762 + - -0.32299805 + - -0.7036133 + - -1.9609375 + - -1.0732422 + - -1.2900391 + - -0.7626953 + - -2.0644531 + - -2.2519531 + - -0.75390625 + - -0.3725586 + - 3.9863281 + - -2.7480469 + - 3.9023438 + - -1.9814453 + - -0.93847656 + - 6.5117188 + - 0.60546875 + - -0.82666016 + - -1.3544922 + - 0.6323242 + - -2.96875 + - 3.3164063 + - 6.4257813 + - -2.3164063 + - -0.70703125 + - 5.7226563 + - 0.9033203 + - 1.3867188 + - 0.39868164 + - -1.9765625 + - 1.0751953 + - 0.51123047 + - -2.9804688 + - 1.3408203 + - -0.8623047 + - -0.3305664 + - 2.6601563 + - -7.1601563 + - 0.71728516 + - 4.21875 + - -2.4765625 + - -0.79003906 + - -2.1503906 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23156738 + - 1.5947266 + - 2.4082031 + - -0.6894531 + - 1.6523438 + - -2.3300781 + - -2.6777344 + - 2.3339844 + - -0.69189453 + - 0.39379883 + - -2.3339844 + - 3.765625 + - 0.6713867 + - -1.71875 + - -2.4199219 + - -1.2382813 + - -0.22509766 + - 0.57373047 + - -0.34472656 + - 0.5488281 + - 2.0214844 + - -2.5917969 + - -0.09649658 + - -2.7949219 + - 0.71972656 + - 0.95751953 + - 1.1845703 + - -1.2763672 + - -2.2324219 + - -3.1464844 + - 1.2744141 + - 0.5834961 + - 1.15625 + - -0.36157227 + - -2.1542969 + - -2.1152344 + - 1.2978516 + - -3.0253906 + - -2.5078125 + - -1.9648438 + - 3.6992188 + - -3.4804688 + - -1.9482422 + - -0.6015625 + - 2.3535156 + - -1.609375 + - 0.017578125 + - -1.0625 + - -0.9248047 + - -0.30395508 + - -4.1132813 + - 0.8129883 + - 1.6357422 + - 4.8632813 + - -1.6777344 + - 1.4501953 + - -0.2841797 + - 6.375 + - 1.9326172 + - -0.73095703 + - 1.4150391 + - 1.7363281 + - -0.64941406 + - -1.9150391 + - -1.2910156 + - 1.2724609 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3691406 + - -0.04574585 + - -0.054595947 + - 2.40625 + - -0.54248047 + - -0.9785156 + - 1.7080078 + - -1.4541016 + - -2.8515625 + - 0.9140625 + - 0.92041016 + - -3.3164063 + - -0.5415039 + - 1.859375 + - -1.9082031 + - -1.2275391 + - -0.16516113 + - -0.29711914 + - 4.4257813 + - 6.828125 + - -1.8183594 + - -0.18664551 + - -3.7402344 + - -2.1445313 + - 0.515625 + - 1.0849609 + - -2.375 + - 1.8476563 + - -3.6679688 + - -2.8671875 + - -0.51171875 + - -2.3496094 + - -0.9980469 + - -2.3925781 + - -0.021759033 + - 1.8232422 + - 1.421875 + - -0.38916016 + - 1.7294922 + - 2.8515625 + - -0.71875 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8647461 + - -1.6259766 + - -0.9580078 + - 0.50634766 + - 0.05996704 + - -0.2841797 + - -3.6992188 + - -1.28125 + - -1.3017578 + - 1.7587891 + - -0.9296875 + - 0.9707031 + - 0.14562988 + - 2.8203125 + - -0.19946289 + - -1.4619141 + - 8.03125 + - -2.1171875 + - 3.65625 + - -4.03125 + - 3.6367188 + - 4.2148438 + - -4.0703125 + - 1.1347656 + - 1.7832031 + - -0.21923828 + - -1.1455078 + - -0.35864258 + - -0.16906738 + - 1.8251953 + - -1.71875 + - -1.2568359 + - -1.7851563 + - 3.9589844 + - -0.72753906 + - 1.2275391 + - 0.44628906 + - -1.2568359 + - 0.9194336 + - -0.515625 + - -0.5131836 + - -1.1142578 + - 3.3339844 + - 0.8959961 + - -2.1777344 + - 1.6064453 + - -0.6953125 + - -2.7265625 + - 0.44482422 + - -2.1367188 + - -0.85253906 + - 2.6328125 + - 2.1464844 + - 2.1816406 + - -8.9609375 + - 4.40625 + - -0.578125 + - 0.32617188 + - 0.48632813 + - -3.5039063 + - 1.9033203 + - 0.44970703 + - -1.4980469 + - 1.4433594 + - -4.6289063 + - 0.4033203 + - -0.2097168 + - -0.4741211 + - 0.07739258 + - 0.23547363 + - 1.1494141 + - -0.3383789 + - -0.7475586 + - 0.73291016 + - 2.0761719 + - -2.421875 + - 1.4589844 + - -2.5488281 + - 1.5820313 + - 2.3574219 + - 0.77978516 + - 1.0751953 + - 1.9609375 + - -0.33642578 + - 0.08258057 + - -1.2607422 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0185547 + - -4.046875 + - 0.6635742 + - -0.4050293 + - -0.3876953 + - -0.26391602 + - 1.1337891 + - -0.93896484 + - 1.3505859 + - 6.3554688 + - 1.0771484 + - -8.7421875 + - 1.2646484 + - 1.3359375 + - -0.11853027 + - -0.98535156 + - 2.9433594 + - 6.1757813 + - -1.8076172 + - -0.09399414 + - -0.6176758 + - -1.4550781 + - 1.4707031 + - -0.77441406 + - 0.2220459 + - -0.23046875 + - -2.4199219 + - -0.43237305 + - -0.49902344 + - 4.078125 + - -1.9355469 + - -1.4414063 + - 0.12658691 + - 1.7949219 + - 3.6269531 + - 2.203125 + - 1.0576172 + - 0.4970703 + - 2.703125 + - 0.66748047 + - -24.875 + - 1.6738281 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2578125 + - -0.6875 + - 3.0644531 + - -3.7109375 + - 2.6074219 + - -7.5507813 + - -7.9296875 + - 0.8076172 + - -0.953125 + - 2.0195313 + - -1.1660156 + - 0.38110352 + - 4.4414063 + - -0.9458008 + - 1.5400391 + - 1.0097656 + - 2.0351563 + - 1.9921875 + - -2.9023438 + - -2.4785156 + - 3.6640625 + - -2.578125 + - 1.8388672 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31152344 + - -0.0836792 + - 2.3574219 + - 0.6328125 + - -1.6601563 + - 1.71875 + - -1.8515625 + - 0.73095703 + - -0.04421997 + - 0.4597168 + - 0.034576416 + - 3.46875 + - 1.4013672 + - 0.056915283 + - 3.71875 + - 2.7539063 + - 1.515625 + - -1.0654297 + - -1.0966797 + - 1.7587891 + - -1.0693359 + - -2.015625 + - 2.0742188 + - 1.3916016 + - 3.1171875 + - -1.6464844 + - -4.7148438 + - 0.67529297 + - -2.6191406 + - 0.16125488 + - 2.4453125 + - -3.1289063 + - -0.6386719 + - -0.37548828 + - -0.41308594 + - -0.12719727 + - 4.5664063 + - 2.8710938 + - 1.4658203 + - -4.6757813 + - -0.140625 + - 3.0175781 + - 0.5756836 + - -0.4440918 + - 1.3955078 + - 0.27856445 + - -0.7294922 + - -1.0048828 + - 2.1171875 + - -3.4804688 + - -0.22387695 + - 1.3056641 + - -0.33764648 + - 0.57910156 + - 4.0429688 + - -0.57177734 + - 0.72314453 + - -1.4560547 + - -3.84375 + - 0.8569336 + - -1.7167969 + - 0.9316406 + - -1.5507813 + - -2.4707031 + - 0.9458008 + - -3.0820313 + - -8.6328125 + - 0.87353516 + - -3.7128906 + - 0.2854004 + - 2.3984375 + - 1.1992188 + - -3.4628906 + - 0.6176758 + - -3.5625 + - -1.8496094 + - -5.140625 + - -0.8227539 + - 0.005859375 + - -0.0052986145 + - 3.953125 + - -0.890625 + - 1.4560547 + - -3.1464844 + - -2.7402344 + - -1.1064453 + - 0.2019043 + - -0.8989258 + - -3.078125 + - 0.8232422 + - -2.5 + - -0.43896484 + - -0.1282959 + - 1.2353516 + - -0.3251953 + - 0.5102539 + - -3.4140625 + - -1.6064453 + - 0.57910156 + - -5.2148438 + - -2.2265625 + - 2.5878906 + - 5.3945313 + - 5.4765625 + - -0.2890625 + - 0.234375 + - 4.4335938 + - 3.2617188 + - -1.6669922 + - -0.90234375 + - -2.3027344 + - 0.3310547 + - 2.8554688 + - -1.0009766 + - -0.7446289 + - -0.61035156 + - -0.75390625 + - -2.0234375 + - -2.2988281 + - 2.4609375 + - -1.8125 + - 1.2353516 + - -0.21203613 + - -2.3457031 + - -0.0234375 + - 0.78027344 + - 1.3662109 + - -0.5136719 + - -0.7988281 + - 0.52685547 + - 2.2109375 + - -0.9453125 + - -1.5009766 + - -4.6523438 + - -0.0446167 + - 0.20629883 + - 3.40625 + - -0.46484375 + - 0.18688965 + - 2.3476563 + - 23.5 + - -0.89501953 + - -3.078125 + - 4.3554688 + - 0.5859375 + - 4.0507813 + - -2.0214844 + - -13.3359375 + - 1.4970703 + - -1.0517578 + - 4.7578125 + - 0.66796875 + - 0.11383057 + - 1.2236328 + - 0.84375 + - 2.2851563 + - 1.4814453 + - -4.9257813 + - 0.3095703 + - -4.7148438 + - 1.0253906 + - -3.7539063 + - 0.3647461 + - -0.20080566 + - -1.4785156 + - 3.5820313 + - -0.93603516 + - -2.2539063 + - 0.28979492 + - 3.0644531 + - -0.5317383 + - -0.69189453 + - 1.3955078 + - -1.6269531 + - -1.3457031 + - -2.0546875 + - -0.33032227 + - -0.26245117 + - -0.96191406 + - 0.11212158 + - -2.59375 + - 2.2695313 + - -1.0654297 + - -1.7246094 + - 1.9658203 + - -0.79833984 + - 0.2915039 + - 1.7851563 + - -3.4238281 + - 3.5742188 + - 1.0439453 + - -1.3769531 + - 5.90625 + - -2.6601563 + - -2.3691406 + - 0.82666016 + - 0.78759766 + - 2.9375 + - -2.3515625 + - 1.5 + - -2.4375 + - 3.8339844 + - 0.71240234 + - -1.1992188 + - -0.064697266 + - 6.109375 + - 3.3691406 + - -0.4128418 + - -1.7158203 + - -0.36547852 + - -1.1796875 + - -0.25268555 + - -0.30004883 + - -0.19189453 + - -2.7128906 + - -5.9140625 + - 6.5351563 + - 0.93652344 + - -2.375 + - -1.8955078 + - 1.6201172 + - 0.37719727 + - -0.3203125 + - -0.21618652 + - 0.5834961 + - 1.2314453 + - 0.7866211 + - 1.6142578 + - -3.2421875 + - 0.8457031 + - 1.3232422 + - -1.9501953 + - 0.4663086 + - 0.171875 + - 5.1757813 + - 2.1445313 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4765625 + - 4.703125 + - -0.546875 + - -1.9902344 + - 5.75 + - 0.78759766 + - 0.38598633 + - -1.2539063 + - -0.17272949 + - 2.4550781 + - 1.6503906 + - -1.2587891 + - -1.6191406 + - -1.8496094 + - -0.71777344 + - -0.42578125 + - 0.38891602 + - 0.73339844 + - 0.124572754 + - 0.29614258 + - -2.078125 + - 2.2597656 + - 23.0625 + - -3.9101563 + - 2.9414063 + - -0.17468262 + - 0.92871094 + - 2.359375 + - 0.18408203 + - -2.0410156 + - 0.2841797 + - -0.84375 + - -1.4482422 + - 1.9472656 + - -2.3066406 + - -1.7001953 + - -0.2607422 + - 0.31054688 + - -5.1601563 + - 1.984375 + - 2.1582031 + - 14.546875 + - -2.6972656 + - 1.4003906 + - -0.11602783 + - -1.4023438 + - 0.2097168 + - -0.65283203 + - 0.63623047 + - 0.6635742 + - -0.21679688 + - -1.2744141 + - -26 + - -0.5024414 + - 0.55078125 + - 1.0732422 + - -2.9140625 + - -0.4934082 + - -0.6484375 + - 0.9169922 + - -2.46875 + - 0.9277344 + - 0.59472656 + - -3.8222656 + - -1.3505859 + - -0.8232422 + - -0.15454102 + - -1.0322266 + - -1.2919922 + - -2.9804688 + - 0.62353516 + - -0.2298584 + - -2.3261719 + - 0.8232422 + - 2.6308594 + - 0.26000977 + - 3.421875 + - -1.4072266 + - 3.1738281 + - -0.5625 + - 7.6953125 + - -1.9335938 + - 2.5839844 + - 4.0078125 + - -6.6484375 + - 2.421875 + - -2.1796875 + - 4.359375 + - -0.8208008 + - -0.51123047 + - -1.7314453 + - 0.5083008 + - 0.62841797 + - 0.9926758 + - -5.5351563 + - 2.9492188 + - -0.17919922 + - -2.4003906 + - 0.0287323 + - 2.7089844 + - 2.53125 + - 2.6328125 + - 2.5039063 + - -1.953125 + - -1.2744141 + - 1.8378906 + - 4.15625 + - 1.4326172 + - -1.4902344 + - -3.828125 + - -0.64501953 + - -4.1679688 + - -1.1298828 + - 2.1113281 + - 2.2246094 + - 3.640625 + - -1.1396484 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.7363281 + - -1.0830078 + - 0.77001953 + - -1.2724609 + - 1.3398438 + - -1.2626953 + - 1.3603516 + - -1.4814453 + - -2.6640625 + - 0.6230469 + - -3.5585938 + - -0.33764648 + - -3.3710938 + - -3.9375 + - -0.76416016 + - 0.515625 + - 3.0039063 + - -1.4169922 + - -0.14941406 + - 2.9160156 + - 0.7988281 + - 0.52783203 + - -2.7890625 + - 3.3554688 + - 2.0605469 + - -1.4150391 + - -3.3203125 + - 3.6054688 + - -0.5683594 + - 3.9394531 + - -2.7871094 + - -0.92089844 + - -1.0517578 + - 0.8227539 + - 3.4941406 + - 2.4726563 + - -0.17443848 + - 0.9404297 + - -3.7363281 + - -6.046875 + - -0.46191406 + - -1.4882813 + - 2.6621094 + - 2.6914063 + - 0.81933594 + - 1.0390625 + - 2.1582031 + - 0.5991211 + - -0.0715332 + - 2.3574219 + - -1.8457031 + - 2.953125 + - 1 + - -0.45532227 + - -0.33251953 + - -0.8066406 + - -0.6645508 + - 12.1953125 + - 0.5239258 + - 2.53125 + - 5.7851563 + - 7.796875 + - -1.2158203 + - 0.42822266 + - -1.0888672 + - 1.4638672 + - -2.6542969 + - -1.7939453 + - 1.3466797 + - 0.6689453 + - 0.30126953 + - -2.5625 + - -0.71875 + - 1.0185547 + - 1.890625 + - 1.9335938 + - 0.34350586 + - -0.17382813 + - -0.18469238 + - -0.78125 + - -1.9404297 + - -2.1035156 + - -1.4277344 + - 1.2451172 + - -0.46313477 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9921875 + - 1.015625 + - 0.2241211 + - -0.98291016 + - 1.9423828 + - -1.75 + - 0.74072266 + - 1.8212891 + - -1.4931641 + - 1.2539063 + - -1.7744141 + - -0.55615234 + - 3.9394531 + - -0.7192383 + - 1.7138672 + - -2.6484375 + - -1.0947266 + - -2.9023438 + - 3.21875 + - 1.0126953 + - -2.4042969 + - -1.1142578 + - 4.1015625 + - 1.8300781 + - 1.0361328 + - 1.5976563 + - 4.1875 + - 0.8457031 + - -1.8183594 + - -1.6669922 + - 1.4794922 + - 1.5244141 + - 1.203125 + - 4.1875 + - 2.5175781 + - 2.2617188 + - 1.9628906 + - -1.4160156 + - -0.6542969 + - -1.8525391 + - 1.2382813 + - 0.2019043 + - -0.050201416 + - -1.1044922 + - 0.3461914 + - 1.390625 + - 0.10290527 + - 3.0859375 + - -0.97753906 + - 0.08258057 + - 0.86376953 + - -0.26757813 + - 23.46875 + - -3.4707031 + - -1.1474609 + - -4.2460938 + - -0.22851563 + - 0.73583984 + - 2.34375 + - -0.092041016 + - -4.7851563 + - 1.6845703 + - 2.5976563 + - -1.359375 + - 3.3945313 + - 2.5351563 + - 1.9492188 + - 0.52001953 + - 1.6367188 + - -3.0742188 + - 1.7148438 + - 0.96191406 + - -2.2128906 + - 1.7011719 + - -3.6757813 + - 1.7763672 + - 0.0758667 + - 0.82177734 + - -2.2089844 + - 0.11645508 + - 2.3359375 + - -3.7753906 + - -0.76953125 + - 1.3154297 + - 2.078125 + - 2.1328125 + - 2.4160156 + - -1.5634766 + - 6.2851563 + - -0.03125 + - 0.32592773 + - -0.65625 + - -4.3359375 + - -3.5664063 + - 0.5019531 + - 4.9257813 + - 0.38012695 + - 0.20166016 + - -1.5683594 + - 1.7353516 + - 2.8164063 + - 3.9121094 + - -0.57470703 + - -1.8261719 + - 0.39379883 + - 8.6640625 + - -3.2226563 + - -1.2158203 + - 0.6328125 + - -1.2607422 + - 1.1367188 + - 0.51123047 + - 1.3037109 + - -0.11773682 + - -0.11462402 + - -4.2421875 + - -3.546875 + - -2.6640625 + - -3.1269531 + - -2.9941406 + - 0.49536133 + - -2.1972656 + - -1.2841797 + - 3.2851563 + - -0.7211914 + - -1.8222656 + - 0.68310547 + - -3.3378906 + - -4.3945313 + - -0.29614258 + - 2.0722656 + - -2.6777344 + - -0.19885254 + - 1.1748047 + - 2.1855469 + - 1.2265625 + - -1.1201172 + - -3.0878906 + - -1.4257813 + - -0.8696289 + - -2.9550781 + - 0.012275696 + - -0.5029297 + - -0.26831055 + - 4.1679688 + - -1.1015625 + - 2.6386719 + - -3.3066406 + - -2.3125 + - -1.2939453 + - -0.6850586 + - 1.2021484 + - -1.3095703 + - 1.4707031 + - 1.0224609 + - 0.8652344 + - 0.40429688 + - -1.2783203 + - -1.6054688 + - 1.5166016 + - -1.4238281 + - 1.6367188 + - 0.48046875 + - -0.32885742 + - 2.7402344 + - 0.9326172 + - 0.21398926 + - 1.2578125 + - -3.8359375 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.29956055 + - -0.22302246 + - 0.52734375 + - 1.0439453 + - 1.1669922 + - 1.2773438 + - -1.2041016 + - -2.421875 + - 1.2001953 + - 2.1035156 + - -2.71875 + - 2.1171875 + - 0.453125 + - 0.3317871 + - 1.2675781 + - 0.6713867 + - -5.578125 + - -3.3398438 + - -1.0908203 + - 1.5175781 + - 0.0262146 + - -2.25 + - -0.95703125 + - 4.9179688 + - -0.171875 + - 1.3681641 + - 6.5859375 + - 2.5625 + - -2.6875 + - 0.84033203 + - -0.055236816 + - 6.015625 + - -4.9648438 + - -2.1777344 + - 0.98876953 + - -2.1269531 + - -0.57470703 + - -2.3886719 + - 1.8857422 + - -3.3496094 + - 3.1972656 + - -1.1943359 + - 0.71972656 + - 0.15234375 + - -0.51708984 + - -1.1992188 + - 0.9658203 + - -0.23144531 + - -1.9414063 + - 5.9726563 + - 0.78759766 + - 2.4453125 + - -0.31518555 + - -4.4648438 + - 2.4316406 + - 0.24658203 + - 1.3349609 + - -0.71484375 + - -1.3564453 + - -0.7675781 + - 1.1240234 + - -2.0175781 + - -3.0800781 + - -0.032348633 + - 0.69873047 + - 1.7294922 + - 2.8203125 + - -2.3183594 + - 1.2373047 + - 0.30688477 + - -2.703125 + - 0.3466797 + - 3.5585938 + - 1.3242188 + - 5.7539063 + - 0.24804688 + - 0.0625 + - 16.203125 + - -0.41845703 + - 2.3027344 + - -3.5488281 + - -0.90771484 + - -0.89697266 + - 0.5410156 + - 1.4794922 + - 4.1484375 + - -0.92089844 + - -3.5253906 + - -1.8222656 + - 0.8720703 + - 1.9169922 + - 1.0517578 + - -1.1318359 + - 4.453125 + - -0.26391602 + - -0.66796875 + - 0.24523926 + - -1.6455078 + - 0.3034668 + - -1.5175781 + - -2.2949219 + - -1.6777344 + - 2.3652344 + - -0.2253418 + - -3.9960938 + - -3.1015625 + - 0.74316406 + - -0.99609375 + - -0.87890625 + - -1.8613281 + - -1.890625 + - 0.1751709 + - -0.083984375 + - 3.0117188 + - 0.75634766 + - 2.7890625 + - 0.2861328 + - 1.9648438 + - -4.5898438 + - 0.88720703 + - 0.65283203 + - -0.06890869 + - 4.2070313 + - -1.3691406 + - -1.3691406 + - -2.0625 + - -5.4882813 + - 2.1308594 + - 1.9013672 + - -0.30786133 + - 2.8808594 + - 4.703125 + - -1.6386719 + - -0.17785645 + - -3.8339844 + - -0.13439941 + - -1.8310547 + - -0.77441406 + - -1.1064453 + - 1.7431641 + - -2.7011719 + - -0.38720703 + - 1.0185547 + - 1.9091797 + - -4.953125 + - 3.3925781 + - 0.92626953 + - -0.5727539 + - -1.6923828 + - 4.6914063 + - 0.94384766 + - 1.1826172 + - 1.0126953 + - -1.9609375 + - -2.4472656 + - 1.6650391 + - 1.3632813 + - 2.3925781 + - 0.17211914 + - 4.7539063 + - -1.6230469 + - -1.1386719 + - 0.9663086 + - -1.5556641 + - -0.7675781 + - -1.5439453 + - 0.62353516 + - -4.34375 + - -0.8286133 + - 1.6669922 + - 1.9033203 + - -2.3789063 + - 2.5566406 + - -3.9316406 + - 2.6816406 + - 0.78759766 + - -0.73876953 + - 4.6054688 + - -0.89160156 + - -2.6074219 + - 1.9169922 + - 2.4316406 + - 3.3085938 + - 1.7695313 + - -1.0097656 + - -0.22338867 + - 0.45361328 + - 33.40625 + - 13.4765625 + - -9.1796875 + - 2.265625 + - -1.0507813 + - 1.4277344 + - -2.734375 + - -4.1757813 + - -0.36376953 + - -0.20703125 + - 1.9589844 + - 0.51464844 + - -0.34057617 + - 1.5166016 + - -2.7890625 + - 1.9707031 + - -1.0009766 + - 0.91259766 + - -2.6933594 + - 0.7138672 + - 1.8779297 + - 3.4140625 + - -1.3193359 + - -1.1445313 + - -0.2253418 + - -2.1523438 + - 0.08703613 + - -0.4038086 + - -4.6054688 + - 0.75097656 + - -0.119384766 + - -0.16101074 + - 1.4169922 + - 2.4785156 + - 1.6337891 + - -4.3789063 + - -1.8554688 + - 2.0644531 + - -2.1699219 + - 1.2451172 + - 2.2324219 + - 1.5371094 + - -0.27978516 + - 4.2304688 + - -1.2050781 + - 0.29345703 + - -3.4941406 + - 2.1425781 + - 1.3066406 + - 0.5107422 + - 2.2910156 + - 8.7265625 + - -0.5673828 + - -1.4306641 + - 1.7226563 + - -0.9453125 + - -0.84521484 + - 0.05606079 + - 1.4580078 + - 0.2175293 + - 2.9785156 + - 2.3984375 + - 1.2050781 + - -3.9238281 + - -1.7402344 + - -1.1376953 + - 1.9384766 + - -0.83203125 + - -2.6855469 + - 0.2565918 + - -2.9277344 + - -0.20385742 + - -1.5039063 + - -2.265625 + - 0.92822266 + - -2.6640625 + - -0.18579102 + - 1.3486328 + - 5.4453125 + - 0.41503906 + - -1.7626953 + - -1.4189453 + - 1.6337891 + - 1.8632813 + - 1.6875 + - 2.3808594 + - 1.1025391 + - 0.22314453 + - 1.9453125 + - -1.5341797 + - 1.3691406 + - 0.5053711 + - -0.8886719 + - -0.99902344 + - 3.6582031 + - 1.2080078 + - -1.3974609 + - 4.03125 + - -1.9023438 + - 0.5214844 + - -3.4609375 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.11743164 + - 0.4892578 + - 0.32250977 + - -2.3222656 + - -0.081970215 + - 1.4853516 + - -3.2910156 + - 3.6777344 + - -0.69384766 + - 4.28125 + - 1.8076172 + - 2.8300781 + - -2.9140625 + - -1.3212891 + - 3.5175781 + - 0.42773438 + - -2.3886719 + - -1.8847656 + - 0.8803711 + - 1.109375 + - 3.6132813 + - 1.3603516 + - -3.2714844 + - 2.0566406 + - 2.4140625 + - 0.1307373 + - -0.87890625 + - -1.2529297 + - -1.1123047 + - 1.2490234 + - 0.28198242 + - 0.3125 + - -0.18469238 + - -3.4375 + - 1.5390625 + - -1.3007813 + - -0.4399414 + - 1.9648438 + - 1.7783203 + - -2.1347656 + - -0.296875 + - -0.17236328 + - 2.0097656 + - -1.2041016 + - -0.14453125 + - -4.1132813 + - 1.1660156 + - 1.3193359 + - -1.4667969 + - -1.4375 + - 0.4111328 + - -0.91552734 + - -1.1474609 + - 0.41748047 + - 0.4025879 + - 2.1621094 + - 0.09051514 + - -2.5625 + - 2.7890625 + - 1.7763672 + - -0.9404297 + - 0.4248047 + - 0.32739258 + - 2.3457031 + - -0.119506836 + - -2.5625 + - -0.5102539 + - -0.26660156 + - -2.6132813 + - -1.3476563 + - 0.5800781 + - 0.7158203 + - 1.4140625 + - 1.9658203 + - -1.1708984 + - -1.7529297 + - -0.59765625 + - 0.38500977 + - -0.5258789 + - 0.9008789 + - 1.5195313 + - -1.5722656 + - -0.06945801 + - 1.7695313 + - 1.7246094 + - -1.2783203 + - 2.3789063 + - 2.3203125 + - 1.78125 + - 0.7128906 + - -2.4902344 + - -1.8623047 + - 2.984375 + - 1.1738281 + - 0.92285156 + - -3.3925781 + - -2.7636719 + - -1.4267578 + - -2.8496094 + - -0.41601563 + - 0.39208984 + - -12.4453125 + - -0.31689453 + - -0.46142578 + - 0.21984863 + - -0.89160156 + - 0.5493164 + - -1.2490234 + - 1.6689453 + - 0.4597168 + - -1.7109375 + - 2.34375 + - -5.3710938 + - 0.48706055 + - 0.3251953 + - -1.1757813 + - 1.375 + - 1.5214844 + - -2.0566406 + - -0.022598267 + - 3.4277344 + - 0.61816406 + - 1.828125 + - -0.5341797 + - 9.390625 + - 1.4433594 + - -2.1386719 + - 0.72509766 + - -0.5239258 + - 0.89208984 + - -0.89160156 + - -0.083618164 + - -2.6601563 + - 6.7539063 + - 0.6816406 + - -1.7734375 + - 0.74072266 + - 1.0400391 + - -6.0976563 + - 0.71777344 + - 0.2915039 + - 1.3701172 + - 0.43798828 + - 6.2929688 + - -0.5932617 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4609375 + - 2.1035156 + - 1.1425781 + - -2.8378906 + - 1.5439453 + - 1.7998047 + - -3.1582031 + - -1.0820313 + - -0.32714844 + - -0.43115234 + - -3.2050781 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6953125 + - -1.7978516 + - 3.5683594 + - -2.4199219 + - 0.19494629 + - -1.6347656 + - -1.6376953 + - 2.0566406 + - -0.3552246 + - -1.3388672 + - 1.7587891 + - 1.6367188 + - -0.61572266 + - 0.6455078 + - 0.6113281 + - 2.1738281 + - 0.86376953 + - 3.7558594 + - 0.019104004 + - -0.2692871 + - -1.7851563 + - 2.6640625 + - 0.18725586 + - -2.0234375 + - -1.2880859 + - -1.5732422 + - -0.09063721 + - 5.2382813 + - 4.703125 + - -1.1416016 + - 1.9345703 + - 2.3378906 + - -0.7207031 + - -1.2539063 + - -0.4033203 + - 2.0351563 + - -1.9433594 + - 2.2792969 + - -3.4765625 + - 2.8359375 + - 0.7871094 + - -3.9589844 + - -0.11071777 + - -2.6660156 + - 3.2460938 + - 0.30151367 + - -5.5117188 + - -0.2685547 + - -1.7626953 + - 1.6542969 + - 0.42626953 + - 0.66503906 + - 3.4492188 + - 0.47387695 + - 1.28125 + - -0.3215332 + - -3.09375 + - -1.6669922 + - -0.59765625 + - -3.7890625 + - 8.9296875 + - 1.1962891 + - 1.4658203 + - -0.5292969 + - 0.5283203 + - -1.4980469 + - 0.4362793 + - 1.1601563 + - -1.2988281 + - -5.4726563 + - -3.3964844 + - 4.6328125 + - -4.1757813 + - 1.8066406 + - -1.8466797 + - -2.8164063 + - 1.296875 + - 0.8886719 + - -0.58203125 + - 0.27270508 + - 1.25 + - 1.1113281 + - -3.1777344 + - 0.07476807 + - -4.0429688 + - 1.7041016 + - -1.5908203 + - 1.2070313 + - -3.5976563 + - 0.81103516 + - -1.4306641 + - 0.9394531 + - -2.4980469 + - -1.0517578 + - 0.07281494 + - 2.2519531 + - 3.2441406 + - 0.49902344 + - 1.6640625 + - -1.6152344 + - 2.421875 + - 1.2851563 + - -0.71875 + - -1.1757813 + - -2.6894531 + - -0.24438477 + - 0.5205078 + - 2.5664063 + - -2.8769531 + - -0.093566895 + - -0.00390625 + - 4.234375 + - -0.012275696 + - -2.2246094 + - 0.36572266 + - 1.9814453 + - -2.2167969 + - -2.3164063 + - -0.9794922 + - 1.2119141 + - 1.9492188 + - -0.5366211 + - 0.7207031 + - -1.4638672 + - -0.29589844 + - 0.8256836 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8466797 + - 5.8125 + - 2.6308594 + - -1.5351563 + - 1.4619141 + - -0.5991211 + - 1.0800781 + - -1.6582031 + - -2.0136719 + - -0.91308594 + - 1.2207031 + - -1.9169922 + - 1.1708984 + - -1.0449219 + - 3.5253906 + - 4.34375 + - -0.51708984 + - 0.18188477 + - -0.23486328 + - -1.4326172 + - -3.3300781 + - -2.8691406 + - -0.890625 + - 1.3818359 + - -1.0712891 + - 0.85791016 + - 2.171875 + - 1.5488281 + - 1.4101563 + - -0.41503906 + - 0.8691406 + - -4.9179688 + - -0.90283203 + - -8.3046875 + - -1.7314453 + - -2.0175781 + - -2.2753906 + - -2.9023438 + - -0.96533203 + - 2.8378906 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7314453 + - -1.6464844 + - -0.65722656 + - -0.1796875 + - 0.51416016 + - 2.3203125 + - 3.0976563 + - -2.1542969 + - 1.1396484 + - 1.6914063 + - -0.0390625 + - 0.88378906 + - -1.4277344 + - 0.4267578 + - 0.08758545 + - -3.4179688 + - 0.72802734 + - 4.8867188 + - -0.75634766 + - -0.5488281 + - -1.4765625 + - -2.4765625 + - 0.65625 + - -0.3408203 + - 3.7578125 + - 0.36083984 + - -2.0878906 + - 2.2285156 + - -0.27612305 + - 1.5869141 + - -2.5488281 + - 0.7753906 + - 0.4025879 + - 1.2587891 + - -0.55908203 + - 1.6416016 + - 2.9863281 + - 4.1796875 + - 0.13830566 + - -0.85595703 + - -0.55566406 + - 2.0410156 + - -3.8964844 + - 0.77978516 + - -0.2824707 + - 3.2734375 + - 1.1845703 + - -2.0351563 + - 0.7270508 + - 2.3515625 + - 0.83691406 + - -3.1015625 + - -1.3193359 + - -2.0195313 + - -1.6425781 + - -2.9023438 + - -0.42871094 + - 2.3789063 + - -3.4550781 + - -2.8339844 + - 1.1816406 + - -0.5722656 + - 2.453125 + - -2.5 + - -0.10070801 + - -1.1962891 + - -0.010597229 + - -2.734375 + - 1.5898438 + - -4.609375 + - -4.359375 + - -0.1171875 + - -1.5556641 + - 1.4550781 + - 8.6328125 + - 0.89501953 + - 3.6816406 + - -4.7578125 + - 1.1894531 + - -0.67626953 + - 1.3095703 + - 0.9038086 + - 0.67626953 + - -0.16235352 + - -4.78125 + - 0.53125 + - 0.7607422 + - 2.5625 + - -0.83447266 + - -2.8378906 + - 0.44628906 + - -0.08538818 + - -0.5522461 + - -2.4765625 + - 1.4394531 + - 2.1074219 + - -2.5625 + - 5.3554688 + - 0.30908203 + - 0.36865234 + - 0.9243164 + - 0.52734375 + - 4.0117188 + - 0.27416992 + - 2.0800781 + - -1.8203125 + - -0.51904297 + - 0.5410156 + - 2.3886719 + - 7.1640625 + - 1.7148438 + - 1.0996094 + - -1.0556641 + - 3.5546875 + - 0.050476074 + - 1.7128906 + - 1.7871094 + - 2.2246094 + - -0.30566406 + - 3.09375 + - -0.69628906 + - 3.6015625 + - -4.4882813 + - -1.4697266 + - -2.0253906 + - 0.94189453 + - 0.001115799 + - 1.3408203 + - -0.42285156 + - 4.0742188 + - -1.9775391 + - -2.1054688 + - -0.84228516 + - 0.016174316 + - 2.9785156 + - 2.40625 + - 0.7363281 + - 1.1787109 + - 3.2851563 + - 4.1992188 + - 0.75634766 + - -0.5756836 + - 1.3769531 + - 2.0800781 + - -4.9882813 + - -4.578125 + - -0.9609375 + - 3.3125 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.265625 + - -0.8544922 + - -0.28344727 + - 1.3613281 + - -1.3515625 + - -0.44604492 + - 2.5839844 + - 2.6875 + - -0.9711914 + - -0.3581543 + - 0.4165039 + - 1.7861328 + - 0.39453125 + - -0.12207031 + - -0.35864258 + - 1.2529297 + - 2.140625 + - 0.9091797 + - -2.1191406 + - -0.3251953 + - -3.6425781 + - -4.8789063 + - -0.092163086 + - 2.5820313 + - -0.86035156 + - -0.36767578 + - 3.125 + - -2.1777344 + - 2.0097656 + - 0.5566406 + - -0.9897461 + - -2.9140625 + - 1.4013672 + - -0.5180664 + - 3.0625 + - 3.3476563 + - 1.2998047 + - -6.8359375 + - -0.47680664 + - -0.41845703 + - -5.390625 + - 2.1210938 + - -2.6621094 + - 2.4355469 + - 1.3867188 + - -6.4453125 + - 1.3076172 + - -0.65478516 + - -2.7988281 + - -2.4296875 + - 1.1220703 + - -0.37597656 + - 2.0761719 + - -0.4309082 + - -0.8129883 + - -33.875 + - -2.53125 + - -2.4140625 + - -0.3881836 + - -1.4277344 + - 2.09375 + - 2.4121094 + - -4.7539063 + - -4.6601563 + - -0.9038086 + - 1.1162109 + - -1.4375 + - -1.0976563 + - 6.7734375 + - 0.4885254 + - 4.7304688 + - -1.6601563 + - 4.3242188 + - -0.25097656 + - -1.4335938 + - 0.11437988 + - -0.45507813 + - 1.0791016 + - 1.8134766 + - -0.4350586 + - -4.0117188 + - -1.2519531 + - 0.053833008 + - 1.8681641 + - -0.36206055 + - 0.5722656 + - -1.265625 + - 0.3642578 + - -0.5629883 + - -3.4941406 + - 4.8632813 + - -3.3046875 + - -0.8071289 + - -2.328125 + - -3.4863281 + - 0.029571533 + - 1.9746094 + - 2.6328125 + - 0.01576233 + - 0.25268555 + - 1.7089844 + - 4.0039063 + - -0.63720703 + - 1.90625 + - -2.8339844 + - 2.6796875 + - -1.0927734 + - 0.26220703 + - -3.9238281 + - 3.0117188 + - 2.6074219 + - -2.9648438 + - 3.4550781 + - 2.6816406 + - 0.6645508 + - -1.0673828 + - -4.0117188 + - 3.0097656 + - 1.3544922 + - 1.5175781 + - -0.3876953 + - 0.039611816 + - -5.0078125 + - 0.8300781 + - 1.3789063 + - -2.2207031 + - 0.77441406 + - 2.6035156 + - 0.40454102 + - -0.56103516 + - 2.2070313 + - -1.4003906 + - -2.6953125 + - 0.8046875 + - 0.42114258 + - -1.2441406 + - 2.0878906 + - 0.47314453 + - 1.0439453 + - 3.0527344 + - 0.85058594 + - -1.2832031 + - 1.1123047 + - 2.0527344 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0400391 + - 8.5703125 + - -1.4746094 + - 2.03125 + - -0.5991211 + - -0.8847656 + - -0.44628906 + - -0.66796875 + - 2.8222656 + - 0.049102783 + - 3.53125 + - 1.0810547 + - 2.125 + - -2.1464844 + - -2.4277344 + - 3.5800781 + - -0.17236328 + - 5.921875 + - -1.0566406 + - 5.921875 + - -2.0253906 + - -0.95410156 + - -1.4013672 + - 1.5019531 + - 0.3852539 + - 0.79003906 + - -1.5839844 + - 4.1132813 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7216797 + - -2.0976563 + - 1.7167969 + - -1.4580078 + - -4.0742188 + - -3.1113281 + - 0.44921875 + - -4.3554688 + - -0.16064453 + - 1.7939453 + - 3.7304688 + - -1.1054688 + - -0.67529297 + - -30.3125 + - -0.85595703 + - -0.027618408 + - -0.6660156 + - 0.7626953 + - 3.5800781 + - 0.79296875 + - 1.8632813 + - 0.12609863 + - 2.0976563 + - 0.012275696 + - -0.1484375 + - -2.9160156 + - -2.2011719 + - 1.3662109 + - -2.3691406 + - 0.55859375 + - 0.073791504 + - -0.63134766 + - -1.5576172 + - 1.4433594 + - 10.890625 + - 3.125 + - -1.265625 + - 1.1884766 + - 0.94140625 + - -0.84814453 + - 2.3105469 + - 0.37841797 + - -2.6035156 + - 1.296875 + - 0.2529297 + - -2.203125 + - 0.34057617 + - 0.38110352 + - -2.0644531 + - -3.2285156 + - 0.17248535 + - -0.55126953 + - -1.90625 + - 5.6289063 + - 1.6572266 + - -1.2236328 + - 3.1679688 + - 1.0341797 + - 1.2763672 + - 0.0011701584 + - 3.1445313 + - 0.6489258 + - -1.7949219 + - 0.19189453 + - 3.5175781 + - -2.3945313 + - 2.4589844 + - -1.5351563 + - -2.0097656 + - -0.9692383 + - 4.3242188 + - 0.4519043 + - -4.0820313 + - 1.6386719 + - -0.49804688 + - -0.6801758 + - -1.8076172 + - -2.5019531 + - 0.077819824 + - -3.75 + - 0.7397461 + - 3.0078125 + - -6.9453125 + - 0.48876953 + - -1.3095703 + - -3.3691406 + - -3.0175781 + - 1.7734375 + - -0.8691406 + - -3.1191406 + - 0.06640625 + - 0.18615723 + - -0.3959961 + - -1.3349609 + - -0.6459961 + - 1.8984375 + - 1.75 + - 6.6757813 + - -1.4882813 + - -0.46704102 + - -1.2744141 + - -1.8183594 + - 2.0644531 + - -1.9638672 + - -0.7011719 + - 2.0664063 + - 0.15258789 + - 3.4492188 + - 0.890625 + - 0.921875 + - -1.0634766 + - 3.0039063 + - -0.6928711 + - 1.6298828 + - 0.5488281 + - -2.703125 + - -1.1425781 + - 0.41503906 + - -0.5839844 + - -0.2109375 + - 4.5625 + - 1.4433594 + - -0.11102295 + - -1.6738281 + - 4.5078125 + - -0.49682617 + - 2.0371094 + - -2.7558594 + - -1.8857422 + - 2.1015625 + - 2.515625 + - -0.82177734 + - 0.87597656 + - 1.6611328 + - -1.1982422 + - -1.96875 + - -1.2451172 + - 0.07476807 + - -0.46923828 + - -4.9023438 + - 0.047424316 + - -1.0195313 + - 3.3046875 + - 0.25048828 + - 0.66015625 + - -0.43066406 + - -0.13110352 + - 1.1132813 + - -0.35327148 + - -0.6738281 + - -0.47021484 + - -1.140625 + - -4.4179688 + - 0.7680664 + - 4.2070313 + - 0.112854004 + - 1.3613281 + - 1.8691406 + - 0.6191406 + - 3.9082031 + - -1.546875 + - 0.0418396 + - 2.265625 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6796875 + - 1.6044922 + - -2.3691406 + - 0.18969727 + - 1.0859375 + - 2.8300781 + - -0.6640625 + - 2.6914063 + - 2.7753906 + - 1.3164063 + - 2.5449219 + - -2.40625 + - 4.4960938 + - -2.4257813 + - -0.54003906 + - 1.7001953 + - -0.63427734 + - -2.5 + - 1.7324219 + - 0.1015625 + - -2.2871094 + - -1.5751953 + - -1.5019531 + - -1.6982422 + - -2.8789063 + - 3.1425781 + - 1.8701172 + - 1.7558594 + - -2.7441406 + - -0.32348633 + - -0.13171387 + - 2.4902344 + - 0.3330078 + - 2.4199219 + - -3.0214844 + - -0.18884277 + - 0.44799805 + - 1.0439453 + - 0.17492676 + - 4.0351563 + - -0.08843994 + - 1.4238281 + - -0.7919922 + - -1.9882813 + - -0.9272461 + - 1.3662109 + - 1.046875 + - 0.63427734 + - 1.2451172 + - -3.4550781 + - 0.17297363 + - 1.7441406 + - 0.62353516 + - -0.3647461 + - 1.515625 + - -1.1552734 + - -2.4160156 + - -5.5429688 + - -4.09375 + - 6.078125 + - -1.3701172 + - -0.91015625 + - 1.1992188 + - -1.7529297 + - 2.0800781 + - -1.6416016 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.6425781 + - 0.7397461 + - 0.2734375 + - 1.4511719 + - -0.7939453 + - -1.1513672 + - 0.75683594 + - 0.1204834 + - -3.5039063 + - -1.7607422 + - -1.4775391 + - 3.1015625 + - 2.0839844 + - 6.2929688 + - -0.44384766 + - 2.5175781 + - -1.7080078 + - 1.8369141 diff --git a/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap b/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap new file mode 100644 index 00000000..b238aa6a --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_mistral__mistral_single.snap @@ -0,0 +1,4101 @@ +--- +source: backends/candle/tests/test_flash_mistral.rs +assertion_line: 48 +expression: embeddings_single +--- +- - 3.2363281 + - -1.1582031 + - 1.0810547 + - -2.0234375 + - 1.6054688 + - -1.0048828 + - 0.4362793 + - -0.87646484 + - 0.7988281 + - -0.2722168 + - 0.49365234 + - -0.8203125 + - 0.17041016 + - -0.73291016 + - -0.34936523 + - 0.03543091 + - 0.34277344 + - 1.3779297 + - 1.5234375 + - -1.8720703 + - -1.4052734 + - 1.6289063 + - -1.1650391 + - 0.6503906 + - 1.7939453 + - 1.9814453 + - -0.43286133 + - 1.3994141 + - -0.3486328 + - -2.5253906 + - 2.5390625 + - 0.32348633 + - 2.2988281 + - 1.5175781 + - -0.28735352 + - 1.1669922 + - -3.4550781 + - 0.07141113 + - -5.2773438 + - -0.8330078 + - 0.75683594 + - -2.4296875 + - -0.9194336 + - -0.98095703 + - -1.7236328 + - 2.0722656 + - 0.234375 + - -3.9003906 + - -1.4003906 + - 0.8334961 + - 3.9121094 + - -0.4350586 + - -3.0488281 + - -100.5625 + - -3.0742188 + - -0.93408203 + - 2.7128906 + - -1.0556641 + - -1.3759766 + - -7.3671875 + - -2.3769531 + - 0.57910156 + - 0.83740234 + - 0.13171387 + - 2.4042969 + - 0.07281494 + - -2.5449219 + - 0.5151367 + - 2.0644531 + - -1.5566406 + - -4.6640625 + - 0.051605225 + - -2.9902344 + - -0.9008789 + - -1.2304688 + - -0.40454102 + - 2.9863281 + - 3.1367188 + - -0.13916016 + - -0.36206055 + - -0.640625 + - -0.6069336 + - -1.5878906 + - -0.34594727 + - -2.0214844 + - 0.5366211 + - -1.8007813 + - -0.15222168 + - 2.2597656 + - 0.86816406 + - -1.2304688 + - 5.9375 + - 2.7089844 + - -19.703125 + - -2.8144531 + - -2.7832031 + - -4.4414063 + - 0.36035156 + - 1.5751953 + - -4.09375 + - 1.6904297 + - -1.3564453 + - -3.8652344 + - -0.61035156 + - 0.006626129 + - -2.7910156 + - 0.07922363 + - -1.3349609 + - -1.5810547 + - -0.059143066 + - 0.03945923 + - 0.43066406 + - 0.47851563 + - -1.5595703 + - -0.055236816 + - 3.03125 + - 2.8515625 + - 0.70703125 + - -0.18713379 + - 0.296875 + - 2.2421875 + - 0.5942383 + - 0.15258789 + - -2.4863281 + - -2.2011719 + - -0.26879883 + - 2.4003906 + - -0.7294922 + - 0.32739258 + - 1.5878906 + - 2.3789063 + - 0.171875 + - -3.2539063 + - 1.1572266 + - 1.2333984 + - 2.4101563 + - -0.30664063 + - 0.7890625 + - -1.2041016 + - -1.484375 + - 1.5195313 + - -0.41796875 + - 1.3525391 + - -2.7753906 + - 1.1738281 + - -2.8027344 + - -1.7988281 + - -0.93603516 + - -2.5703125 + - 4.578125 + - 0.7866211 + - -1.9257813 + - -1.0458984 + - 0.037109375 + - 0.5161133 + - -2.7832031 + - 0.90527344 + - -0.5083008 + - -3.0410156 + - -3.1289063 + - -1.2539063 + - -2.6191406 + - -0.5517578 + - -1.140625 + - 0.5136719 + - 1.4003906 + - 3.3613281 + - -1.1591797 + - -0.7578125 + - -0.4633789 + - -2.6328125 + - -1.9306641 + - -0.4375 + - -2.9804688 + - -0.09539795 + - 0.25195313 + - -1.3125 + - 2.09375 + - -4.265625 + - -2.2539063 + - 1.7919922 + - 0.8027344 + - -1.8613281 + - -1.8544922 + - 0.13720703 + - 5.1015625 + - -3.4863281 + - -0.8515625 + - -1.1826172 + - 0.073913574 + - -1.9101563 + - -3.7773438 + - -0.5566406 + - 0.6411133 + - -2.2441406 + - 1.4951172 + - 3.6308594 + - -2.1640625 + - -1.4902344 + - 0.13244629 + - 0.4428711 + - -2.3515625 + - 1.9189453 + - 0.7084961 + - 7.9296875 + - 3.2929688 + - 4.2617188 + - -2.84375 + - -0.34692383 + - -2.2246094 + - -2.0625 + - -0.74853516 + - -2.90625 + - -0.8613281 + - 0.83447266 + - 3.9550781 + - -0.0033473969 + - -2.5214844 + - 3.0957031 + - -0.7055664 + - -3.8515625 + - 0.63378906 + - -0.32470703 + - 3.125 + - -0.085510254 + - -1.2158203 + - 0.09539795 + - 0.765625 + - 0.3972168 + - -3.1484375 + - 0.77734375 + - -0.76708984 + - -1.0068359 + - -0.88720703 + - -0.203125 + - 1.5800781 + - 0.74072266 + - 2.3691406 + - 2.8554688 + - 1.6591797 + - 6.0390625 + - -0.35083008 + - -3.4589844 + - 0.22875977 + - -2.2265625 + - -1.7607422 + - 3.2695313 + - 2.5605469 + - -0.6118164 + - 0.20898438 + - 1.2519531 + - 0.4440918 + - -2.1269531 + - 0.515625 + - 0.625 + - -0.69921875 + - -0.33081055 + - -2.28125 + - 0.03012085 + - 0.34375 + - 1.4726563 + - 1.8476563 + - 1.8925781 + - 1.890625 + - -0.3762207 + - 2.4140625 + - -2.2988281 + - 3.9140625 + - 0.85595703 + - -4.6953125 + - 0.32910156 + - 0.8154297 + - 3.2382813 + - 0.82910156 + - -0.42822266 + - -1.1640625 + - -3.9316406 + - 1.3710938 + - 0.18383789 + - 1.0302734 + - -2.1308594 + - -2.6738281 + - 1.3876953 + - 0.13671875 + - 1 + - -0.7792969 + - -0.064697266 + - 1.8291016 + - 0.65722656 + - 0.03186035 + - 1.7236328 + - 1.2119141 + - 10.078125 + - 0.06500244 + - 0.6723633 + - -0.4814453 + - 1.8417969 + - -1.4003906 + - 2.2128906 + - -0.5473633 + - -0.07757568 + - -0.20861816 + - 2.7636719 + - 3.3300781 + - -1.640625 + - 1.5292969 + - 2.4765625 + - 1.4394531 + - -0.09094238 + - -1.203125 + - -1.6669922 + - -0.10656738 + - -0.8984375 + - 0.07366943 + - 1.1894531 + - -2.4375 + - 0.08148193 + - -0.140625 + - -3.1875 + - 1.2861328 + - 1.8310547 + - 1.2421875 + - -3.8359375 + - 2.5703125 + - -1.4082031 + - -0.7836914 + - -1.3457031 + - -1.5019531 + - 2.3652344 + - -3.5800781 + - -4.078125 + - 1.7050781 + - 1.5644531 + - 0.7675781 + - 2.3378906 + - -0.11633301 + - 2.78125 + - -0.4987793 + - 0.0914917 + - 0.10571289 + - 2.7597656 + - -0.4482422 + - 2.1015625 + - 1.5498047 + - 1.9423828 + - 1.1533203 + - -0.21398926 + - 2.6796875 + - -5.0664063 + - -0.8828125 + - 2.1503906 + - -1.2607422 + - 0.3330078 + - 0.5073242 + - -2.1738281 + - -0.7817383 + - -4.09375 + - -1.6074219 + - -1.6220703 + - -1.4130859 + - -1.4902344 + - 1.7304688 + - 4.359375 + - -1.3847656 + - 2.96875 + - -2.9003906 + - 6.1679688 + - 1.703125 + - 1.4638672 + - -2.6914063 + - 0.77001953 + - -1.5253906 + - -2.1230469 + - 3.5039063 + - -0.40283203 + - 3.5976563 + - -1.4462891 + - 0.39208984 + - 0.70947266 + - 2.4726563 + - -1.3896484 + - -1.2861328 + - -1.9472656 + - -0.86035156 + - -0.7050781 + - 1.8564453 + - 1.8613281 + - -4.2226563 + - -8.125 + - -2.109375 + - 0.45532227 + - -0.09313965 + - -2.6660156 + - -0.9580078 + - 0.046875 + - -0.29736328 + - 2.6464844 + - 2.1054688 + - -2.1464844 + - 1.5488281 + - -2.3359375 + - 1.5898438 + - -0.5644531 + - -4.34375 + - -0.17236328 + - 1.7988281 + - 2.046875 + - -2.1660156 + - -14.390625 + - -0.1204834 + - -2.2128906 + - -1.6064453 + - 3.1152344 + - -1.1582031 + - 1.4433594 + - -0.19799805 + - -3.6875 + - -1.4189453 + - -3.6191406 + - 5.109375 + - -0.5004883 + - -0.4711914 + - 2.7988281 + - -0.33129883 + - -0.76171875 + - 1.0517578 + - 0.16320801 + - -2.0371094 + - 2.2246094 + - -1.4384766 + - -1.9189453 + - -1.7138672 + - -3.8613281 + - 0.84814453 + - -0.37939453 + - -1.8515625 + - 0.58203125 + - -1.9013672 + - 0.75097656 + - 1.6738281 + - -1.3115234 + - -1.5058594 + - -0.6225586 + - -1.6416016 + - -2.203125 + - -0.9116211 + - 0.06585693 + - 2.7050781 + - -2.1699219 + - -3.5800781 + - -0.0075302124 + - 1.5263672 + - -0.5859375 + - -2.0429688 + - -0.47314453 + - 5.609375 + - 4.625 + - -0.036254883 + - 0.06878662 + - 3.2851563 + - -0.44848633 + - -2.8945313 + - -1.7666016 + - 2.7695313 + - -0.9326172 + - -0.84472656 + - -0.9819336 + - 0.27319336 + - 0.33789063 + - -2.3496094 + - 4.9335938 + - 2.3125 + - 0.296875 + - 1.015625 + - 0.34985352 + - 0.4375 + - 0.8125 + - -0.91259766 + - -0.60546875 + - 3.8242188 + - 0.56884766 + - 0.5625 + - 0.9741211 + - -1.9951172 + - -0.32543945 + - 1.2128906 + - -6.0039063 + - 0.13793945 + - 3.71875 + - -0.5605469 + - 0.46289063 + - 1.5683594 + - -0.7011719 + - -0.4658203 + - -2.6289063 + - -1.3330078 + - 2.4589844 + - -2.0410156 + - -2.9179688 + - 5.3789063 + - 0.21728516 + - -5.9609375 + - 2.0371094 + - 0.051330566 + - 1.3349609 + - 3.8339844 + - -0.62158203 + - -0.61035156 + - -1.5869141 + - 2.8496094 + - 3.6738281 + - -2.5761719 + - -1.5 + - 0.6928711 + - -2.0371094 + - 1.6220703 + - -0.34204102 + - -0.5527344 + - -1.4384766 + - -0.5102539 + - 0.5991211 + - 1.5878906 + - 3.6777344 + - -0.01701355 + - 0.55566406 + - 1.4580078 + - 0.20336914 + - -1.375 + - 1.6777344 + - 2.1894531 + - 0.85302734 + - 0.45385742 + - -0.0055770874 + - -1.8759766 + - 3.5820313 + - 0.16687012 + - -4.5078125 + - -0.12371826 + - -0.3569336 + - -1.6259766 + - -1.9589844 + - -1.0117188 + - 3.1054688 + - -0.84765625 + - -4.8398438 + - -2.3632813 + - -1.3837891 + - 0.20227051 + - 1.984375 + - 1.4824219 + - 0.63720703 + - 1.9658203 + - -17.703125 + - -1.4570313 + - -1.0488281 + - -2 + - -1.3818359 + - 0.6147461 + - 0.203125 + - 0.0036258698 + - 2.34375 + - -3.4863281 + - -1.0546875 + - -2.2402344 + - 1.2724609 + - -1.0302734 + - 0.8774414 + - -2.4511719 + - -1.4433594 + - -2.3476563 + - -2.2890625 + - -0.8935547 + - -1.9257813 + - 0.9921875 + - 0.2890625 + - -1.2851563 + - 1.1181641 + - 0.57421875 + - 0.31811523 + - 0.72314453 + - -3.2070313 + - 0.65966797 + - 2.5644531 + - -3.21875 + - -2.9375 + - 1.6806641 + - 1.6425781 + - -2.3378906 + - -3.4960938 + - -1.1923828 + - 1.4433594 + - -3.1875 + - -1.8876953 + - -0.10430908 + - -1.9082031 + - 1.4277344 + - 5.1757813 + - 3.9101563 + - 1.0273438 + - 3.2441406 + - -0.8261719 + - -0.68408203 + - 0.056915283 + - -2.2558594 + - -2.3261719 + - 0.15344238 + - -3.6953125 + - 0.5649414 + - -4.3789063 + - 0.9536133 + - 2.5917969 + - -1.7558594 + - -1.9824219 + - 1.9570313 + - -0.6069336 + - -0.25170898 + - -1.5556641 + - 1.8720703 + - -2.140625 + - 0.001115799 + - 1.4619141 + - 1.8613281 + - 0.002231598 + - 0.44140625 + - -1.609375 + - 3.4902344 + - 0.036834717 + - 1.4189453 + - 0.78222656 + - -0.125 + - 1.7041016 + - -0.5253906 + - -3.2265625 + - -2.6875 + - 0.61328125 + - 2.6132813 + - -2.8164063 + - -0.8310547 + - -0.25170898 + - 0.034576416 + - -2.2246094 + - -2.5664063 + - -0.08154297 + - 2.7851563 + - 4.390625 + - -1.0859375 + - 0.5961914 + - -4.6757813 + - 7.9101563 + - -3.1484375 + - 0.7319336 + - 3.3535156 + - -1.6201172 + - -2.59375 + - 0.98291016 + - -1.6289063 + - -0.5541992 + - 2.6914063 + - 3.8085938 + - -0.45996094 + - 1.4609375 + - 1.0556641 + - 1.6582031 + - 3.1054688 + - -0.5498047 + - 2.4003906 + - 1.8154297 + - -2.0449219 + - 0.22497559 + - 0.9868164 + - -0.52490234 + - -1.0039063 + - 0.6166992 + - 0.609375 + - -0.7138672 + - -2.9492188 + - -0.19580078 + - -0.9863281 + - -0.18981934 + - 0.0446167 + - 1.5244141 + - 1.7304688 + - 1.015625 + - -1.4150391 + - 7.7539063 + - 3.3671875 + - 7.0976563 + - 1.4716797 + - -5.71875 + - -5.8828125 + - -0.3815918 + - -1.3154297 + - -0.3232422 + - -1.5888672 + - 0.18579102 + - -0.23291016 + - -1.0429688 + - 1.6132813 + - -1.9462891 + - 2.6738281 + - 3.2207031 + - 3.6679688 + - -0.9086914 + - -2.5136719 + - 0.5102539 + - 24.09375 + - 1.2988281 + - 0.88183594 + - 0.09259033 + - -3.0175781 + - 1.8251953 + - 0.71240234 + - 0.7685547 + - -2.15625 + - 1.1123047 + - 3.0058594 + - 2.9707031 + - -0.28710938 + - -0.04937744 + - 0.5996094 + - 4.7890625 + - 1.4404297 + - 3.0644531 + - -5.0585938 + - -0.171875 + - -1.8632813 + - -1.8867188 + - -3.6425781 + - 0.9008789 + - -0.4501953 + - 1.4492188 + - -0.27001953 + - -1.8603516 + - 2.15625 + - 0.66259766 + - -3.4140625 + - -5.734375 + - -0.2175293 + - -3.0253906 + - -0.99658203 + - 1.8369141 + - -1.4111328 + - 1.4414063 + - 3.9785156 + - -1.9648438 + - -1.5273438 + - -1.875 + - 2.2949219 + - -0.2331543 + - -0.55810547 + - 1.2763672 + - 0.61083984 + - 1.4492188 + - 0.84228516 + - -0.7363281 + - -0.9975586 + - -3.1113281 + - 2.9492188 + - -0.51416016 + - 0.32739258 + - -2.6601563 + - -1.5888672 + - 1.0517578 + - 0.116882324 + - -1.2705078 + - -1.6640625 + - 2.1640625 + - -1.7226563 + - -1.7275391 + - -0.45581055 + - -0.26733398 + - 2.6152344 + - 0.42016602 + - -1.1191406 + - -0.46948242 + - 4.125 + - 1.4794922 + - -0.26660156 + - 2.9726563 + - -2.859375 + - 2.3183594 + - 0.52001953 + - -1.1894531 + - -3.203125 + - -1.1923828 + - 2.2304688 + - -2.4980469 + - 5.8789063 + - -0.002231598 + - 2.4101563 + - -0.78125 + - -1.4570313 + - 0.85595703 + - 2.6875 + - 0.5 + - -1.1445313 + - -0.55908203 + - 0.46972656 + - 1.1552734 + - -3.6191406 + - 2.3222656 + - -4.75 + - -4.75 + - -3.7851563 + - 1.0068359 + - 3.9140625 + - 1.4355469 + - -1.3916016 + - 0.17407227 + - 2.4257813 + - 1.2197266 + - -2.609375 + - 1.1171875 + - -1.5351563 + - -4.0273438 + - -0.3540039 + - 5.6328125 + - 0.22961426 + - 2.1113281 + - 1.9863281 + - -0.9980469 + - 2.140625 + - -0.2734375 + - -2.8144531 + - -0.19921875 + - 4.5820313 + - -2.5644531 + - -0.36279297 + - 2.8847656 + - -1.4326172 + - 0.06750488 + - 1.0771484 + - -1.1982422 + - -9.3359375 + - 1.4482422 + - -47.28125 + - -1.2910156 + - -0.60595703 + - -2.0683594 + - -3.9179688 + - -0.47753906 + - 0.29614258 + - 1.0644531 + - 1.6621094 + - 1.0615234 + - 0.18664551 + - -1.7929688 + - 4.6835938 + - -0.5258789 + - -2.0019531 + - 1.5908203 + - 1.1064453 + - -0.72509766 + - 16.984375 + - 0.42407227 + - -0.97509766 + - -1.2607422 + - -0.94140625 + - -0.58251953 + - 0.40063477 + - 2.8007813 + - 0.87109375 + - -1.6220703 + - -0.42578125 + - -2.6699219 + - -0.9589844 + - -2.4199219 + - 0.1784668 + - 0.50146484 + - -0.8803711 + - 2.4511719 + - 1.0332031 + - 0.80566406 + - 1.4453125 + - 0.50878906 + - 3.9179688 + - -0.37817383 + - 1.0478516 + - 0.25683594 + - -3.1425781 + - 2.5253906 + - 0.12548828 + - -1.2929688 + - -0.5229492 + - -2.9902344 + - 0.3515625 + - -1.6113281 + - -0.08203125 + - -0.65966797 + - -0.06137085 + - 0.20996094 + - 1.9462891 + - -4.1523438 + - -2.4902344 + - 0.3618164 + - 0.18371582 + - -1.0068359 + - -2.59375 + - 1.2685547 + - 6.5976563 + - -0.65185547 + - -0.7446289 + - 4.7265625 + - -2.2558594 + - 2.3105469 + - -2.0644531 + - -0.16882324 + - 0.17822266 + - -2.3066406 + - 2.8925781 + - -4.5742188 + - 3.5976563 + - -1.0625 + - 5.234375 + - 0.47021484 + - 0.3149414 + - -3.0703125 + - 1.9140625 + - 0.18664551 + - 1.9296875 + - 2.9335938 + - -1.0634766 + - -0.28735352 + - 0.26293945 + - -0.7158203 + - 2.5664063 + - -1.4658203 + - -1.5371094 + - -2.7050781 + - 1.2421875 + - -0.47607422 + - -0.35009766 + - -0.84472656 + - -3.4140625 + - -1.09375 + - -2.1328125 + - -5.7382813 + - -1.1669922 + - 0.2524414 + - 1.3486328 + - 3.4140625 + - 3.4492188 + - 0.40039063 + - 0.56640625 + - 0.06439209 + - 0.7709961 + - 0.99365234 + - -1.6416016 + - 2.9238281 + - 0.9736328 + - 1.3349609 + - -2.6855469 + - 2.3144531 + - -2.046875 + - 2.2109375 + - 1.6347656 + - 0.484375 + - -1.6738281 + - -1.7783203 + - 0.17663574 + - 0.31176758 + - 4.0273438 + - -0.72509766 + - 3.1933594 + - 2.3925781 + - 2.6542969 + - 1.484375 + - -0.05355835 + - 1.9794922 + - 0.39257813 + - 0.24121094 + - 2.7246094 + - -0.80126953 + - -2.8066406 + - 0.16589355 + - -2.1699219 + - -2.03125 + - -2.4511719 + - -3.0097656 + - 1.8994141 + - 2.8339844 + - 2.7753906 + - -2.4824219 + - 0.84228516 + - -3.1992188 + - 2.2734375 + - -1.7246094 + - 4.734375 + - 4.6914063 + - 0.59472656 + - -0.5366211 + - 1.7763672 + - 0.2956543 + - 2.3574219 + - -4.1796875 + - 3.9277344 + - -1.46875 + - -4.9414063 + - -1.9033203 + - -1.0361328 + - -0.3449707 + - -2.9414063 + - -15.5703125 + - 2.0390625 + - -1.2744141 + - 4.1445313 + - 1.2207031 + - 3.3535156 + - 1.3818359 + - 1.5976563 + - -0.45166016 + - -0.6635742 + - 1.65625 + - -2.0996094 + - 2.4941406 + - 1.4931641 + - 2.0800781 + - -3.2714844 + - 0.96191406 + - -0.0055770874 + - -0.21203613 + - 1.2304688 + - 2.2519531 + - -1.0205078 + - 0.35668945 + - -0.019805908 + - 1.59375 + - -4.4726563 + - 0.2109375 + - -1.7705078 + - -16.6875 + - 0.61816406 + - 0.119384766 + - 2.9882813 + - -4.9882813 + - -1.5654297 + - 0.2705078 + - 1.1875 + - -5.0273438 + - -2.6191406 + - -2.6113281 + - 3.7070313 + - -0.53222656 + - -0.44799805 + - -2.3652344 + - 0.7050781 + - -6.203125 + - -1.1806641 + - -0.3515625 + - 0.73828125 + - 1.1845703 + - -1 + - -0.24719238 + - -2.4667969 + - -0.6381836 + - 2.9179688 + - -3.5039063 + - -0.040161133 + - -0.52783203 + - 1.5332031 + - 3.4589844 + - -1.8183594 + - 0.32641602 + - -1.4794922 + - -0.75 + - 2.2285156 + - -0.75390625 + - 0.43066406 + - -18.859375 + - -0.33496094 + - -1.8964844 + - 2.4355469 + - -4.1835938 + - 2.4101563 + - 0.5703125 + - 1.2275391 + - 1.6376953 + - -0.6977539 + - 1.4189453 + - -1.1503906 + - 2.2636719 + - -1.9921875 + - 0.5078125 + - -0.11853027 + - 0.58691406 + - 0.04714966 + - 1.4111328 + - -4.8007813 + - -1.421875 + - 2.3105469 + - -2.7324219 + - -0.19165039 + - 2.9023438 + - -1.453125 + - 3.1464844 + - -2.5957031 + - -1.5205078 + - 2.0761719 + - 1.3583984 + - 3.15625 + - -2.1542969 + - -1.4980469 + - -1.6445313 + - -0.41552734 + - -0.60791016 + - -1.6884766 + - 1.4931641 + - 1.8642578 + - 3.7695313 + - 1.6601563 + - 2.2988281 + - 3.6582031 + - -2.0839844 + - 0.41430664 + - -2.2949219 + - -1.4238281 + - -6.0546875 + - 1.0351563 + - 2.46875 + - 0.46142578 + - 0.2512207 + - 0.19921875 + - -2.0976563 + - 0.60302734 + - 0.1508789 + - 8.0703125 + - -0.37890625 + - -1.6367188 + - -1.1289063 + - 1.1582031 + - 1.5166016 + - 1.8085938 + - -1.7597656 + - -1.9277344 + - 0.43237305 + - 2.6953125 + - 0.68310547 + - 3.0742188 + - -3.4238281 + - -4.5898438 + - 0.8183594 + - 0.8173828 + - 1.5820313 + - 0.97314453 + - 0.3359375 + - -0.24768066 + - 4.140625 + - 0.4609375 + - 0.12164307 + - -2.3164063 + - 1.6376953 + - -0.86328125 + - 1.2705078 + - -3.3242188 + - -0.4831543 + - 1.75 + - -2.6875 + - 1.2890625 + - 3.96875 + - 2.2597656 + - -0.89990234 + - -0.88964844 + - 1.5273438 + - 1.3662109 + - 0.67626953 + - 2.8710938 + - 4.9335938 + - -0.4152832 + - 1.0458984 + - -0.6816406 + - 0.17663574 + - 0.75 + - 2.2324219 + - 1.2294922 + - 1.1123047 + - 0.13781738 + - -4.578125 + - -0.58251953 + - 3.1289063 + - -2.9101563 + - -0.50390625 + - -3.1054688 + - -0.7910156 + - 2.46875 + - 6.375 + - 1.0224609 + - -1.5839844 + - 1.7207031 + - 2.2578125 + - -0.5307617 + - -1.3740234 + - 1.2626953 + - -5.4179688 + - 1.2460938 + - 2.6777344 + - 5.4140625 + - -0.45336914 + - 0.5151367 + - -1.0908203 + - -0.8769531 + - -2.59375 + - -3.6132813 + - 3.6015625 + - -0.8696289 + - 0.9765625 + - 5.375 + - -2.1015625 + - -1.2519531 + - -2.5078125 + - -0.39208984 + - -0.044769287 + - 0.2902832 + - -1.1806641 + - -0.1352539 + - 3.3046875 + - -0.9975586 + - 0.38891602 + - 1.9707031 + - 0.58154297 + - -0.54052734 + - -0.30859375 + - 3.3164063 + - -0.28027344 + - 0.87158203 + - 1.84375 + - 2.5957031 + - 0.625 + - -0.63720703 + - -3.7226563 + - -3.2988281 + - 0.060546875 + - 3.0703125 + - -0.93847656 + - 2.4707031 + - -0.65722656 + - 1.5 + - -0.15563965 + - -3.625 + - 0.98095703 + - 0.1015625 + - -0.14416504 + - -1.1445313 + - -2.4316406 + - 6.703125 + - -2.4082031 + - 0.82910156 + - -1.2744141 + - 2.6484375 + - 0.7402344 + - -0.6870117 + - -2.0546875 + - 0.016738892 + - -3.9648438 + - 0.97753906 + - 0.3684082 + - 1.9726563 + - 1.2236328 + - 11.5703125 + - -1.9707031 + - -1.2548828 + - 1.5488281 + - 0.38598633 + - 6.0546875 + - 4.0273438 + - 0.3269043 + - -1.5107422 + - -0.71191406 + - 0.52734375 + - 8.3046875 + - 0.3881836 + - -0.64404297 + - 0.2421875 + - -1.1992188 + - 0.69873047 + - -3.1113281 + - -2.7441406 + - -2.3984375 + - -3.6738281 + - 1.8623047 + - -3.6796875 + - -1.0703125 + - 1.0117188 + - 0.83203125 + - -4.9375 + - -0.24768066 + - 0.37231445 + - 1.9902344 + - -0.44458008 + - -1.4228516 + - 1.3271484 + - -1.1367188 + - -1.125 + - 2.2480469 + - 0.48657227 + - 1.9863281 + - 4.1679688 + - -1.84375 + - 1.5097656 + - 0.41918945 + - -4.1914063 + - -1.8837891 + - -0.30249023 + - -1.7529297 + - 3.1015625 + - -1.015625 + - 0.49438477 + - 3.1601563 + - 0.076171875 + - 3.5742188 + - -0.7426758 + - 3.171875 + - -1.8476563 + - 3.15625 + - -0.8876953 + - -3.9023438 + - -2.7324219 + - -3.7519531 + - 1.6601563 + - 1.1337891 + - -0.98876953 + - -0.70947266 + - -0.7890625 + - -0.30151367 + - -2.2441406 + - -1.0410156 + - 1.1416016 + - 1.0859375 + - -0.74365234 + - 2.7128906 + - -9.2578125 + - 3.6777344 + - 3.4101563 + - -0.7944336 + - 0.8720703 + - -2.4628906 + - -0.8623047 + - 0.82177734 + - -0.097351074 + - 1.9794922 + - 0.9145508 + - -0.82421875 + - 3.8378906 + - 0.4519043 + - -1.5556641 + - -2.7050781 + - -0.60253906 + - 1.1113281 + - -0.43481445 + - -2.0175781 + - -0.31811523 + - -0.0758667 + - -1.5087891 + - 3.2519531 + - 0.3737793 + - -6.2070313 + - 1.9091797 + - 4.3554688 + - -0.013671875 + - 0.04714966 + - 0.29467773 + - 0.8154297 + - 1.7441406 + - 2.4199219 + - 3.375 + - 0.42578125 + - 0.55810547 + - -0.4350586 + - -0.10180664 + - 1.4433594 + - 2.7324219 + - -0.17236328 + - -3.9609375 + - 10.78125 + - 2.2988281 + - -3.1757813 + - -71.0625 + - 0.85791016 + - -1.6738281 + - -0.8847656 + - 2.8320313 + - 4.7890625 + - 1.6933594 + - 0.89697266 + - -0.09313965 + - -2.2050781 + - -2.7636719 + - 1.6953125 + - -0.71533203 + - 2.3476563 + - 0.35327148 + - -5.0625 + - -2.6953125 + - -3.0058594 + - -0.32592773 + - 1.7832031 + - 2.4550781 + - 0.5229492 + - 1.1347656 + - -0.9584961 + - -1.6064453 + - -2.7519531 + - -1.6699219 + - -3.28125 + - 1.0976563 + - -1.7207031 + - 1.1289063 + - -4.6367188 + - 0.08868408 + - -1.1123047 + - -3.8847656 + - 1.0830078 + - 1.0185547 + - -0.043792725 + - 1.3076172 + - -2.6289063 + - -0.30395508 + - -1.3193359 + - 4.21875 + - 1.7939453 + - 1.2841797 + - -2.6074219 + - 2.0527344 + - 1.4726563 + - 2.9414063 + - 0.3347168 + - 1.2998047 + - -0.56591797 + - 1.0771484 + - 9.7265625 + - -4.9023438 + - 1.8222656 + - 0.13598633 + - 0.9267578 + - 0.3774414 + - -2.0136719 + - 0.92089844 + - 2.0449219 + - 0.38598633 + - -3.1523438 + - -0.7363281 + - 0.11602783 + - -4.6367188 + - 0.7373047 + - -0.9375 + - 0.46191406 + - -2.9609375 + - 2.0625 + - 2.8964844 + - 0.58447266 + - 1.4394531 + - 0.29077148 + - -2.2109375 + - -0.7861328 + - 0.54296875 + - 1.0341797 + - -0.111328125 + - 0.41235352 + - -1.7998047 + - -1.1992188 + - 0.7680664 + - -2.7578125 + - 2.4277344 + - 3.6503906 + - -0.6069336 + - -1.0185547 + - -1.2431641 + - 2.0898438 + - -0.15917969 + - 2.8671875 + - 2.4902344 + - 7.8007813 + - 1.8486328 + - 3.0820313 + - -1.703125 + - 0.8125 + - 1.5527344 + - -0.3125 + - 0.39379883 + - 1.9355469 + - -0.99658203 + - 0.13000488 + - -0.84033203 + - -2.9570313 + - 0.6801758 + - -1.1962891 + - 5.3007813 + - 16.75 + - 1.0966797 + - -0.65185547 + - -3.8945313 + - 1.375 + - -0.7519531 + - 1.6757813 + - 2.3925781 + - -0.3112793 + - -0.93359375 + - 3.2714844 + - 0.94921875 + - 1.359375 + - -1.8720703 + - 2.1757813 + - 2.2402344 + - -4.09375 + - 1.3691406 + - 0.3017578 + - 2.1171875 + - 0.10992432 + - -1.7070313 + - 1.2988281 + - -0.8232422 + - 3.9394531 + - 1.4765625 + - -1.4296875 + - 3.2890625 + - 1.3623047 + - -1.7988281 + - -3.2207031 + - 1.6689453 + - -0.06915283 + - -3 + - 0.7626953 + - 0.15979004 + - -2.6484375 + - 0.08618164 + - 1.9960938 + - 0.55322266 + - 0.3449707 + - 3.0351563 + - 1.4033203 + - -0.54345703 + - 0.3737793 + - 3.5664063 + - -0.76220703 + - 2.7558594 + - 0.7607422 + - 3.2363281 + - 2.3925781 + - -2.2617188 + - -1.4804688 + - 2.25 + - 6.3828125 + - -2.75 + - -0.32836914 + - 3.0234375 + - -4.2539063 + - 0.107666016 + - -0.51660156 + - -2.2578125 + - 0.2763672 + - 0.7685547 + - 2.3105469 + - 1.0986328 + - 0.08648682 + - -0.15844727 + - -0.0027885437 + - -1.9550781 + - -0.63671875 + - -2.2246094 + - 0.40283203 + - 1.1972656 + - 0.39086914 + - -2.2207031 + - -1.6533203 + - -2.0566406 + - -1.6660156 + - -10.375 + - 0.69091797 + - 0.6245117 + - -0.04574585 + - -0.63378906 + - -1.4775391 + - -3.3144531 + - 1.4140625 + - -0.5234375 + - 1.6064453 + - 3.4453125 + - 1.1767578 + - 2.6191406 + - 5.765625 + - -1.4560547 + - 1.8808594 + - -3.375 + - -3.6914063 + - -2.7050781 + - 1.6914063 + - 0.24243164 + - -2.6425781 + - 2.9160156 + - -2.34375 + - -0.6567383 + - 0.69628906 + - 1.2294922 + - 5.4804688 + - -0.18408203 + - 0.48876953 + - 3.3378906 + - 4.1132813 + - -3.0703125 + - -5.390625 + - -0.29760742 + - 0.8984375 + - 1.0292969 + - 2.5839844 + - -0.08984375 + - -1.4404297 + - 2.7011719 + - 2.3789063 + - -0.2915039 + - -1.8369141 + - -1.3837891 + - 2.1191406 + - 0.8208008 + - 3.875 + - 1.8369141 + - -0.4584961 + - 3.375 + - 1.1132813 + - 1.0107422 + - 2.1347656 + - -3.4238281 + - -2.9003906 + - -2.6542969 + - 2.4277344 + - 2.7695313 + - -1.9716797 + - -3.71875 + - -3.6953125 + - -1.53125 + - -4.890625 + - 0.98535156 + - -1.0332031 + - 2.1660156 + - 0.57177734 + - -2.96875 + - -4.15625 + - -0.06359863 + - 0.03375244 + - 3.421875 + - 0.9238281 + - -0.6503906 + - -1.0087891 + - 20.421875 + - 1.1191406 + - 0.57958984 + - 2.1933594 + - 8.015625 + - -0.359375 + - -0.22424316 + - 0.3095703 + - 0.73583984 + - -3.4316406 + - -0.8833008 + - 4.125 + - -2.3203125 + - 4.7304688 + - 0.6694336 + - 0.73828125 + - -0.64697266 + - 0.6850586 + - -2.9277344 + - -2.5664063 + - 5.1523438 + - -0.84033203 + - 0.48242188 + - 3.7050781 + - 0.15368652 + - -3.9765625 + - 1.375 + - 2.2460938 + - 0.9941406 + - 0.20471191 + - 0.63378906 + - 0.37158203 + - 3.1679688 + - 0.61279297 + - -4.0507813 + - 0.9628906 + - -0.625 + - -0.94433594 + - -1.0126953 + - -4.5390625 + - 5.3125 + - 2.5136719 + - -6.203125 + - -1.0429688 + - 1.4091797 + - 2.28125 + - -1.4980469 + - 1.140625 + - 1.7939453 + - -2.5078125 + - 3.671875 + - 0.52001953 + - 2.359375 + - 0.30126953 + - 6.125 + - 1.1328125 + - 0.2890625 + - 1.0439453 + - -2.0097656 + - -3.8300781 + - 4.5507813 + - 3.0390625 + - 2.7226563 + - 0.027053833 + - 0.33325195 + - 0.15283203 + - 2.9375 + - -3.4550781 + - 0.39501953 + - 0.38476563 + - -4.5078125 + - -1.8955078 + - 1.9746094 + - 2.75 + - -4.6992188 + - -2.0097656 + - -1.140625 + - -3.2929688 + - -1.2207031 + - -2.7890625 + - 1.3349609 + - 1.0644531 + - 0.18103027 + - -3.5664063 + - -0.7441406 + - 2.5605469 + - 1.5654297 + - -1.3662109 + - -2.8671875 + - 1.3818359 + - -1.5234375 + - -0.8388672 + - -4.0742188 + - -2.3789063 + - -4.5390625 + - 2.6972656 + - 0.6796875 + - -3.2050781 + - -2.5175781 + - -2.1894531 + - 1.2724609 + - 0.51416016 + - -0.60595703 + - 4.125 + - -3.0625 + - 0.67041016 + - -0.07757568 + - -1.6328125 + - 4.0585938 + - -3.6660156 + - 1.1875 + - -2.1308594 + - 2.0605469 + - -0.37939453 + - -4.78125 + - -1.0390625 + - 3.9726563 + - 0.35839844 + - 1.2685547 + - -2.8925781 + - 2.3574219 + - -6.140625 + - 1.2578125 + - 0.69873047 + - -0.88964844 + - 3.6660156 + - 3.4941406 + - 1.4863281 + - 2.40625 + - -0.640625 + - 0.66015625 + - -2.4589844 + - -3.3125 + - -2.1347656 + - 2.8867188 + - 0.7397461 + - -1.4589844 + - 1.7070313 + - 1.0664063 + - -0.52783203 + - 2.5449219 + - -1.8867188 + - -1.6669922 + - 1.2216797 + - -0.51660156 + - -1.5722656 + - 1.5830078 + - 0.42919922 + - 0.49487305 + - 3.7519531 + - 2.6386719 + - 0.0892334 + - -1.2861328 + - -5.2070313 + - 3.09375 + - 1.4482422 + - -2.1132813 + - 2.4472656 + - 1.5185547 + - -3.7050781 + - 2.1367188 + - 1.9863281 + - -1.7519531 + - 2.6875 + - -3 + - -1.9804688 + - -1.8457031 + - 0.51708984 + - 1.8808594 + - 0.33813477 + - -1.5712891 + - -5.5898438 + - -0.23986816 + - -1.6425781 + - -0.8676758 + - -1.3125 + - -5.1445313 + - 3.1328125 + - 0.61816406 + - -2.2441406 + - 1.0234375 + - -1.7402344 + - 3.6640625 + - -2.1699219 + - 2.3691406 + - -1.4482422 + - 0.34106445 + - -0.8408203 + - -0.49316406 + - 1.8691406 + - -0.21594238 + - -0.25708008 + - -3.2109375 + - 0.10406494 + - -1.5878906 + - 1.0107422 + - 1.2763672 + - 3.7441406 + - -1.6972656 + - -2.15625 + - -0.032348633 + - 3.90625 + - 2.0722656 + - -1.0029297 + - -3.7441406 + - -1.1396484 + - -2.8867188 + - 8.7734375 + - -1.75 + - -0.109375 + - -1.7861328 + - 4.3945313 + - 1.2861328 + - 1.1962891 + - 0.7944336 + - -1.3017578 + - 0.21643066 + - -0.7138672 + - 2.1738281 + - -5.390625 + - -2.6757813 + - 5.7382813 + - -4.125 + - 3.6875 + - -1.0947266 + - 0.5 + - 0.6381836 + - 3.8164063 + - 0.3984375 + - -1.3984375 + - -0.0078125 + - 0.95410156 + - 2.171875 + - -4.828125 + - 1.7792969 + - 0.54833984 + - -3.1738281 + - -1.4355469 + - -0.23962402 + - -1.1396484 + - -0.22302246 + - -1.1669922 + - 0.3425293 + - 1.5595703 + - -0.8535156 + - -2.1015625 + - -3.8867188 + - 0.54833984 + - -1.4433594 + - -1.6181641 + - 0.23596191 + - 2.6875 + - 0.5493164 + - 2.5390625 + - -0.3046875 + - -0.31103516 + - -1.7480469 + - 3.4765625 + - 2.8671875 + - -1.8125 + - -0.6796875 + - -3.6894531 + - -2.2324219 + - 1.75 + - 0.15234375 + - -2.2128906 + - -2.3203125 + - -0.578125 + - 1.2363281 + - -0.47875977 + - 0.8803711 + - 2.4414063 + - -0.9194336 + - -3.0878906 + - -2.6503906 + - 0.14672852 + - -2.9726563 + - -1.8681641 + - -1.0400391 + - -2.1738281 + - -2.8847656 + - -0.61816406 + - -0.8330078 + - -1.3642578 + - 5.4140625 + - 4.6953125 + - -4.2148438 + - -0.3569336 + - -1.28125 + - 1.4785156 + - -2.328125 + - -2.2949219 + - 3.5800781 + - -1.3017578 + - -2.5488281 + - 1.4306641 + - 2.2753906 + - -2.2050781 + - -3.6425781 + - -0.66845703 + - -1.7558594 + - -1.0195313 + - 0.15844727 + - -0.32080078 + - -0.70654297 + - -1.9628906 + - -1.0722656 + - -1.2929688 + - -0.76416016 + - -2.0664063 + - -2.2539063 + - -0.7558594 + - -0.37158203 + - 3.9863281 + - -2.7519531 + - 3.9023438 + - -1.9804688 + - -0.9316406 + - 6.5078125 + - 0.60253906 + - -0.82910156 + - -1.3535156 + - 0.6323242 + - -2.9726563 + - 3.3203125 + - 6.421875 + - -2.3164063 + - -0.7084961 + - 5.7226563 + - 0.90283203 + - 1.3837891 + - 0.3955078 + - -1.9765625 + - 1.0742188 + - 0.50878906 + - -2.9804688 + - 1.3427734 + - -0.8613281 + - -0.33447266 + - 2.6582031 + - -7.1601563 + - 0.71777344 + - 4.2148438 + - -2.4765625 + - -0.7910156 + - -2.1523438 + - 4.2460938 + - -5.1679688 + - -2.3320313 + - -0.23095703 + - 1.5947266 + - 2.4082031 + - -0.68847656 + - 1.6523438 + - -2.328125 + - -2.6777344 + - 2.3359375 + - -0.6948242 + - 0.39648438 + - -2.3339844 + - 3.7714844 + - 0.66845703 + - -1.71875 + - -2.4238281 + - -1.2421875 + - -0.2253418 + - 0.5722656 + - -0.34692383 + - 0.54541016 + - 2.0175781 + - -2.5878906 + - -0.09539795 + - -2.7949219 + - 0.7241211 + - 0.953125 + - 1.1865234 + - -1.2783203 + - -2.234375 + - -3.1484375 + - 1.2773438 + - 0.5834961 + - 1.1572266 + - -0.35473633 + - -2.15625 + - -2.1152344 + - 1.2978516 + - -3.0273438 + - -2.5136719 + - -1.9619141 + - 3.6992188 + - -3.4785156 + - -1.9482422 + - -0.60253906 + - 2.3535156 + - -1.6074219 + - 0.014503479 + - -1.0634766 + - -0.9248047 + - -0.30688477 + - -4.1210938 + - 0.8144531 + - 1.6376953 + - 4.859375 + - -1.6796875 + - 1.4482422 + - -0.28686523 + - 6.375 + - 1.9296875 + - -0.7294922 + - 1.4150391 + - 1.7324219 + - -0.64990234 + - -1.9150391 + - -1.2890625 + - 1.2744141 + - 1.7753906 + - 3.4375 + - -1.9316406 + - 2.3730469 + - -0.04574585 + - -0.055236816 + - 2.40625 + - -0.5361328 + - -0.97753906 + - 1.7050781 + - -1.4550781 + - -2.8496094 + - 0.9140625 + - 0.92285156 + - -3.3085938 + - -0.5410156 + - 1.8603516 + - -1.9072266 + - -1.2226563 + - -0.16955566 + - -0.29467773 + - 4.4257813 + - 6.8242188 + - -1.8144531 + - -0.18603516 + - -3.7402344 + - -2.1425781 + - 0.51416016 + - 1.0888672 + - -2.375 + - 1.8486328 + - -3.671875 + - -2.8691406 + - -0.50878906 + - -2.3476563 + - -0.9975586 + - -2.390625 + - -0.022872925 + - 1.8251953 + - 1.421875 + - -0.38720703 + - 1.7363281 + - 2.8496094 + - -0.7216797 + - -2.0195313 + - 1.3427734 + - 2.3515625 + - 0.8642578 + - -1.6220703 + - -0.9550781 + - 0.5053711 + - 0.060821533 + - -0.28515625 + - -3.6992188 + - -1.28125 + - -1.2978516 + - 1.7617188 + - -0.9326172 + - 0.96533203 + - 0.1439209 + - 2.8222656 + - -0.20129395 + - -1.4619141 + - 8.03125 + - -2.1132813 + - 3.6503906 + - -4.0273438 + - 3.6367188 + - 4.21875 + - -4.0664063 + - 1.1337891 + - 1.7832031 + - -0.22033691 + - -1.1425781 + - -0.35546875 + - -0.17297363 + - 1.8232422 + - -1.7207031 + - -1.2578125 + - -1.7851563 + - 3.9609375 + - -0.72802734 + - 1.2285156 + - 0.44677734 + - -1.2597656 + - 0.921875 + - -0.5136719 + - -0.51171875 + - -1.1142578 + - 3.3339844 + - 0.89208984 + - -2.1738281 + - 1.609375 + - -0.69873047 + - -2.7265625 + - 0.4440918 + - -2.1386719 + - -0.85253906 + - 2.6328125 + - 2.1425781 + - 2.1855469 + - -8.9609375 + - 4.40625 + - -0.5805664 + - 0.3293457 + - 0.48657227 + - -3.5019531 + - 1.9033203 + - 0.44970703 + - -1.5009766 + - 1.4414063 + - -4.625 + - 0.40112305 + - -0.21362305 + - -0.4753418 + - 0.07678223 + - 0.234375 + - 1.1494141 + - -0.34545898 + - -0.74853516 + - 0.7314453 + - 2.0800781 + - -2.4199219 + - 1.4638672 + - -2.5507813 + - 1.5810547 + - 2.359375 + - 0.77978516 + - 1.078125 + - 1.9570313 + - -0.3322754 + - 0.08258057 + - -1.2578125 + - 4.4570313 + - 1.421875 + - 2.5390625 + - 1.0166016 + - -4.0390625 + - 0.66503906 + - -0.40161133 + - -0.38891602 + - -0.26391602 + - 1.1357422 + - -0.9375 + - 1.3476563 + - 6.3554688 + - 1.0732422 + - -8.7421875 + - 1.2675781 + - 1.3388672 + - -0.11828613 + - -0.9863281 + - 2.9414063 + - 6.1757813 + - -1.8085938 + - -0.09820557 + - -0.61816406 + - -1.453125 + - 1.4726563 + - -0.7734375 + - 0.21923828 + - -0.22814941 + - -2.4238281 + - -0.43408203 + - -0.5 + - 4.0820313 + - -1.9326172 + - -1.4404297 + - 0.12634277 + - 1.7939453 + - 3.6191406 + - 2.1953125 + - 1.0546875 + - 0.49658203 + - 2.7050781 + - 0.66796875 + - -24.84375 + - 1.6748047 + - -4.6367188 + - -1.8183594 + - -15.671875 + - -1.2568359 + - -0.6870117 + - 3.0644531 + - -3.7128906 + - 2.609375 + - -7.5625 + - -7.9375 + - 0.80908203 + - -0.95410156 + - 2.0214844 + - -1.1650391 + - 0.3779297 + - 4.4375 + - -0.9453125 + - 1.5361328 + - 1.0087891 + - 2.0332031 + - 1.9931641 + - -2.9023438 + - -2.4765625 + - 3.6621094 + - -2.5761719 + - 1.8408203 + - 1.6982422 + - -5.0117188 + - 1.9042969 + - -0.31225586 + - -0.08258057 + - 2.3535156 + - 0.6352539 + - -1.6601563 + - 1.7197266 + - -1.8496094 + - 0.73046875 + - -0.04547119 + - 0.45996094 + - 0.036834717 + - 3.46875 + - 1.4023438 + - 0.061920166 + - 3.7128906 + - 2.75 + - 1.5185547 + - -1.0664063 + - -1.0947266 + - 1.7597656 + - -1.0664063 + - -2.015625 + - 2.078125 + - 1.390625 + - 3.1171875 + - -1.6494141 + - -4.7148438 + - 0.67285156 + - -2.6191406 + - 0.16210938 + - 2.4414063 + - -3.1289063 + - -0.6411133 + - -0.37329102 + - -0.4140625 + - -0.13000488 + - 4.5664063 + - 2.875 + - 1.4648438 + - -4.6757813 + - -0.13916016 + - 3.0117188 + - 0.57666016 + - -0.4453125 + - 1.3945313 + - 0.28149414 + - -0.7294922 + - -1.0039063 + - 2.1191406 + - -3.484375 + - -0.22729492 + - 1.3056641 + - -0.33862305 + - 0.5800781 + - 4.0390625 + - -0.5722656 + - 0.7241211 + - -1.4550781 + - -3.84375 + - 0.85791016 + - -1.71875 + - 0.92822266 + - -1.546875 + - -2.46875 + - 0.94970703 + - -3.0800781 + - -8.6328125 + - 0.8774414 + - -3.7089844 + - 0.2854004 + - 2.4003906 + - 1.1992188 + - -3.4628906 + - 0.6152344 + - -3.5566406 + - -1.8525391 + - -5.1367188 + - -0.82128906 + - 0.005718231 + - -0.0025100708 + - 3.9492188 + - -0.89208984 + - 1.4550781 + - -3.1503906 + - -2.7421875 + - -1.1074219 + - 0.19470215 + - -0.9003906 + - -3.0742188 + - 0.81884766 + - -2.4941406 + - -0.4404297 + - -0.12817383 + - 1.2353516 + - -0.32226563 + - 0.5078125 + - -3.4140625 + - -1.6044922 + - 0.5761719 + - -5.2070313 + - -2.2285156 + - 2.5839844 + - 5.3945313 + - 5.4726563 + - -0.2890625 + - 0.23120117 + - 4.4335938 + - 3.2597656 + - -1.6689453 + - -0.9008789 + - -2.3066406 + - 0.3330078 + - 2.8515625 + - -1.0039063 + - -0.74609375 + - -0.6118164 + - -0.7519531 + - -2.0234375 + - -2.296875 + - 2.4609375 + - -1.8095703 + - 1.2333984 + - -0.20812988 + - -2.3496094 + - -0.021194458 + - 0.78271484 + - 1.359375 + - -0.5175781 + - -0.7998047 + - 0.5258789 + - 2.2089844 + - -0.94970703 + - -1.5 + - -4.6523438 + - -0.04547119 + - 0.20422363 + - 3.4082031 + - -0.46362305 + - 0.18469238 + - 2.3476563 + - 23.5 + - -0.8959961 + - -3.0800781 + - 4.359375 + - 0.5830078 + - 4.0507813 + - -2.0234375 + - -13.3203125 + - 1.4960938 + - -1.0517578 + - 4.7539063 + - 0.66845703 + - 0.11383057 + - 1.2207031 + - 0.8408203 + - 2.2832031 + - 1.4814453 + - -4.9179688 + - 0.30908203 + - -4.7148438 + - 1.0234375 + - -3.7539063 + - 0.36450195 + - -0.19970703 + - -1.4775391 + - 3.5820313 + - -0.9350586 + - -2.2519531 + - 0.29345703 + - 3.0703125 + - -0.5292969 + - -0.6928711 + - 1.3974609 + - -1.6289063 + - -1.3476563 + - -2.0527344 + - -0.32861328 + - -0.2668457 + - -0.95947266 + - 0.1149292 + - -2.5957031 + - 2.2675781 + - -1.0664063 + - -1.7275391 + - 1.9658203 + - -0.79833984 + - 0.29541016 + - 1.7871094 + - -3.4179688 + - 3.5722656 + - 1.0419922 + - -1.3701172 + - 5.9101563 + - -2.6601563 + - -2.3671875 + - 0.8227539 + - 0.7866211 + - 2.9375 + - -2.3496094 + - 1.5 + - -2.4375 + - 3.8300781 + - 0.7109375 + - -1.203125 + - -0.06329346 + - 6.1054688 + - 3.3710938 + - -0.41015625 + - -1.71875 + - -0.3671875 + - -1.1767578 + - -0.25268555 + - -0.30078125 + - -0.1940918 + - -2.7109375 + - -5.9179688 + - 6.5351563 + - 0.9375 + - -2.3789063 + - -1.8955078 + - 1.6210938 + - 0.37548828 + - -0.31518555 + - -0.21875 + - 0.5830078 + - 1.2382813 + - 0.7890625 + - 1.6132813 + - -3.2402344 + - 0.8442383 + - 1.3203125 + - -1.9482422 + - 0.46557617 + - 0.17077637 + - 5.1757813 + - 2.1425781 + - -1.6201172 + - 4.75 + - -1.0703125 + - 2.4785156 + - 4.703125 + - -0.54296875 + - -1.9921875 + - 5.75 + - 0.78759766 + - 0.38354492 + - -1.2578125 + - -0.17211914 + - 2.4511719 + - 1.6533203 + - -1.2587891 + - -1.6181641 + - -1.8476563 + - -0.71875 + - -0.42626953 + - 0.3869629 + - 0.7348633 + - 0.12426758 + - 0.29516602 + - -2.078125 + - 2.2558594 + - 23.0625 + - -3.9101563 + - 2.9472656 + - -0.171875 + - 0.9301758 + - 2.3613281 + - 0.18798828 + - -2.0449219 + - 0.28344727 + - -0.8486328 + - -1.4492188 + - 1.9501953 + - -2.3046875 + - -1.6992188 + - -0.25854492 + - 0.31225586 + - -5.1601563 + - 1.9814453 + - 2.15625 + - 14.546875 + - -2.7011719 + - 1.4033203 + - -0.11602783 + - -1.4033203 + - 0.2109375 + - -0.6464844 + - 0.63916016 + - 0.6640625 + - -0.21984863 + - -1.2744141 + - -26 + - -0.5029297 + - 0.55078125 + - 1.0742188 + - -2.9101563 + - -0.4951172 + - -0.6484375 + - 0.9194336 + - -2.46875 + - 0.9267578 + - 0.5957031 + - -3.828125 + - -1.3505859 + - -0.8256836 + - -0.15515137 + - -1.0332031 + - -1.2939453 + - -2.9804688 + - 0.6225586 + - -0.23510742 + - -2.3261719 + - 0.8261719 + - 2.6347656 + - 0.2565918 + - 3.4257813 + - -1.4033203 + - 3.1738281 + - -0.5678711 + - 7.6953125 + - -1.9326172 + - 2.5859375 + - 4.0039063 + - -6.6484375 + - 2.4199219 + - -2.1757813 + - 4.3632813 + - -0.8208008 + - -0.5097656 + - -1.734375 + - 0.50439453 + - 0.62841797 + - 0.9951172 + - -5.5351563 + - 2.953125 + - -0.18005371 + - -2.4003906 + - 0.027893066 + - 2.7128906 + - 2.5332031 + - 2.6386719 + - 2.5058594 + - -1.9511719 + - -1.2734375 + - 1.8320313 + - 4.15625 + - 1.4335938 + - -1.4951172 + - -3.8300781 + - -0.64501953 + - -4.1640625 + - -1.1318359 + - 2.1132813 + - 2.2207031 + - 3.6367188 + - -1.140625 + - 4.890625 + - 4.9960938 + - 2.046875 + - -0.734375 + - -1.0810547 + - 0.76953125 + - -1.2734375 + - 1.3349609 + - -1.2626953 + - 1.3642578 + - -1.4804688 + - -2.6601563 + - 0.62158203 + - -3.5585938 + - -0.33520508 + - -3.3691406 + - -3.9375 + - -0.76464844 + - 0.5126953 + - 3.0058594 + - -1.4169922 + - -0.14758301 + - 2.9179688 + - 0.7988281 + - 0.52978516 + - -2.7910156 + - 3.359375 + - 2.0585938 + - -1.4140625 + - -3.3203125 + - 3.6015625 + - -0.56884766 + - 3.9375 + - -2.7890625 + - -0.921875 + - -1.0517578 + - 0.8203125 + - 3.4902344 + - 2.4726563 + - -0.17346191 + - 0.94189453 + - -3.7363281 + - -6.0507813 + - -0.46191406 + - -1.4873047 + - 2.65625 + - 2.6914063 + - 0.81689453 + - 1.0429688 + - 2.1601563 + - 0.59814453 + - -0.07366943 + - 2.3574219 + - -1.8486328 + - 2.9550781 + - 0.99902344 + - -0.4560547 + - -0.3359375 + - -0.8046875 + - -0.6621094 + - 12.1953125 + - 0.52441406 + - 2.53125 + - 5.7734375 + - 7.8046875 + - -1.21875 + - 0.42993164 + - -1.0869141 + - 1.4628906 + - -2.6542969 + - -1.7949219 + - 1.34375 + - 0.66845703 + - 0.29956055 + - -2.5566406 + - -0.7207031 + - 1.0195313 + - 1.8886719 + - 1.9316406 + - 0.34399414 + - -0.17321777 + - -0.1821289 + - -0.7832031 + - -1.9394531 + - -2.1015625 + - -1.4257813 + - 1.2460938 + - -0.46191406 + - -2.4238281 + - -3.4238281 + - 2.7890625 + - 2.1503906 + - 1.9941406 + - 1.0136719 + - 0.22485352 + - -0.98291016 + - 1.9404297 + - -1.7470703 + - 0.74072266 + - 1.8251953 + - -1.4882813 + - 1.2548828 + - -1.7763672 + - -0.55859375 + - 3.9375 + - -0.7192383 + - 1.7089844 + - -2.6484375 + - -1.0927734 + - -2.9003906 + - 3.2207031 + - 1.0126953 + - -2.4003906 + - -1.1132813 + - 4.1015625 + - 1.8291016 + - 1.0341797 + - 1.5966797 + - 4.1914063 + - 0.8461914 + - -1.8164063 + - -1.6669922 + - 1.4746094 + - 1.5244141 + - 1.2060547 + - 4.1875 + - 2.5195313 + - 2.265625 + - 1.9580078 + - -1.4179688 + - -0.6538086 + - -1.8564453 + - 1.2441406 + - 0.19885254 + - -0.050201416 + - -1.1044922 + - 0.34765625 + - 1.390625 + - 0.10595703 + - 3.0839844 + - -0.97753906 + - 0.080322266 + - 0.86376953 + - -0.27001953 + - 23.46875 + - -3.4648438 + - -1.1455078 + - -4.2460938 + - -0.22766113 + - 0.7368164 + - 2.34375 + - -0.09429932 + - -4.7851563 + - 1.6826172 + - 2.5976563 + - -1.3603516 + - 3.3925781 + - 2.5390625 + - 1.9511719 + - 0.51953125 + - 1.6357422 + - -3.0820313 + - 1.7158203 + - 0.9614258 + - -2.2148438 + - 1.7001953 + - -3.6777344 + - 1.7763672 + - 0.0758667 + - 0.8208008 + - -2.2089844 + - 0.12011719 + - 2.3339844 + - -3.7714844 + - -0.77197266 + - 1.3144531 + - 2.078125 + - 2.1347656 + - 2.4082031 + - -1.5664063 + - 6.2851563 + - -0.035705566 + - 0.3269043 + - -0.6582031 + - -4.3398438 + - -3.5703125 + - 0.5024414 + - 4.9257813 + - 0.38110352 + - 0.20275879 + - -1.5664063 + - 1.7324219 + - 2.8144531 + - 3.9101563 + - -0.5703125 + - -1.8300781 + - 0.39135742 + - 8.6640625 + - -3.2226563 + - -1.21875 + - 0.6303711 + - -1.2597656 + - 1.1396484 + - 0.5097656 + - 1.3017578 + - -0.11853027 + - -0.11633301 + - -4.2382813 + - -3.5429688 + - -2.6660156 + - -3.125 + - -2.9941406 + - 0.49731445 + - -2.203125 + - -1.2890625 + - 3.2851563 + - -0.7158203 + - -1.8212891 + - 0.6801758 + - -3.3378906 + - -4.4023438 + - -0.29785156 + - 2.0722656 + - -2.6738281 + - -0.19897461 + - 1.1738281 + - 2.1875 + - 1.2285156 + - -1.1191406 + - -3.0839844 + - -1.4257813 + - -0.87158203 + - -2.9550781 + - 0.016738892 + - -0.5004883 + - -0.26733398 + - 4.171875 + - -1.1015625 + - 2.6386719 + - -3.3027344 + - -2.3066406 + - -1.2890625 + - -0.68310547 + - 1.1992188 + - -1.3095703 + - 1.4726563 + - 1.0214844 + - 0.8647461 + - 0.40307617 + - -1.2763672 + - -1.6074219 + - 1.5175781 + - -1.4238281 + - 1.6337891 + - 0.4814453 + - -0.33032227 + - 2.7382813 + - 0.9296875 + - 0.21643066 + - 1.2539063 + - -3.8339844 + - -2.6425781 + - -3.2421875 + - -1.3925781 + - 0.30249023 + - -0.22033691 + - 0.5292969 + - 1.0478516 + - 1.1650391 + - 1.2773438 + - -1.2050781 + - -2.421875 + - 1.1992188 + - 2.1015625 + - -2.7226563 + - 2.1171875 + - 0.45581055 + - 0.33129883 + - 1.2685547 + - 0.67285156 + - -5.5898438 + - -3.34375 + - -1.0898438 + - 1.5175781 + - 0.026779175 + - -2.2480469 + - -0.9560547 + - 4.9257813 + - -0.17370605 + - 1.3681641 + - 6.5820313 + - 2.5605469 + - -2.6855469 + - 0.83984375 + - -0.056915283 + - 6.015625 + - -4.9570313 + - -2.1777344 + - 0.9863281 + - -2.1269531 + - -0.57910156 + - -2.3925781 + - 1.8867188 + - -3.3476563 + - 3.1953125 + - -1.1894531 + - 0.7207031 + - 0.15515137 + - -0.5161133 + - -1.1982422 + - 0.96875 + - -0.23339844 + - -1.9394531 + - 5.9726563 + - 0.79003906 + - 2.4414063 + - -0.31469727 + - -4.46875 + - 2.4296875 + - 0.24865723 + - 1.3359375 + - -0.7138672 + - -1.3564453 + - -0.7661133 + - 1.1220703 + - -2.015625 + - -3.0722656 + - -0.030685425 + - 0.69677734 + - 1.7275391 + - 2.8183594 + - -2.3203125 + - 1.234375 + - 0.3095703 + - -2.7070313 + - 0.34692383 + - 3.5566406 + - 1.3251953 + - 5.75 + - 0.24768066 + - 0.06359863 + - 16.1875 + - -0.41845703 + - 2.3007813 + - -3.5507813 + - -0.90722656 + - -0.89746094 + - 0.5439453 + - 1.4785156 + - 4.1484375 + - -0.9238281 + - -3.5253906 + - -1.8232422 + - 0.87402344 + - 1.9189453 + - 1.0517578 + - -1.1347656 + - 4.4570313 + - -0.26879883 + - -0.66796875 + - 0.24414063 + - -1.6445313 + - 0.30395508 + - -1.5214844 + - -2.2949219 + - -1.6738281 + - 2.3652344 + - -0.22375488 + - -4 + - -3.1015625 + - 0.7397461 + - -0.9951172 + - -0.88134766 + - -1.8613281 + - -1.8925781 + - 0.17687988 + - -0.08227539 + - 3.0117188 + - 0.75683594 + - 2.7890625 + - 0.28637695 + - 1.9667969 + - -4.5898438 + - 0.88378906 + - 0.64941406 + - -0.06854248 + - 4.2070313 + - -1.3662109 + - -1.3671875 + - -2.0664063 + - -5.4882813 + - 2.1308594 + - 1.8994141 + - -0.31152344 + - 2.8789063 + - 4.703125 + - -1.640625 + - -0.17565918 + - -3.8339844 + - -0.13244629 + - -1.8339844 + - -0.77197266 + - -1.1074219 + - 1.7451172 + - -2.703125 + - -0.38671875 + - 1.0224609 + - 1.9111328 + - -4.953125 + - 3.3925781 + - 0.9248047 + - -0.57373047 + - -1.6894531 + - 4.6914063 + - 0.9428711 + - 1.1796875 + - 1.0107422 + - -1.9638672 + - -2.4433594 + - 1.6601563 + - 1.3613281 + - 2.390625 + - 0.17053223 + - 4.7617188 + - -1.6230469 + - -1.1416016 + - 0.96484375 + - -1.5556641 + - -0.76660156 + - -1.5439453 + - 0.62353516 + - -4.3476563 + - -0.82666016 + - 1.6621094 + - 1.9033203 + - -2.375 + - 2.5566406 + - -3.9316406 + - 2.6777344 + - 0.7910156 + - -0.7397461 + - 4.5976563 + - -0.8935547 + - -2.609375 + - 1.921875 + - 2.4296875 + - 3.3144531 + - 1.7685547 + - -1.0107422 + - -0.22399902 + - 0.45361328 + - 33.40625 + - 13.4609375 + - -9.1796875 + - 2.265625 + - -1.0498047 + - 1.4277344 + - -2.7285156 + - -4.171875 + - -0.36083984 + - -0.20532227 + - 1.9619141 + - 0.51708984 + - -0.3388672 + - 1.5126953 + - -2.7910156 + - 1.9707031 + - -1.0048828 + - 0.9091797 + - -2.6953125 + - 0.71533203 + - 1.8789063 + - 3.4160156 + - -1.3212891 + - -1.1416016 + - -0.22705078 + - -2.1503906 + - 0.08703613 + - -0.40356445 + - -4.6054688 + - 0.75439453 + - -0.12780762 + - -0.15905762 + - 1.421875 + - 2.4765625 + - 1.6376953 + - -4.375 + - -1.8544922 + - 2.0644531 + - -2.1660156 + - 1.2460938 + - 2.2285156 + - 1.5400391 + - -0.2800293 + - 4.2265625 + - -1.2050781 + - 0.29296875 + - -3.4941406 + - 2.1425781 + - 1.3056641 + - 0.51171875 + - 2.2910156 + - 8.734375 + - -0.5722656 + - -1.4316406 + - 1.7226563 + - -0.9472656 + - -0.84472656 + - 0.054107666 + - 1.4589844 + - 0.21362305 + - 2.9804688 + - 2.3964844 + - 1.203125 + - -3.9238281 + - -1.7451172 + - -1.1357422 + - 1.9345703 + - -0.8339844 + - -2.6875 + - 0.25439453 + - -2.9238281 + - -0.20739746 + - -1.5019531 + - -2.2675781 + - 0.92626953 + - -2.6699219 + - -0.18823242 + - 1.3486328 + - 5.4453125 + - 0.4140625 + - -1.7626953 + - -1.4208984 + - 1.6337891 + - 1.8632813 + - 1.6884766 + - 2.3789063 + - 1.1064453 + - 0.22314453 + - 1.9423828 + - -1.53125 + - 1.3662109 + - 0.50439453 + - -0.8911133 + - -1.0019531 + - 3.65625 + - 1.2099609 + - -1.3984375 + - 4.0351563 + - -1.9003906 + - 0.5229492 + - -3.4648438 + - -1.0595703 + - 0.75097656 + - 1.15625 + - 0.12231445 + - 0.48754883 + - 0.32348633 + - -2.3203125 + - -0.081970215 + - 1.484375 + - -3.2929688 + - 3.6777344 + - -0.6933594 + - 4.28125 + - 1.8056641 + - 2.8339844 + - -2.9140625 + - -1.3173828 + - 3.515625 + - 0.4248047 + - -2.3886719 + - -1.8857422 + - 0.875 + - 1.1064453 + - 3.609375 + - 1.3613281 + - -3.2714844 + - 2.0546875 + - 2.4140625 + - 0.1270752 + - -0.8769531 + - -1.2519531 + - -1.1103516 + - 1.2451172 + - 0.2758789 + - 0.30737305 + - -0.18188477 + - -3.4394531 + - 1.5400391 + - -1.2939453 + - -0.4375 + - 1.9580078 + - 1.7792969 + - -2.1367188 + - -0.2956543 + - -0.17468262 + - 2.0078125 + - -1.203125 + - -0.140625 + - -4.109375 + - 1.1669922 + - 1.3193359 + - -1.4697266 + - -1.4335938 + - 0.4091797 + - -0.91503906 + - -1.1445313 + - 0.41333008 + - 0.4038086 + - 2.1660156 + - 0.09411621 + - -2.5546875 + - 2.7890625 + - 1.7773438 + - -0.9394531 + - 0.4284668 + - 0.328125 + - 2.3417969 + - -0.12164307 + - -2.5566406 + - -0.50927734 + - -0.265625 + - -2.6074219 + - -1.3457031 + - 0.58691406 + - 0.71728516 + - 1.4130859 + - 1.96875 + - -1.1738281 + - -1.75 + - -0.6010742 + - 0.38598633 + - -0.52441406 + - 0.90283203 + - 1.5185547 + - -1.5732422 + - -0.068359375 + - 1.7675781 + - 1.7275391 + - -1.2802734 + - 2.3789063 + - 2.3203125 + - 1.7792969 + - 0.7207031 + - -2.4882813 + - -1.8632813 + - 2.9804688 + - 1.1787109 + - 0.92089844 + - -3.390625 + - -2.7675781 + - -1.4277344 + - -2.8476563 + - -0.42285156 + - 0.39453125 + - -12.4453125 + - -0.31469727 + - -0.46240234 + - 0.21875 + - -0.88916016 + - 0.5488281 + - -1.2509766 + - 1.6689453 + - 0.45922852 + - -1.7119141 + - 2.3417969 + - -5.375 + - 0.4868164 + - 0.32421875 + - -1.1748047 + - 1.3769531 + - 1.5244141 + - -2.0566406 + - -0.025665283 + - 3.4238281 + - 0.61816406 + - 1.8251953 + - -0.53515625 + - 9.390625 + - 1.4433594 + - -2.1425781 + - 0.7246094 + - -0.52197266 + - 0.8935547 + - -0.88916016 + - -0.08459473 + - -2.6640625 + - 6.75 + - 0.68066406 + - -1.7714844 + - 0.7470703 + - 1.0390625 + - -6.09375 + - 0.71484375 + - 0.29418945 + - 1.3671875 + - 0.44189453 + - 6.2929688 + - -0.5942383 + - -2.7695313 + - 1.8964844 + - 2.2207031 + - 2.4628906 + - 2.109375 + - 1.1445313 + - -2.8378906 + - 1.5419922 + - 1.8007813 + - -3.15625 + - -1.0839844 + - -0.3232422 + - -0.43164063 + - -3.1992188 + - -1.8183594 + - -3.2753906 + - -0.1986084 + - -3.8652344 + - 2.4101563 + - -1.6914063 + - -1.796875 + - 3.5683594 + - -2.4199219 + - 0.18859863 + - -1.6337891 + - -1.6347656 + - 2.0566406 + - -0.3544922 + - -1.3388672 + - 1.7558594 + - 1.6328125 + - -0.6225586 + - 0.6425781 + - 0.61083984 + - 2.1738281 + - 0.8647461 + - 3.7578125 + - 0.01953125 + - -0.26611328 + - -1.7851563 + - 2.6621094 + - 0.1842041 + - -2.0214844 + - -1.2861328 + - -1.5732422 + - -0.09051514 + - 5.2382813 + - 4.703125 + - -1.1425781 + - 1.9355469 + - 2.3378906 + - -0.7207031 + - -1.25 + - -0.4050293 + - 2.0273438 + - -1.9423828 + - 2.2753906 + - -3.4765625 + - 2.8359375 + - 0.7866211 + - -3.9609375 + - -0.10961914 + - -2.6640625 + - 3.25 + - 0.3005371 + - -5.5078125 + - -0.27075195 + - -1.765625 + - 1.6582031 + - 0.4284668 + - 0.68310547 + - 3.4550781 + - 0.47021484 + - 1.2822266 + - -0.31884766 + - -3.0898438 + - -1.6689453 + - -0.5917969 + - -3.7890625 + - 8.9140625 + - 1.1953125 + - 1.4628906 + - -0.5317383 + - 0.52783203 + - -1.5 + - 0.43896484 + - 1.1591797 + - -1.2998047 + - -5.4804688 + - -3.4003906 + - 4.6367188 + - -4.171875 + - 1.8056641 + - -1.84375 + - -2.8164063 + - 1.2988281 + - 0.89208984 + - -0.5800781 + - 0.27661133 + - 1.2519531 + - 1.1083984 + - -3.1777344 + - 0.07696533 + - -4.0429688 + - 1.703125 + - -1.59375 + - 1.2041016 + - -3.5976563 + - 0.8105469 + - -1.4296875 + - 0.93847656 + - -2.5 + - -1.0498047 + - 0.07159424 + - 2.2539063 + - 3.2402344 + - 0.5004883 + - 1.6611328 + - -1.6152344 + - 2.4199219 + - 1.2880859 + - -0.7167969 + - -1.1738281 + - -2.6914063 + - -0.23876953 + - 0.51708984 + - 2.5664063 + - -2.8828125 + - -0.09454346 + - -0.0020923615 + - 4.2304688 + - -0.010597229 + - -2.2207031 + - 0.36743164 + - 1.984375 + - -2.21875 + - -2.3183594 + - -0.9819336 + - 1.2138672 + - 1.9511719 + - -0.53466797 + - 0.7192383 + - -1.4638672 + - -0.29736328 + - 0.82910156 + - 3.0742188 + - -2.9179688 + - -2.7089844 + - 1.5957031 + - 1.8515625 + - 5.8125 + - 2.6269531 + - -1.5332031 + - 1.4589844 + - -0.59716797 + - 1.0800781 + - -1.6582031 + - -2.015625 + - -0.9116211 + - 1.2197266 + - -1.9160156 + - 1.1708984 + - -1.0478516 + - 3.5195313 + - 4.3398438 + - -0.51708984 + - 0.17626953 + - -0.23376465 + - -1.4296875 + - -3.3242188 + - -2.8652344 + - -0.8925781 + - 1.3798828 + - -1.0742188 + - 0.85595703 + - 2.1699219 + - 1.5449219 + - 1.4101563 + - -0.4128418 + - 0.86865234 + - -4.921875 + - -0.9008789 + - -8.3046875 + - -1.734375 + - -2.0214844 + - -2.2714844 + - -2.90625 + - -0.96777344 + - 2.8417969 + - -6.7421875 + - -4.4335938 + - 24.671875 + - -1.7294922 + - -1.6435547 + - -0.6557617 + - -0.17883301 + - 0.50634766 + - 2.3261719 + - 3.0898438 + - -2.15625 + - 1.1416016 + - 1.6894531 + - -0.03488159 + - 0.88378906 + - -1.4248047 + - 0.42895508 + - 0.09020996 + - -3.4160156 + - 0.7285156 + - 4.890625 + - -0.75 + - -0.55126953 + - -1.4794922 + - -2.4765625 + - 0.6567383 + - -0.34155273 + - 3.7578125 + - 0.36376953 + - -2.0878906 + - 2.2304688 + - -0.27441406 + - 1.5878906 + - -2.5488281 + - 0.77246094 + - 0.4033203 + - 1.2587891 + - -0.55615234 + - 1.6416016 + - 2.984375 + - 4.1796875 + - 0.13500977 + - -0.85595703 + - -0.55322266 + - 2.0449219 + - -3.890625 + - 0.7788086 + - -0.2800293 + - 3.2695313 + - 1.1845703 + - -2.0371094 + - 0.7270508 + - 2.3496094 + - 0.83691406 + - -3.1035156 + - -1.3164063 + - -2.0175781 + - -1.6425781 + - -2.9003906 + - -0.42822266 + - 2.3769531 + - -3.4570313 + - -2.8359375 + - 1.1767578 + - -0.5722656 + - 2.4550781 + - -2.5039063 + - -0.0993042 + - -1.1953125 + - -0.012275696 + - -2.7324219 + - 1.5888672 + - -4.6132813 + - -4.3554688 + - -0.115478516 + - -1.5566406 + - 1.4550781 + - 8.6328125 + - 0.89697266 + - 3.6796875 + - -4.7578125 + - 1.1884766 + - -0.67285156 + - 1.3085938 + - 0.9038086 + - 0.6767578 + - -0.16455078 + - -4.7695313 + - 0.5332031 + - 0.76171875 + - 2.5664063 + - -0.84033203 + - -2.8378906 + - 0.4453125 + - -0.084106445 + - -0.55078125 + - -2.4765625 + - 1.4394531 + - 2.109375 + - -2.5664063 + - 5.3554688 + - 0.3088379 + - 0.37426758 + - 0.9243164 + - 0.53271484 + - 4.0078125 + - 0.27270508 + - 2.0820313 + - -1.8183594 + - -0.5209961 + - 0.54345703 + - 2.3847656 + - 7.1640625 + - 1.7158203 + - 1.0996094 + - -1.0556641 + - 3.5527344 + - 0.05078125 + - 1.7119141 + - 1.7900391 + - 2.2285156 + - -0.30566406 + - 3.09375 + - -0.6933594 + - 3.5976563 + - -4.484375 + - -1.4716797 + - -2.0273438 + - 0.9428711 + - 0.004463196 + - 1.3388672 + - -0.42236328 + - 4.0742188 + - -1.9814453 + - -2.109375 + - -0.8417969 + - 0.016311646 + - 2.9804688 + - 2.4042969 + - 0.7421875 + - 1.1767578 + - 3.2851563 + - 4.1992188 + - 0.7553711 + - -0.578125 + - 1.3769531 + - 2.078125 + - -4.9882813 + - -4.578125 + - -0.96484375 + - 3.3046875 + - -1.5917969 + - -0.75097656 + - -1.9638672 + - 2.8613281 + - 3.2753906 + - 3.2617188 + - -0.8564453 + - -0.28076172 + - 1.3603516 + - -1.3505859 + - -0.44799805 + - 2.5859375 + - 2.6894531 + - -0.9707031 + - -0.359375 + - 0.41503906 + - 1.7861328 + - 0.39282227 + - -0.1227417 + - -0.35986328 + - 1.2529297 + - 2.1425781 + - 0.90625 + - -2.1171875 + - -0.32250977 + - -3.6425781 + - -4.8789063 + - -0.09008789 + - 2.5820313 + - -0.8569336 + - -0.3659668 + - 3.1269531 + - -2.1777344 + - 2.0078125 + - 0.55859375 + - -0.9863281 + - -2.9140625 + - 1.4023438 + - -0.52001953 + - 3.0664063 + - 3.3515625 + - 1.2978516 + - -6.8359375 + - -0.47705078 + - -0.4194336 + - -5.390625 + - 2.1230469 + - -2.6640625 + - 2.4316406 + - 1.3896484 + - -6.4453125 + - 1.3085938 + - -0.65478516 + - -2.8007813 + - -2.4277344 + - 1.1220703 + - -0.37695313 + - 2.0820313 + - -0.42700195 + - -0.81347656 + - -33.90625 + - -2.5253906 + - -2.4140625 + - -0.39160156 + - -1.4277344 + - 2.0917969 + - 2.4101563 + - -4.7539063 + - -4.6601563 + - -0.90478516 + - 1.1181641 + - -1.4375 + - -1.0966797 + - 6.78125 + - 0.48706055 + - 4.7304688 + - -1.6582031 + - 4.3242188 + - -0.24768066 + - -1.4345703 + - 0.11437988 + - -0.453125 + - 1.0810547 + - 1.8134766 + - -0.4345703 + - -4.015625 + - -1.2519531 + - 0.05355835 + - 1.8691406 + - -0.36376953 + - 0.57177734 + - -1.2675781 + - 0.36206055 + - -0.5605469 + - -3.4941406 + - 4.8632813 + - -3.3027344 + - -0.8066406 + - -2.328125 + - -3.4863281 + - 0.029846191 + - 1.9746094 + - 2.6289063 + - 0.015411377 + - 0.25048828 + - 1.7070313 + - 4 + - -0.63671875 + - 1.9033203 + - -2.8378906 + - 2.6796875 + - -1.0927734 + - 0.2626953 + - -3.921875 + - 3.0117188 + - 2.6113281 + - -2.96875 + - 3.4550781 + - 2.6816406 + - 0.6640625 + - -1.0654297 + - -4.015625 + - 3.0058594 + - 1.3544922 + - 1.5175781 + - -0.38891602 + - 0.040161133 + - -5.0078125 + - 0.82666016 + - 1.3818359 + - -2.2207031 + - 0.7763672 + - 2.6074219 + - 0.4038086 + - -0.56103516 + - 2.2050781 + - -1.3994141 + - -2.6972656 + - 0.80566406 + - 0.42236328 + - -1.2441406 + - 2.0898438 + - 0.46972656 + - 1.0478516 + - 3.0527344 + - 0.8486328 + - -1.28125 + - 1.1132813 + - 2.0488281 + - 0.74658203 + - -2.3789063 + - 2.7949219 + - -1.0380859 + - 8.5703125 + - -1.4736328 + - 2.0292969 + - -0.59472656 + - -0.88183594 + - -0.4428711 + - -0.6660156 + - 2.8222656 + - 0.04714966 + - 3.53125 + - 1.0810547 + - 2.1230469 + - -2.1484375 + - -2.4238281 + - 3.5800781 + - -0.16760254 + - 5.9179688 + - -1.0576172 + - 5.9179688 + - -2.0292969 + - -0.9536133 + - -1.4013672 + - 1.5 + - 0.38745117 + - 0.7910156 + - -1.5820313 + - 4.1210938 + - 2.96875 + - 2.4902344 + - 4.6875 + - -0.7207031 + - -2.0996094 + - 1.7158203 + - -1.4609375 + - -4.0703125 + - -3.109375 + - 0.45117188 + - -4.3554688 + - -0.16455078 + - 1.7939453 + - 3.7363281 + - -1.1025391 + - -0.6791992 + - -30.3125 + - -0.8564453 + - -0.026504517 + - -0.66748047 + - 0.76416016 + - 3.5742188 + - 0.79296875 + - 1.8681641 + - 0.12719727 + - 2.0957031 + - 0.010040283 + - -0.14733887 + - -2.9140625 + - -2.2050781 + - 1.3681641 + - -2.3769531 + - 0.5546875 + - 0.07476807 + - -0.63378906 + - -1.5576172 + - 1.4462891 + - 10.890625 + - 3.125 + - -1.2587891 + - 1.1845703 + - 0.9394531 + - -0.8461914 + - 2.3105469 + - 0.3803711 + - -2.6035156 + - 1.2958984 + - 0.2529297 + - -2.2011719 + - 0.34106445 + - 0.37817383 + - -2.0605469 + - -3.2304688 + - 0.1685791 + - -0.5493164 + - -1.9033203 + - 5.6289063 + - 1.6601563 + - -1.2236328 + - 3.1679688 + - 1.0351563 + - 1.2753906 + - 0.0011701584 + - 3.140625 + - 0.6459961 + - -1.7978516 + - 0.19299316 + - 3.5117188 + - -2.3925781 + - 2.4589844 + - -1.5361328 + - -2.0097656 + - -0.9711914 + - 4.3320313 + - 0.4501953 + - -4.078125 + - 1.640625 + - -0.49487305 + - -0.68310547 + - -1.8125 + - -2.5019531 + - 0.07867432 + - -3.75 + - 0.7373047 + - 3.0117188 + - -6.9453125 + - 0.48876953 + - -1.3125 + - -3.3691406 + - -3.015625 + - 1.7744141 + - -0.86816406 + - -3.1210938 + - 0.06555176 + - 0.18383789 + - -0.3972168 + - -1.3349609 + - -0.6455078 + - 1.8955078 + - 1.7519531 + - 6.6796875 + - -1.4863281 + - -0.46948242 + - -1.2734375 + - -1.8232422 + - 2.0605469 + - -1.9619141 + - -0.69970703 + - 2.0683594 + - 0.15258789 + - 3.4492188 + - 0.89160156 + - 0.92285156 + - -1.0654297 + - 3.0019531 + - -0.6899414 + - 1.6308594 + - 0.5473633 + - -2.7011719 + - -1.1396484 + - 0.41479492 + - -0.5834961 + - -0.2142334 + - 4.5625 + - 1.4414063 + - -0.11456299 + - -1.6738281 + - 4.5039063 + - -0.5004883 + - 2.0371094 + - -2.7578125 + - -1.890625 + - 2.1015625 + - 2.5175781 + - -0.82128906 + - 0.8779297 + - 1.6621094 + - -1.1992188 + - -1.9658203 + - -1.2460938 + - 0.078125 + - -0.46875 + - -4.9023438 + - 0.04547119 + - -1.0234375 + - 3.3046875 + - 0.24829102 + - 0.66259766 + - -0.42407227 + - -0.1274414 + - 1.1132813 + - -0.35083008 + - -0.6723633 + - -0.47094727 + - -1.1416016 + - -4.4179688 + - 0.76953125 + - 4.2070313 + - 0.11364746 + - 1.3613281 + - 1.8681641 + - 0.6166992 + - 3.90625 + - -1.5507813 + - 0.046295166 + - 2.2636719 + - 2.2480469 + - 2.8027344 + - -1.9775391 + - 1.8564453 + - -1.6806641 + - 1.6044922 + - -2.3652344 + - 0.18908691 + - 1.0859375 + - 2.8300781 + - -0.6635742 + - 2.6914063 + - 2.7792969 + - 1.3203125 + - 2.5488281 + - -2.40625 + - 4.4882813 + - -2.4199219 + - -0.5385742 + - 1.7001953 + - -0.63720703 + - -2.5058594 + - 1.7324219 + - 0.103759766 + - -2.2871094 + - -1.5810547 + - -1.5009766 + - -1.6982422 + - -2.875 + - 3.1425781 + - 1.8691406 + - 1.7539063 + - -2.7480469 + - -0.32080078 + - -0.13049316 + - 2.4902344 + - 0.33203125 + - 2.4160156 + - -3.0175781 + - -0.18688965 + - 0.44848633 + - 1.0439453 + - 0.171875 + - 4.0351563 + - -0.09259033 + - 1.421875 + - -0.7915039 + - -1.9824219 + - -0.921875 + - 1.3632813 + - 1.0478516 + - 0.6333008 + - 1.2431641 + - -3.453125 + - 0.17626953 + - 1.7451172 + - 0.6254883 + - -0.36523438 + - 1.5126953 + - -1.1552734 + - -2.4199219 + - -5.5390625 + - -4.0976563 + - 6.078125 + - -1.3671875 + - -0.9116211 + - 1.2001953 + - -1.7539063 + - 2.0761719 + - -1.6425781 + - -2.3925781 + - -3.8867188 + - -2.203125 + - -2.640625 + - 0.74072266 + - 0.27661133 + - 1.4482422 + - -0.7949219 + - -1.1552734 + - 0.75683594 + - 0.123291016 + - -3.5039063 + - -1.7607422 + - -1.4736328 + - 3.1015625 + - 2.0839844 + - 6.2890625 + - -0.44213867 + - 2.5195313 + - -1.7119141 + - 1.8369141 diff --git a/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap new file mode 100644 index 00000000..7a252f73 --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_batch.snap @@ -0,0 +1,4613 @@ +--- +source: backends/candle/tests/test_flash_qwen2.rs +assertion_line: 61 +expression: embeddings_batch +--- +- - -4.9882813 + - 6.7734375 + - -1.6269531 + - -3.21875 + - 7.078125 + - -0.5107422 + - -2.75 + - -1.5371094 + - 4.9257813 + - 0.9790039 + - 6.03125 + - -4.0195313 + - -4.9648438 + - 0.9160156 + - 0.63916016 + - -0.90771484 + - 5.375 + - -0.3293457 + - 2.8535156 + - 2.7773438 + - 0.25170898 + - -4.671875 + - 1.7490234 + - -1.7080078 + - 2.1933594 + - -0.7470703 + - -5.6445313 + - 0.31762695 + - 6.4375 + - 1.9873047 + - -5.265625 + - 0.6816406 + - 0.89404297 + - 12.1640625 + - -3.3867188 + - -5.015625 + - -2.890625 + - 1.3457031 + - -0.47094727 + - -1.1201172 + - 1.2382813 + - -0.6855469 + - -1.5957031 + - -0.39916992 + - 10.4921875 + - 5.3867188 + - -7.9570313 + - -5.6914063 + - 2.9589844 + - -2.2753906 + - 4.1210938 + - -0.3178711 + - -1.15625 + - 5.828125 + - 3.4746094 + - -0.51953125 + - 1.9931641 + - 1.15625 + - -3.9140625 + - -0.30517578 + - 4.390625 + - 0.96191406 + - -5.0078125 + - 5.8242188 + - 1.9091797 + - 2.2949219 + - -3.2460938 + - -3.9570313 + - 5.3789063 + - 6.4648438 + - 6.9375 + - 7.6210938 + - 0.76464844 + - -0.41430664 + - -3.7480469 + - 3.1015625 + - -0.22961426 + - -3.3007813 + - -5.2890625 + - -8.6953125 + - 2.3320313 + - -0.9013672 + - -5.3789063 + - -10.9453125 + - -0.20263672 + - -3.359375 + - -6.1367188 + - 2.6777344 + - -2.7753906 + - 2.0957031 + - -2.3105469 + - -2.7382813 + - -17.140625 + - 5.2070313 + - 3.4707031 + - -2.0371094 + - 0.82421875 + - -3.5566406 + - 2.1445313 + - -4.8164063 + - -1.2802734 + - 0.42407227 + - 0.98095703 + - 1.3271484 + - -1.9667969 + - 0.36328125 + - -3.90625 + - 5.0859375 + - -1.7578125 + - -1.8056641 + - -5.6210938 + - -2.875 + - -2.9453125 + - -1.5351563 + - 3.1445313 + - 3.8066406 + - 0.78759766 + - 2.8574219 + - 3.6015625 + - 10.6171875 + - -0.24499512 + - -0.52734375 + - -0.61816406 + - -2.9453125 + - -1.0263672 + - 3.359375 + - 6.6640625 + - -5.4179688 + - 0.9326172 + - 5.09375 + - -3.796875 + - 2.3691406 + - -3.9375 + - 6.0117188 + - 1.1669922 + - 0.07067871 + - -0.63916016 + - -7.7304688 + - -0.11804199 + - -5.1992188 + - -0.9707031 + - 2.8730469 + - 0.36157227 + - 4.0898438 + - -3.59375 + - -0.14904785 + - 6.3164063 + - 1.0546875 + - 12.78125 + - 5.265625 + - 2.4238281 + - -0.40429688 + - 2.5800781 + - -2.7871094 + - 0.19958496 + - -0.4580078 + - -4.5585938 + - -7.4570313 + - 0.7397461 + - -2.4921875 + - 2.3066406 + - 6.7929688 + - 5.4023438 + - -9.0859375 + - -0.38134766 + - 5.0117188 + - 3.9003906 + - 4.3515625 + - -3.7050781 + - 5.2226563 + - -4.4726563 + - -3.5234375 + - -3.5878906 + - 3.2519531 + - -4.1484375 + - 0.6220703 + - 0.796875 + - -0.8642578 + - -4.4023438 + - 7.171875 + - -2.1464844 + - -5.0898438 + - -3.7910156 + - 9.359375 + - 1.7636719 + - 2.4023438 + - -3.3632813 + - -0.3083496 + - 1.5644531 + - 8.6015625 + - 1.6787109 + - 3.1347656 + - 0.828125 + - -1.140625 + - 7.734375 + - 1.7255859 + - 0.40942383 + - -6.578125 + - 4.8867188 + - 8.0625 + - 3.3789063 + - 4.3359375 + - 1.0917969 + - -7.2265625 + - 11.5078125 + - 7.2929688 + - -0.17590332 + - -12.3046875 + - -1.6904297 + - -1.0439453 + - -6.5117188 + - -1.4707031 + - 3.1171875 + - -6.1835938 + - -0.48608398 + - 0.20043945 + - -2.1621094 + - -14.5859375 + - -2.4316406 + - -7.3242188 + - 2.8027344 + - -19.578125 + - 1.2392578 + - -0.20324707 + - -1.3583984 + - -3.8515625 + - 2.2460938 + - -0.011695862 + - -3.9257813 + - 5.6132813 + - 7.421875 + - -2.6035156 + - 1.0546875 + - -3.15625 + - -0.39282227 + - -1.7597656 + - -10.796875 + - -8.1875 + - -0.53271484 + - 1.5058594 + - 1.9404297 + - -0.18969727 + - 0.14782715 + - 1.4873047 + - -1.9814453 + - 2.9199219 + - -5.5859375 + - 0.45458984 + - -0.087768555 + - -1.2929688 + - -6.359375 + - -3.5957031 + - -3.4257813 + - -1.75 + - 6.2070313 + - 5.6796875 + - 2.3300781 + - 2.0546875 + - -0.85839844 + - 6.0039063 + - 6.4101563 + - 1.9902344 + - 0.55322266 + - -1.5361328 + - 0.30200195 + - 6.3828125 + - 4.6679688 + - 3.1835938 + - -10.171875 + - -1.8203125 + - -4.0351563 + - -5.3164063 + - 0.97802734 + - -3.1679688 + - 8.0703125 + - 0.1373291 + - 1.2431641 + - -0.47998047 + - 3.6601563 + - -6.7265625 + - -1.1728516 + - -1.5908203 + - 0.23620605 + - 5.5898438 + - 4.5234375 + - -5.7226563 + - -4.40625 + - 5.0234375 + - 1.5634766 + - 0.6376953 + - 4.3320313 + - -2.2246094 + - -1.6318359 + - -0.1784668 + - -7 + - -1.6015625 + - 0.10180664 + - 3.1777344 + - 4.5351563 + - 1.7783203 + - 9.765625 + - -0.8173828 + - 1.7431641 + - 0.5605469 + - -1.4628906 + - 5.53125 + - -5.7578125 + - -0.7885742 + - -4.2226563 + - -6.1171875 + - -0.27783203 + - 3.5566406 + - -1.7841797 + - 0.12915039 + - -1.7714844 + - -5.046875 + - -0.14331055 + - 4.3710938 + - -3.421875 + - -1.6601563 + - -2.8886719 + - -4.21875 + - 7.5625 + - -6.5195313 + - -4.1289063 + - 4.3203125 + - 2.7089844 + - -0.018585205 + - 2.265625 + - 2.2285156 + - -2.5683594 + - -5.6679688 + - -4.3085938 + - 0.05795288 + - 5.4296875 + - -1.515625 + - -1.5429688 + - -3.8125 + - 4.3242188 + - -2.0351563 + - 6.0898438 + - -8.421875 + - 1.3779297 + - 5.9804688 + - -2.3671875 + - -1.8222656 + - 0.30078125 + - 3.3515625 + - 5.6367188 + - 0.91796875 + - -4.109375 + - 0.05508423 + - 2.5761719 + - -5.8984375 + - -0.72998047 + - 3.875 + - -0.97998047 + - 9.25 + - 0.640625 + - 5.125 + - -7.7734375 + - -0.4169922 + - 5.8203125 + - 0.023406982 + - -4.9765625 + - 3.3613281 + - 2.6699219 + - 1.2724609 + - 1.9111328 + - -0.86621094 + - 1.2138672 + - -0.8588867 + - 0.053955078 + - 2.6777344 + - 1.3916016 + - -1.3056641 + - 9.7890625 + - -4.0390625 + - 8.625 + - 4.1835938 + - 1.5400391 + - -7.9414063 + - 2.4550781 + - -0.32177734 + - -1.7421875 + - -2.6972656 + - -1.7070313 + - -6.2539063 + - 1.2714844 + - 5.6132813 + - -1.7275391 + - 2.8261719 + - 7.0585938 + - -6.4453125 + - 1.7128906 + - 2.1816406 + - 2.4511719 + - -6.5351563 + - -1.2958984 + - 8.484375 + - 0.90234375 + - -5.25 + - -0.9995117 + - -1.2177734 + - 2.0703125 + - 0.79785156 + - -2.8261719 + - 1.6298828 + - -4.7148438 + - 9.40625 + - -0.09173584 + - 3.0546875 + - 0.1574707 + - 2.953125 + - 3.7773438 + - -3.0742188 + - -8.9375 + - 9.046875 + - 6.8203125 + - -1.7255859 + - 0.2626953 + - -5.984375 + - 2.5605469 + - -1.8837891 + - 2.0429688 + - 1.4042969 + - 1.9941406 + - -1.1591797 + - 2.6152344 + - 4.703125 + - -5.7460938 + - 0.14221191 + - -4.7539063 + - 4.578125 + - 5.7109375 + - -13.2734375 + - 1.0605469 + - 0.42138672 + - -3.5136719 + - 9.265625 + - 12.375 + - -0.6269531 + - -0.1352539 + - 5.5 + - 2.8027344 + - -0.9560547 + - 1.4589844 + - 3.3085938 + - 0.44677734 + - -0.15759277 + - 1.1865234 + - -6.4414063 + - 0.11468506 + - 2.5605469 + - -6.6953125 + - 0.7290039 + - -0.9814453 + - -0.4482422 + - 3.6191406 + - -11.109375 + - -2.4199219 + - -0.37817383 + - -4.4023438 + - 0.5107422 + - -1.9541016 + - -1.9423828 + - 4.6523438 + - 0.53466797 + - -1.1777344 + - -2.8515625 + - 1.3115234 + - 3.4199219 + - 2.6503906 + - -5.1796875 + - 0.5048828 + - -3.7246094 + - 0.83984375 + - -2.8574219 + - 0.23120117 + - 24.703125 + - 0.38232422 + - -3.6171875 + - -1.5263672 + - -1.0390625 + - 4.734375 + - -5.2539063 + - -0.95703125 + - 4.921875 + - -5.5898438 + - -3.3417969 + - -1.3525391 + - -0.8027344 + - 2.8535156 + - 7.7734375 + - 0.6699219 + - 4.7070313 + - -3.3847656 + - -3.4589844 + - -1.9072266 + - 0.2685547 + - 3.4707031 + - -3.1367188 + - -6.328125 + - 2.5371094 + - -1.0742188 + - -6.953125 + - -3.6738281 + - -7.65625 + - 5.046875 + - 2.3125 + - 4.5820313 + - 1.3212891 + - 13.640625 + - -3.5839844 + - 2.8710938 + - -5.4140625 + - -0.63378906 + - -0.013664246 + - 1.6123047 + - 1.6660156 + - 0.81933594 + - 2.390625 + - 0.98779297 + - -0.5605469 + - 6.3632813 + - 1.7509766 + - -9.1328125 + - 4.7109375 + - -7.0703125 + - 1.8564453 + - 7.3007813 + - -1.6103516 + - 0.048553467 + - 0.42163086 + - 2.2148438 + - 5.765625 + - 0.3413086 + - 0.67822266 + - 6.0585938 + - 1.4267578 + - -0.82128906 + - 1.7109375 + - -3.1972656 + - -1.5332031 + - 4.0234375 + - -2.8535156 + - 3.7539063 + - -3.4824219 + - 8.328125 + - 1.3730469 + - -2.9941406 + - -8.578125 + - 5.8046875 + - -2.8417969 + - -5.7773438 + - -1.1640625 + - -0.9033203 + - 4.0039063 + - -0.3083496 + - -3.1113281 + - -1.1943359 + - 7.1796875 + - -3.7792969 + - 7.3203125 + - 2.7539063 + - -1.5244141 + - -1.8544922 + - 2.2890625 + - 1.4609375 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.4863281 + - 8.3984375 + - -1.7675781 + - -2.0234375 + - 8.4453125 + - 3.3222656 + - 6.2148438 + - 3.4746094 + - 4.8085938 + - -2.5410156 + - -0.58251953 + - -0.090148926 + - -2.890625 + - -0.17236328 + - -5.3554688 + - -5.8007813 + - -2.40625 + - 2.78125 + - -1.1171875 + - 6.5273438 + - 4.3867188 + - -2.9414063 + - 0.3076172 + - 6.0117188 + - -0.32128906 + - -2.9785156 + - -1.1113281 + - 3.5566406 + - 7.1875 + - 3.7851563 + - -2.5820313 + - 0.12878418 + - 7.1367188 + - 9.9921875 + - -0.06323242 + - 0.703125 + - 0.70166016 + - -0.7714844 + - -2.2695313 + - 0.033081055 + - 0.029953003 + - 6.6523438 + - 2.6367188 + - -3.8769531 + - -4.7773438 + - -5.1367188 + - 4.796875 + - -2.0136719 + - 3.34375 + - -3.4160156 + - -5.078125 + - 0.74902344 + - 2.3574219 + - -1.8564453 + - 1.9130859 + - -3.640625 + - -3.2773438 + - 1.1289063 + - 1.7148438 + - -1.8642578 + - 4.4296875 + - 0.4741211 + - 1.3945313 + - -5.5742188 + - -4.109375 + - -0.8774414 + - -7.5585938 + - -3.9628906 + - 7.3789063 + - -0.8852539 + - -0.62402344 + - -2.0722656 + - -3.5429688 + - 5.9609375 + - 8.21875 + - 3.890625 + - -3.3476563 + - -1.4951172 + - 2.9648438 + - 0.18395996 + - -3.9511719 + - -4.3398438 + - -2.3964844 + - -1.3242188 + - -0.8041992 + - -2.7441406 + - -1.4892578 + - 7.1210938 + - -6.9375 + - -2.296875 + - -2.4550781 + - 6.3242188 + - 1.0410156 + - -4.59375 + - -0.5957031 + - -0.8564453 + - 7.0195313 + - 1.7265625 + - 4.515625 + - 2.6054688 + - 5.5703125 + - -3.0195313 + - -3.1523438 + - 2.2929688 + - -4.4414063 + - 6.46875 + - 4.9375 + - -1.9814453 + - 4.4453125 + - 1.5048828 + - 4.5585938 + - -5.0117188 + - 1.3818359 + - 5.90625 + - -6.7695313 + - -1.9111328 + - -0.071777344 + - 0.9746094 + - -0.8261719 + - -1.3583984 + - 2.1132813 + - -3.2734375 + - 4.6132813 + - 3.1328125 + - 0.60839844 + - 3.640625 + - -4.6992188 + - -2.4726563 + - 1.2744141 + - 2.1425781 + - -0.7441406 + - 0.024169922 + - -2.4355469 + - -3.28125 + - 0.57373047 + - -7.5195313 + - -6.2070313 + - 4.7226563 + - 6.1914063 + - 8.3515625 + - 12.2421875 + - -2.53125 + - -1.2783203 + - -2.5019531 + - 0.6977539 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.14929199 + - -3.9550781 + - -1.8896484 + - 8.78125 + - 0.7001953 + - 7.5625 + - -4.9570313 + - -6.9882813 + - 5.9453125 + - -1.8261719 + - 5.9882813 + - 3.2597656 + - 0.9448242 + - -8.3203125 + - -2.0175781 + - -2.5527344 + - 1.1171875 + - -3.6699219 + - 3.6796875 + - 3.5019531 + - 2.9042969 + - -4.9257813 + - 5.4414063 + - -1.0283203 + - -1.8310547 + - -4.5351563 + - 6.1914063 + - -3.5488281 + - 1.0585938 + - -4.3867188 + - 0.074645996 + - 7.7734375 + - 6.8945313 + - -5.1367188 + - -0.5361328 + - 3.4316406 + - -2.5214844 + - 1.7695313 + - 0.6152344 + - -1.7314453 + - -2.2070313 + - -2.2402344 + - -4.0742188 + - -0.6567383 + - -2.8925781 + - 1.6826172 + - -4.6640625 + - -4.1601563 + - 3.5527344 + - 3.8261719 + - -0.7451172 + - -0.43188477 + - 1.5214844 + - 0.14746094 + - 1.9335938 + - 6.421875 + - -0.24707031 + - 7.6679688 + - -5.765625 + - 7.8671875 + - 0.8486328 + - 2.9960938 + - 1.3359375 + - 3.6855469 + - -3.7617188 + - 3.7382813 + - -6.0234375 + - -6.40625 + - 1.3740234 + - 1.9501953 + - 3.1679688 + - -0.5288086 + - -1.0214844 + - -4.5351563 + - 9.4375 + - -5.8984375 + - 8 + - 3.6210938 + - -15.5859375 + - -2.7734375 + - 1.0527344 + - 3.0488281 + - -7.7148438 + - -4.7148438 + - 1.1132813 + - -0.6948242 + - -5.7929688 + - 3.9042969 + - 10.0625 + - 0.10675049 + - -4.1992188 + - 1.2373047 + - 1.3027344 + - -0.26367188 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7099609 + - -0.13208008 + - 2.6171875 + - -4.9335938 + - 6.8164063 + - 2.7988281 + - -2.1015625 + - -5.8007813 + - -4.8515625 + - 0.9658203 + - 1.8544922 + - 0.90283203 + - -1.2851563 + - 2.1660156 + - -0.25219727 + - 0.020111084 + - -5.4804688 + - -2.8789063 + - 3.1835938 + - -4.2070313 + - -2.7792969 + - -1.0927734 + - 0.67626953 + - -1.7822266 + - 0.8491211 + - -9.9140625 + - -1.6845703 + - -1.7011719 + - 1.8603516 + - 5.21875 + - -0.21923828 + - -0.1303711 + - -3.2890625 + - 3.203125 + - 0.4099121 + - 1.0439453 + - 1.7529297 + - 6.2148438 + - 0.9067383 + - 2.5820313 + - 1.8457031 + - -0.9951172 + - -0.27026367 + - -2.7050781 + - -5.828125 + - -1.5742188 + - 5.6796875 + - -1.8222656 + - 5.390625 + - 4.8125 + - -2.6464844 + - -1.1611328 + - 0.83154297 + - -1.1591797 + - -3.9667969 + - 6.53125 + - 1.890625 + - -3.125 + - 3.7128906 + - -0.37451172 + - -10.171875 + - 0.27197266 + - 4.375 + - 2.171875 + - 4.0820313 + - 0.96191406 + - 6.5742188 + - 1.1435547 + - 3.4101563 + - 14.1484375 + - 2.0058594 + - -6.46875 + - -5.5351563 + - -2.3808594 + - 5.1484375 + - -2.9238281 + - -3.0195313 + - 2.390625 + - -1.4082031 + - 2.9199219 + - -1.7109375 + - 2.4238281 + - 5.2421875 + - -1.5576172 + - 3.0644531 + - 9.1953125 + - -6.7304688 + - 0.80126953 + - -0.8017578 + - -1.3261719 + - 0.9580078 + - 3.1933594 + - 3.2617188 + - -10.828125 + - -5.5234375 + - 4.6445313 + - -2.640625 + - -4.7734375 + - 0.61279297 + - 4.0820313 + - -0.9604492 + - -5.203125 + - 0.64453125 + - -0.8691406 + - -0.31176758 + - -2.9414063 + - -3.9609375 + - -6.171875 + - 0.4567871 + - -0.5551758 + - -4.7070313 + - 4.1835938 + - -2.7480469 + - 2.9570313 + - 0.69677734 + - 3.5410156 + - 3.2050781 + - -1.5 + - -3.6210938 + - -0.8125 + - 0.7993164 + - 0.234375 + - -1.6123047 + - 6.1835938 + - 4.0117188 + - 2.1601563 + - -4.8125 + - 0.29003906 + - 6.5546875 + - -0.56884766 + - -3.1816406 + - 4.7617188 + - -4.2578125 + - -0.0072288513 + - 4.6445313 + - -4.40625 + - -0.7939453 + - -5.5820313 + - -8.15625 + - -6.9921875 + - -4.0664063 + - -0.8754883 + - 0.9082031 + - -7.7304688 + - -1.1416016 + - -3.3574219 + - -7.6796875 + - -1.3916016 + - -3.9472656 + - 5.5429688 + - -2.8222656 + - -5.3554688 + - 0.6171875 + - -0.82177734 + - -0.1071167 + - 2.5546875 + - -4.1914063 + - 0.03567505 + - -1.4912109 + - -18.234375 + - -3.4882813 + - -0.61621094 + - -2.9511719 + - -2.3105469 + - -2.7207031 + - -4.4453125 + - 0.22436523 + - 3.4179688 + - 2.2519531 + - 3.9589844 + - 0.53515625 + - 0.16992188 + - -9.9765625 + - -1.6142578 + - -1.0683594 + - 2.5488281 + - 5.4765625 + - 3.3320313 + - 1.9384766 + - -5.3203125 + - -0.64501953 + - 1.9863281 + - -2.2285156 + - 0.6845703 + - -1.9570313 + - -0.99902344 + - -7.109375 + - 0.2980957 + - -3.0253906 + - 0.4033203 + - -1.8222656 + - 0.4440918 + - 2.0332031 + - -3.109375 + - -4.3320313 + - -9.6640625 + - -3.9921875 + - -0.23498535 + - -8.546875 + - -1.2666016 + - 7.6328125 + - 1.7714844 + - -3.4804688 + - -12.171875 + - -3.0878906 + - -7.7578125 + - -2.0957031 + - 0.08728027 + - 6.3476563 + - 2.7285156 + - -1.2490234 + - -2.7011719 + - 1.4521484 + - 2.7929688 + - 1.5078125 + - -1.7939453 + - -3.4882813 + - -7.3828125 + - -8.0234375 + - -1.2158203 + - -2.7832031 + - 1.6845703 + - -6.6835938 + - -5.9882813 + - -5.0429688 + - -0.43139648 + - -2.5878906 + - -4.0820313 + - -4.4101563 + - -0.0793457 + - -1.3710938 + - 0.28515625 + - -5.1914063 + - -4.4804688 + - -0.12731934 + - 2.2890625 + - -0.1171875 + - -2.6132813 + - -2.9160156 + - -5.3867188 + - 15.71875 + - 4.9179688 + - 2.6601563 + - 0.9135742 + - -7.9453125 + - -11.1875 + - 4.671875 + - 0.26464844 + - -0.44628906 + - -4.6914063 + - 8.9296875 + - -4.0117188 + - -0.059295654 + - 0.6850586 + - 2.0800781 + - -4.9609375 + - 0.091918945 + - 1.5673828 + - 0.88671875 + - -0.11450195 + - -4.34375 + - -0.3581543 + - 0.34960938 + - 3.2792969 + - 0.31469727 + - -1.2236328 + - 3.0585938 + - -2.1601563 + - -8.734375 + - 6.3984375 + - 0.15588379 + - -3.0253906 + - -3.7089844 + - 4.4804688 + - -3.390625 + - -4.046875 + - 0.32348633 + - 1.7861328 + - 5.8554688 + - 4.234375 + - -0.5810547 + - -1.4169922 + - 1.4697266 + - -1.1591797 + - 2.3320313 + - -3.3945313 + - -5.0351563 + - -4.8476563 + - -0.95751953 + - -1.7558594 + - -0.6669922 + - 0.06011963 + - -2.2792969 + - -0.08380127 + - -3.7167969 + - 7.8867188 + - 4.2304688 + - -2.8574219 + - -3.3203125 + - 5.625 + - -2.6347656 + - 2.0019531 + - -0.5317383 + - 1.3701172 + - -0.08496094 + - -3.8242188 + - -3.0117188 + - 4.203125 + - 4.7265625 + - -4.328125 + - 11.1875 + - -1.6337891 + - -0.8666992 + - -5.9023438 + - -5.859375 + - -0.9355469 + - -8.4375 + - -5.46875 + - 1.1240234 + - -2.1289063 + - -7.890625 + - 5.0898438 + - -5.2382813 + - -0.027267456 + - 2.1738281 + - 3.9980469 + - 6.4375 + - 4.203125 + - 5.4414063 + - -2.7070313 + - 0.10546875 + - -2.6132813 + - 5.5234375 + - -1.9365234 + - 3.7636719 + - -2.2285156 + - 1.6455078 + - 2.8125 + - -0.21313477 + - 5.1953125 + - 7.0351563 + - -2.828125 + - 6.2382813 + - -3.6425781 + - 5.7382813 + - -0.30249023 + - -3.5917969 + - -1.5507813 + - 6.0976563 + - -0.92333984 + - 2.9238281 + - -8.75 + - -0.2763672 + - 0.54296875 + - 3.0019531 + - -2.3320313 + - 1.6035156 + - 7.4257813 + - -5.984375 + - -0.48168945 + - 0.1427002 + - 0.8515625 + - -6.4023438 + - -1.2822266 + - -2.8828125 + - -1.2177734 + - 2.5761719 + - -3.8085938 + - 3.5957031 + - 11.265625 + - -9.984375 + - 3.9042969 + - 7.6015625 + - -2.4746094 + - 1.7685547 + - -0.30004883 + - -4.1484375 + - 0.3190918 + - -4.4609375 + - -0.3984375 + - 3.4667969 + - -1.7177734 + - 1.8867188 + - -8.171875 + - 3.046875 + - 6.234375 + - 0.22839355 + - 8.5234375 + - -3.0292969 + - -1.9580078 + - 4.546875 + - 3.2421875 + - 0.69628906 + - -2.8554688 + - 1.2177734 + - -6.3398438 + - 1.2490234 + - 1.2724609 + - -2.9121094 + - 1.3271484 + - -2.3066406 + - 0.703125 + - -6.4804688 + - -4.1015625 + - -2.4296875 + - -0.3515625 + - 1.6445313 + - -6.1914063 + - 4.171875 + - -13.109375 + - -1.1240234 + - 6.53125 + - 3.2871094 + - 4.0664063 + - 2.9746094 + - 2.9785156 + - 7.7773438 + - -2.7148438 + - -3.8300781 + - 6.3632813 + - 3.1503906 + - -8.09375 + - -1.3330078 + - -4.8632813 + - -2.21875 + - -0.6171875 + - -1.8818359 + - 4.5820313 + - -3.9160156 + - -3.078125 + - -1.4169922 + - 20.34375 + - -1.7783203 + - 2.125 + - -2.96875 + - 0.42333984 + - -4.7617188 + - -0.68115234 + - 1.4033203 + - 2.0527344 + - 3.875 + - 1.7890625 + - 0.61572266 + - -2.4238281 + - -0.953125 + - 5.6679688 + - 0.8208008 + - 0.022460938 + - -1.7705078 + - 6.6289063 + - 0.48901367 + - -6.4804688 + - -3.3085938 + - -12.15625 + - -0.35791016 + - -0.8105469 + - -2.0058594 + - 5.0039063 + - -3.0957031 + - 0.19445801 + - 10.140625 + - 4.4453125 + - -3.2050781 + - 1.7548828 + - -8.9921875 + - 1.5078125 + - 6.7304688 + - 9.0390625 + - -2.6171875 + - -5.4492188 + - 4.4492188 + - -0.63623047 + - -5.9296875 + - 0.28222656 + - 4.015625 + - 7.4023438 + - 4.328125 + - -6.84375 + - -2.6796875 + - -4.1992188 + - -2.0078125 + - 1.015625 + - -9.4296875 + - -6.2109375 + - -4.7890625 + - -10.484375 + - -0.08459473 + - 1.7314453 + - -5.8632813 + - 6.8164063 + - -2.2597656 + - -2.8125 + - 5.4101563 + - -2.2597656 + - 7.6367188 + - 0.67333984 + - 0.20532227 + - -12.8359375 + - -0.19580078 + - -1.0927734 + - 4.1835938 + - -2.2226563 + - 3.0800781 + - 3.5605469 + - -7.2460938 + - 0.02708435 + - 1.2529297 + - -9.328125 + - -8.2734375 + - -2.2617188 + - -0.78125 + - 6.7929688 + - -1.9189453 + - -11.796875 + - -0.23071289 + - 3.5976563 + - -2.78125 + - 0.56689453 + - -5.1992188 + - -2.3203125 + - -3.0351563 + - -4.1679688 + - 3.7460938 + - -2.4394531 + - -2.0507813 + - -3.3808594 + - -2.3320313 + - 3.6464844 + - 9.140625 + - -5.2070313 + - 3.0605469 + - 0.37329102 + - -1.1757813 + - -5.2304688 + - 2.1074219 + - -10.1484375 + - 1.8974609 + - 0.28686523 + - 0.6074219 + - 3.9355469 + - 5.15625 + - 0.68310547 + - -10.734375 + - -2.1621094 + - 1.3164063 + - -1.2197266 + - 2.8183594 + - -1.2998047 + - -0.5415039 + - 1.3759766 + - 12.25 + - -1.0390625 + - 4.4960938 + - 7.28125 + - 1.3095703 + - 1.9541016 + - 3.953125 + - 1.5693359 + - 1.5996094 + - -2.046875 + - 1.7978516 + - 4.3515625 + - -7.734375 + - 2.1425781 + - 0.71191406 + - -4.109375 + - 0.81689453 + - 12.375 + - -7.5390625 + - -10.0078125 + - 1.4414063 + - -0.7026367 + - 0.74365234 + - 9.2265625 + - -7.2148438 + - 1.0693359 + - 4.2070313 + - 2.0507813 + - -4.5859375 + - -6.4101563 + - -4.6992188 + - -3.4394531 + - -1.2207031 + - 17.21875 + - 2.9785156 + - 1.2050781 + - 5.796875 + - -4.9648438 + - 2.5605469 + - -2.625 + - -1.5097656 + - -8.375 + - -0.81152344 + - 3.8359375 + - -2.8007813 + - -0.53759766 + - 2.09375 + - 10.5 + - 6.3164063 + - 4.921875 + - 4.0585938 + - -6.2226563 + - -1.1142578 + - 3.1269531 + - -5.7695313 + - 6.15625 + - 2.7421875 + - -0.1463623 + - -6.1523438 + - 0.4934082 + - -5.0664063 + - -4.90625 + - 2.6738281 + - 4.734375 + - 4.1171875 + - -3.7304688 + - 1.7646484 + - 1.0849609 + - -1.8232422 + - -4.1835938 + - 1.6884766 + - 7.5703125 + - 5.0039063 + - 2.1699219 + - -5.6992188 + - -0.73828125 + - 1.7001953 + - -3.1308594 + - -3.1015625 + - -9.46875 + - -3.6074219 + - 6.9882813 + - 1.6279297 + - -2.3378906 + - -6.125 + - 2.8574219 + - 2.4628906 + - -1.3818359 + - 2.9199219 + - 0.46801758 + - 2.4082031 + - -1.7470703 + - -0.8823242 + - -0.16455078 + - 1.5869141 + - 0.17614746 + - -3.265625 + - -0.16381836 + - 5.3359375 + - 5.5703125 + - -5.15625 + - -2.5078125 + - 0.9633789 + - 12.1640625 + - -1.7744141 + - -1.1025391 + - 0.73779297 + - 8.3828125 + - 4.140625 + - -6.90625 + - 1.8007813 + - 6.4179688 + - -4.1328125 + - 0.4506836 + - 2.5058594 + - 6.0742188 + - -1.140625 + - 1.0488281 + - 5.3554688 + - 3.8164063 + - -2.2597656 + - 0.92041016 + - 4.9570313 + - 1.9746094 + - 9.4453125 + - 0.60791016 + - -2.4003906 + - -1.9726563 + - 2.2070313 + - -3.171875 + - -10.796875 + - 0.55810547 + - -6.234375 + - 4.9765625 + - 1.2148438 + - 0.44091797 + - 3.8847656 + - -2.8613281 + - -2.1171875 + - 2.5742188 + - -0.7753906 + - -1.8837891 + - -8.0859375 + - 3.7070313 + - 0.09869385 + - -4.3515625 + - -2.8476563 + - 4.8476563 + - 1.9140625 + - -2.6347656 + - 1.4101563 + - 0.88916016 + - 2.3554688 + - -9.1171875 + - 1.078125 + - 1.3027344 + - -2.2402344 + - 4.8671875 + - -3.1484375 + - -6.3945313 + - -1.2197266 + - 4.7617188 + - 0.3034668 + - -0.44091797 + - 5.7773438 + - -4.1445313 + - -4.4648438 + - -7.8125 + - -3.3515625 +- - -2.6601563 + - 6.1328125 + - 1.4423828 + - -3.2871094 + - 5.0429688 + - -2.6582031 + - -0.17053223 + - -0.06591797 + - 0.16113281 + - 1.5869141 + - 6.71875 + - -4.5 + - -3.9179688 + - -1.1357422 + - -1.4628906 + - -0.0803833 + - 1.6572266 + - -1.1748047 + - -0.22253418 + - 7.5351563 + - -1.2246094 + - -7.7929688 + - -5.9960938 + - -2.1679688 + - -0.036895752 + - -1.4746094 + - -7.046875 + - 1.9560547 + - 5.9023438 + - 3.2734375 + - -5.4648438 + - 2.125 + - 7.3632813 + - 13.5234375 + - -7.1484375 + - -4.1132813 + - -0.8017578 + - -1.9736328 + - -2.0019531 + - -1.5009766 + - 2.8671875 + - 1.2753906 + - -0.5551758 + - -0.10852051 + - 5.8007813 + - 5.4648438 + - -10.828125 + - -5.4492188 + - 0.025390625 + - 2.4375 + - 2.6425781 + - -5.3632813 + - -3.2480469 + - 2.4453125 + - 7.5117188 + - -0.40014648 + - 2.6855469 + - -0.59228516 + - -1.859375 + - -0.8886719 + - 2.8535156 + - -2.9765625 + - -0.14123535 + - 8.5078125 + - 2.8730469 + - 5.7265625 + - -2.1171875 + - -2.2460938 + - 4.6679688 + - 3.4609375 + - 6.203125 + - 1.3486328 + - 4.484375 + - -0.121276855 + - -0.7529297 + - 5.7148438 + - 2.4394531 + - -2.9511719 + - -8.984375 + - -10.390625 + - 1.5205078 + - -0.20666504 + - -7.734375 + - -11.8203125 + - -1.140625 + - -2.7675781 + - -7.3945313 + - 3.6523438 + - -0.55810547 + - -1.9707031 + - 2.1757813 + - -3.0585938 + - -16.484375 + - 4.6289063 + - 6.96875 + - -2.9804688 + - 0.44555664 + - -2.6210938 + - -0.57958984 + - 1.2226563 + - -2.09375 + - 0.953125 + - 2.0136719 + - -0.25390625 + - -1.7011719 + - -1.0419922 + - -15.3515625 + - 3.6621094 + - -0.7661133 + - -5.6953125 + - -7.734375 + - 1.2558594 + - 0.4765625 + - -3.7578125 + - 1.9130859 + - 5.0546875 + - 1.4794922 + - -0.13244629 + - 0.08148193 + - 8.5625 + - 2.1894531 + - -0.39794922 + - 5.1171875 + - -3.6523438 + - -1.8945313 + - 2.9882813 + - 7.1328125 + - -4.328125 + - -5.4726563 + - 4.15625 + - -7.0351563 + - -4.8085938 + - -2.2929688 + - 4.5234375 + - 0.86328125 + - 2.4472656 + - -3.2773438 + - -1.8867188 + - 0.9248047 + - -4.6054688 + - -0.74609375 + - 3.5742188 + - 2.0410156 + - 3.7363281 + - -0.87109375 + - -1.2783203 + - 5.6523438 + - 1.3505859 + - 10.5078125 + - 0.54345703 + - 5.8164063 + - -2.8085938 + - 3.9511719 + - -1.7529297 + - -3.4785156 + - 1.4970703 + - -1.0410156 + - -9.0078125 + - -4.734375 + - -7.4257813 + - 2.2207031 + - 3.0976563 + - 8.34375 + - -5.6835938 + - 2.2109375 + - 4.7890625 + - 13.2890625 + - 5.0898438 + - -4.6132813 + - 4.0429688 + - -1.1464844 + - 1.4775391 + - -3.4023438 + - -2.6445313 + - -2.5273438 + - 2.6835938 + - -0.74658203 + - 3.1464844 + - -9.5234375 + - 10.8984375 + - 1.9990234 + - -6.5859375 + - -6.25 + - 5.6171875 + - -1.9248047 + - 0.8442383 + - -3.28125 + - 1.25 + - 7.7851563 + - 9.0078125 + - 0.5917969 + - 4.765625 + - 0.015930176 + - -2.9296875 + - 4.34375 + - -1.0742188 + - 2.5703125 + - -5.8125 + - 5.7226563 + - 4.546875 + - 1.765625 + - 0.17333984 + - 1.3652344 + - -3.5605469 + - 8.6328125 + - 5.0820313 + - 1.6074219 + - -4.0429688 + - 2.5878906 + - 0.7651367 + - -7.4609375 + - -1.2744141 + - 0.19689941 + - -8.96875 + - -0.3930664 + - -5.4804688 + - -1.7539063 + - -14.65625 + - -1.9550781 + - -6.84375 + - 2.7832031 + - -14.296875 + - -1.4101563 + - 4.2226563 + - 2.2714844 + - -3.6992188 + - -4.2070313 + - 2.03125 + - -2.4453125 + - 1.1230469 + - 7.2539063 + - -0.9663086 + - 0.8432617 + - -2.0117188 + - 0.10241699 + - -1.1904297 + - -4.78125 + - -5.0546875 + - -4.4179688 + - 1.3056641 + - -1.1845703 + - 0.1685791 + - -2.78125 + - -1.0908203 + - -3.7988281 + - 4.4648438 + - 0.07293701 + - 0.1451416 + - 0.16137695 + - 2.9746094 + - -7.1953125 + - -2.6445313 + - -5.6523438 + - -0.88623047 + - 6.4453125 + - 5.453125 + - 1.2021484 + - 3.4453125 + - 0.020889282 + - 6.859375 + - 8.0390625 + - 2.3554688 + - -1.4697266 + - -1.296875 + - 0.10217285 + - 1.1445313 + - -2.1113281 + - 3.9980469 + - -8.8984375 + - -2.8730469 + - 2.0644531 + - -5.3085938 + - 0.5878906 + - -4.7578125 + - 7.9726563 + - -4.5742188 + - 0.18920898 + - -0.13659668 + - 8 + - -7.7929688 + - -0.23095703 + - 0.21203613 + - -0.8671875 + - 7.9101563 + - 7.3359375 + - -10.8359375 + - -1.6132813 + - 7.8710938 + - 7.5234375 + - 5.28125 + - 4.5820313 + - 2.8164063 + - -4.5039063 + - 4.3046875 + - -9.515625 + - -3.0351563 + - 3.8886719 + - 5.3515625 + - 4.4179688 + - 3.125 + - 5.5234375 + - -3.890625 + - 4.8984375 + - -1.1513672 + - 0.91308594 + - 4.7070313 + - -3.3652344 + - 2.4472656 + - -3.03125 + - -4.4101563 + - 2.0136719 + - 1.2832031 + - -5.2734375 + - 2.21875 + - -4.2460938 + - -3.84375 + - 1.0859375 + - 6.65625 + - -3.1855469 + - -1.8798828 + - 0.041168213 + - -3.6855469 + - 0.77490234 + - -2.3007813 + - -4.4257813 + - 2.609375 + - 1.3867188 + - -0.044128418 + - -0.7211914 + - 5.3945313 + - -6.078125 + - -6.4179688 + - -1.9951172 + - 0.359375 + - 7.6796875 + - -0.8066406 + - -1.2041016 + - 3.0761719 + - 0.62646484 + - 5.0273438 + - 3.2441406 + - -5.671875 + - -0.9892578 + - 5.7148438 + - -4.0507813 + - -7.6328125 + - 1.5166016 + - 1.1181641 + - 5.8984375 + - 3.6933594 + - -2.1738281 + - 0.1184082 + - 1.4492188 + - -5.7851563 + - -6.3710938 + - 2.8007813 + - -0.59033203 + - 6.6953125 + - 0.048034668 + - 2.8378906 + - -6.5039063 + - 3.1464844 + - 0.66308594 + - -3.4394531 + - -3.3339844 + - 2.4492188 + - 3.1132813 + - 2.1269531 + - 3.0214844 + - -3.2460938 + - -7.984375 + - -4.1640625 + - -0.45507813 + - -1.5615234 + - 4.6757813 + - 2.546875 + - 5.5820313 + - 0.18457031 + - 4.7148438 + - -2.34375 + - -1.5302734 + - -10.890625 + - 2.1230469 + - 0.78808594 + - -3.1542969 + - -0.5385742 + - -3.1464844 + - -2.4003906 + - -5.1367188 + - -0.85253906 + - 4.953125 + - -0.8486328 + - 6.25 + - -8.46875 + - -0.049713135 + - 5.7382813 + - -0.13757324 + - -10.8984375 + - -1.4873047 + - 6.1523438 + - 5.0664063 + - -2.1640625 + - -3.0039063 + - -0.36743164 + - 2.296875 + - -0.54345703 + - 0.31982422 + - 1.4697266 + - -6.3789063 + - 12.203125 + - 0.6308594 + - 4.2539063 + - 2.4960938 + - 1.5224609 + - 4.9609375 + - -1.6894531 + - -10.15625 + - 3.1660156 + - 2.7207031 + - -0.026367188 + - -2.4804688 + - -6.0820313 + - 2.40625 + - -3.4570313 + - 0.58496094 + - 7.1601563 + - -2.171875 + - 2.6113281 + - 5.234375 + - -1.2363281 + - -5.375 + - -1.2138672 + - -5 + - 6.25 + - 4.0234375 + - -12.5546875 + - 1.2861328 + - 1.6513672 + - -0.002565384 + - 11.203125 + - 4.2734375 + - 5.6171875 + - 2.9765625 + - -0.39501953 + - 1.9853516 + - -5.15625 + - -0.9848633 + - 8.125 + - -0.72314453 + - -4.59375 + - -0.8491211 + - -6.765625 + - -0.7060547 + - 2.4765625 + - 0.0541687 + - -0.6845703 + - 1.9365234 + - 4.9257813 + - -2.25 + - -9.71875 + - -2.3769531 + - 2.9121094 + - -3.6035156 + - 1.8974609 + - 2.1054688 + - -1.0136719 + - 1.0263672 + - -1.2988281 + - -2.7597656 + - -1.0136719 + - 1.8779297 + - 1.5869141 + - 1.0380859 + - -9.1328125 + - -2.4023438 + - -1.7392578 + - -1.6982422 + - -7.0585938 + - 1.7822266 + - 39.8125 + - -5.09375 + - -3.1484375 + - 0.76953125 + - -1.5371094 + - 3.6054688 + - -2.9160156 + - 0.24438477 + - -0.3605957 + - -1.9970703 + - -0.61083984 + - 1.6347656 + - -1.6269531 + - 2.7558594 + - 7.7382813 + - -2.5117188 + - 0.86572266 + - 1.4677734 + - -8.40625 + - 0.6088867 + - 0.55126953 + - 2.0175781 + - -3.5507813 + - -2.453125 + - 9.2421875 + - 0.9399414 + - -10.3359375 + - -0.5683594 + - -3.953125 + - 6.671875 + - 2.6230469 + - 3.90625 + - -0.3112793 + - 13.515625 + - -6 + - 0.34204102 + - -7.2851563 + - -3.1035156 + - 0.515625 + - -5.78125 + - 0.85546875 + - -2.7324219 + - 1.2373047 + - -0.025985718 + - -0.18713379 + - 9.3515625 + - -1.5898438 + - -8.6015625 + - 8.421875 + - -1.6669922 + - 5.375 + - 5.0273438 + - -0.95947266 + - 5.3242188 + - -0.91064453 + - 2.5449219 + - 1.6660156 + - -1.7597656 + - 0.26757813 + - 1.7070313 + - 2.2539063 + - 2.4140625 + - -5.3046875 + - -2.9082031 + - -3.8769531 + - 5.734375 + - -0.52246094 + - 1.4697266 + - -5.3632813 + - 4.3945313 + - 3.7207031 + - -1.7265625 + - -4.9726563 + - 4.9296875 + - -0.62353516 + - -10.2890625 + - -4.0429688 + - 0.35913086 + - 5.1171875 + - -2.7167969 + - -2.7109375 + - 1.6943359 + - 2.5195313 + - -0.8520508 + - 2.1855469 + - 0.50097656 + - 1.7402344 + - 1.2587891 + - 3.2460938 + - 4.0195313 + - -8.9140625 + - -2.4785156 + - 2.0273438 + - 4.8867188 + - 6.4257813 + - 0.8745117 + - -3.9453125 + - 3.3671875 + - 4.0429688 + - 8.625 + - 1.9970703 + - 5.921875 + - -2.6054688 + - 1.6337891 + - -4.0703125 + - -1.4013672 + - 0.79003906 + - -0.86083984 + - -4.6132813 + - 0.5859375 + - 4.0820313 + - -2 + - 4.5820313 + - 2.5175781 + - -1.0537109 + - 0.2220459 + - 8.8125 + - -0.56396484 + - -2.4121094 + - 0.51904297 + - 3.5546875 + - 5.4960938 + - 4 + - -9.0390625 + - 2.2109375 + - 6.921875 + - 12.1328125 + - -2.1503906 + - 3.421875 + - 2.0566406 + - -6.1484375 + - -3.5410156 + - 4.6601563 + - -2.4863281 + - 3.4824219 + - 0.7192383 + - -0.5786133 + - -0.4128418 + - -6.5625 + - 3.3574219 + - -2.8007813 + - 6.2773438 + - -5.625 + - -5.828125 + - -0.121276855 + - 1.8955078 + - 0.29077148 + - 1.4560547 + - 4.578125 + - -4.8515625 + - -2.484375 + - 0.29882813 + - -0.75439453 + - 9.1171875 + - 2.1835938 + - -0.734375 + - -5.28125 + - -2.9121094 + - -2.6679688 + - -4.0742188 + - -0.091796875 + - 3.265625 + - -1.7441406 + - -0.107666016 + - -0.97021484 + - -3.2792969 + - 5.3242188 + - 11.7890625 + - -1.390625 + - -1.453125 + - 1.4892578 + - 3.6269531 + - 2.9707031 + - -5.0039063 + - -0.8676758 + - -3.015625 + - -0.79785156 + - 2.9472656 + - -0.68359375 + - -3.8457031 + - 8.53125 + - -4.4492188 + - 1.7265625 + - -2.8515625 + - 10.6953125 + - 0.6298828 + - -6.3632813 + - 3.7890625 + - 0.02583313 + - 5.625 + - 1.1943359 + - 4.1015625 + - -0.79345703 + - 6.5039063 + - -1.7978516 + - -0.92822266 + - -0.37963867 + - -5.75 + - 4.8164063 + - 0.5751953 + - -2.0644531 + - 6.7578125 + - 3.3007813 + - 2.6074219 + - -1.8779297 + - 1.2832031 + - 3.7246094 + - -5.46875 + - -1.5478516 + - -1.1992188 + - 0.7739258 + - 0.105163574 + - -1.8105469 + - -0.64941406 + - -3.3828125 + - 6.1445313 + - 1.7167969 + - 3.1875 + - -4.1328125 + - -4.625 + - -4.4921875 + - 3.7929688 + - -0.50683594 + - 2.8789063 + - 1.0751953 + - -4.9453125 + - -7.296875 + - -1.0917969 + - -4.7734375 + - -1.640625 + - 1.9980469 + - 8.75 + - 8.7265625 + - 14.8125 + - 2.234375 + - -0.7573242 + - 0.8901367 + - 1.3173828 + - 2.3144531 + - -2.1035156 + - 1.5166016 + - 0.86035156 + - -3.2167969 + - -4.6796875 + - 12.4453125 + - 3.2558594 + - 13.234375 + - -2.7363281 + - -1.7490234 + - 8.5703125 + - -1.1708984 + - 2.7617188 + - 2.6484375 + - -0.42285156 + - 3.1640625 + - -1.3808594 + - -0.55908203 + - 2.0273438 + - -4.2578125 + - 1.7412109 + - -1.9677734 + - 2.8867188 + - -9.578125 + - 5.5546875 + - -0.62109375 + - -7.4648438 + - -1.7392578 + - 5.5351563 + - -3.0996094 + - 0.29907227 + - -1.9863281 + - -3.7441406 + - 2.5019531 + - 6.0117188 + - -3.2832031 + - 1.7216797 + - 2.40625 + - -5.9960938 + - 2.1640625 + - 0.33935547 + - -2.8359375 + - -1.9365234 + - -7.03125 + - -3.9179688 + - 0.18847656 + - -2.8261719 + - -1.8232422 + - -5.953125 + - -4.7617188 + - 3.109375 + - -1.1181641 + - -1.3964844 + - 0.25854492 + - -0.2355957 + - 8.96875 + - 6.265625 + - 5.125 + - 4.9453125 + - 7.1210938 + - 0.37353516 + - 2.5292969 + - -0.16174316 + - -1.0419922 + - -1.9121094 + - 0.56933594 + - -4.5117188 + - 0.48046875 + - -3.2109375 + - -4.7773438 + - 2.4765625 + - 3.4785156 + - 1.6933594 + - 2.1542969 + - 0.36767578 + - -5.1015625 + - 5.4570313 + - -8.4609375 + - 8.9921875 + - 0.23986816 + - -23.265625 + - -1.5517578 + - 0.9589844 + - 1.53125 + - -19.390625 + - -0.5551758 + - -2.2207031 + - 0.55029297 + - -1.5292969 + - 0.6479492 + - 7.5273438 + - -0.5708008 + - -3.3007813 + - 1.0556641 + - 1.1162109 + - 0.17236328 + - -1.8681641 + - 19.296875 + - -0.9951172 + - 0.34594727 + - 1.5986328 + - 1.4570313 + - -2.7304688 + - 6.4101563 + - 5.2773438 + - -0.9682617 + - -3.5585938 + - -5.8320313 + - 0.5102539 + - 1.859375 + - -0.7089844 + - 1.1777344 + - 2.2617188 + - 2.7636719 + - 3.7714844 + - -4.0390625 + - -5.6171875 + - 5.8828125 + - -3.6054688 + - -3.2324219 + - -2.2675781 + - -0.6738281 + - 0.40112305 + - -0.09869385 + - -3.1074219 + - -0.46240234 + - -0.48095703 + - 2.7304688 + - 1.6044922 + - -2.2265625 + - -2.7949219 + - -3.9296875 + - 2.4296875 + - -2.0625 + - 0.37548828 + - -0.33764648 + - 5.0234375 + - 0.34765625 + - 2.265625 + - 1.3535156 + - -3.1386719 + - -1.3925781 + - -4.6796875 + - -6.4101563 + - -6.4921875 + - 7.6367188 + - -2.6816406 + - 4.1367188 + - 5.0078125 + - -2.6152344 + - 0.42163086 + - -0.6689453 + - 3.59375 + - -2.7167969 + - 4.7382813 + - -2.2949219 + - -4.7421875 + - 1.5917969 + - -0.45043945 + - -9.171875 + - 0.073791504 + - 2.8574219 + - 2.5 + - 0.6435547 + - -0.9448242 + - 5.3476563 + - -1.9765625 + - 4.0625 + - 1.6523438 + - -5.359375 + - -12.7578125 + - -1.3681641 + - -5.8828125 + - 1.2304688 + - -4.3789063 + - -4.265625 + - 10.28125 + - -5.4296875 + - 3.1484375 + - -6.71875 + - 4.5078125 + - 7.765625 + - -1.0263672 + - 0.31323242 + - 6.59375 + - -6.703125 + - 1.7832031 + - 1.7119141 + - -2.9882813 + - -0.1149292 + - 3.5136719 + - 5.9101563 + - -11.8828125 + - -3.2910156 + - 1.7861328 + - -3.1464844 + - -1.7050781 + - -2.28125 + - -0.76953125 + - -1.6191406 + - -2.7109375 + - -1.8359375 + - -9.4609375 + - 0.1262207 + - -4.0664063 + - -2.3066406 + - -7.0703125 + - 3.1738281 + - -3.9589844 + - -6.2265625 + - -1.5527344 + - -13.1875 + - 7.2421875 + - -0.0066375732 + - 1.4453125 + - 2.6679688 + - 2.8925781 + - 0.24084473 + - -0.66503906 + - -0.71240234 + - -1.6630859 + - -1.5644531 + - 3.6171875 + - 3.7050781 + - 2.4921875 + - -2.59375 + - -3.7949219 + - 2.2636719 + - -2.6210938 + - -2.5761719 + - 1.2060547 + - 0.30908203 + - -1.0556641 + - 1.5283203 + - 1.6806641 + - -2.3945313 + - -0.33447266 + - -8.3984375 + - -5.7578125 + - -2.9589844 + - -3.5253906 + - -2.6210938 + - -6.2109375 + - -2.1367188 + - -0.83740234 + - -11.296875 + - -0.96875 + - -1.9716797 + - 4.7734375 + - -5.1757813 + - -3.9824219 + - -0.67041016 + - 1.6728516 + - 4.3046875 + - 0.90527344 + - -7.2421875 + - 0.036132813 + - -3.5195313 + - -13.8671875 + - 3.3222656 + - -2.0019531 + - 0.5576172 + - 0.29882813 + - -0.18347168 + - -0.3491211 + - 1.0224609 + - 4.578125 + - 4.4726563 + - 2.5214844 + - 3 + - 3.1679688 + - -5.1835938 + - -1.859375 + - -2.3632813 + - 2.1582031 + - -0.28344727 + - 0.05682373 + - 0.5776367 + - -3.5917969 + - 0.93847656 + - 0.8540039 + - -2.6035156 + - 1.2148438 + - -3.453125 + - -3.9765625 + - 0.35839844 + - 0.89404297 + - -7.96875 + - -6.3007813 + - -1.3164063 + - -3.7949219 + - 0.9560547 + - -0.8100586 + - -4.4414063 + - -9.0390625 + - -8.4453125 + - -1.5175781 + - -6.59375 + - -5.3632813 + - 4.1328125 + - 0.10809326 + - -4.375 + - -11.578125 + - -2.9238281 + - -9.4140625 + - -2.1308594 + - 1.7373047 + - 0.40307617 + - 3.1074219 + - 5.625 + - 0.9135742 + - 1.1972656 + - 1.7744141 + - 0.93603516 + - 0.76123047 + - -2.5605469 + - -2.4824219 + - -5.28125 + - -4.9960938 + - -2.4609375 + - -2.3085938 + - -3.6230469 + - -3.3359375 + - 0.33666992 + - 1.5625 + - -2.6152344 + - -3.1367188 + - 2.0566406 + - -0.2607422 + - -0.42089844 + - 1.6015625 + - -5.046875 + - -4.625 + - 2.0507813 + - 4.96875 + - -5.7070313 + - -0.081604004 + - -5.9609375 + - -7.3867188 + - 8.0234375 + - 11.2578125 + - 4.7890625 + - 1.5742188 + - -1.8105469 + - -0.61865234 + - -2.8242188 + - 1.4355469 + - 0.78125 + - -4.1445313 + - 11.5625 + - -5.6328125 + - -0.08343506 + - 0.6743164 + - -0.26049805 + - -5.1679688 + - 0.0869751 + - -0.36010742 + - 0.25952148 + - -1.2255859 + - 0.41088867 + - 1.3222656 + - -2.6699219 + - -0.19616699 + - 2.7460938 + - -1.5703125 + - -0.5654297 + - -4.265625 + - -2.7421875 + - 5.0195313 + - -3.421875 + - -1.4833984 + - -3.5117188 + - 4.5585938 + - 2.3671875 + - -1.7558594 + - 4.8867188 + - -0.26049805 + - 3.6953125 + - 0.7705078 + - -0.19335938 + - 1.4179688 + - 6.0234375 + - 2.3105469 + - 8.2734375 + - 0.4169922 + - -4.8203125 + - -2.0410156 + - 2.0371094 + - 0.4267578 + - 0.9321289 + - 1.3779297 + - -3.2714844 + - -0.6591797 + - -1.5068359 + - 6.21875 + - 0.39135742 + - 3.2871094 + - -1.5976563 + - 4.46875 + - -1.5048828 + - 1.9814453 + - -0.7651367 + - -1.7587891 + - 3.5175781 + - -3.4199219 + - -3.2207031 + - 7.3789063 + - 1.9667969 + - -1.9277344 + - 6.0234375 + - -1.46875 + - -4.9140625 + - -5.7890625 + - -3.7246094 + - 1.0273438 + - -8.3515625 + - -3.6269531 + - 0.2890625 + - -4.8007813 + - -6.0742188 + - 1.8652344 + - -5.859375 + - -0.1303711 + - 2.6875 + - 9.4921875 + - 3.5761719 + - 1.6201172 + - 7.3710938 + - -2.7460938 + - 1.2705078 + - 0.5307617 + - 7.4375 + - 4.203125 + - -1.6572266 + - -0.66015625 + - 1.6787109 + - 1.0703125 + - -0.025161743 + - 3.4375 + - 4.5429688 + - -4.7851563 + - 3.6210938 + - 0.124572754 + - 14.265625 + - 0.038726807 + - -2.5 + - 0.9296875 + - 0.9111328 + - -0.020980835 + - -3.5566406 + - -7.8984375 + - -0.67578125 + - 0.74316406 + - 2.9394531 + - -4.2695313 + - 4.6679688 + - 3.2148438 + - 0.8149414 + - -2.0859375 + - 1.2001953 + - 6.875 + - -7.359375 + - 0.28637695 + - -0.44140625 + - -2.5585938 + - 6.03125 + - -6.6132813 + - 5.2851563 + - 12.390625 + - -6.203125 + - 2.6601563 + - 2.3554688 + - -3.4375 + - 2.3964844 + - 0.4946289 + - -0.06878662 + - -1.6601563 + - -2.6933594 + - 5.8359375 + - 4.1796875 + - -1.9238281 + - 0.15405273 + - -8.7421875 + - 4.4335938 + - 5.6015625 + - -0.14611816 + - 7.9335938 + - -2.0878906 + - -0.06939697 + - 2.4472656 + - 5.0078125 + - -5.7578125 + - -5.1601563 + - -1.3964844 + - -8.4921875 + - 2.9550781 + - 0.82470703 + - -0.56152344 + - 0.011161804 + - -6.1171875 + - -1.2744141 + - -7.0390625 + - -1.6132813 + - -3.421875 + - 1.4443359 + - 0.36621094 + - 0.10784912 + - 3.0273438 + - -7.2265625 + - -2.1015625 + - 5.8632813 + - -3.7988281 + - 3.5605469 + - 3.7402344 + - 4.9179688 + - 4.3671875 + - -2 + - -1.7324219 + - 4.6171875 + - 7.6757813 + - -1.4951172 + - 0.140625 + - -8.0546875 + - -1.8964844 + - 0.2668457 + - 2.8417969 + - -4.84375 + - 4.1210938 + - 2.515625 + - 2.9414063 + - 28.0625 + - -6.4609375 + - -1.2070313 + - -0.26635742 + - 4.1210938 + - -4.0195313 + - -0.9873047 + - 1.6308594 + - 0.43603516 + - 2.2363281 + - 2.2539063 + - 1.3857422 + - 4.2265625 + - -2.1757813 + - 5.3164063 + - 3.7636719 + - -3.6074219 + - -4.8515625 + - 7.4492188 + - -2.0019531 + - -2.921875 + - -5.3632813 + - -10.65625 + - -1.1523438 + - -2.0136719 + - -3.4921875 + - 3.7089844 + - -1.5585938 + - -1.4443359 + - 5.3828125 + - 3.7558594 + - -2.5097656 + - 1.2724609 + - -10.34375 + - -0.81884766 + - 7.7890625 + - 3.5351563 + - -0.9116211 + - -2.2734375 + - 4.171875 + - -1.5917969 + - -4.5976563 + - -1.7949219 + - 4.1992188 + - -1.2099609 + - 3.4199219 + - -5.9101563 + - -1.9345703 + - -10.2578125 + - -0.40527344 + - -2.3398438 + - -3.6699219 + - -5.4179688 + - -4.9648438 + - -5.6367188 + - -1.8330078 + - 1.6630859 + - -6.359375 + - 6.2851563 + - 1.6992188 + - -1.0722656 + - 5.765625 + - -0.43920898 + - 12.328125 + - 0.0869751 + - 3.8710938 + - -9.390625 + - -0.45825195 + - -1.1894531 + - 3.4160156 + - -3.6367188 + - -0.08227539 + - 3.3320313 + - -5.8828125 + - -5.2382813 + - 3.6289063 + - -9.7421875 + - -15.734375 + - 1.84375 + - -3.28125 + - 6.5703125 + - -1.015625 + - -6.390625 + - -0.7758789 + - -0.5004883 + - 3.4296875 + - -0.6660156 + - 1.7900391 + - -2.53125 + - -3.1582031 + - 2.1074219 + - 0.82373047 + - -4.15625 + - 0.3564453 + - -5.0625 + - 0.46826172 + - -0.20117188 + - 9.4296875 + - -1.3701172 + - 6.21875 + - -1.1826172 + - -0.50927734 + - 0.97509766 + - 1.5351563 + - -9.1015625 + - 1.2363281 + - 1.1484375 + - 4.2460938 + - 4.6484375 + - 5.0078125 + - -1.4257813 + - -8.8046875 + - -2.5878906 + - 3.6601563 + - 0.5317383 + - 0.8198242 + - -2.7597656 + - -0.5253906 + - 2.9589844 + - 10.453125 + - -3.3242188 + - 1.2519531 + - 7.5820313 + - -1.4306641 + - 0.2076416 + - 9.6015625 + - 1.8046875 + - 3.9414063 + - 3.5351563 + - -3.0703125 + - 0.03564453 + - -3.2148438 + - 1.125 + - -1.9433594 + - -4.84375 + - 1.5664063 + - 9.125 + - -3.109375 + - -5.609375 + - 1.5107422 + - 1.7890625 + - 1.6806641 + - 9.0703125 + - -5.46875 + - 0.28930664 + - 1.1523438 + - 2.3300781 + - -2.265625 + - -4.3164063 + - 1.2324219 + - 0.8979492 + - -0.7207031 + - 14.6171875 + - 6.0703125 + - 1.9316406 + - 2.6289063 + - -1.1337891 + - 0.21948242 + - -2.4433594 + - -0.31347656 + - -4.25 + - -3.2949219 + - 5.4609375 + - -3.3808594 + - 1.8662109 + - 1.7060547 + - 5.5273438 + - -0.16638184 + - 2.9453125 + - 1.7265625 + - -11.4921875 + - -0.5644531 + - 4.7539063 + - -4.1992188 + - 1.3359375 + - 3.3535156 + - 0.17980957 + - -2.5195313 + - -0.31640625 + - -2.515625 + - -5.7851563 + - 1.5869141 + - 3.09375 + - 4.25 + - -0.20983887 + - -1.2236328 + - 1.1054688 + - -1.4736328 + - -2.6875 + - 3.3945313 + - 1.2041016 + - 4.8710938 + - 0.4609375 + - -3.3300781 + - 0.5957031 + - 4.734375 + - -1.6015625 + - -2.8535156 + - -6.3476563 + - -3.4667969 + - -0.015586853 + - 2.0605469 + - -7.609375 + - -1.2441406 + - 1.4921875 + - 3.8867188 + - -2.015625 + - 3.8066406 + - 2.0976563 + - 3.3398438 + - -3.6445313 + - 0.39282227 + - 0.13439941 + - 2.8496094 + - 2.1542969 + - -0.36157227 + - 3.0332031 + - 4.4140625 + - 4.8359375 + - -1.9169922 + - -1.2685547 + - -0.16906738 + - 2.2167969 + - -1.4179688 + - -1.7714844 + - 5.78125 + - 8.3359375 + - -3.6367188 + - -6.6015625 + - 2.7207031 + - 4.8085938 + - -1.6699219 + - -0.8544922 + - 2.5 + - 6.7265625 + - -1.78125 + - -2.8378906 + - 2.7578125 + - 3.6367188 + - 0.48828125 + - -2.4121094 + - 4.46875 + - 0.028198242 + - 0.9223633 + - 0.29736328 + - -3.4199219 + - 0.06951904 + - 2.6640625 + - -0.0012645721 + - -1.8964844 + - -0.4909668 + - -2.859375 + - 5.4804688 + - 1.0214844 + - 1.234375 + - 1.5986328 + - -3.7890625 + - -2.46875 + - 2.8691406 + - -2.2089844 + - -1.4101563 + - -8.25 + - -1.3613281 + - 2.7675781 + - -6.8632813 + - -2.1367188 + - 1.6796875 + - 2.0703125 + - -4.4179688 + - 2.9082031 + - -0.06329346 + - 2.3125 + - -7.7890625 + - -3.7441406 + - -0.3395996 + - -0.15661621 + - 8.2109375 + - -2.4023438 + - -5.0976563 + - -2.3925781 + - -1.0058594 + - 3.0703125 + - -0.8886719 + - 5.75 + - -5.0195313 + - -4.2851563 + - 2.0683594 + - -5.28125 +- - -4.9882813 + - 6.7734375 + - -1.6269531 + - -3.21875 + - 7.078125 + - -0.5107422 + - -2.75 + - -1.5371094 + - 4.9257813 + - 0.9790039 + - 6.03125 + - -4.0195313 + - -4.9648438 + - 0.9160156 + - 0.63916016 + - -0.90771484 + - 5.375 + - -0.3293457 + - 2.8535156 + - 2.7773438 + - 0.25170898 + - -4.671875 + - 1.7490234 + - -1.7080078 + - 2.1933594 + - -0.7470703 + - -5.6445313 + - 0.31762695 + - 6.4375 + - 1.9873047 + - -5.265625 + - 0.6816406 + - 0.89404297 + - 12.1640625 + - -3.3867188 + - -5.015625 + - -2.890625 + - 1.3457031 + - -0.47094727 + - -1.1201172 + - 1.2382813 + - -0.6855469 + - -1.5957031 + - -0.39916992 + - 10.4921875 + - 5.3867188 + - -7.9570313 + - -5.6914063 + - 2.9589844 + - -2.2753906 + - 4.1210938 + - -0.3178711 + - -1.15625 + - 5.828125 + - 3.4746094 + - -0.51953125 + - 1.9931641 + - 1.15625 + - -3.9140625 + - -0.30517578 + - 4.390625 + - 0.96191406 + - -5.0078125 + - 5.8242188 + - 1.9091797 + - 2.2949219 + - -3.2460938 + - -3.9570313 + - 5.3789063 + - 6.4648438 + - 6.9375 + - 7.6210938 + - 0.76464844 + - -0.41430664 + - -3.7480469 + - 3.1015625 + - -0.22961426 + - -3.3007813 + - -5.2890625 + - -8.6953125 + - 2.3320313 + - -0.9013672 + - -5.3789063 + - -10.9453125 + - -0.20263672 + - -3.359375 + - -6.1367188 + - 2.6777344 + - -2.7753906 + - 2.0957031 + - -2.3105469 + - -2.7382813 + - -17.140625 + - 5.2070313 + - 3.4707031 + - -2.0371094 + - 0.82421875 + - -3.5566406 + - 2.1445313 + - -4.8164063 + - -1.2802734 + - 0.42407227 + - 0.98095703 + - 1.3271484 + - -1.9667969 + - 0.36328125 + - -3.90625 + - 5.0859375 + - -1.7578125 + - -1.8056641 + - -5.6210938 + - -2.875 + - -2.9453125 + - -1.5351563 + - 3.1445313 + - 3.8066406 + - 0.78759766 + - 2.8574219 + - 3.6015625 + - 10.6171875 + - -0.24499512 + - -0.52734375 + - -0.61816406 + - -2.9453125 + - -1.0263672 + - 3.359375 + - 6.6640625 + - -5.4179688 + - 0.9326172 + - 5.09375 + - -3.796875 + - 2.3691406 + - -3.9375 + - 6.0117188 + - 1.1669922 + - 0.07067871 + - -0.63916016 + - -7.7304688 + - -0.11804199 + - -5.1992188 + - -0.9707031 + - 2.8730469 + - 0.36157227 + - 4.0898438 + - -3.59375 + - -0.14904785 + - 6.3164063 + - 1.0546875 + - 12.78125 + - 5.265625 + - 2.4238281 + - -0.40429688 + - 2.5800781 + - -2.7871094 + - 0.19958496 + - -0.4580078 + - -4.5585938 + - -7.4570313 + - 0.7397461 + - -2.4921875 + - 2.3066406 + - 6.7929688 + - 5.4023438 + - -9.0859375 + - -0.38134766 + - 5.0117188 + - 3.9003906 + - 4.3515625 + - -3.7050781 + - 5.2226563 + - -4.4726563 + - -3.5234375 + - -3.5878906 + - 3.2519531 + - -4.1484375 + - 0.6220703 + - 0.796875 + - -0.8642578 + - -4.4023438 + - 7.171875 + - -2.1464844 + - -5.0898438 + - -3.7910156 + - 9.359375 + - 1.7636719 + - 2.4023438 + - -3.3632813 + - -0.3083496 + - 1.5644531 + - 8.6015625 + - 1.6787109 + - 3.1347656 + - 0.828125 + - -1.140625 + - 7.734375 + - 1.7255859 + - 0.40942383 + - -6.578125 + - 4.8867188 + - 8.0625 + - 3.3789063 + - 4.3359375 + - 1.0917969 + - -7.2265625 + - 11.5078125 + - 7.2929688 + - -0.17590332 + - -12.3046875 + - -1.6904297 + - -1.0439453 + - -6.5117188 + - -1.4707031 + - 3.1171875 + - -6.1835938 + - -0.48608398 + - 0.20043945 + - -2.1621094 + - -14.5859375 + - -2.4316406 + - -7.3242188 + - 2.8027344 + - -19.578125 + - 1.2392578 + - -0.20324707 + - -1.3583984 + - -3.8515625 + - 2.2460938 + - -0.011695862 + - -3.9257813 + - 5.6132813 + - 7.421875 + - -2.6035156 + - 1.0546875 + - -3.15625 + - -0.39282227 + - -1.7597656 + - -10.796875 + - -8.1875 + - -0.53271484 + - 1.5058594 + - 1.9404297 + - -0.18969727 + - 0.14782715 + - 1.4873047 + - -1.9814453 + - 2.9199219 + - -5.5859375 + - 0.45458984 + - -0.087768555 + - -1.2929688 + - -6.359375 + - -3.5957031 + - -3.4257813 + - -1.75 + - 6.2070313 + - 5.6796875 + - 2.3300781 + - 2.0546875 + - -0.85839844 + - 6.0039063 + - 6.4101563 + - 1.9902344 + - 0.55322266 + - -1.5361328 + - 0.30200195 + - 6.3828125 + - 4.6679688 + - 3.1835938 + - -10.171875 + - -1.8203125 + - -4.0351563 + - -5.3164063 + - 0.97802734 + - -3.1679688 + - 8.0703125 + - 0.1373291 + - 1.2431641 + - -0.47998047 + - 3.6601563 + - -6.7265625 + - -1.1728516 + - -1.5908203 + - 0.23620605 + - 5.5898438 + - 4.5234375 + - -5.7226563 + - -4.40625 + - 5.0234375 + - 1.5634766 + - 0.6376953 + - 4.3320313 + - -2.2246094 + - -1.6318359 + - -0.1784668 + - -7 + - -1.6015625 + - 0.10180664 + - 3.1777344 + - 4.5351563 + - 1.7783203 + - 9.765625 + - -0.8173828 + - 1.7431641 + - 0.5605469 + - -1.4628906 + - 5.53125 + - -5.7578125 + - -0.7885742 + - -4.2226563 + - -6.1171875 + - -0.27783203 + - 3.5566406 + - -1.7841797 + - 0.12915039 + - -1.7714844 + - -5.046875 + - -0.14331055 + - 4.3710938 + - -3.421875 + - -1.6601563 + - -2.8886719 + - -4.21875 + - 7.5625 + - -6.5195313 + - -4.1289063 + - 4.3203125 + - 2.7089844 + - -0.018585205 + - 2.265625 + - 2.2285156 + - -2.5683594 + - -5.6679688 + - -4.3085938 + - 0.05795288 + - 5.4296875 + - -1.515625 + - -1.5429688 + - -3.8125 + - 4.3242188 + - -2.0351563 + - 6.0898438 + - -8.421875 + - 1.3779297 + - 5.9804688 + - -2.3671875 + - -1.8222656 + - 0.30078125 + - 3.3515625 + - 5.6367188 + - 0.91796875 + - -4.109375 + - 0.05508423 + - 2.5761719 + - -5.8984375 + - -0.72998047 + - 3.875 + - -0.97998047 + - 9.25 + - 0.640625 + - 5.125 + - -7.7734375 + - -0.4169922 + - 5.8203125 + - 0.023406982 + - -4.9765625 + - 3.3613281 + - 2.6699219 + - 1.2724609 + - 1.9111328 + - -0.86621094 + - 1.2138672 + - -0.8588867 + - 0.053955078 + - 2.6777344 + - 1.3916016 + - -1.3056641 + - 9.7890625 + - -4.0390625 + - 8.625 + - 4.1835938 + - 1.5400391 + - -7.9414063 + - 2.4550781 + - -0.32177734 + - -1.7421875 + - -2.6972656 + - -1.7070313 + - -6.2539063 + - 1.2714844 + - 5.6132813 + - -1.7275391 + - 2.8261719 + - 7.0585938 + - -6.4453125 + - 1.7128906 + - 2.1816406 + - 2.4511719 + - -6.5351563 + - -1.2958984 + - 8.484375 + - 0.90234375 + - -5.25 + - -0.9995117 + - -1.2177734 + - 2.0703125 + - 0.79785156 + - -2.8261719 + - 1.6298828 + - -4.7148438 + - 9.40625 + - -0.09173584 + - 3.0546875 + - 0.1574707 + - 2.953125 + - 3.7773438 + - -3.0742188 + - -8.9375 + - 9.046875 + - 6.8203125 + - -1.7255859 + - 0.2626953 + - -5.984375 + - 2.5605469 + - -1.8837891 + - 2.0429688 + - 1.4042969 + - 1.9941406 + - -1.1591797 + - 2.6152344 + - 4.703125 + - -5.7460938 + - 0.14221191 + - -4.7539063 + - 4.578125 + - 5.7109375 + - -13.2734375 + - 1.0605469 + - 0.42138672 + - -3.5136719 + - 9.265625 + - 12.375 + - -0.6269531 + - -0.1352539 + - 5.5 + - 2.8027344 + - -0.9560547 + - 1.4589844 + - 3.3085938 + - 0.44677734 + - -0.15759277 + - 1.1865234 + - -6.4414063 + - 0.11468506 + - 2.5605469 + - -6.6953125 + - 0.7290039 + - -0.9814453 + - -0.4482422 + - 3.6191406 + - -11.109375 + - -2.4199219 + - -0.37817383 + - -4.4023438 + - 0.5107422 + - -1.9541016 + - -1.9423828 + - 4.6523438 + - 0.53466797 + - -1.1777344 + - -2.8515625 + - 1.3115234 + - 3.4199219 + - 2.6503906 + - -5.1796875 + - 0.5048828 + - -3.7246094 + - 0.83984375 + - -2.8574219 + - 0.23120117 + - 24.703125 + - 0.38232422 + - -3.6171875 + - -1.5263672 + - -1.0390625 + - 4.734375 + - -5.2539063 + - -0.95703125 + - 4.921875 + - -5.5898438 + - -3.3417969 + - -1.3525391 + - -0.8027344 + - 2.8535156 + - 7.7734375 + - 0.6699219 + - 4.7070313 + - -3.3847656 + - -3.4589844 + - -1.9072266 + - 0.2685547 + - 3.4707031 + - -3.1367188 + - -6.328125 + - 2.5371094 + - -1.0742188 + - -6.953125 + - -3.6738281 + - -7.65625 + - 5.046875 + - 2.3125 + - 4.5820313 + - 1.3212891 + - 13.640625 + - -3.5839844 + - 2.8710938 + - -5.4140625 + - -0.63378906 + - -0.013664246 + - 1.6123047 + - 1.6660156 + - 0.81933594 + - 2.390625 + - 0.98779297 + - -0.5605469 + - 6.3632813 + - 1.7509766 + - -9.1328125 + - 4.7109375 + - -7.0703125 + - 1.8564453 + - 7.3007813 + - -1.6103516 + - 0.048553467 + - 0.42163086 + - 2.2148438 + - 5.765625 + - 0.3413086 + - 0.67822266 + - 6.0585938 + - 1.4267578 + - -0.82128906 + - 1.7109375 + - -3.1972656 + - -1.5332031 + - 4.0234375 + - -2.8535156 + - 3.7539063 + - -3.4824219 + - 8.328125 + - 1.3730469 + - -2.9941406 + - -8.578125 + - 5.8046875 + - -2.8417969 + - -5.7773438 + - -1.1640625 + - -0.9033203 + - 4.0039063 + - -0.3083496 + - -3.1113281 + - -1.1943359 + - 7.1796875 + - -3.7792969 + - 7.3203125 + - 2.7539063 + - -1.5244141 + - -1.8544922 + - 2.2890625 + - 1.4609375 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.4863281 + - 8.3984375 + - -1.7675781 + - -2.0234375 + - 8.4453125 + - 3.3222656 + - 6.2148438 + - 3.4746094 + - 4.8085938 + - -2.5410156 + - -0.58251953 + - -0.090148926 + - -2.890625 + - -0.17236328 + - -5.3554688 + - -5.8007813 + - -2.40625 + - 2.78125 + - -1.1171875 + - 6.5273438 + - 4.3867188 + - -2.9414063 + - 0.3076172 + - 6.0117188 + - -0.32128906 + - -2.9785156 + - -1.1113281 + - 3.5566406 + - 7.1875 + - 3.7851563 + - -2.5820313 + - 0.12878418 + - 7.1367188 + - 9.9921875 + - -0.06323242 + - 0.703125 + - 0.70166016 + - -0.7714844 + - -2.2695313 + - 0.033081055 + - 0.029953003 + - 6.6523438 + - 2.6367188 + - -3.8769531 + - -4.7773438 + - -5.1367188 + - 4.796875 + - -2.0136719 + - 3.34375 + - -3.4160156 + - -5.078125 + - 0.74902344 + - 2.3574219 + - -1.8564453 + - 1.9130859 + - -3.640625 + - -3.2773438 + - 1.1289063 + - 1.7148438 + - -1.8642578 + - 4.4296875 + - 0.4741211 + - 1.3945313 + - -5.5742188 + - -4.109375 + - -0.8774414 + - -7.5585938 + - -3.9628906 + - 7.3789063 + - -0.8852539 + - -0.62402344 + - -2.0722656 + - -3.5429688 + - 5.9609375 + - 8.21875 + - 3.890625 + - -3.3476563 + - -1.4951172 + - 2.9648438 + - 0.18395996 + - -3.9511719 + - -4.3398438 + - -2.3964844 + - -1.3242188 + - -0.8041992 + - -2.7441406 + - -1.4892578 + - 7.1210938 + - -6.9375 + - -2.296875 + - -2.4550781 + - 6.3242188 + - 1.0410156 + - -4.59375 + - -0.5957031 + - -0.8564453 + - 7.0195313 + - 1.7265625 + - 4.515625 + - 2.6054688 + - 5.5703125 + - -3.0195313 + - -3.1523438 + - 2.2929688 + - -4.4414063 + - 6.46875 + - 4.9375 + - -1.9814453 + - 4.4453125 + - 1.5048828 + - 4.5585938 + - -5.0117188 + - 1.3818359 + - 5.90625 + - -6.7695313 + - -1.9111328 + - -0.071777344 + - 0.9746094 + - -0.8261719 + - -1.3583984 + - 2.1132813 + - -3.2734375 + - 4.6132813 + - 3.1328125 + - 0.60839844 + - 3.640625 + - -4.6992188 + - -2.4726563 + - 1.2744141 + - 2.1425781 + - -0.7441406 + - 0.024169922 + - -2.4355469 + - -3.28125 + - 0.57373047 + - -7.5195313 + - -6.2070313 + - 4.7226563 + - 6.1914063 + - 8.3515625 + - 12.2421875 + - -2.53125 + - -1.2783203 + - -2.5019531 + - 0.6977539 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.14929199 + - -3.9550781 + - -1.8896484 + - 8.78125 + - 0.7001953 + - 7.5625 + - -4.9570313 + - -6.9882813 + - 5.9453125 + - -1.8261719 + - 5.9882813 + - 3.2597656 + - 0.9448242 + - -8.3203125 + - -2.0175781 + - -2.5527344 + - 1.1171875 + - -3.6699219 + - 3.6796875 + - 3.5019531 + - 2.9042969 + - -4.9257813 + - 5.4414063 + - -1.0283203 + - -1.8310547 + - -4.5351563 + - 6.1914063 + - -3.5488281 + - 1.0585938 + - -4.3867188 + - 0.074645996 + - 7.7734375 + - 6.8945313 + - -5.1367188 + - -0.5361328 + - 3.4316406 + - -2.5214844 + - 1.7695313 + - 0.6152344 + - -1.7314453 + - -2.2070313 + - -2.2402344 + - -4.0742188 + - -0.6567383 + - -2.8925781 + - 1.6826172 + - -4.6640625 + - -4.1601563 + - 3.5527344 + - 3.8261719 + - -0.7451172 + - -0.43188477 + - 1.5214844 + - 0.14746094 + - 1.9335938 + - 6.421875 + - -0.24707031 + - 7.6679688 + - -5.765625 + - 7.8671875 + - 0.8486328 + - 2.9960938 + - 1.3359375 + - 3.6855469 + - -3.7617188 + - 3.7382813 + - -6.0234375 + - -6.40625 + - 1.3740234 + - 1.9501953 + - 3.1679688 + - -0.5288086 + - -1.0214844 + - -4.5351563 + - 9.4375 + - -5.8984375 + - 8 + - 3.6210938 + - -15.5859375 + - -2.7734375 + - 1.0527344 + - 3.0488281 + - -7.7148438 + - -4.7148438 + - 1.1132813 + - -0.6948242 + - -5.7929688 + - 3.9042969 + - 10.0625 + - 0.10675049 + - -4.1992188 + - 1.2373047 + - 1.3027344 + - -0.26367188 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7099609 + - -0.13208008 + - 2.6171875 + - -4.9335938 + - 6.8164063 + - 2.7988281 + - -2.1015625 + - -5.8007813 + - -4.8515625 + - 0.9658203 + - 1.8544922 + - 0.90283203 + - -1.2851563 + - 2.1660156 + - -0.25219727 + - 0.020111084 + - -5.4804688 + - -2.8789063 + - 3.1835938 + - -4.2070313 + - -2.7792969 + - -1.0927734 + - 0.67626953 + - -1.7822266 + - 0.8491211 + - -9.9140625 + - -1.6845703 + - -1.7011719 + - 1.8603516 + - 5.21875 + - -0.21923828 + - -0.1303711 + - -3.2890625 + - 3.203125 + - 0.4099121 + - 1.0439453 + - 1.7529297 + - 6.2148438 + - 0.9067383 + - 2.5820313 + - 1.8457031 + - -0.9951172 + - -0.27026367 + - -2.7050781 + - -5.828125 + - -1.5742188 + - 5.6796875 + - -1.8222656 + - 5.390625 + - 4.8125 + - -2.6464844 + - -1.1611328 + - 0.83154297 + - -1.1591797 + - -3.9667969 + - 6.53125 + - 1.890625 + - -3.125 + - 3.7128906 + - -0.37451172 + - -10.171875 + - 0.27197266 + - 4.375 + - 2.171875 + - 4.0820313 + - 0.96191406 + - 6.5742188 + - 1.1435547 + - 3.4101563 + - 14.1484375 + - 2.0058594 + - -6.46875 + - -5.5351563 + - -2.3808594 + - 5.1484375 + - -2.9238281 + - -3.0195313 + - 2.390625 + - -1.4082031 + - 2.9199219 + - -1.7109375 + - 2.4238281 + - 5.2421875 + - -1.5576172 + - 3.0644531 + - 9.1953125 + - -6.7304688 + - 0.80126953 + - -0.8017578 + - -1.3261719 + - 0.9580078 + - 3.1933594 + - 3.2617188 + - -10.828125 + - -5.5234375 + - 4.6445313 + - -2.640625 + - -4.7734375 + - 0.61279297 + - 4.0820313 + - -0.9604492 + - -5.203125 + - 0.64453125 + - -0.8691406 + - -0.31176758 + - -2.9414063 + - -3.9609375 + - -6.171875 + - 0.4567871 + - -0.5551758 + - -4.7070313 + - 4.1835938 + - -2.7480469 + - 2.9570313 + - 0.69677734 + - 3.5410156 + - 3.2050781 + - -1.5 + - -3.6210938 + - -0.8125 + - 0.7993164 + - 0.234375 + - -1.6123047 + - 6.1835938 + - 4.0117188 + - 2.1601563 + - -4.8125 + - 0.29003906 + - 6.5546875 + - -0.56884766 + - -3.1816406 + - 4.7617188 + - -4.2578125 + - -0.0072288513 + - 4.6445313 + - -4.40625 + - -0.7939453 + - -5.5820313 + - -8.15625 + - -6.9921875 + - -4.0664063 + - -0.8754883 + - 0.9082031 + - -7.7304688 + - -1.1416016 + - -3.3574219 + - -7.6796875 + - -1.3916016 + - -3.9472656 + - 5.5429688 + - -2.8222656 + - -5.3554688 + - 0.6171875 + - -0.82177734 + - -0.1071167 + - 2.5546875 + - -4.1914063 + - 0.03567505 + - -1.4912109 + - -18.234375 + - -3.4882813 + - -0.61621094 + - -2.9511719 + - -2.3105469 + - -2.7207031 + - -4.4453125 + - 0.22436523 + - 3.4179688 + - 2.2519531 + - 3.9589844 + - 0.53515625 + - 0.16992188 + - -9.9765625 + - -1.6142578 + - -1.0683594 + - 2.5488281 + - 5.4765625 + - 3.3320313 + - 1.9384766 + - -5.3203125 + - -0.64501953 + - 1.9863281 + - -2.2285156 + - 0.6845703 + - -1.9570313 + - -0.99902344 + - -7.109375 + - 0.2980957 + - -3.0253906 + - 0.4033203 + - -1.8222656 + - 0.4440918 + - 2.0332031 + - -3.109375 + - -4.3320313 + - -9.6640625 + - -3.9921875 + - -0.23498535 + - -8.546875 + - -1.2666016 + - 7.6328125 + - 1.7714844 + - -3.4804688 + - -12.171875 + - -3.0878906 + - -7.7578125 + - -2.0957031 + - 0.08728027 + - 6.3476563 + - 2.7285156 + - -1.2490234 + - -2.7011719 + - 1.4521484 + - 2.7929688 + - 1.5078125 + - -1.7939453 + - -3.4882813 + - -7.3828125 + - -8.0234375 + - -1.2158203 + - -2.7832031 + - 1.6845703 + - -6.6835938 + - -5.9882813 + - -5.0429688 + - -0.43139648 + - -2.5878906 + - -4.0820313 + - -4.4101563 + - -0.0793457 + - -1.3710938 + - 0.28515625 + - -5.1914063 + - -4.4804688 + - -0.12731934 + - 2.2890625 + - -0.1171875 + - -2.6132813 + - -2.9160156 + - -5.3867188 + - 15.71875 + - 4.9179688 + - 2.6601563 + - 0.9135742 + - -7.9453125 + - -11.1875 + - 4.671875 + - 0.26464844 + - -0.44628906 + - -4.6914063 + - 8.9296875 + - -4.0117188 + - -0.059295654 + - 0.6850586 + - 2.0800781 + - -4.9609375 + - 0.091918945 + - 1.5673828 + - 0.88671875 + - -0.11450195 + - -4.34375 + - -0.3581543 + - 0.34960938 + - 3.2792969 + - 0.31469727 + - -1.2236328 + - 3.0585938 + - -2.1601563 + - -8.734375 + - 6.3984375 + - 0.15588379 + - -3.0253906 + - -3.7089844 + - 4.4804688 + - -3.390625 + - -4.046875 + - 0.32348633 + - 1.7861328 + - 5.8554688 + - 4.234375 + - -0.5810547 + - -1.4169922 + - 1.4697266 + - -1.1591797 + - 2.3320313 + - -3.3945313 + - -5.0351563 + - -4.8476563 + - -0.95751953 + - -1.7558594 + - -0.6669922 + - 0.06011963 + - -2.2792969 + - -0.08380127 + - -3.7167969 + - 7.8867188 + - 4.2304688 + - -2.8574219 + - -3.3203125 + - 5.625 + - -2.6347656 + - 2.0019531 + - -0.5317383 + - 1.3701172 + - -0.08496094 + - -3.8242188 + - -3.0117188 + - 4.203125 + - 4.7265625 + - -4.328125 + - 11.1875 + - -1.6337891 + - -0.8666992 + - -5.9023438 + - -5.859375 + - -0.9355469 + - -8.4375 + - -5.46875 + - 1.1240234 + - -2.1289063 + - -7.890625 + - 5.0898438 + - -5.2382813 + - -0.027267456 + - 2.1738281 + - 3.9980469 + - 6.4375 + - 4.203125 + - 5.4414063 + - -2.7070313 + - 0.10546875 + - -2.6132813 + - 5.5234375 + - -1.9365234 + - 3.7636719 + - -2.2285156 + - 1.6455078 + - 2.8125 + - -0.21313477 + - 5.1953125 + - 7.0351563 + - -2.828125 + - 6.2382813 + - -3.6425781 + - 5.7382813 + - -0.30249023 + - -3.5917969 + - -1.5507813 + - 6.0976563 + - -0.92333984 + - 2.9238281 + - -8.75 + - -0.2763672 + - 0.54296875 + - 3.0019531 + - -2.3320313 + - 1.6035156 + - 7.4257813 + - -5.984375 + - -0.48168945 + - 0.1427002 + - 0.8515625 + - -6.4023438 + - -1.2822266 + - -2.8828125 + - -1.2177734 + - 2.5761719 + - -3.8085938 + - 3.5957031 + - 11.265625 + - -9.984375 + - 3.9042969 + - 7.6015625 + - -2.4746094 + - 1.7685547 + - -0.30004883 + - -4.1484375 + - 0.3190918 + - -4.4609375 + - -0.3984375 + - 3.4667969 + - -1.7177734 + - 1.8867188 + - -8.171875 + - 3.046875 + - 6.234375 + - 0.22839355 + - 8.5234375 + - -3.0292969 + - -1.9580078 + - 4.546875 + - 3.2421875 + - 0.69628906 + - -2.8554688 + - 1.2177734 + - -6.3398438 + - 1.2490234 + - 1.2724609 + - -2.9121094 + - 1.3271484 + - -2.3066406 + - 0.703125 + - -6.4804688 + - -4.1015625 + - -2.4296875 + - -0.3515625 + - 1.6445313 + - -6.1914063 + - 4.171875 + - -13.109375 + - -1.1240234 + - 6.53125 + - 3.2871094 + - 4.0664063 + - 2.9746094 + - 2.9785156 + - 7.7773438 + - -2.7148438 + - -3.8300781 + - 6.3632813 + - 3.1503906 + - -8.09375 + - -1.3330078 + - -4.8632813 + - -2.21875 + - -0.6171875 + - -1.8818359 + - 4.5820313 + - -3.9160156 + - -3.078125 + - -1.4169922 + - 20.34375 + - -1.7783203 + - 2.125 + - -2.96875 + - 0.42333984 + - -4.7617188 + - -0.68115234 + - 1.4033203 + - 2.0527344 + - 3.875 + - 1.7890625 + - 0.61572266 + - -2.4238281 + - -0.953125 + - 5.6679688 + - 0.8208008 + - 0.022460938 + - -1.7705078 + - 6.6289063 + - 0.48901367 + - -6.4804688 + - -3.3085938 + - -12.15625 + - -0.35791016 + - -0.8105469 + - -2.0058594 + - 5.0039063 + - -3.0957031 + - 0.19445801 + - 10.140625 + - 4.4453125 + - -3.2050781 + - 1.7548828 + - -8.9921875 + - 1.5078125 + - 6.7304688 + - 9.0390625 + - -2.6171875 + - -5.4492188 + - 4.4492188 + - -0.63623047 + - -5.9296875 + - 0.28222656 + - 4.015625 + - 7.4023438 + - 4.328125 + - -6.84375 + - -2.6796875 + - -4.1992188 + - -2.0078125 + - 1.015625 + - -9.4296875 + - -6.2109375 + - -4.7890625 + - -10.484375 + - -0.08459473 + - 1.7314453 + - -5.8632813 + - 6.8164063 + - -2.2597656 + - -2.8125 + - 5.4101563 + - -2.2597656 + - 7.6367188 + - 0.67333984 + - 0.20532227 + - -12.8359375 + - -0.19580078 + - -1.0927734 + - 4.1835938 + - -2.2226563 + - 3.0800781 + - 3.5605469 + - -7.2460938 + - 0.02708435 + - 1.2529297 + - -9.328125 + - -8.2734375 + - -2.2617188 + - -0.78125 + - 6.7929688 + - -1.9189453 + - -11.796875 + - -0.23071289 + - 3.5976563 + - -2.78125 + - 0.56689453 + - -5.1992188 + - -2.3203125 + - -3.0351563 + - -4.1679688 + - 3.7460938 + - -2.4394531 + - -2.0507813 + - -3.3808594 + - -2.3320313 + - 3.6464844 + - 9.140625 + - -5.2070313 + - 3.0605469 + - 0.37329102 + - -1.1757813 + - -5.2304688 + - 2.1074219 + - -10.1484375 + - 1.8974609 + - 0.28686523 + - 0.6074219 + - 3.9355469 + - 5.15625 + - 0.68310547 + - -10.734375 + - -2.1621094 + - 1.3164063 + - -1.2197266 + - 2.8183594 + - -1.2998047 + - -0.5415039 + - 1.3759766 + - 12.25 + - -1.0390625 + - 4.4960938 + - 7.28125 + - 1.3095703 + - 1.9541016 + - 3.953125 + - 1.5693359 + - 1.5996094 + - -2.046875 + - 1.7978516 + - 4.3515625 + - -7.734375 + - 2.1425781 + - 0.71191406 + - -4.109375 + - 0.81689453 + - 12.375 + - -7.5390625 + - -10.0078125 + - 1.4414063 + - -0.7026367 + - 0.74365234 + - 9.2265625 + - -7.2148438 + - 1.0693359 + - 4.2070313 + - 2.0507813 + - -4.5859375 + - -6.4101563 + - -4.6992188 + - -3.4394531 + - -1.2207031 + - 17.21875 + - 2.9785156 + - 1.2050781 + - 5.796875 + - -4.9648438 + - 2.5605469 + - -2.625 + - -1.5097656 + - -8.375 + - -0.81152344 + - 3.8359375 + - -2.8007813 + - -0.53759766 + - 2.09375 + - 10.5 + - 6.3164063 + - 4.921875 + - 4.0585938 + - -6.2226563 + - -1.1142578 + - 3.1269531 + - -5.7695313 + - 6.15625 + - 2.7421875 + - -0.1463623 + - -6.1523438 + - 0.4934082 + - -5.0664063 + - -4.90625 + - 2.6738281 + - 4.734375 + - 4.1171875 + - -3.7304688 + - 1.7646484 + - 1.0849609 + - -1.8232422 + - -4.1835938 + - 1.6884766 + - 7.5703125 + - 5.0039063 + - 2.1699219 + - -5.6992188 + - -0.73828125 + - 1.7001953 + - -3.1308594 + - -3.1015625 + - -9.46875 + - -3.6074219 + - 6.9882813 + - 1.6279297 + - -2.3378906 + - -6.125 + - 2.8574219 + - 2.4628906 + - -1.3818359 + - 2.9199219 + - 0.46801758 + - 2.4082031 + - -1.7470703 + - -0.8823242 + - -0.16455078 + - 1.5869141 + - 0.17614746 + - -3.265625 + - -0.16381836 + - 5.3359375 + - 5.5703125 + - -5.15625 + - -2.5078125 + - 0.9633789 + - 12.1640625 + - -1.7744141 + - -1.1025391 + - 0.73779297 + - 8.3828125 + - 4.140625 + - -6.90625 + - 1.8007813 + - 6.4179688 + - -4.1328125 + - 0.4506836 + - 2.5058594 + - 6.0742188 + - -1.140625 + - 1.0488281 + - 5.3554688 + - 3.8164063 + - -2.2597656 + - 0.92041016 + - 4.9570313 + - 1.9746094 + - 9.4453125 + - 0.60791016 + - -2.4003906 + - -1.9726563 + - 2.2070313 + - -3.171875 + - -10.796875 + - 0.55810547 + - -6.234375 + - 4.9765625 + - 1.2148438 + - 0.44091797 + - 3.8847656 + - -2.8613281 + - -2.1171875 + - 2.5742188 + - -0.7753906 + - -1.8837891 + - -8.0859375 + - 3.7070313 + - 0.09869385 + - -4.3515625 + - -2.8476563 + - 4.8476563 + - 1.9140625 + - -2.6347656 + - 1.4101563 + - 0.88916016 + - 2.3554688 + - -9.1171875 + - 1.078125 + - 1.3027344 + - -2.2402344 + - 4.8671875 + - -3.1484375 + - -6.3945313 + - -1.2197266 + - 4.7617188 + - 0.3034668 + - -0.44091797 + - 5.7773438 + - -4.1445313 + - -4.4648438 + - -7.8125 + - -3.3515625 diff --git a/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap new file mode 100644 index 00000000..362e1ebf --- /dev/null +++ b/backends/candle/tests/snapshots/test_flash_qwen2__qwen2_single.snap @@ -0,0 +1,1541 @@ +--- +source: backends/candle/tests/test_flash_qwen2.rs +assertion_line: 72 +expression: embeddings_single +--- +- - -4.9960938 + - 6.8007813 + - -1.6386719 + - -3.2109375 + - 7.0507813 + - -0.5097656 + - -2.75 + - -1.5380859 + - 4.9414063 + - 0.96533203 + - 6.015625 + - -3.9980469 + - -4.96875 + - 0.9296875 + - 0.66064453 + - -0.93359375 + - 5.3671875 + - -0.3383789 + - 2.8457031 + - 2.7714844 + - 0.24035645 + - -4.671875 + - 1.7734375 + - -1.7138672 + - 2.2050781 + - -0.7290039 + - -5.6445313 + - 0.32226563 + - 6.4179688 + - 1.9970703 + - -5.2617188 + - 0.6928711 + - 0.91845703 + - 12.171875 + - -3.4003906 + - -5.015625 + - -2.8925781 + - 1.3515625 + - -0.47045898 + - -1.1005859 + - 1.25 + - -0.69433594 + - -1.6308594 + - -0.39135742 + - 10.484375 + - 5.359375 + - -7.9609375 + - -5.6796875 + - 2.953125 + - -2.2792969 + - 4.109375 + - -0.31152344 + - -1.1337891 + - 5.828125 + - 3.4648438 + - -0.5341797 + - 1.9941406 + - 1.1660156 + - -3.9179688 + - -0.30688477 + - 4.3945313 + - 0.94091797 + - -4.984375 + - 5.8085938 + - 1.9296875 + - 2.3066406 + - -3.2460938 + - -3.9511719 + - 5.3828125 + - 6.453125 + - 6.921875 + - 7.625 + - 0.7944336 + - -0.40039063 + - -3.7519531 + - 3.1035156 + - -0.24145508 + - -3.2636719 + - -5.3085938 + - -8.671875 + - 2.328125 + - -0.89697266 + - -5.3554688 + - -10.9140625 + - -0.19873047 + - -3.3789063 + - -6.1328125 + - 2.6660156 + - -2.7675781 + - 2.109375 + - -2.3144531 + - -2.7578125 + - -17.109375 + - 5.1796875 + - 3.4550781 + - -2.0351563 + - 0.81103516 + - -3.5664063 + - 2.1542969 + - -4.78125 + - -1.2695313 + - 0.4140625 + - 0.9916992 + - 1.3408203 + - -1.9746094 + - 0.35302734 + - -3.9082031 + - 5.0859375 + - -1.7539063 + - -1.7861328 + - -5.6210938 + - -2.8828125 + - -2.9453125 + - -1.5458984 + - 3.1503906 + - 3.8007813 + - 0.78271484 + - 2.8496094 + - 3.6035156 + - 10.6171875 + - -0.2565918 + - -0.5229492 + - -0.6142578 + - -2.9453125 + - -1.0302734 + - 3.359375 + - 6.671875 + - -5.4335938 + - 0.94677734 + - 5.0898438 + - -3.7832031 + - 2.3710938 + - -3.9414063 + - 6.0117188 + - 1.1777344 + - 0.06689453 + - -0.63183594 + - -7.75 + - -0.12237549 + - -5.203125 + - -0.9794922 + - 2.8847656 + - 0.37353516 + - 4.09375 + - -3.5800781 + - -0.14013672 + - 6.3320313 + - 1.0683594 + - 12.765625 + - 5.2617188 + - 2.4140625 + - -0.37573242 + - 2.5839844 + - -2.8105469 + - 0.21374512 + - -0.4416504 + - -4.5703125 + - -7.4765625 + - 0.74072266 + - -2.4765625 + - 2.3164063 + - 6.7929688 + - 5.3828125 + - -9.109375 + - -0.38305664 + - 5.0234375 + - 3.9101563 + - 4.3320313 + - -3.7070313 + - 5.2226563 + - -4.4882813 + - -3.5117188 + - -3.5878906 + - 3.2539063 + - -4.1757813 + - 0.62841797 + - 0.7871094 + - -0.86376953 + - -4.3945313 + - 7.140625 + - -2.171875 + - -5.0742188 + - -3.7890625 + - 9.34375 + - 1.7626953 + - 2.3925781 + - -3.3476563 + - -0.3005371 + - 1.5576172 + - 8.59375 + - 1.6884766 + - 3.1152344 + - 0.7973633 + - -1.1503906 + - 7.7421875 + - 1.7197266 + - 0.39697266 + - -6.578125 + - 4.8945313 + - 8.0703125 + - 3.3984375 + - 4.3398438 + - 1.1044922 + - -7.2421875 + - 11.53125 + - 7.3007813 + - -0.16821289 + - -12.28125 + - -1.6777344 + - -1.0253906 + - -6.4960938 + - -1.4628906 + - 3.0859375 + - -6.1796875 + - -0.49194336 + - 0.19616699 + - -2.1660156 + - -14.546875 + - -2.4335938 + - -7.296875 + - 2.8144531 + - -19.578125 + - 1.2509766 + - -0.21643066 + - -1.3544922 + - -3.8457031 + - 2.234375 + - -0.04156494 + - -3.9394531 + - 5.625 + - 7.4335938 + - -2.6210938 + - 1.0830078 + - -3.1738281 + - -0.39697266 + - -1.7597656 + - -10.8359375 + - -8.2109375 + - -0.5527344 + - 1.5097656 + - 1.9316406 + - -0.17895508 + - 0.14587402 + - 1.4873047 + - -1.9521484 + - 2.890625 + - -5.6171875 + - 0.4423828 + - -0.07745361 + - -1.2978516 + - -6.3554688 + - -3.5976563 + - -3.4277344 + - -1.7441406 + - 6.2148438 + - 5.6914063 + - 2.3378906 + - 2.0449219 + - -0.8623047 + - 6.0078125 + - 6.3945313 + - 1.9785156 + - 0.55566406 + - -1.5371094 + - 0.3017578 + - 6.3867188 + - 4.6679688 + - 3.1757813 + - -10.1640625 + - -1.8203125 + - -4.0546875 + - -5.3359375 + - 0.98339844 + - -3.1601563 + - 8.0859375 + - 0.15698242 + - 1.2539063 + - -0.48583984 + - 3.6367188 + - -6.7226563 + - -1.171875 + - -1.5888672 + - 0.23486328 + - 5.59375 + - 4.53125 + - -5.7070313 + - -4.390625 + - 5.0351563 + - 1.5537109 + - 0.6123047 + - 4.3476563 + - -2.2285156 + - -1.6386719 + - -0.1932373 + - -6.9960938 + - -1.6064453 + - 0.08795166 + - 3.1738281 + - 4.5390625 + - 1.7880859 + - 9.7578125 + - -0.82666016 + - 1.7480469 + - 0.56933594 + - -1.4628906 + - 5.5195313 + - -5.7578125 + - -0.81396484 + - -4.2070313 + - -6.0976563 + - -0.29736328 + - 3.5664063 + - -1.7910156 + - 0.1303711 + - -1.7832031 + - -5.0507813 + - -0.1394043 + - 4.3945313 + - -3.4082031 + - -1.6884766 + - -2.8925781 + - -4.1992188 + - 7.5625 + - -6.5195313 + - -4.125 + - 4.3125 + - 2.6972656 + - -0.018585205 + - 2.2734375 + - 2.2402344 + - -2.5351563 + - -5.6796875 + - -4.3085938 + - 0.068481445 + - 5.4335938 + - -1.5068359 + - -1.53125 + - -3.8144531 + - 4.3203125 + - -2.0097656 + - 6.0859375 + - -8.421875 + - 1.3945313 + - 6.0117188 + - -2.3554688 + - -1.8203125 + - 0.296875 + - 3.3613281 + - 5.609375 + - 0.91064453 + - -4.1640625 + - 0.05505371 + - 2.5898438 + - -5.8867188 + - -0.72802734 + - 3.8847656 + - -0.9814453 + - 9.2421875 + - 0.6357422 + - 5.1289063 + - -7.7773438 + - -0.42138672 + - 5.8476563 + - 0.025741577 + - -4.9804688 + - 3.3417969 + - 2.6757813 + - 1.2695313 + - 1.9111328 + - -0.86083984 + - 1.203125 + - -0.8442383 + - 0.06298828 + - 2.6914063 + - 1.3818359 + - -1.3125 + - 9.796875 + - -4.046875 + - 8.6171875 + - 4.1953125 + - 1.5576172 + - -7.9257813 + - 2.4628906 + - -0.3244629 + - -1.7304688 + - -2.7363281 + - -1.6865234 + - -6.2890625 + - 1.2685547 + - 5.6054688 + - -1.7246094 + - 2.8554688 + - 7.0625 + - -6.4296875 + - 1.7138672 + - 2.1933594 + - 2.4492188 + - -6.515625 + - -1.2949219 + - 8.4609375 + - 0.89941406 + - -5.21875 + - -0.97509766 + - -1.2324219 + - 2.0644531 + - 0.8183594 + - -2.8574219 + - 1.6621094 + - -4.703125 + - 9.421875 + - -0.103027344 + - 3.0566406 + - 0.13635254 + - 2.9472656 + - 3.7675781 + - -3.0820313 + - -8.9140625 + - 9.078125 + - 6.8242188 + - -1.7558594 + - 0.25634766 + - -5.9960938 + - 2.5488281 + - -1.8525391 + - 2.0527344 + - 1.4238281 + - 1.9941406 + - -1.1503906 + - 2.5820313 + - 4.703125 + - -5.7421875 + - 0.16186523 + - -4.7421875 + - 4.5625 + - 5.7265625 + - -13.25 + - 1.0585938 + - 0.4350586 + - -3.4902344 + - 9.2734375 + - 12.359375 + - -0.6357422 + - -0.124572754 + - 5.5039063 + - 2.7949219 + - -0.94921875 + - 1.4667969 + - 3.3203125 + - 0.44360352 + - -0.15441895 + - 1.2050781 + - -6.453125 + - 0.10571289 + - 2.578125 + - -6.7109375 + - 0.74609375 + - -0.9873047 + - -0.4951172 + - 3.640625 + - -11.140625 + - -2.4179688 + - -0.40185547 + - -4.40625 + - 0.5078125 + - -1.9570313 + - -1.9472656 + - 4.6640625 + - 0.51660156 + - -1.1796875 + - -2.8574219 + - 1.3056641 + - 3.4199219 + - 2.6523438 + - -5.171875 + - 0.5048828 + - -3.7070313 + - 0.86279297 + - -2.8691406 + - 0.23120117 + - 24.640625 + - 0.3701172 + - -3.6191406 + - -1.5244141 + - -1.0380859 + - 4.71875 + - -5.2773438 + - -0.9580078 + - 4.9179688 + - -5.6054688 + - -3.3203125 + - -1.3261719 + - -0.8261719 + - 2.8613281 + - 7.7460938 + - 0.6645508 + - 4.7226563 + - -3.3789063 + - -3.46875 + - -1.9121094 + - 0.27294922 + - 3.453125 + - -3.1210938 + - -6.3476563 + - 2.5351563 + - -1.0654297 + - -6.9414063 + - -3.6738281 + - -7.6484375 + - 5.046875 + - 2.3300781 + - 4.5820313 + - 1.3105469 + - 13.625 + - -3.5546875 + - 2.8828125 + - -5.3984375 + - -0.63183594 + - -0.016036987 + - 1.6474609 + - 1.6591797 + - 0.8183594 + - 2.4023438 + - 0.9926758 + - -0.55322266 + - 6.375 + - 1.7548828 + - -9.140625 + - 4.703125 + - -7.0976563 + - 1.8603516 + - 7.2851563 + - -1.6132813 + - 0.02911377 + - 0.43164063 + - 2.2402344 + - 5.765625 + - 0.35839844 + - 0.6904297 + - 6.0546875 + - 1.4228516 + - -0.8232422 + - 1.7285156 + - -3.2128906 + - -1.5332031 + - 4.0507813 + - -2.8613281 + - 3.7402344 + - -3.4824219 + - 8.3125 + - 1.390625 + - -2.9746094 + - -8.5703125 + - 5.8164063 + - -2.8300781 + - -5.7617188 + - -1.1474609 + - -0.92578125 + - 4.0117188 + - -0.29614258 + - -3.1054688 + - -1.203125 + - 7.1953125 + - -3.7753906 + - 7.3203125 + - 2.7734375 + - -1.5205078 + - -1.8730469 + - 2.3007813 + - 1.4492188 + - -9.1171875 + - -3.3105469 + - 4.484375 + - 3.5097656 + - 8.40625 + - -1.7578125 + - -2.0429688 + - 8.46875 + - 3.2988281 + - 6.203125 + - 3.4882813 + - 4.8085938 + - -2.5253906 + - -0.5834961 + - -0.06707764 + - -2.8964844 + - -0.16894531 + - -5.3710938 + - -5.8203125 + - -2.390625 + - 2.7773438 + - -1.1132813 + - 6.5390625 + - 4.375 + - -2.921875 + - 0.2998047 + - 6.0078125 + - -0.33642578 + - -2.984375 + - -1.1054688 + - 3.5332031 + - 7.2070313 + - 3.78125 + - -2.5390625 + - 0.12194824 + - 7.1328125 + - 9.9921875 + - -0.084228516 + - 0.6791992 + - 0.66796875 + - -0.76123047 + - -2.2597656 + - 0.029327393 + - 0.017471313 + - 6.6523438 + - 2.6425781 + - -3.8828125 + - -4.7773438 + - -5.15625 + - 4.7851563 + - -2.0273438 + - 3.3554688 + - -3.4199219 + - -5.0625 + - 0.74365234 + - 2.3789063 + - -1.8720703 + - 1.9023438 + - -3.6445313 + - -3.2441406 + - 1.1259766 + - 1.7216797 + - -1.8857422 + - 4.453125 + - 0.49365234 + - 1.4111328 + - -5.5742188 + - -4.1054688 + - -0.8588867 + - -7.6054688 + - -3.9433594 + - 7.3984375 + - -0.8857422 + - -0.62890625 + - -2.0683594 + - -3.5390625 + - 5.9726563 + - 8.2265625 + - 3.9296875 + - -3.3457031 + - -1.5029297 + - 2.9707031 + - 0.16552734 + - -3.9511719 + - -4.3515625 + - -2.3828125 + - -1.3417969 + - -0.8066406 + - -2.7402344 + - -1.4658203 + - 7.125 + - -6.96875 + - -2.3066406 + - -2.4609375 + - 6.3242188 + - 1.0380859 + - -4.59375 + - -0.5942383 + - -0.8486328 + - 7.0351563 + - 1.7070313 + - 4.53125 + - 2.625 + - 5.5390625 + - -3.0136719 + - -3.1464844 + - 2.2832031 + - -4.4453125 + - 6.4765625 + - 4.9648438 + - -1.9853516 + - 4.4453125 + - 1.4960938 + - 4.5625 + - -5.03125 + - 1.3789063 + - 5.8984375 + - -6.7695313 + - -1.9003906 + - -0.059814453 + - 1.0039063 + - -0.8183594 + - -1.3632813 + - 2.109375 + - -3.2890625 + - 4.6015625 + - 3.1347656 + - 0.61572266 + - 3.6699219 + - -4.6914063 + - -2.4804688 + - 1.2744141 + - 2.1523438 + - -0.7558594 + - 0.023544312 + - -2.4082031 + - -3.2578125 + - 0.59716797 + - -7.4960938 + - -6.2070313 + - 4.7460938 + - 6.1914063 + - 8.359375 + - 12.2109375 + - -2.5332031 + - -1.2861328 + - -2.484375 + - 0.7158203 + - 2.1933594 + - -1.5917969 + - 1.9853516 + - 0.1508789 + - -3.9667969 + - -1.875 + - 8.7890625 + - 0.7089844 + - 7.5859375 + - -4.9414063 + - -6.9726563 + - 5.9179688 + - -1.8388672 + - 5.984375 + - 3.2382813 + - 0.93408203 + - -8.3359375 + - -2.0605469 + - -2.5722656 + - 1.1279297 + - -3.6679688 + - 3.6679688 + - 3.4804688 + - 2.9121094 + - -4.90625 + - 5.4453125 + - -1.0234375 + - -1.8085938 + - -4.53125 + - 6.1992188 + - -3.578125 + - 1.0693359 + - -4.3828125 + - 0.09295654 + - 7.7890625 + - 6.9023438 + - -5.1328125 + - -0.515625 + - 3.4316406 + - -2.5097656 + - 1.78125 + - 0.6191406 + - -1.7460938 + - -2.2148438 + - -2.2421875 + - -4.0742188 + - -0.65527344 + - -2.90625 + - 1.6816406 + - -4.6679688 + - -4.140625 + - 3.5644531 + - 3.8457031 + - -0.7373047 + - -0.44580078 + - 1.5253906 + - 0.107666016 + - 1.9316406 + - 6.4101563 + - -0.25610352 + - 7.6679688 + - -5.7929688 + - 7.8945313 + - 0.8520508 + - 3.0117188 + - 1.3261719 + - 3.6914063 + - -3.7578125 + - 3.7519531 + - -6.0507813 + - -6.3945313 + - 1.3876953 + - 1.9541016 + - 3.1757813 + - -0.5571289 + - -1.0400391 + - -4.5351563 + - 9.4453125 + - -5.8710938 + - 8.0078125 + - 3.6621094 + - -15.5859375 + - -2.7792969 + - 1.046875 + - 3.0683594 + - -7.7148438 + - -4.7421875 + - 1.1230469 + - -0.6894531 + - -5.7890625 + - 3.9199219 + - 10.0625 + - 0.101257324 + - -4.1796875 + - 1.2480469 + - 1.3203125 + - -0.27148438 + - 0.115478516 + - 21.40625 + - 1.1445313 + - -1.7050781 + - -0.12695313 + - 2.609375 + - -4.953125 + - 6.8007813 + - 2.8164063 + - -2.109375 + - -5.8085938 + - -4.8476563 + - 0.9741211 + - 1.8603516 + - 0.9091797 + - -1.2900391 + - 2.1367188 + - -0.2775879 + - 0.025131226 + - -5.4648438 + - -2.8417969 + - 3.1738281 + - -4.1875 + - -2.7988281 + - -1.0859375 + - 0.6738281 + - -1.7871094 + - 0.84228516 + - -9.953125 + - -1.6787109 + - -1.6992188 + - 1.8554688 + - 5.2421875 + - -0.24304199 + - -0.12646484 + - -3.2910156 + - 3.203125 + - 0.40673828 + - 1.0351563 + - 1.765625 + - 6.2382813 + - 0.9277344 + - 2.5976563 + - 1.8193359 + - -0.9863281 + - -0.26635742 + - -2.6953125 + - -5.8359375 + - -1.5664063 + - 5.71875 + - -1.8359375 + - 5.3867188 + - 4.8164063 + - -2.6757813 + - -1.171875 + - 0.83496094 + - -1.1396484 + - -3.9433594 + - 6.5351563 + - 1.8955078 + - -3.1074219 + - 3.7167969 + - -0.3630371 + - -10.1875 + - 0.25561523 + - 4.359375 + - 2.1953125 + - 4.0820313 + - 0.9638672 + - 6.5546875 + - 1.1445313 + - 3.4003906 + - 14.1640625 + - 2.0019531 + - -6.4414063 + - -5.53125 + - -2.390625 + - 5.1523438 + - -2.9179688 + - -3.0097656 + - 2.3632813 + - -1.4111328 + - 2.921875 + - -1.7275391 + - 2.4277344 + - 5.2421875 + - -1.5703125 + - 3.0390625 + - 9.203125 + - -6.7304688 + - 0.8095703 + - -0.8105469 + - -1.3173828 + - 0.94873047 + - 3.2070313 + - 3.265625 + - -10.828125 + - -5.5390625 + - 4.640625 + - -2.6425781 + - -4.7734375 + - 0.64453125 + - 4.0859375 + - -0.96777344 + - -5.1992188 + - 0.6503906 + - -0.8745117 + - -0.30981445 + - -2.9609375 + - -3.9453125 + - -6.1523438 + - 0.44311523 + - -0.5488281 + - -4.6992188 + - 4.1601563 + - -2.7402344 + - 2.9355469 + - 0.7158203 + - 3.5253906 + - 3.2011719 + - -1.5136719 + - -3.609375 + - -0.81103516 + - 0.79589844 + - 0.25219727 + - -1.6132813 + - 6.1953125 + - 3.9785156 + - 2.1484375 + - -4.8085938 + - 0.31274414 + - 6.5585938 + - -0.56152344 + - -3.203125 + - 4.7578125 + - -4.2890625 + - 0.0036144257 + - 4.6523438 + - -4.3789063 + - -0.7910156 + - -5.5859375 + - -8.171875 + - -6.9921875 + - -4.0625 + - -0.8754883 + - 0.9135742 + - -7.7265625 + - -1.1416016 + - -3.3457031 + - -7.6601563 + - -1.4003906 + - -3.9570313 + - 5.5585938 + - -2.8339844 + - -5.34375 + - 0.62597656 + - -0.8334961 + - -0.10827637 + - 2.5410156 + - -4.1640625 + - 0.035461426 + - -1.4824219 + - -18.234375 + - -3.5136719 + - -0.61621094 + - -2.9492188 + - -2.3125 + - -2.7324219 + - -4.4375 + - 0.2253418 + - 3.4140625 + - 2.2773438 + - 3.96875 + - 0.52001953 + - 0.16186523 + - -9.984375 + - -1.5878906 + - -1.0664063 + - 2.5273438 + - 5.4726563 + - 3.3398438 + - 1.9677734 + - -5.3046875 + - -0.65478516 + - 1.9716797 + - -2.21875 + - 0.68408203 + - -1.9677734 + - -0.9736328 + - -7.125 + - 0.2919922 + - -3.0234375 + - 0.421875 + - -1.8300781 + - 0.45654297 + - 2.0429688 + - -3.1308594 + - -4.3320313 + - -9.6875 + - -4.0117188 + - -0.2512207 + - -8.546875 + - -1.2548828 + - 7.6445313 + - 1.7714844 + - -3.4707031 + - -12.15625 + - -3.0859375 + - -7.7617188 + - -2.0898438 + - 0.09484863 + - 6.34375 + - 2.7226563 + - -1.2441406 + - -2.7050781 + - 1.4414063 + - 2.7851563 + - 1.5 + - -1.7880859 + - -3.4667969 + - -7.3945313 + - -8.015625 + - -1.2070313 + - -2.78125 + - 1.703125 + - -6.6367188 + - -5.9804688 + - -5.0585938 + - -0.41381836 + - -2.5898438 + - -4.078125 + - -4.4101563 + - -0.11029053 + - -1.3505859 + - 0.2614746 + - -5.1835938 + - -4.4726563 + - -0.12854004 + - 2.2910156 + - -0.09680176 + - -2.6269531 + - -2.9023438 + - -5.421875 + - 15.734375 + - 4.890625 + - 2.6542969 + - 0.8989258 + - -7.96875 + - -11.1640625 + - 4.6835938 + - 0.24902344 + - -0.44335938 + - -4.6757813 + - 8.921875 + - -3.9941406 + - -0.05895996 + - 0.6982422 + - 2.0800781 + - -4.9375 + - 0.091918945 + - 1.5839844 + - 0.8911133 + - -0.09967041 + - -4.3867188 + - -0.35253906 + - 0.36157227 + - 3.2910156 + - 0.29663086 + - -1.2138672 + - 3.0644531 + - -2.1875 + - -8.7578125 + - 6.421875 + - 0.1496582 + - -3.0273438 + - -3.7128906 + - 4.4882813 + - -3.3886719 + - -4.0507813 + - 0.31323242 + - 1.7900391 + - 5.8515625 + - 4.21875 + - -0.57714844 + - -1.3984375 + - 1.4736328 + - -1.1748047 + - 2.3183594 + - -3.3847656 + - -5.015625 + - -4.84375 + - -0.9609375 + - -1.7646484 + - -0.703125 + - 0.055725098 + - -2.2929688 + - -0.08001709 + - -3.7246094 + - 7.8984375 + - 4.2265625 + - -2.875 + - -3.3457031 + - 5.640625 + - -2.6347656 + - 2.0097656 + - -0.5444336 + - 1.3837891 + - -0.0869751 + - -3.8085938 + - -3.0058594 + - 4.2109375 + - 4.7578125 + - -4.3320313 + - 11.1640625 + - -1.6669922 + - -0.8486328 + - -5.8945313 + - -5.8632813 + - -0.9379883 + - -8.4453125 + - -5.4570313 + - 1.1132813 + - -2.1230469 + - -7.9101563 + - 5.0976563 + - -5.2382813 + - -0.027252197 + - 2.1542969 + - 3.9746094 + - 6.4414063 + - 4.1953125 + - 5.4414063 + - -2.6855469 + - 0.093933105 + - -2.6210938 + - 5.515625 + - -1.9550781 + - 3.7851563 + - -2.2285156 + - 1.6621094 + - 2.8261719 + - -0.21313477 + - 5.1914063 + - 7.0585938 + - -2.84375 + - 6.21875 + - -3.6640625 + - 5.7851563 + - -0.29492188 + - -3.5859375 + - -1.5400391 + - 6.1171875 + - -0.92285156 + - 2.9316406 + - -8.7265625 + - -0.25317383 + - 0.546875 + - 2.9980469 + - -2.3164063 + - 1.6005859 + - 7.4179688 + - -6.0273438 + - -0.48217773 + - 0.13757324 + - 0.84765625 + - -6.4023438 + - -1.2714844 + - -2.8984375 + - -1.1894531 + - 2.5839844 + - -3.8261719 + - 3.5957031 + - 11.265625 + - -9.9765625 + - 3.890625 + - 7.6054688 + - -2.4746094 + - 1.7714844 + - -0.30078125 + - -4.1523438 + - 0.3125 + - -4.4492188 + - -0.3779297 + - 3.453125 + - -1.7099609 + - 1.8554688 + - -8.171875 + - 3.0625 + - 6.2382813 + - 0.23913574 + - 8.5234375 + - -3.0488281 + - -1.9902344 + - 4.5351563 + - 3.2519531 + - 0.7084961 + - -2.8632813 + - 1.2373047 + - -6.3320313 + - 1.2314453 + - 1.2734375 + - -2.9257813 + - 1.3251953 + - -2.2890625 + - 0.7158203 + - -6.4804688 + - -4.09375 + - -2.4257813 + - -0.36157227 + - 1.6533203 + - -6.1914063 + - 4.1601563 + - -13.125 + - -1.1171875 + - 6.5039063 + - 3.3125 + - 4.0625 + - 2.9902344 + - 2.9628906 + - 7.8007813 + - -2.71875 + - -3.8261719 + - 6.375 + - 3.1621094 + - -8.0859375 + - -1.3447266 + - -4.8710938 + - -2.1953125 + - -0.62402344 + - -1.9199219 + - 4.578125 + - -3.9277344 + - -3.0625 + - -1.4238281 + - 20.28125 + - -1.7685547 + - 2.109375 + - -2.984375 + - 0.41845703 + - -4.765625 + - -0.69091797 + - 1.3945313 + - 2.0566406 + - 3.9042969 + - 1.7929688 + - 0.6171875 + - -2.4375 + - -0.94677734 + - 5.6601563 + - 0.81689453 + - 0.041137695 + - -1.7695313 + - 6.6289063 + - 0.49926758 + - -6.5 + - -3.3007813 + - -12.1796875 + - -0.38208008 + - -0.8300781 + - -1.9794922 + - 5.0234375 + - -3.1015625 + - 0.17346191 + - 10.1328125 + - 4.4179688 + - -3.2011719 + - 1.7480469 + - -8.9765625 + - 1.4941406 + - 6.7226563 + - 9.0390625 + - -2.6210938 + - -5.4492188 + - 4.4453125 + - -0.6225586 + - -5.9101563 + - 0.28149414 + - 4.0273438 + - 7.40625 + - 4.3203125 + - -6.875 + - -2.65625 + - -4.1875 + - -1.9970703 + - 1.03125 + - -9.4453125 + - -6.1835938 + - -4.7851563 + - -10.5 + - -0.062408447 + - 1.7246094 + - -5.8710938 + - 6.8046875 + - -2.2578125 + - -2.8085938 + - 5.453125 + - -2.2617188 + - 7.625 + - 0.67285156 + - 0.17578125 + - -12.84375 + - -0.18786621 + - -1.0966797 + - 4.1523438 + - -2.2402344 + - 3.0917969 + - 3.5488281 + - -7.2695313 + - 0.022140503 + - 1.2539063 + - -9.3203125 + - -8.265625 + - -2.2792969 + - -0.7631836 + - 6.8046875 + - -1.9013672 + - -11.8046875 + - -0.24047852 + - 3.5859375 + - -2.7890625 + - 0.5673828 + - -5.1953125 + - -2.3183594 + - -3.0273438 + - -4.1875 + - 3.7460938 + - -2.4316406 + - -2.0429688 + - -3.3789063 + - -2.3417969 + - 3.6582031 + - 9.1484375 + - -5.2226563 + - 3.0546875 + - 0.36157227 + - -1.1728516 + - -5.2539063 + - 2.1308594 + - -10.15625 + - 1.9169922 + - 0.2722168 + - 0.60839844 + - 3.9472656 + - 5.1679688 + - 0.6791992 + - -10.6953125 + - -2.1757813 + - 1.3056641 + - -1.2558594 + - 2.8378906 + - -1.3095703 + - -0.5136719 + - 1.3476563 + - 12.265625 + - -1.0419922 + - 4.5078125 + - 7.2890625 + - 1.2998047 + - 1.9511719 + - 3.9648438 + - 1.5673828 + - 1.5996094 + - -2.0605469 + - 1.8046875 + - 4.3632813 + - -7.7304688 + - 2.1425781 + - 0.7246094 + - -4.0976563 + - 0.8198242 + - 12.375 + - -7.5390625 + - -10 + - 1.4423828 + - -0.7089844 + - 0.7211914 + - 9.21875 + - -7.203125 + - 1.078125 + - 4.21875 + - 2.0488281 + - -4.5898438 + - -6.4414063 + - -4.6914063 + - -3.4394531 + - -1.21875 + - 17.265625 + - 2.96875 + - 1.1923828 + - 5.8125 + - -4.9609375 + - 2.5761719 + - -2.640625 + - -1.4892578 + - -8.359375 + - -0.8305664 + - 3.8242188 + - -2.7851563 + - -0.5551758 + - 2.0800781 + - 10.5078125 + - 6.3085938 + - 4.9375 + - 4.046875 + - -6.2148438 + - -1.1171875 + - 3.1464844 + - -5.7695313 + - 6.1328125 + - 2.7324219 + - -0.15002441 + - -6.1601563 + - 0.4855957 + - -5.0703125 + - -4.9296875 + - 2.6796875 + - 4.75 + - 4.1015625 + - -3.7539063 + - 1.7714844 + - 1.0996094 + - -1.8242188 + - -4.1914063 + - 1.6787109 + - 7.546875 + - 4.984375 + - 2.171875 + - -5.7109375 + - -0.77441406 + - 1.6904297 + - -3.1386719 + - -3.1113281 + - -9.4765625 + - -3.6054688 + - 7.015625 + - 1.6132813 + - -2.328125 + - -6.1367188 + - 2.8710938 + - 2.4628906 + - -1.3759766 + - 2.9160156 + - 0.4428711 + - 2.3945313 + - -1.7441406 + - -0.88671875 + - -0.1694336 + - 1.5869141 + - 0.16357422 + - -3.2832031 + - -0.15612793 + - 5.3320313 + - 5.5351563 + - -5.1640625 + - -2.4960938 + - 0.9658203 + - 12.1640625 + - -1.7626953 + - -1.1142578 + - 0.7270508 + - 8.3671875 + - 4.140625 + - -6.8867188 + - 1.8105469 + - 6.4296875 + - -4.1367188 + - 0.45458984 + - 2.5019531 + - 6.0742188 + - -1.1699219 + - 1.0537109 + - 5.3554688 + - 3.8125 + - -2.2871094 + - 0.9238281 + - 4.9296875 + - 1.9853516 + - 9.484375 + - 0.5942383 + - -2.4199219 + - -1.9736328 + - 2.2128906 + - -3.1914063 + - -10.7734375 + - 0.5703125 + - -6.2734375 + - 4.9804688 + - 1.1855469 + - 0.4416504 + - 3.8925781 + - -2.8496094 + - -2.1054688 + - 2.5566406 + - -0.7841797 + - -1.8798828 + - -8.125 + - 3.7285156 + - 0.09362793 + - -4.3515625 + - -2.8378906 + - 4.8515625 + - 1.8964844 + - -2.6269531 + - 1.4208984 + - 0.90185547 + - 2.3457031 + - -9.125 + - 1.0859375 + - 1.3027344 + - -2.2382813 + - 4.875 + - -3.1582031 + - -6.3789063 + - -1.2128906 + - 4.7773438 + - 0.27392578 + - -0.43188477 + - 5.8125 + - -4.1367188 + - -4.4570313 + - -7.8046875 + - -3.3515625 diff --git a/backends/candle/tests/test_bert.rs b/backends/candle/tests/test_bert.rs index 45d02577..1bd5017f 100644 --- a/backends/candle/tests/test_bert.rs +++ b/backends/candle/tests/test_bert.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings, SnapshotScores}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer, relative_matcher}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -28,10 +28,10 @@ fn test_mini() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch", embeddings_batch, &matcher); let input_single = batch( @@ -41,7 +41,7 @@ fn test_mini() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); @@ -57,8 +57,8 @@ fn test_mini() -> Result<()> { ); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings = SnapshotScores::from(pooled_embeddings); - let raw_embeddings = SnapshotScores::from(raw_embeddings); + let pooled_embeddings = SnapshotEmbeddings::from(pooled_embeddings); + let raw_embeddings = SnapshotEmbeddings::from(raw_embeddings); assert_eq!(embeddings_batch[0], pooled_embeddings[0]); assert_eq!(raw_embeddings.len(), 8); @@ -91,13 +91,13 @@ fn test_mini_pooled_raw() -> Result<()> { [1, 4, 5].to_vec(), ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings_batch = SnapshotScores::from(pooled_embeddings); + let pooled_embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch_pooled", pooled_embeddings_batch, &matcher); - let raw_embeddings_batch = SnapshotScores::from(raw_embeddings); + let raw_embeddings_batch = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_batch_raw", raw_embeddings_batch, &matcher); // Check that the first token of each raw embeddings member is the same as the cls pooling ones @@ -113,7 +113,7 @@ fn test_mini_pooled_raw() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single_pooled", embeddings_single, &matcher); assert_eq!(pooled_embeddings_batch[0], embeddings_single[0]); @@ -126,7 +126,7 @@ fn test_mini_pooled_raw() -> Result<()> { ); let (_, raw_embeddings) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(raw_embeddings); + let embeddings_single = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_single_raw", embeddings_single, &matcher); assert_eq!(raw_embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_bert.rs b/backends/candle/tests/test_flash_bert.rs index 1888a32b..ea150e7f 100644 --- a/backends/candle/tests/test_flash_bert.rs +++ b/backends/candle/tests/test_flash_bert.rs @@ -2,9 +2,9 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings, SnapshotScores}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer, relative_matcher}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -34,10 +34,10 @@ fn test_flash_mini() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch", embeddings_batch, &matcher); let input_single = batch( @@ -47,7 +47,7 @@ fn test_flash_mini() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); @@ -63,8 +63,8 @@ fn test_flash_mini() -> Result<()> { ); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings = SnapshotScores::from(pooled_embeddings); - let raw_embeddings = SnapshotScores::from(raw_embeddings); + let pooled_embeddings = SnapshotEmbeddings::from(pooled_embeddings); + let raw_embeddings = SnapshotEmbeddings::from(raw_embeddings); assert_eq!(embeddings_batch[0], pooled_embeddings[0]); assert_eq!(raw_embeddings.len(), 8); @@ -101,13 +101,13 @@ fn test_flash_mini_pooled_raw() -> Result<()> { [1, 4, 5].to_vec(), ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, raw_embeddings) = sort_embeddings(backend.embed(input_batch)?); - let pooled_embeddings_batch = SnapshotScores::from(pooled_embeddings); + let pooled_embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_batch_pooled", pooled_embeddings_batch, &matcher); - let raw_embeddings_batch = SnapshotScores::from(raw_embeddings); + let raw_embeddings_batch = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_batch_raw", raw_embeddings_batch, &matcher); // Check that the first token of each raw embeddings member is the same as the cls pooling ones @@ -123,7 +123,7 @@ fn test_flash_mini_pooled_raw() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("mini_single_pooled", embeddings_single, &matcher); assert_eq!(pooled_embeddings_batch[0], embeddings_single[0]); @@ -136,7 +136,7 @@ fn test_flash_mini_pooled_raw() -> Result<()> { ); let (_, raw_embeddings) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(raw_embeddings); + let embeddings_single = SnapshotEmbeddings::from(raw_embeddings); insta::assert_yaml_snapshot!("mini_single_raw", embeddings_single, &matcher); assert_eq!(raw_embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_gte.rs b/backends/candle/tests/test_flash_gte.rs new file mode 100644 index 00000000..20b06b2f --- /dev/null +++ b/backends/candle/tests/test_flash_gte.rs @@ -0,0 +1,53 @@ +#![allow(dead_code, unused_imports)] +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_gte() -> Result<()> { + let model_root = download_artifacts("Alibaba-NLP/gte-base-en-v1.5", None)?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::Cls), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("gte_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("gte_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} diff --git a/backends/candle/tests/test_flash_jina.rs b/backends/candle/tests/test_flash_jina.rs index 4a5f8276..255b82a2 100644 --- a/backends/candle/tests/test_flash_jina.rs +++ b/backends/candle/tests/test_flash_jina.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_jina_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_jina_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_jina_code.rs b/backends/candle/tests/test_flash_jina_code.rs index 508bf722..d84848dc 100644 --- a/backends/candle/tests/test_flash_jina_code.rs +++ b/backends/candle/tests/test_flash_jina_code.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_jina_code_base() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_jina_code_base() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_mistral.rs b/backends/candle/tests/test_flash_mistral.rs new file mode 100644 index 00000000..71749c8b --- /dev/null +++ b/backends/candle/tests/test_flash_mistral.rs @@ -0,0 +1,53 @@ +#![allow(dead_code, unused_imports)] +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_mistral() -> Result<()> { + let model_root = download_artifacts("Salesforce/SFR-Embedding-2_R", None)?; + let tokenizer = load_tokenizer(&model_root)?; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::Mean), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("mistral_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("mistral_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} diff --git a/backends/candle/tests/test_flash_nomic.rs b/backends/candle/tests/test_flash_nomic.rs index 3e9b6e1d..263bbe43 100644 --- a/backends/candle/tests/test_flash_nomic.rs +++ b/backends/candle/tests/test_flash_nomic.rs @@ -1,9 +1,9 @@ #![allow(dead_code, unused_imports)] mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -30,10 +30,10 @@ fn test_flash_nomic_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_batch", embeddings_batch, &matcher); let input_single = batch( @@ -43,7 +43,7 @@ fn test_flash_nomic_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_flash_qwen2.rs b/backends/candle/tests/test_flash_qwen2.rs new file mode 100644 index 00000000..38e45553 --- /dev/null +++ b/backends/candle/tests/test_flash_qwen2.rs @@ -0,0 +1,77 @@ +#![allow(dead_code, unused_imports)] + +mod common; + +use crate::common::{sort_embeddings, SnapshotEmbeddings}; +use anyhow::Result; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; +use text_embeddings_backend_candle::CandleBackend; +use text_embeddings_backend_core::{Backend, ModelType, Pool}; +use tokenizers::processors::sequence::Sequence; +use tokenizers::processors::template::TemplateProcessing; +use tokenizers::{PostProcessorWrapper, Tokenizer}; + +#[test] +#[serial_test::serial] +#[cfg(all(feature = "cuda", feature = "flash-attn"))] +fn test_flash_qwen2() -> Result<()> { + let model_root = download_artifacts("Alibaba-NLP/gte-Qwen2-1.5B-instruct", None)?; + let mut tokenizer = load_tokenizer(&model_root)?; + // Qwen2 updates the post processor manually instead of into the tokenizer.json... + // https://huggingface.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct/blob/main/tokenization_qwen.py#L246 + let template = TemplateProcessing::builder() + .try_single("$A:0 <|endoftext|>:0") + .unwrap() + .try_pair("$A:0 <|endoftext|>:0 $B:1 <|endoftext|>:1") + .unwrap() + .special_tokens(vec![("<|endoftext|>", 151643)]) + .build() + .unwrap(); + match tokenizer.get_post_processor() { + None => tokenizer.with_post_processor(template), + Some(post_processor) => { + let post_processor = Sequence::new(vec![ + post_processor.clone(), + PostProcessorWrapper::Template(template), + ]); + tokenizer.with_post_processor(post_processor) + } + }; + + let backend = CandleBackend::new( + model_root, + "float16".to_string(), + ModelType::Embedding(Pool::LastToken), + )?; + + let input_batch = batch( + vec![ + tokenizer.encode("What is Deep Learning?", true).unwrap(), + tokenizer.encode("Deep Learning is...", true).unwrap(), + tokenizer.encode("What is Deep Learning?", true).unwrap(), + ], + [0, 1, 2].to_vec(), + vec![], + ); + + let matcher = cosine_matcher(); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); + insta::assert_yaml_snapshot!("qwen2_batch", embeddings_batch, &matcher); + + let input_single = batch( + vec![tokenizer.encode("What is Deep Learning?", true).unwrap()], + [0].to_vec(), + vec![], + ); + + let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); + + insta::assert_yaml_snapshot!("qwen2_single", embeddings_single, &matcher); + assert_eq!(embeddings_batch[0], embeddings_single[0]); + assert_eq!(embeddings_batch[2], embeddings_single[0]); + + Ok(()) +} diff --git a/backends/candle/tests/test_jina.rs b/backends/candle/tests/test_jina.rs index 4cd7bba6..4aa30d03 100644 --- a/backends/candle/tests/test_jina.rs +++ b/backends/candle/tests/test_jina.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_jina_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_jina_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_jina_code.rs b/backends/candle/tests/test_jina_code.rs index 70248e1a..6c3b3f20 100644 --- a/backends/candle/tests/test_jina_code.rs +++ b/backends/candle/tests/test_jina_code.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_jina_code_base() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_jina_code_base() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("jina_code_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/candle/tests/test_nomic.rs b/backends/candle/tests/test_nomic.rs index 914be7ea..ce0a4559 100644 --- a/backends/candle/tests/test_nomic.rs +++ b/backends/candle/tests/test_nomic.rs @@ -1,8 +1,8 @@ mod common; -use crate::common::{sort_embeddings, SnapshotScores}; +use crate::common::{sort_embeddings, SnapshotEmbeddings}; use anyhow::Result; -use common::{batch, download_artifacts, load_tokenizer, relative_matcher}; +use common::{batch, cosine_matcher, download_artifacts, load_tokenizer}; use text_embeddings_backend_candle::CandleBackend; use text_embeddings_backend_core::{Backend, ModelType, Pool}; @@ -27,10 +27,10 @@ fn test_nomic_small() -> Result<()> { vec![], ); - let matcher = relative_matcher(); + let matcher = cosine_matcher(); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_batch)?); - let embeddings_batch = SnapshotScores::from(pooled_embeddings); + let embeddings_batch = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_batch", embeddings_batch, &matcher); let input_single = batch( @@ -40,7 +40,7 @@ fn test_nomic_small() -> Result<()> { ); let (pooled_embeddings, _) = sort_embeddings(backend.embed(input_single)?); - let embeddings_single = SnapshotScores::from(pooled_embeddings); + let embeddings_single = SnapshotEmbeddings::from(pooled_embeddings); insta::assert_yaml_snapshot!("nomic_single", embeddings_single, &matcher); assert_eq!(embeddings_batch[0], embeddings_single[0]); diff --git a/backends/core/Cargo.toml b/backends/core/Cargo.toml index 5e330715..754f9526 100644 --- a/backends/core/Cargo.toml +++ b/backends/core/Cargo.toml @@ -6,9 +6,9 @@ authors.workspace = true homepage.workspace = true [dependencies] -thiserror = "^1.0" -clap = { version = "^4.1", features = ["derive"], optional = true } -nohash-hasher = "^0.2" +thiserror = { workspace = true } +clap = { workspace = true, optional = true } +nohash-hasher = { workspace = true } [features] clap = ["dep:clap"] diff --git a/backends/core/src/lib.rs b/backends/core/src/lib.rs index 06cef3ed..932c0083 100644 --- a/backends/core/src/lib.rs +++ b/backends/core/src/lib.rs @@ -63,6 +63,8 @@ pub enum Pool { /// This option is only available if the loaded model is a `ForMaskedLM` Transformer /// model. Splade, + /// Select the last token as embedding + LastToken, } impl fmt::Display for Pool { @@ -71,6 +73,7 @@ impl fmt::Display for Pool { Pool::Cls => write!(f, "cls"), Pool::Mean => write!(f, "mean"), Pool::Splade => write!(f, "splade"), + Pool::LastToken => write!(f, "last_token"), } } } diff --git a/backends/ort/Cargo.toml b/backends/ort/Cargo.toml new file mode 100644 index 00000000..40ccc560 --- /dev/null +++ b/backends/ort/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "text-embeddings-backend-ort" +version.workspace = true +edition.workspace = true +authors.workspace = true +homepage.workspace = true + +[dependencies] +anyhow = { workspace = true } +nohash-hasher = { workspace = true } +ndarray = "0.16.1" +num_cpus = { workspace = true } +ort = { version = "2.0.0-rc.8", default-features = false, features = ["download-binaries", "half", "onednn", "ndarray"] } +text-embeddings-backend-core = { path = "../core" } +tracing = { workspace = true } +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/backends/ort/src/lib.rs b/backends/ort/src/lib.rs new file mode 100644 index 00000000..ab38fcc1 --- /dev/null +++ b/backends/ort/src/lib.rs @@ -0,0 +1,401 @@ +use ndarray::{s, Axis}; +use nohash_hasher::BuildNoHashHasher; +use ort::{GraphOptimizationLevel, Session}; +use std::collections::HashMap; +use std::ops::{Div, Mul}; +use std::path::PathBuf; +use text_embeddings_backend_core::{ + Backend, BackendError, Batch, Embedding, Embeddings, ModelType, Pool, Predictions, +}; + +pub struct OrtBackend { + session: Session, + pool: Pool, + type_id_name: Option, +} + +impl OrtBackend { + pub fn new( + model_path: PathBuf, + dtype: String, + model_type: ModelType, + ) -> Result { + // Check dtype + if &dtype == "float32" { + } else { + return Err(BackendError::Start(format!( + "DType {dtype} is not supported" + ))); + }; + + // Check model type + let pool = match model_type { + ModelType::Classifier => Pool::Cls, + ModelType::Embedding(pool) => match pool { + Pool::Splade | Pool::LastToken => { + return Err(BackendError::Start(format!( + "Pooling {pool} is not supported for this backend. Use `candle` backend instead." + ))); + } + pool => pool, + }, + }; + + // Get model path + let onnx_path = { + let default_path = model_path.join("model.onnx"); + match default_path.exists() { + true => default_path, + false => model_path.join("onnx/model.onnx"), + } + }; + + // Start onnx session + let session = Session::builder() + .s()? + .with_intra_threads(num_cpus::get()) + .s()? + .with_optimization_level(GraphOptimizationLevel::Level3) + .s()? + .commit_from_file(onnx_path) + .s()?; + + // Check if the model requires type tokens + let mut type_id_name = None; + for input in &session.inputs { + if &input.name == "token_type_ids" || &input.name == "input_type" { + type_id_name = Some(input.name.clone()); + break; + } + } + + Ok(Self { + session, + pool, + type_id_name, + }) + } +} + +impl Backend for OrtBackend { + fn max_batch_size(&self) -> Option { + Some(8) + } + + fn health(&self) -> Result<(), BackendError> { + Ok(()) + } + + fn is_padded(&self) -> bool { + true + } + + fn embed(&self, batch: Batch) -> Result { + let batch_size = batch.len(); + let max_length = batch.max_length as usize; + + // Whether a least one of the request in the batch is padded + let mut masking = false; + + let (input_ids, type_ids, input_lengths, attention_mask) = { + let elems = batch_size * max_length; + + if batch_size > 1 { + // Prepare padded batch + let mut input_ids = Vec::with_capacity(elems); + let mut type_ids = Vec::with_capacity(elems); + let mut attention_mask = Vec::with_capacity(elems); + let mut input_lengths = Vec::with_capacity(batch_size); + + for i in 0..batch_size { + let start = batch.cumulative_seq_lengths[i] as usize; + let end = batch.cumulative_seq_lengths[i + 1] as usize; + let seq_length = (end - start) as u32; + input_lengths.push(seq_length as f32); + + // Copy values + for j in start..end { + input_ids.push(batch.input_ids[j] as i64); + type_ids.push(batch.token_type_ids[j] as i64); + attention_mask.push(1_i64); + } + + // Add padding if needed + let padding = batch.max_length - seq_length; + if padding > 0 { + // Set bool to use attention mask + masking = true; + for _ in 0..padding { + input_ids.push(0); + type_ids.push(0); + attention_mask.push(0_i64); + } + } + } + (input_ids, type_ids, input_lengths, attention_mask) + } else { + let attention_mask = vec![1_i64; elems]; + + ( + batch.input_ids.into_iter().map(|v| v as i64).collect(), + batch.token_type_ids.into_iter().map(|v| v as i64).collect(), + vec![batch.max_length as f32], + attention_mask, + ) + } + }; + + // Create ndarrays + let input_ids = ndarray::Array2::from_shape_vec((batch_size, max_length), input_ids).e()?; + let attention_mask = + ndarray::Array2::from_shape_vec((batch_size, max_length), attention_mask).e()?; + let input_lengths = ndarray::Array1::from_vec(input_lengths); + + // Create onnx inputs + let inputs = match self.type_id_name.as_ref() { + Some(type_id_name) => { + // Add type ids to inputs + let type_ids = + ndarray::Array2::from_shape_vec((batch_size, max_length), type_ids).e()?; + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone(), type_id_name => type_ids].e()? + } + None => { + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone()] + .e()? + } + }; + + // Run model + let outputs = self.session.run(inputs).e()?; + // Get last_hidden_state ndarray + + let outputs = outputs + .get("last_hidden_state") + .or(outputs.get("token_embeddings")) + .ok_or(BackendError::Inference(format!( + "Unknown output keys: {:?}", + self.session.outputs + )))? + .try_extract_tensor::() + .e()? + .to_owned(); + + // Final embeddings struct + let mut embeddings = + HashMap::with_capacity_and_hasher(batch_size, BuildNoHashHasher::default()); + + let has_pooling_requests = !batch.pooled_indices.is_empty(); + let has_raw_requests = !batch.raw_indices.is_empty(); + + if has_pooling_requests { + let mut outputs = outputs.clone(); + + // Only use pooled_indices if at least one member of the batch ask for raw embeddings + let indices = if has_raw_requests { + let indices: Vec = + batch.pooled_indices.iter().map(|v| *v as usize).collect(); + + // Select values in the batch + outputs = outputs.select(Axis(0), &indices); + Some(indices) + } else { + None + }; + + let pooled_embeddings = match self.pool { + // CLS pooling + Pool::Cls => outputs.slice(s![.., 0, ..]).into_owned().into_dyn(), + // Last token pooling is not supported for this model + Pool::LastToken => unreachable!(), + // Mean pooling + Pool::Mean => { + if masking { + let mut attention_mask = attention_mask; + let mut input_lengths = input_lengths; + + if let Some(indices) = indices { + // Select values in the batch + attention_mask = attention_mask.select(Axis(0), &indices); + input_lengths = input_lengths.select(Axis(0), &indices); + }; + + // Cast and reshape + let attention_mask = attention_mask.mapv(|x| x as f32).insert_axis(Axis(2)); + + // Mask padded values + outputs = outputs.mul(attention_mask); + outputs + .sum_axis(Axis(1)) + .div(input_lengths.insert_axis(Axis(1))) + } else { + outputs.mean_axis(Axis(1)).unwrap() + } + } + Pool::Splade => unreachable!(), + }; + + for (i, e) in batch + .pooled_indices + .into_iter() + .zip(pooled_embeddings.rows()) + { + embeddings.insert(i as usize, Embedding::Pooled(e.to_vec())); + } + }; + + if has_raw_requests { + // Reshape outputs + let s = outputs.shape().to_vec(); + let outputs = outputs.into_shape_with_order((s[0] * s[1], s[2])).e()?; + + // We need to remove the padding tokens only if batch_size > 1 and there are some + // member of the batch that require pooling + // or if batch_size > 1 and the members of the batch have different lengths + let raw_embeddings = if (masking || has_pooling_requests) && batch_size > 1 { + let mut final_indices: Vec = Vec::with_capacity(batch_size * max_length); + + for i in batch.raw_indices.iter() { + let start = i * batch.max_length; + let i = *i as usize; + let length = + batch.cumulative_seq_lengths[i + 1] - batch.cumulative_seq_lengths[i]; + + for j in start..start + length { + // Add indices for the tokens of this specific member of the batch + final_indices.push(j as usize); + } + } + + // Select the tokens with final indices + outputs.select(Axis(0), &final_indices) + } else { + outputs + }; + + // Used for indexing in the raw_embeddings tensor + let input_lengths: Vec = (0..batch_size) + .map(|i| { + (batch.cumulative_seq_lengths[i + 1] - batch.cumulative_seq_lengths[i]) as usize + }) + .collect(); + + let mut cumulative_length = 0; + for i in batch.raw_indices.into_iter() { + let length = input_lengths[i as usize]; + let e = raw_embeddings.slice(s![cumulative_length..cumulative_length + length, ..]); + let e = e.rows().into_iter().map(|v| v.to_vec()).collect(); + + embeddings.insert(i as usize, Embedding::All(e)); + cumulative_length += length; + } + } + + Ok(embeddings) + } + + fn predict(&self, batch: Batch) -> Result { + let batch_size = batch.len(); + let max_length = batch.max_length as usize; + + let (input_ids, type_ids, attention_mask) = { + let elems = batch_size * max_length; + + if batch_size > 1 { + // Prepare padded batch + let mut input_ids = Vec::with_capacity(elems); + let mut type_ids = Vec::with_capacity(elems); + let mut attention_mask = Vec::with_capacity(elems); + + for i in 0..batch_size { + let start = batch.cumulative_seq_lengths[i] as usize; + let end = batch.cumulative_seq_lengths[i + 1] as usize; + let seq_length = (end - start) as u32; + + // Copy values + for j in start..end { + input_ids.push(batch.input_ids[j] as i64); + type_ids.push(batch.token_type_ids[j] as i64); + attention_mask.push(1_i64); + } + + // Add padding if needed + let padding = batch.max_length - seq_length; + if padding > 0 { + for _ in 0..padding { + input_ids.push(0); + type_ids.push(0); + attention_mask.push(0_i64); + } + } + } + (input_ids, type_ids, attention_mask) + } else { + let attention_mask = vec![1_i64; elems]; + + ( + batch.input_ids.into_iter().map(|v| v as i64).collect(), + batch.token_type_ids.into_iter().map(|v| v as i64).collect(), + attention_mask, + ) + } + }; + + // Create ndarrays + let input_ids = ndarray::Array2::from_shape_vec((batch_size, max_length), input_ids).e()?; + let attention_mask = + ndarray::Array2::from_shape_vec((batch_size, max_length), attention_mask).e()?; + + // Create onnx inputs + let inputs = match self.type_id_name.as_ref() { + Some(type_id_name) => { + // Add type ids to inputs + let type_ids = + ndarray::Array2::from_shape_vec((batch_size, max_length), type_ids).e()?; + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone(), type_id_name => type_ids].e()? + } + None => { + ort::inputs!["input_ids" => input_ids, "attention_mask" => attention_mask.clone()] + .e()? + } + }; + + // Run model + let outputs = self.session.run(inputs).e()?; + // Get last_hidden_state ndarray + let outputs = outputs["logits"] + .try_extract_tensor::() + .e()? + .to_owned(); + + let mut predictions = + HashMap::with_capacity_and_hasher(batch_size, BuildNoHashHasher::default()); + for (i, r) in outputs.rows().into_iter().enumerate() { + predictions.insert(i, r.to_vec()); + } + + Ok(predictions) + } +} + +pub trait WrapErr { + fn s(self) -> Result; + fn e(self) -> Result; +} + +impl WrapErr for Result { + fn s(self) -> Result { + self.map_err(|e| BackendError::Start(e.to_string())) + } + fn e(self) -> Result { + self.map_err(|e| BackendError::Inference(e.to_string())) + } +} + +impl WrapErr for Result { + fn s(self) -> Result { + self.map_err(|e| BackendError::Start(e.to_string())) + } + fn e(self) -> Result { + self.map_err(|e| BackendError::Inference(e.to_string())) + } +} diff --git a/backends/src/dtype.rs b/backends/src/dtype.rs index d2c896ce..53193ef7 100644 --- a/backends/src/dtype.rs +++ b/backends/src/dtype.rs @@ -12,11 +12,8 @@ pub enum DType { all(feature = "candle", not(feature = "accelerate")) ))] Float16, - // Float32 is not available on candle cuda - #[cfg(any(feature = "python", feature = "candle"))] + #[cfg(any(feature = "python", feature = "candle", feature = "ort"))] Float32, - // #[cfg(feature = "candle")] - // Q6K, } impl fmt::Display for DType { @@ -28,11 +25,32 @@ impl fmt::Display for DType { all(feature = "candle", not(feature = "accelerate")) ))] DType::Float16 => write!(f, "float16"), - // Float32 is not available on candle cuda - #[cfg(any(feature = "python", feature = "candle"))] + #[cfg(any(feature = "python", feature = "candle", feature = "ort"))] DType::Float32 => write!(f, "float32"), - // #[cfg(feature = "candle")] - // DType::Q6K => write!(f, "q6k"), + } + } +} + +#[allow(clippy::derivable_impls)] +impl Default for DType { + fn default() -> Self { + #[cfg(any( + feature = "accelerate", + feature = "mkl", + feature = "mkl-dynamic", + feature = "ort" + ))] + { + DType::Float32 + } + #[cfg(not(any( + feature = "accelerate", + feature = "mkl", + feature = "mkl-dynamic", + feature = "ort" + )))] + { + DType::Float16 } } } diff --git a/backends/src/lib.rs b/backends/src/lib.rs index d332b4a7..9d44cdbd 100644 --- a/backends/src/lib.rs +++ b/backends/src/lib.rs @@ -1,5 +1,7 @@ mod dtype; +use hf_hub::api::tokio::{ApiError, ApiRepo}; +use std::cmp::{max, min}; use std::path::PathBuf; use std::sync::Arc; use std::thread::JoinHandle; @@ -16,13 +18,16 @@ pub use text_embeddings_backend_core::{ #[cfg(feature = "candle")] use text_embeddings_backend_candle::CandleBackend; +#[cfg(feature = "ort")] +use text_embeddings_backend_ort::OrtBackend; + #[cfg(feature = "python")] use text_embeddings_backend_python::PythonBackend; #[derive(Debug, Clone)] pub struct Backend { /// Channel to communicate with the background thread - backend_sender: mpsc::UnboundedSender, + backend_sender: mpsc::Sender, /// Health status health_receiver: watch::Receiver, _backend_thread: Arc, @@ -40,7 +45,7 @@ impl Backend { otlp_endpoint: Option, otlp_service_name: String, ) -> Result { - let (backend_sender, backend_receiver) = mpsc::unbounded_channel(); + let (backend_sender, backend_receiver) = mpsc::channel(8); let backend = init_backend( model_path, @@ -67,6 +72,62 @@ impl Backend { }) } + #[instrument(skip(self))] + pub async fn warmup( + &self, + max_input_length: usize, + max_batch_tokens: usize, + max_batch_requests: Option, + ) -> Result<(), BackendError> { + let mut input_ids = Vec::with_capacity(max_batch_tokens); + let mut token_type_ids = Vec::with_capacity(max_batch_tokens); + let mut position_ids = Vec::with_capacity(max_batch_tokens); + + let mut cumulative_seq_lengths = vec![0]; + let mut pooled_indices = Vec::new(); + + let mut i = 0_u32; + let mut remaining = max_batch_tokens; + let mut cumulative_length = 0; + let mut max_length = 0; + + while remaining > 0 { + let request_length = min(remaining, max_input_length); + cumulative_length += request_length; + max_length = max(max_length, request_length as u32); + + input_ids.extend(vec![0; request_length]); + token_type_ids.extend(vec![0; request_length]); + position_ids.extend((0..request_length as u32).collect::>()); + + cumulative_seq_lengths.push(cumulative_length as u32); + pooled_indices.push(i); + + i += 1; + remaining = remaining.saturating_sub(max_input_length); + if let Some(max_batch_requests) = &max_batch_requests { + if i as usize == *max_batch_requests { + break; + } + } + } + + let batch = Batch { + input_ids, + token_type_ids, + position_ids, + cumulative_seq_lengths, + max_length, + pooled_indices, + raw_indices: vec![], + }; + + match &self.model_type { + ModelType::Classifier => self.predict(batch).await.map(|_| ()), + ModelType::Embedding(_) => self.embed(batch).await.map(|_| ()), + } + } + #[instrument(skip(self))] pub async fn health(&self) -> Result<(), BackendError> { if *self.health_receiver.borrow() { @@ -76,6 +137,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender .send(BackendCommand::Health(Span::current(), sender)) + .await .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without sending a response. This is a bug.", @@ -110,7 +172,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender - .send(BackendCommand::Embed(batch, Span::current(), sender)) + .try_send(BackendCommand::Embed(batch, Span::current(), sender)) .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without send a response. This is a bug.", @@ -122,7 +184,7 @@ impl Backend { let (sender, receiver) = oneshot::channel(); self.backend_sender - .send(BackendCommand::Predict(batch, Span::current(), sender)) + .try_send(BackendCommand::Predict(batch, Span::current(), sender)) .expect("No backend receiver. This is a bug."); receiver.await.expect( "Backend blocking task dropped the sender without send a response. This is a bug.", @@ -164,6 +226,13 @@ fn init_backend( .expect("Python Backend management thread failed")?, )); } + } else if cfg!(feature = "ort") { + #[cfg(feature = "ort")] + return Ok(Box::new(OrtBackend::new( + model_path, + dtype.to_string(), + model_type, + )?)); } Err(BackendError::NoBackend) } @@ -174,7 +243,7 @@ struct BackendThread(Option>); impl BackendThread { fn new( backend: Box, - mut backend_receiver: mpsc::UnboundedReceiver, + mut backend_receiver: mpsc::Receiver, health_sender: watch::Sender, ) -> Self { let handle = std::thread::spawn(move || { @@ -228,3 +297,98 @@ enum BackendCommand { oneshot::Sender>, ), } + +pub async fn download_weights(api: &ApiRepo) -> Result, ApiError> { + let model_files = if cfg!(feature = "python") || cfg!(feature = "candle") { + match download_safetensors(api).await { + Ok(p) => p, + Err(_) => { + tracing::warn!("safetensors weights not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); + tracing::info!("Downloading `pytorch_model.bin`"); + let p = api.get("pytorch_model.bin").await?; + vec![p] + } + } + } else if cfg!(feature = "ort") { + match download_onnx(api).await { + Ok(p) => p, + Err(err) => { + panic!("failed to download `model.onnx` or `model.onnx_data`. Check the onnx file exists in the repository. {err}"); + } + } + } else { + unreachable!() + }; + + Ok(model_files) +} + +async fn download_safetensors(api: &ApiRepo) -> Result, ApiError> { + // Single file + tracing::info!("Downloading `model.safetensors`"); + match api.get("model.safetensors").await { + Ok(p) => return Ok(vec![p]), + Err(err) => tracing::warn!("Could not download `model.safetensors`: {}", err), + }; + + // Sharded weights + // Download and parse index file + tracing::info!("Downloading `model.safetensors.index.json`"); + let index_file = api.get("model.safetensors.index.json").await?; + let index_file_string: String = + std::fs::read_to_string(index_file).expect("model.safetensors.index.json is corrupted"); + let json: serde_json::Value = serde_json::from_str(&index_file_string) + .expect("model.safetensors.index.json is corrupted"); + + let weight_map = match json.get("weight_map") { + Some(serde_json::Value::Object(map)) => map, + _ => panic!("model.safetensors.index.json is corrupted"), + }; + + let mut safetensors_filenames = std::collections::HashSet::new(); + for value in weight_map.values() { + if let Some(file) = value.as_str() { + safetensors_filenames.insert(file.to_string()); + } + } + + // Download weight files + let mut safetensors_files = Vec::new(); + for n in safetensors_filenames { + tracing::info!("Downloading `{}`", n); + safetensors_files.push(api.get(&n).await?); + } + + Ok(safetensors_files) +} + +async fn download_onnx(api: &ApiRepo) -> Result, ApiError> { + let mut model_files: Vec = Vec::new(); + + tracing::info!("Downloading `model.onnx`"); + match api.get("model.onnx").await { + Ok(p) => model_files.push(p), + Err(err) => { + tracing::warn!("Could not download `model.onnx`: {err}"); + tracing::info!("Downloading `onnx/model.onnx`"); + let p = api.get("onnx/model.onnx").await?; + model_files.push(p.parent().unwrap().to_path_buf()) + } + }; + + tracing::info!("Downloading `model.onnx_data`"); + match api.get("model.onnx_data").await { + Ok(p) => model_files.push(p), + Err(err) => { + tracing::warn!("Could not download `model.onnx_data`: {err}"); + tracing::info!("Downloading `onnx/model.onnx_data`"); + + match api.get("onnx/model.onnx_data").await { + Ok(p) => model_files.push(p.parent().unwrap().to_path_buf()), + Err(err) => tracing::warn!("Could not download `onnx/model.onnx_data`: {err}"), + } + } + } + + Ok(model_files) +} diff --git a/core/Cargo.toml b/core/Cargo.toml index 0e83c744..d69871dc 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -6,10 +6,12 @@ authors.workspace = true homepage.workspace = true [dependencies] -hf-hub = { version = "^0.3.0", features = ["tokio"], default-features = false } -metrics = "^0.21" +async-channel = "^2.3" +hf-hub = { workspace = true } +metrics = { workspace = true } +serde_json = { workspace = true } text-embeddings-backend = { path = "../backends" } -thiserror = "^1.0" -tokenizers = { version = "^0.19.1", default-features = false, features = ["onig", "esaxx_fast"] } -tracing = "^0.1" -tokio = { version = "^1.25", features = ["rt", "rt-multi-thread", "parking_lot", "sync"] } +thiserror = { workspace = true } +tokenizers = { workspace = true } +tracing = { workspace = true } +tokio = { workspace = true } diff --git a/core/src/download.rs b/core/src/download.rs index 6cc60472..02ea484d 100644 --- a/core/src/download.rs +++ b/core/src/download.rs @@ -1,5 +1,6 @@ use hf_hub::api::tokio::{ApiError, ApiRepo}; use std::path::PathBuf; +use text_embeddings_backend::download_weights; use tracing::instrument; // Old classes used other config names than 'sentence_bert_config.json' @@ -19,20 +20,14 @@ pub async fn download_artifacts(api: &ApiRepo) -> Result { tracing::info!("Starting download"); + tracing::info!("Downloading `config.json`"); api.get("config.json").await?; + + tracing::info!("Downloading `tokenizer.json`"); api.get("tokenizer.json").await?; - let model_root = match api.get("model.safetensors").await { - Ok(p) => p, - Err(_) => { - let p = api.get("pytorch_model.bin").await?; - tracing::warn!("`model.safetensors` not found. Using `pytorch_model.bin` instead. Model loading will be significantly slower."); - p - } - } - .parent() - .unwrap() - .to_path_buf(); + let model_files = download_weights(api).await?; + let model_root = model_files[0].parent().unwrap().to_path_buf(); tracing::info!("Model artifacts downloaded in {:?}", start.elapsed()); Ok(model_root) @@ -40,6 +35,7 @@ pub async fn download_artifacts(api: &ApiRepo) -> Result { #[instrument(skip_all)] pub async fn download_pool_config(api: &ApiRepo) -> Result { + tracing::info!("Downloading `1_Pooling/config.json`"); let pool_config_path = api.get("1_Pooling/config.json").await?; Ok(pool_config_path) } @@ -60,3 +56,10 @@ pub async fn download_st_config(api: &ApiRepo) -> Result { Err(err) } + +#[instrument(skip_all)] +pub async fn download_new_st_config(api: &ApiRepo) -> Result { + tracing::info!("Downloading `config_sentence_transformers.json`"); + let pool_config_path = api.get("config_sentence_transformers.json").await?; + Ok(pool_config_path) +} diff --git a/core/src/infer.rs b/core/src/infer.rs index 0f95ff8b..23b343bf 100644 --- a/core/src/infer.rs +++ b/core/src/infer.rs @@ -30,14 +30,10 @@ impl Infer { ) -> Self { let notify_batching_task = Arc::new(Notify::new()); - let (embed_sender, embed_receiver) = mpsc::unbounded_channel(); + // Bound channel to 1 to be able to prefetch one batch + let (embed_sender, embed_receiver) = mpsc::channel(1); - // Create two batching tasks to prefetch batches - tokio::spawn(batching_task( - queue.clone(), - notify_batching_task.clone(), - embed_sender.clone(), - )); + // Batching task tokio::spawn(batching_task( queue.clone(), notify_batching_task.clone(), @@ -59,23 +55,25 @@ impl Infer { } } - #[instrument(skip(self))] + #[instrument(skip(self, inputs))] pub async fn tokenize + std::fmt::Debug>( &self, inputs: I, add_special_tokens: bool, - ) -> Result { + prompt_name: Option, + ) -> Result<(Option, RawEncoding), TextEmbeddingsError> { self.tokenization - .tokenize(inputs.into(), add_special_tokens) + .tokenize(inputs.into(), add_special_tokens, prompt_name) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err }) } - #[instrument(skip(self))] + #[instrument(skip(self, ids))] pub async fn decode( &self, ids: Vec, @@ -85,7 +83,8 @@ impl Infer { .decode(ids, skip_special_tokens) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err }) @@ -98,11 +97,13 @@ impl Infer { .limit_concurrent_requests .try_acquire_owned() .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "overloaded"); + let counter = metrics::counter!("te_request_failure", "err" => "overloaded"); + counter.increment(1); tracing::error!("{err}"); TextEmbeddingsError::from(err) }) } + #[instrument(skip(self))] pub async fn acquire_permit(&self) -> OwnedSemaphorePermit { // Limit concurrent requests by acquiring a permit from the semaphore @@ -113,18 +114,20 @@ impl Infer { .expect("Semaphore has been closed. This is a bug.") } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_all + std::fmt::Debug>( &self, inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); if self.is_splade() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "`embed_all` is not available for SPLADE models".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -137,6 +140,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, false, &start_time, permit, @@ -151,36 +155,34 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_sparse + std::fmt::Debug>( &self, inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); if !self.is_splade() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not an embedding model with SPLADE pooling".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -193,6 +195,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, true, &start_time, permit, @@ -207,37 +210,35 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } - #[instrument(skip(self, permit))] + #[instrument(skip(self, inputs, permit))] pub async fn embed_pooled + std::fmt::Debug>( &self, inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, normalize: bool, permit: OwnedSemaphorePermit, ) -> Result { let start_time = Instant::now(); if self.is_splade() && normalize { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "`normalize` is not available for SPLADE models".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -250,6 +251,7 @@ impl Infer { inputs, truncate, truncation_direction, + prompt_name, true, &start_time, permit, @@ -281,35 +283,34 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_embed_success"); - metrics::histogram!("te_embed_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_embed_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_embed_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_embed_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_embed_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_embed_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_embed_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } + #[allow(clippy::too_many_arguments)] async fn embed + std::fmt::Debug>( &self, inputs: I, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, pooling: bool, start_time: &Instant, _permit: OwnedSemaphorePermit, ) -> Result { if self.is_classifier() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not an embedding model".to_string(); tracing::error!("{message}"); return Err(TextEmbeddingsError::Backend(BackendError::Inference( @@ -317,15 +318,17 @@ impl Infer { ))); } - metrics::increment_counter!("te_embed_count"); + let counter = metrics::counter!("te_embed_count"); + counter.increment(1); // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate, truncation_direction) + .encode(inputs.into(), truncate, truncation_direction, prompt_name) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -353,7 +356,8 @@ impl Infer { "Infer batching task dropped the sender without sending a response. This is a bug.", ) .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "inference"); + let counter = metrics::counter!("te_request_failure", "err" => "inference"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -361,7 +365,7 @@ impl Infer { Ok(response) } - #[instrument(skip(self, _permit))] + #[instrument(skip(self, inputs, _permit))] pub async fn predict + std::fmt::Debug>( &self, inputs: I, @@ -371,7 +375,8 @@ impl Infer { _permit: OwnedSemaphorePermit, ) -> Result { if !self.is_classifier() { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "Model is not a classifier model".to_string(); return Err(TextEmbeddingsError::Backend(BackendError::Inference( message, @@ -379,15 +384,17 @@ impl Infer { } let start_time = Instant::now(); - metrics::increment_counter!("te_predict_count"); + let counter = metrics::counter!("te_predict_count"); + counter.increment(1); // Tokenization let encoding = self .tokenization - .encode(inputs.into(), truncate, truncation_direction) + .encode(inputs.into(), truncate, truncation_direction, None) .await .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "tokenization"); + let counter = metrics::counter!("te_request_failure", "err" => "tokenization"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -415,7 +422,8 @@ impl Infer { "Infer batching task dropped the sender without sending a response. This is a bug.", ) .map_err(|err| { - metrics::increment_counter!("te_request_failure", "err" => "inference"); + let counter = metrics::counter!("te_request_failure", "err" => "inference"); + counter.increment(1); tracing::error!("{err}"); err })?; @@ -452,20 +460,16 @@ impl Infer { let total_time = start_time.elapsed(); // Metrics - metrics::increment_counter!("te_predict_success"); - metrics::histogram!("te_predict_duration", total_time.as_secs_f64()); - metrics::histogram!( - "te_predict_tokenization_duration", - response.metadata.tokenization.as_secs_f64() - ); - metrics::histogram!( - "te_predict_queue_duration", - response.metadata.queue.as_secs_f64() - ); - metrics::histogram!( - "te_predict_inference_duration", - response.metadata.inference.as_secs_f64() - ); + let counter = metrics::counter!("te_predict_success"); + counter.increment(1); + let histogram = metrics::histogram!("te_predict_duration"); + histogram.record(total_time.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_tokenization_duration"); + histogram.record(response.metadata.tokenization.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_queue_duration"); + histogram.record(response.metadata.queue.as_secs_f64()); + let histogram = metrics::histogram!("te_predict_inference_duration"); + histogram.record(response.metadata.inference.as_secs_f64()); Ok(response) } @@ -495,30 +499,30 @@ impl Infer { } #[instrument(skip_all)] -async fn batching_task( - queue: Queue, - notify: Arc, - embed_sender: mpsc::UnboundedSender<(NextBatch, oneshot::Sender<()>)>, -) { +async fn batching_task(queue: Queue, notify: Arc, embed_sender: mpsc::Sender) { loop { notify.notified().await; - while let Some(next_batch) = queue.next_batch().await { - let (callback_sender, callback_receiver) = oneshot::channel(); - embed_sender - .send((next_batch, callback_sender)) + { + let mut permit = embed_sender + .reserve() + .await .expect("embed receiver was dropped. This is a bug."); - let _ = callback_receiver.await; + + while let Some(next_batch) = queue.next_batch().await { + permit.send(next_batch); + permit = embed_sender + .reserve() + .await + .expect("embed receiver was dropped. This is a bug."); + } } } } #[instrument(skip_all)] -async fn backend_task( - backend: Backend, - mut embed_receiver: mpsc::UnboundedReceiver<(NextBatch, oneshot::Sender<()>)>, -) { - while let Some((batch, _callback)) = embed_receiver.recv().await { +async fn backend_task(backend: Backend, mut embed_receiver: mpsc::Receiver) { + while let Some(batch) = embed_receiver.recv().await { match &backend.model_type { ModelType::Classifier => { let results = backend.predict(batch.1).await; diff --git a/core/src/queue.rs b/core/src/queue.rs index dfefda21..3fd8b771 100644 --- a/core/src/queue.rs +++ b/core/src/queue.rs @@ -35,7 +35,7 @@ pub struct Metadata { #[derive(Debug, Clone)] pub struct Queue { /// Channel to communicate with the background queue task - queue_sender: mpsc::UnboundedSender, + queue_sender: mpsc::Sender, } impl Queue { @@ -46,7 +46,7 @@ impl Queue { max_concurrent_requests: usize, ) -> Self { // Create channels - let (queue_sender, queue_receiver) = mpsc::unbounded_channel(); + let (queue_sender, queue_receiver) = mpsc::channel(max_concurrent_requests); // Launch background queue task std::thread::spawn(move || { @@ -68,8 +68,8 @@ impl Queue { // Send append command to the background task managing the state // Unwrap is safe here self.queue_sender - .send(QueueCommand::Append(Box::new(entry), Span::current())) - .expect("Queue background task dropped the receiver. This is a bug."); + .try_send(QueueCommand::Append(Box::new(entry), Span::current())) + .expect("Queue background task dropped the receiver or the receiver is too behind. This is a bug."); } /// Get the next batch from the queue @@ -80,11 +80,11 @@ impl Queue { // Send next batch command to the background task managing the state // Unwrap is safe here self.queue_sender - .send(QueueCommand::NextBatch { + .try_send(QueueCommand::NextBatch { response_sender, span: Span::current(), }) - .expect("Queue background task dropped the receiver. This is a bug."); + .expect("Queue background task dropped the receiver or the receiver is too behind. This is a bug."); // Await on response channel // Unwrap is safe here response_receiver.await.expect( @@ -99,7 +99,7 @@ fn queue_blocking_task( max_batch_tokens: usize, max_batch_requests: Option, max_concurrent_requests: usize, - mut queue_receiver: mpsc::UnboundedReceiver, + mut queue_receiver: mpsc::Receiver, ) { let capacity = max_batch_requests.unwrap_or(max_concurrent_requests); @@ -110,7 +110,8 @@ fn queue_blocking_task( QueueCommand::Append(entry, span) => { let _span = span.entered(); entries.push_back(*entry); - metrics::increment_gauge!("te_queue_size", 1.0); + let gauge = metrics::gauge!("te_queue_size"); + gauge.increment(1.0); } QueueCommand::NextBatch { response_sender, @@ -137,7 +138,8 @@ fn queue_blocking_task( // Filter entries where the response receiver was dropped (== entries where the request // was dropped by the client) if entry.metadata.response_tx.is_closed() { - metrics::increment_counter!("te_request_failure", "err" => "dropped"); + let counter = metrics::counter!("te_request_failure", "err" => "dropped"); + counter.increment(1); continue; } @@ -197,9 +199,12 @@ fn queue_blocking_task( let _ = response_sender.send(next_batch); - metrics::histogram!("te_batch_next_size", batch_size as f64); - metrics::histogram!("te_batch_next_tokens", current_tokens as f64); - metrics::gauge!("te_queue_size", entries.len() as f64); + let histogram = metrics::histogram!("te_batch_next_size"); + histogram.record(batch_size as f64); + let histogram = metrics::histogram!("te_batch_next_tokens"); + histogram.record(current_tokens as f64); + let gauge = metrics::gauge!("te_queue_size"); + gauge.set(entries.len() as f64) } } } diff --git a/core/src/tokenization.rs b/core/src/tokenization.rs index 07226823..71617daf 100644 --- a/core/src/tokenization.rs +++ b/core/src/tokenization.rs @@ -1,16 +1,19 @@ /// Payload tokenization logic use crate::TextEmbeddingsError; +use std::collections::HashMap; use tokenizers::tokenizer::Tokenizer; pub use tokenizers::Encoding as RawEncoding; use tokenizers::{TruncationDirection, TruncationParams, TruncationStrategy}; -use tokio::sync::{mpsc, oneshot}; +use tokio::sync::oneshot; use tracing::{instrument, Span}; +static MAX_CHAR_MULTIPLIER: usize = 250; + /// Validation #[derive(Debug, Clone)] pub struct Tokenization { /// Channel to communicate with the background tokenization task - sender: mpsc::UnboundedSender, + sender: async_channel::Sender, } impl Tokenization { @@ -19,43 +22,33 @@ impl Tokenization { tokenizer: Tokenizer, max_input_length: usize, position_offset: usize, + default_prompt: Option, + prompts: Option>, ) -> Self { tracing::info!("Starting {workers} tokenization workers"); // Create channel - let (sender, mut round_robin_receiver) = mpsc::unbounded_channel(); - let mut senders = Vec::with_capacity(workers); + let (sender, receiver) = async_channel::bounded(workers * 4); // Create workers for _ in 0..workers { let tokenizer_clone = tokenizer.clone(); - let (tokenizer_sender, tokenizer_receiver) = mpsc::unbounded_channel(); - senders.push(tokenizer_sender); - + let receiver_clone = receiver.clone(); + let default_prompt_clone = default_prompt.clone(); + let prompts_clone = prompts.clone(); // Spawn worker std::thread::spawn(move || { tokenizer_worker( tokenizer_clone, max_input_length, position_offset, - tokenizer_receiver, + default_prompt_clone, + prompts_clone, + receiver_clone, ) }); } - // Create tokenization round robin task - tokio::spawn(async move { - // Loop over requests - loop { - for sender in &senders { - match round_robin_receiver.recv().await { - None => return, - Some(request) => sender.send(request).unwrap(), - }; - } - } - }); - Self { sender } } @@ -65,6 +58,7 @@ impl Tokenization { inputs: EncodingInput, truncate: bool, truncation_direction: TruncationDirection, + prompt_name: Option, ) -> Result { // Check if inputs is empty if inputs.is_empty() { @@ -82,9 +76,11 @@ impl Tokenization { inputs, truncate, truncation_direction, + prompt_name, response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -97,7 +93,8 @@ impl Tokenization { &self, inputs: EncodingInput, add_special_tokens: bool, - ) -> Result { + prompt_name: Option, + ) -> Result<(Option, RawEncoding), TextEmbeddingsError> { // Check if inputs is empty if inputs.is_empty() { return Err(TextEmbeddingsError::Validation( @@ -113,9 +110,11 @@ impl Tokenization { .send(TokenizerRequest::Tokenize( inputs, add_special_tokens, + prompt_name, response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -147,6 +146,7 @@ impl Tokenization { response_sender, Span::current(), )) + .await .expect("Tokenization background task dropped the receiver. This is a bug."); // Await on response channel @@ -160,20 +160,28 @@ fn tokenizer_worker( mut tokenizer: Tokenizer, max_input_length: usize, position_offset: usize, - mut receiver: mpsc::UnboundedReceiver, + default_prompt: Option, + prompts: Option>, + receiver: async_channel::Receiver, ) { // Loop over requests - while let Some(request) = receiver.blocking_recv() { + while let Ok(request) = receiver.recv_blocking() { match request { TokenizerRequest::Encode( inputs, truncate, truncation_direction, + prompt_name, response_tx, parent_span, ) => { parent_span.in_scope(|| { if !response_tx.is_closed() { + let default_prompt_clone = match prompt_name { + None => default_prompt.clone(), + Some(_) => None, + }; + // It's possible that the user dropped its request resulting in a send error. // We just discard the error let _ = response_tx.send(encode_input( @@ -182,20 +190,38 @@ fn tokenizer_worker( truncation_direction, max_input_length, position_offset, + default_prompt_clone, + prompt_name, + prompts.as_ref(), &mut tokenizer, )); } }) } - TokenizerRequest::Tokenize(inputs, add_special_tokens, response_tx, parent_span) => { + TokenizerRequest::Tokenize( + inputs, + add_special_tokens, + prompt_name, + response_tx, + parent_span, + ) => { parent_span.in_scope(|| { if !response_tx.is_closed() { + let default_prompt_clone = match prompt_name { + None => default_prompt.clone(), + Some(_) => None, + }; + // It's possible that the user dropped its request resulting in a send error. // We just discard the error let _ = response_tx.send(tokenize_input( inputs, add_special_tokens, + max_input_length, None, + default_prompt_clone, + prompt_name, + prompts.as_ref(), &mut tokenizer, )); } @@ -225,40 +251,117 @@ fn decode_ids( .decode(&ids, skip_special_tokens)?) } +fn prepare_pre_prompt( + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, +) -> Result, TextEmbeddingsError> { + let pre_prompt = if let Some(prompt_name) = prompt_name.as_ref() { + match prompts { + None => { + return Err(TextEmbeddingsError::Validation(format!("`default-prompt-name` is set to `{prompt_name}` but no prompts were found in the Sentence Transformers configuration"))); + } + Some(prompts) if !prompts.contains_key(prompt_name) => { + return Err(TextEmbeddingsError::Validation(format!("`default-prompt-name` is set to `{prompt_name}` but it was not found in the Sentence Transformers prompts. Available prompts: {:?}", prompts.keys()))); + } + Some(prompts) => prompts.get(prompt_name).cloned(), + } + } else { + default_prompt + }; + Ok(pre_prompt) +} + +#[allow(clippy::too_many_arguments)] fn tokenize_input( - inputs: EncodingInput, + mut inputs: EncodingInput, add_special_tokens: bool, + max_input_length: usize, truncate_params: Option, + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, tokenizer: &mut Tokenizer, -) -> Result { +) -> Result<(Option, RawEncoding), TextEmbeddingsError> { + let pre_prompt = prepare_pre_prompt(default_prompt, prompt_name, prompts)?; + + let input_chars = inputs.count_chars(); + let limit = max_input_length * MAX_CHAR_MULTIPLIER; + if input_chars > limit { + if truncate_params.is_none() { + return Err(TextEmbeddingsError::Validation(format!( + "`inputs` must have less than {limit} characters. Given: {input_chars}" + ))); + } + inputs.apply_limit(limit); + } + let encoding = match inputs { // encode input - EncodingInput::Single(s) => tokenizer - .with_truncation(truncate_params)? - .encode::(s, add_special_tokens)?, - EncodingInput::Dual(s1, s2) => { - tokenizer + EncodingInput::Single(s) => { + let s = if let Some(mut pre_prompt) = pre_prompt { + pre_prompt.push_str(&s); + pre_prompt + } else { + s + }; + + let encoding = tokenizer .with_truncation(truncate_params)? - .encode::<(String, String)>((s1, s2), add_special_tokens)? + .encode::<&str>(&s, add_special_tokens)?; + + (Some(s), encoding) + } + EncodingInput::Dual(s1, s2) => { + if pre_prompt.is_some() { + return Err(TextEmbeddingsError::Validation( + "`prompt_name` cannot be set with dual inputs".to_string(), + )); + } + + ( + None, + tokenizer + .with_truncation(truncate_params)? + .encode::<(String, String)>((s1, s2), add_special_tokens)?, + ) } // input is encoded -> convert to tokenizers Encoding EncodingInput::Ids(ids) => { - let text = tokenizer.decode(&ids, false)?; - tokenizer - .with_truncation(truncate_params)? - .encode::(text, false)? + if let Some(mut pre_prompt) = pre_prompt { + let text = tokenizer.decode(&ids, true)?; + pre_prompt.push_str(&text); + + let encoding = tokenizer + .with_truncation(truncate_params)? + .encode::<&str>(&pre_prompt, true)?; + + (Some(pre_prompt), encoding) + } else { + let text = tokenizer.decode(&ids, false)?; + + let encoding = tokenizer + .with_truncation(truncate_params)? + .encode::<&str>(&text, false)?; + + (Some(text), encoding) + } } }; Ok(encoding) } /// Get input length and optionally truncate it +#[allow(clippy::too_many_arguments)] fn encode_input( inputs: EncodingInput, truncate: bool, truncation_direction: TruncationDirection, max_input_length: usize, position_offset: usize, + default_prompt: Option, + prompt_name: Option, + prompts: Option<&HashMap>, tokenizer: &mut Tokenizer, ) -> Result { // Default truncation params @@ -269,7 +372,16 @@ fn encode_input( stride: 0, }); - let encoding = tokenize_input(inputs, true, truncate_params, tokenizer)?; + let (_, encoding) = tokenize_input( + inputs, + true, + max_input_length, + truncate_params, + default_prompt, + prompt_name, + prompts, + tokenizer, + )?; let seq_len = encoding.len(); if seq_len > max_input_length { @@ -277,7 +389,8 @@ fn encode_input( "`inputs` must have less than {max_input_length} tokens. Given: {seq_len}" ))); } - metrics::histogram!("te_request_input_length", seq_len as f64); + let histogram = metrics::histogram!("te_request_input_length"); + histogram.record(seq_len as f64); Ok(ValidEncoding { input_ids: encoding.get_ids().to_vec(), token_type_ids: encoding.get_type_ids().to_vec(), @@ -308,6 +421,33 @@ impl EncodingInput { EncodingInput::Ids(v) => v.is_empty(), } } + + fn count_chars(&self) -> usize { + match self { + EncodingInput::Single(s) => s.chars().count(), + EncodingInput::Dual(s1, s2) => s1.chars().count() + s2.chars().count(), + EncodingInput::Ids(v) => v.len(), + } + } + + fn apply_limit(&mut self, limit: usize) { + let truncate_string = |s: &mut String, limit: usize| { + if s.is_char_boundary(limit) { + s.truncate(limit) + } + }; + + match self { + EncodingInput::Single(s) => { + truncate_string(s, limit); + } + EncodingInput::Dual(s1, s2) => { + truncate_string(s1, limit / 2); + truncate_string(s2, limit / 2); + } + EncodingInput::Ids(_) => {} + } + } } impl From for EncodingInput { @@ -327,13 +467,15 @@ enum TokenizerRequest { EncodingInput, bool, TruncationDirection, + Option, oneshot::Sender>, Span, ), Tokenize( EncodingInput, bool, - oneshot::Sender>, + Option, + oneshot::Sender, RawEncoding), TextEmbeddingsError>>, Span, ), Decode( diff --git a/docs/openapi.json b/docs/openapi.json index 7368145e..f12811d3 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -10,7 +10,7 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.2.3" + "version": "1.5.1" }, "paths": { "/decode": { @@ -19,7 +19,6 @@ "Text Embeddings Inference" ], "summary": "Decode input ids", - "description": "Decode input ids", "operationId": "decode", "requestBody": { "content": { @@ -65,7 +64,6 @@ "Text Embeddings Inference" ], "summary": "Get Embeddings. Returns a 424 status code if the model is not an embedding model.", - "description": "Get Embeddings. Returns a 424 status code if the model is not an embedding model.", "operationId": "embed", "requestBody": { "content": { @@ -153,7 +151,7 @@ "Text Embeddings Inference" ], "summary": "Get all Embeddings without Pooling.", - "description": "Get all Embeddings without Pooling.\nReturns a 424 status code if the model is not an embedding model.", + "description": "Returns a 424 status code if the model is not an embedding model.", "operationId": "embed_all", "requestBody": { "content": { @@ -241,7 +239,6 @@ "Text Embeddings Inference" ], "summary": "Get Sparse Embeddings. Returns a 424 status code if the model is not an embedding model with SPLADE pooling.", - "description": "Get Sparse Embeddings. Returns a 424 status code if the model is not an embedding model with SPLADE pooling.", "operationId": "embed_sparse", "requestBody": { "content": { @@ -323,101 +320,12 @@ } } }, - "/embeddings": { - "post": { - "tags": [ - "Text Embeddings Inference" - ], - "summary": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", - "description": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", - "operationId": "openai_embed", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Embeddings", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatResponse" - } - } - } - }, - "413": { - "description": "Batch size error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Batch size error", - "type": "validation" - } - } - } - }, - "422": { - "description": "Tokenization error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Tokenization error", - "type": "tokenizer" - } - } - } - }, - "424": { - "description": "Embedding Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Inference failed", - "type": "backend" - } - } - } - }, - "429": { - "description": "Model is overloaded", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenAICompatErrorResponse" - }, - "example": { - "message": "Model is overloaded", - "type": "overloaded" - } - } - } - } - } - } - }, "/health": { "get": { "tags": [ "Text Embeddings Inference" ], "summary": "Health check method", - "description": "Health check method", "operationId": "health", "responses": { "200": { @@ -446,7 +354,6 @@ "Text Embeddings Inference" ], "summary": "Text Embeddings Inference endpoint info", - "description": "Text Embeddings Inference endpoint info", "operationId": "get_model_info", "responses": { "200": { @@ -468,7 +375,6 @@ "Text Embeddings Inference" ], "summary": "Prometheus metrics scrape endpoint", - "description": "Prometheus metrics scrape endpoint", "operationId": "metrics", "responses": { "200": { @@ -490,7 +396,6 @@ "Text Embeddings Inference" ], "summary": "Get Predictions. Returns a 424 status code if the model is not a Sequence Classification model", - "description": "Get Predictions. Returns a 424 status code if the model is not a Sequence Classification model", "operationId": "predict", "requestBody": { "content": { @@ -578,7 +483,7 @@ "Text Embeddings Inference" ], "summary": "Get Ranks. Returns a 424 status code if the model is not a Sequence Classification model with", - "description": "Get Ranks. Returns a 424 status code if the model is not a Sequence Classification model with\na single class.", + "description": "a single class.", "operationId": "rerank", "requestBody": { "content": { @@ -660,13 +565,99 @@ } } }, + "/similarity": { + "post": { + "tags": [ + "Text Embeddings Inference" + ], + "summary": "Get Sentence Similarity. Returns a 424 status code if the model is not an embedding model.", + "operationId": "similarity", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimilarityRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Sentence Similarity", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SimilarityResponse" + } + } + } + }, + "413": { + "description": "Batch size error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Batch size error", + "error_type": "validation" + } + } + } + }, + "422": { + "description": "Tokenization error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Tokenization error", + "error_type": "tokenizer" + } + } + } + }, + "424": { + "description": "Embedding Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Inference failed", + "error_type": "backend" + } + } + } + }, + "429": { + "description": "Model is overloaded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + }, + "example": { + "error": "Model is overloaded", + "error_type": "overloaded" + } + } + } + } + } + } + }, "/tokenize": { "post": { "tags": [ "Text Embeddings Inference" ], "summary": "Tokenize inputs", - "description": "Tokenize inputs", "operationId": "tokenize", "requestBody": { "content": { @@ -706,19 +697,18 @@ } } }, - "/vertex": { + "/v1/embeddings": { "post": { "tags": [ "Text Embeddings Inference" ], - "summary": "Generate embeddings from a Vertex request", - "description": "Generate embeddings from a Vertex request", - "operationId": "vertex_compatibility", + "summary": "OpenAI compatible route. Returns a 424 status code if the model is not an embedding model.", + "operationId": "openai_embed", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VertexRequest" + "$ref": "#/components/schemas/OpenAICompatRequest" } } }, @@ -726,18 +716,25 @@ }, "responses": { "200": { - "description": "Results" + "description": "Embeddings", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpenAICompatResponse" + } + } + } }, "413": { "description": "Batch size error", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Batch size error", - "error_type": "validation" + "message": "Batch size error", + "type": "validation" } } } @@ -747,25 +744,25 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Tokenization error", - "error_type": "tokenizer" + "message": "Tokenization error", + "type": "tokenizer" } } } }, "424": { - "description": "Error", + "description": "Embedding Error", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Inference failed", - "error_type": "backend" + "message": "Inference failed", + "type": "backend" } } } @@ -775,11 +772,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/OpenAICompatErrorResponse" }, "example": { - "error": "Model is overloaded", - "error_type": "overloaded" + "message": "Model is overloaded", + "type": "overloaded" } } } @@ -852,10 +849,26 @@ "inputs": { "$ref": "#/components/schemas/Input" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -895,10 +908,26 @@ "default": "true", "example": "true" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -928,10 +957,26 @@ "inputs": { "$ref": "#/components/schemas/Input" }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -944,6 +989,20 @@ } } }, + "Embedding": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "number", + "format": "float" + } + }, + { + "type": "string" + } + ] + }, "EmbeddingModel": { "type": "object", "required": [ @@ -956,6 +1015,13 @@ } } }, + "EncodingFormat": { + "type": "string", + "enum": [ + "float", + "base64" + ] + }, "ErrorResponse": { "type": "object", "required": [ @@ -991,10 +1057,14 @@ "max_input_length", "max_batch_tokens", "max_client_batch_size", + "auto_truncate", "tokenization_workers", "version" ], "properties": { + "auto_truncate": { + "type": "boolean" + }, "docker_label": { "type": "string", "example": "null", @@ -1065,12 +1135,12 @@ "Input": { "oneOf": [ { - "type": "string" + "$ref": "#/components/schemas/InputType" }, { "type": "array", "items": { - "type": "string" + "$ref": "#/components/schemas/InputType" } } ] @@ -1098,6 +1168,21 @@ } ] }, + "InputType": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "integer", + "format": "int32", + "minimum": 0 + } + } + ] + }, "ModelType": { "oneOf": [ { @@ -1144,16 +1229,7 @@ ], "properties": { "embedding": { - "type": "array", - "items": { - "type": "number", - "format": "float" - }, - "example": [ - 0.0, - 1.0, - 2.0 - ] + "$ref": "#/components/schemas/Embedding" }, "index": { "type": "integer", @@ -1193,6 +1269,14 @@ "input" ], "properties": { + "encoding_format": { + "allOf": [ + { + "$ref": "#/components/schemas/EncodingFormat" + } + ], + "default": "float" + }, "input": { "$ref": "#/components/schemas/Input" }, @@ -1317,7 +1401,16 @@ "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -1416,7 +1509,16 @@ "truncate": { "type": "boolean", "default": "false", - "example": "false" + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" } } }, @@ -1426,6 +1528,91 @@ "$ref": "#/components/schemas/Rank" } }, + "SimilarityInput": { + "type": "object", + "required": [ + "source_sentence", + "sentences" + ], + "properties": { + "sentences": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of strings which will be compared against the source_sentence.", + "example": [ + "What is Machine Learning?" + ] + }, + "source_sentence": { + "type": "string", + "description": "The string that you wish to compare the other strings with. This can be a phrase, sentence,\nor longer passage, depending on the model being used.", + "example": "What is Deep Learning?" + } + } + }, + "SimilarityParameters": { + "type": "object", + "required": [ + "truncation_direction" + ], + "properties": { + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true + }, + "truncate": { + "type": "boolean", + "default": "false", + "example": "false", + "nullable": true + }, + "truncation_direction": { + "allOf": [ + { + "$ref": "#/components/schemas/TruncationDirection" + } + ], + "default": "right" + } + } + }, + "SimilarityRequest": { + "type": "object", + "required": [ + "inputs" + ], + "properties": { + "inputs": { + "$ref": "#/components/schemas/SimilarityInput" + }, + "parameters": { + "allOf": [ + { + "$ref": "#/components/schemas/SimilarityParameters" + } + ], + "default": "null", + "nullable": true + } + } + }, + "SimilarityResponse": { + "type": "array", + "items": { + "type": "number", + "format": "float" + }, + "example": [ + 0.0, + 1.0, + 0.5 + ] + }, "SimpleToken": { "type": "object", "required": [ @@ -1479,6 +1666,19 @@ } } }, + "TokenizeInput": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, "TokenizeRequest": { "type": "object", "required": [ @@ -1491,7 +1691,14 @@ "example": "true" }, "inputs": { - "$ref": "#/components/schemas/Input" + "$ref": "#/components/schemas/TokenizeInput" + }, + "prompt_name": { + "type": "string", + "description": "The name of the prompt that should be used by for encoding. If not set, no prompt\nwill be applied.\n\nMust be a key in the `sentence-transformers` configuration `prompts` dictionary.\n\nFor example if ``prompt_name`` is \"query\" and the ``prompts`` is {\"query\": \"query: \", ...},\nthen the sentence \"What is the capital of France?\" will be encoded as\n\"query: What is the capital of France?\" because the prompt text will be prepended before\nany text to encode.", + "default": "null", + "example": "null", + "nullable": true } } }, @@ -1515,273 +1722,12 @@ ] ] }, - "VertexInstance": { - "oneOf": [ - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedAllRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed_all" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/EmbedSparseRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "embed_sparse" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/PredictRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "predict" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/RerankRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "rerank" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "$ref": "#/components/schemas/TokenizeRequest" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "tokenize" - ] - } - } - } - ] - } - ], - "discriminator": { - "propertyName": "type" - } - }, - "VertexRequest": { - "type": "object", - "required": [ - "instances" - ], - "properties": { - "instances": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VertexInstance" - } - } - } - }, - "VertexResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VertexResponseInstance" - } - }, - "VertexResponseInstance": { - "oneOf": [ - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedAllResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed_all" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/EmbedSparseResponse" - }, - "type": { - "type": "string", - "enum": [ - "embed_sparse" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/PredictResponse" - }, - "type": { - "type": "string", - "enum": [ - "predict" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/RerankResponse" - }, - "type": { - "type": "string", - "enum": [ - "rerank" - ] - } - } - }, - { - "type": "object", - "required": [ - "type", - "result" - ], - "properties": { - "result": { - "$ref": "#/components/schemas/TokenizeResponse" - }, - "type": { - "type": "string", - "enum": [ - "tokenize" - ] - } - } - } - ], - "discriminator": { - "propertyName": "type" - } + "TruncationDirection": { + "type": "string", + "enum": [ + "Left", + "Right" + ] } } }, diff --git a/docs/source/en/cli_arguments.md b/docs/source/en/cli_arguments.md index 5efa63cf..e25e60b7 100644 --- a/docs/source/en/cli_arguments.md +++ b/docs/source/en/cli_arguments.md @@ -62,9 +62,11 @@ Options: [env: POOLING=] Possible values: - - cls: Select the CLS token as embedding - - mean: Apply Mean pooling to the model embeddings - - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only available if the loaded model is a `ForMaskedLM` Transformer model + - cls: Select the CLS token as embedding + - mean: Apply Mean pooling to the model embeddings + - splade: Apply SPLADE (Sparse Lexical and Expansion) to the model embeddings. This option is only + available if the loaded model is a `ForMaskedLM` Transformer model + - last-token: Select the last token as embedding --max-concurrent-requests The maximum amount of concurrent requests for this particular deployment. @@ -98,6 +100,37 @@ Options: [env: MAX_CLIENT_BATCH_SIZE=] [default: 32] + --auto-truncate + Automatically truncate inputs that are longer than the maximum supported size + + Unused for gRPC servers + + [env: AUTO_TRUNCATE=] + + --default-prompt-name + The name of the prompt that should be used by default for encoding. If not set, no prompt will be applied. + + Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + + For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, then the + sentence "What is the capital of France?" will be encoded as "query: What is the capital of France?" because + the prompt text will be prepended before any text to encode. + + The argument '--default-prompt-name ' cannot be used with '--default-prompt ` + + [env: DEFAULT_PROMPT_NAME=] + + --default-prompt + The prompt that should be used by default for encoding. If not set, no prompt will be applied. + + For example if ``default_prompt`` is "query: " then the sentence "What is the capital of France?" will be + encoded as "query: What is the capital of France?" because the prompt text will be prepended before any text + to encode. + + The argument '--default-prompt ' cannot be used with '--default-prompt-name ` + + [env: DEFAULT_PROMPT=] + --hf-api-token Your HuggingFace hub token @@ -126,7 +159,7 @@ Options: The location of the huggingface hub cache. Used to override the location if you want to provide a mounted disk for instance - [env: HUGGINGFACE_HUB_CACHE=/data] + [env: HUGGINGFACE_HUB_CACHE=] --payload-limit Payload size limit in bytes @@ -139,7 +172,8 @@ Options: --api-key Set an api key for request authorization. - By default the server responds to every request. With an api key set, the requests must have the Authorization header set with the api key as Bearer token. + By default the server responds to every request. With an api key set, the requests must have the Authorization + header set with the api key as Bearer token. [env: API_KEY=] @@ -154,11 +188,13 @@ Options: [env: OTLP_ENDPOINT=] --otlp-service-name - The service name for opentelemetry. + The service name for opentelemetry. e.g. `text-embeddings-inference.server` [env: OTLP_SERVICE_NAME=] [default: text-embeddings-inference.server] --cors-allow-origin + Unused for gRPC servers + [env: CORS_ALLOW_ORIGIN=] ``` diff --git a/docs/source/en/private_models.md b/docs/source/en/private_models.md index bd9041c7..d11d66f3 100644 --- a/docs/source/en/private_models.md +++ b/docs/source/en/private_models.md @@ -24,10 +24,10 @@ Once you have confirmed that you have access to the model: - Navigate to your account's [Profile | Settings | Access Tokens page](https://huggingface.co/settings/tokens). - Generate and copy a read token. -If you're the CLI, set the `HUGGING_FACE_HUB_TOKEN` environment variable. For example: +If you're the CLI, set the `HF_API_TOKEN` environment variable. For example: ```shell -export HUGGING_FACE_HUB_TOKEN= +export HF_API_TOKEN= ``` Alternatively, you can provide the token when deploying the model with Docker: @@ -37,5 +37,5 @@ model= volume=$PWD/data token= -docker run --gpus all -e HUGGING_FACE_HUB_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -e HF_API_TOKEN=$token -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` diff --git a/docs/source/en/quick_tour.md b/docs/source/en/quick_tour.md index c0fe008c..aceb5674 100644 --- a/docs/source/en/quick_tour.md +++ b/docs/source/en/quick_tour.md @@ -31,15 +31,13 @@ Finally, deploy your model. Let's say you want to use `BAAI/bge-large-en-v1.5`. ```shell model=BAAI/bge-large-en-v1.5 -revision=refs/pr/5 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` -Here we pass a `revision=refs/pr/5` because the `safetensors` variant of this model is currently in a pull request. We also recommend sharing a volume with the Docker container (`volume=$PWD/data`) to avoid downloading weights every run. @@ -66,10 +64,9 @@ Let's say you want to use `BAAI/bge-reranker-large`: ```shell model=BAAI/bge-reranker-large -revision=refs/pr/4 volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model --revision $revision +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed a model, you can use the `rerank` endpoint to rank the similarity between a query and a list @@ -90,7 +87,7 @@ You can also use classic Sequence Classification models like `SamLowe/roberta-ba model=SamLowe/roberta-base-go_emotions volume=$PWD/data -docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.2 --model-id $model +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model ``` Once you have deployed the model you can use the `predict` endpoint to get the emotions most associated with an input: @@ -121,3 +118,26 @@ curl 127.0.0.1:8080/predict \ -d '{"inputs":[["I like you."], ["I hate pineapples"]]}' \ -H 'Content-Type: application/json' ``` + +## Air gapped deployment + +To deploy Text Embeddings Inference in an air-gapped environment, first download the weights and then mount them inside +the container using a volume. + +For example: + +```shell +# (Optional) create a `models` directory +mkdir models +cd models + +# Make sure you have git-lfs installed (https://git-lfs.com) +git lfs install +git clone https://huggingface.co/Alibaba-NLP/gte-base-en-v1.5 + +# Set the models directory as the volume path +volume=$PWD + +# Mount the models directory inside the container with a volume and set the model ID +docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id /data/gte-base-en-v1.5 +``` diff --git a/docs/source/en/supported_models.md b/docs/source/en/supported_models.md index 876e5d06..c5e1be85 100644 --- a/docs/source/en/supported_models.md +++ b/docs/source/en/supported_models.md @@ -20,19 +20,21 @@ We are continually expanding our support for other model types and plan to inclu ## Supported embeddings models -Text Embeddings Inference currently supports BERT, CamemBERT, XLM-RoBERTa models with absolute positions and JinaBERT -model with Alibi positions. +Text Embeddings Inference currently supports Nomic, BERT, CamemBERT, XLM-RoBERTa models with absolute positions, JinaBERT +model with Alibi positions and Mistral, Alibaba GTE and Qwen2 models with Rope positions. Below are some examples of the currently supported models: -| MTEB Rank | Model Type | Model ID | -|-----------|--------------|--------------------------------------------------------------------------------------------------| -| 6 | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | -| 10 | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | -| N/A | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | -| N/A | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jniaai/jina-embeddings-v2-base-code) | +| MTEB Rank | Model Size | Model Type | Model ID | +|-----------|----------------|-------------|--------------------------------------------------------------------------------------------------| +| 1 | 7B (Very Slow) | Mistral | [Salesforce/SFR-Embedding-2_R](https://hf.co/Salesforce/SFR-Embedding-2_R) | +| 15 | 0.4B | Alibaba GTE | [Alibaba-NLP/gte-large-en-v1.5](Alibaba-NLP/gte-large-en-v1.5) | +| 20 | 0.3B | Bert | [WhereIsAI/UAE-Large-V1](https://hf.co/WhereIsAI/UAE-Large-V1) | +| 24 | 0.5B | XLM-RoBERTa | [intfloat/multilingual-e5-large-instruct](https://hf.co/intfloat/multilingual-e5-large-instruct) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1](https://hf.co/nomic-ai/nomic-embed-text-v1) | +| N/A | 0.1B | NomicBert | [nomic-ai/nomic-embed-text-v1.5](https://hf.co/nomic-ai/nomic-embed-text-v1.5) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-en](https://hf.co/jinaai/jina-embeddings-v2-base-en) | +| N/A | 0.1B | JinaBERT | [jinaai/jina-embeddings-v2-base-code](https://hf.co/jinaai/jina-embeddings-v2-base-code) | To explore the list of best performing text embeddings models, visit the @@ -64,13 +66,13 @@ Find the appropriate Docker image for your hardware in the following table: | Architecture | Image | |-------------------------------------|--------------------------------------------------------------------------| -| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.2 | +| CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 | | Volta | NOT SUPPORTED | -| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.2 (experimental) | -| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.2 | -| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.2 | -| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.2 | -| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.2 (experimental) | +| Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.5 (experimental) | +| Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.5 | +| Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.5 | +| Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.5 | +| Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.5 (experimental) | **Warning**: Flash Attention is turned off by default for the Turing image as it suffers from precision issues. You can turn Flash Attention v1 ON by using the `USE_FLASH_ATTENTION=True` environment variable. diff --git a/load_tests/load.js b/load_tests/load.js index b7e4524e..867f9fdb 100644 --- a/load_tests/load.js +++ b/load_tests/load.js @@ -2,7 +2,7 @@ import {check} from 'k6'; import http from 'k6/http'; import {Trend} from 'k6/metrics'; -const host = __ENV.HOST || '127.0.0.1:8080'; +const host = __ENV.HOST || '127.0.0.1:3000'; const totalTime = new Trend('total_time', true); const tokenizationTIme = new Trend('tokenization_time', true); @@ -27,7 +27,7 @@ export const options = { executor: 'constant-arrival-rate', duration: '30s', preAllocatedVUs: 5000, - rate: 1000, + rate: 50, timeUnit: '1s', gracefulStop: '1s', }, @@ -36,8 +36,9 @@ export const options = { export default function () { const payload = JSON.stringify({ - query: inputs, - texts: [inputs], + inputs: inputs, + // query: inputs, + // texts: [inputs], truncate: true, }); diff --git a/load_tests/load_grpc.js b/load_tests/load_grpc.js index bce6834e..30d2676a 100644 --- a/load_tests/load_grpc.js +++ b/load_tests/load_grpc.js @@ -2,7 +2,7 @@ import {check} from 'k6'; import grpc from 'k6/experimental/grpc'; import {Trend} from 'k6/metrics'; -const host = __ENV.HOST || '127.0.0.1:8080'; +const host = __ENV.HOST || '127.0.0.1:3000'; const totalTime = new Trend('total_time', true); const tokenizationTIme = new Trend('tokenization_time', true); @@ -25,7 +25,7 @@ export const options = { // }, load_test: { executor: 'constant-arrival-rate', - duration: '30s', + duration: '5m', preAllocatedVUs: 5000, rate: 1000, timeUnit: '1s', diff --git a/proto/tei.proto b/proto/tei.proto index 394c0262..aac6c2ba 100644 --- a/proto/tei.proto +++ b/proto/tei.proto @@ -79,6 +79,7 @@ message EmbedRequest { bool truncate = 2; bool normalize = 3; TruncationDirection truncation_direction = 4; + optional string prompt_name = 5; } message EmbedResponse { @@ -90,6 +91,7 @@ message EmbedSparseRequest { string inputs = 1; bool truncate = 2; TruncationDirection truncation_direction = 3; + optional string prompt_name = 4; } message SparseValue { @@ -106,6 +108,7 @@ message EmbedAllRequest { string inputs = 1; bool truncate = 2; TruncationDirection truncation_direction = 3; + optional string prompt_name = 4; } message TokenEmbedding { @@ -175,6 +178,7 @@ message RerankResponse { message EncodeRequest { string inputs = 1; bool add_special_tokens = 2; + optional string prompt_name = 3; } message SimpleToken { diff --git a/router/Cargo.toml b/router/Cargo.toml index 2f2b0815..e648036b 100644 --- a/router/Cargo.toml +++ b/router/Cargo.toml @@ -15,38 +15,39 @@ name = "text-embeddings-router" path = "src/main.rs" [dependencies] -anyhow = "1.0.71" +anyhow = { workspace = true } text-embeddings-backend = { path = "../backends", features = ["clap"] } text-embeddings-core = { path = "../core" } -clap = { version = "4.1.4", features = ["derive", "env"] } +clap = { workspace = true } futures = "^0.3" -init-tracing-opentelemetry = { version = "0.14.1", features = ["opentelemetry-otlp"] } -hf-hub = { version = "0.3.0", features = ["tokio"] } +init-tracing-opentelemetry = { version = "0.18.1", features = ["opentelemetry-otlp"] } +hf-hub = { workspace = true } http = "1.0.0" -num_cpus = "1.16.0" -metrics = "0.21.0" -metrics-exporter-prometheus = { version = "0.12.1", features = [] } -opentelemetry = { version = "0.20.0", features = ["rt-tokio"] } -opentelemetry-otlp = "0.13.0" -reqwest = { version = "0.11.14", features = [] } -serde = "1.0.152" -serde_json = "1.0.93" -thiserror = "1.0.38" -tokenizers = { version = "0.19.1", default-features=false, features=["onig", "esaxx_fast"] } -tokio = { version = "1.25.0", features = ["rt", "rt-multi-thread", "parking_lot", "signal", "sync"] } -tracing = "0.1.37" -tracing-opentelemetry = "0.21.0" +num_cpus = { workspace = true } +metrics = { workspace = true } +metrics-exporter-prometheus = { version = "0.15.1", features = [] } +opentelemetry = "0.23.0" +opentelemetry_sdk = { version = "0.23.0", features = ["rt-tokio"] } +opentelemetry-otlp = "0.16.0" +reqwest = { version = "0.12.5", features = [] } +simsimd = "4.4.0" +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokenizers = { workspace = true } +tokio = { workspace = true } +tracing = { workspace = true } +tracing-opentelemetry = "0.24.0" tracing-subscriber = { version = "0.3.16", features = ["json", "env-filter"] } veil = "0.1.6" -mimalloc = { version = "*", default-features = false } # HTTP dependencies axum = { version = "0.7.4", features = ["json"], optional = true } -axum-tracing-opentelemetry = { version = "0.17.0", optional = true } -base64 = { version = "0.21.4", optional = true } +axum-tracing-opentelemetry = { version = "0.18.1", optional = true } +base64 = { version = "0.22.1", optional = true } tower-http = { version = "0.5.1", features = ["cors"], optional = true } utoipa = { version = "4.2", features = ["axum_extras"], optional = true } -utoipa-swagger-ui = { version = "6.0", features = ["axum"], optional = true } +utoipa-swagger-ui = { version = "7.1", features = ["axum"], optional = true } # gRPC dependencies async-stream = { version = "0.3.5", optional = true } @@ -56,14 +57,21 @@ tonic-health = { version = "0.11.0", optional = true } tonic-reflection = { version = "0.11.0", optional = true } tokio-stream = { version = "0.1.14", optional = true } +# Malloc trim hack for linux +[target.'cfg(target_os = "linux")'.dependencies] +libc = "0.2.149" +# else use mimalloc +[target.'cfg(not(target_os = "linux"))'.dependencies] +mimalloc = { version = "*", features = ["no_thp"] } + [dev-dependencies] insta = { git = "https://github.com/OlivierDehaene/insta", rev = "f4f98c0410b91fb5a28b10df98e4422955be9c2c", features = ["yaml"] } is_close = "0.1.3" -reqwest = { version = "0.11.22", features = ["json"] } +reqwest = { version = "0.12.5", features = ["json"] } [build-dependencies] vergen = { version = "8.0.0", features = ["build", "git", "gitcl"] } -tonic-build = { version = "0.10.2", optional = true } +tonic-build = { version = "0.11.0", optional = true } [features] default = ["candle", "http"] @@ -74,6 +82,7 @@ mkl = ["text-embeddings-backend/mkl"] mkl-dynamic = ["text-embeddings-backend/mkl-dynamic"] accelerate = ["text-embeddings-backend/accelerate"] python = ["text-embeddings-backend/python"] +ort = ["text-embeddings-backend/ort"] candle = ["text-embeddings-backend/candle"] candle-cuda = ["candle", "text-embeddings-backend/flash-attn"] candle-cuda-turing = ["candle", "text-embeddings-backend/flash-attn-v1"] diff --git a/router/src/grpc/server.rs b/router/src/grpc/server.rs index 98ee5601..c3b34a8e 100644 --- a/router/src/grpc/server.rs +++ b/router/src/grpc/server.rs @@ -87,6 +87,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, request.normalize, permit, ) @@ -142,6 +143,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, permit, ) .await @@ -207,6 +209,7 @@ impl TextEmbeddingsService { request.inputs, request.truncate, truncation_direction, + request.prompt_name, permit, ) .await @@ -326,11 +329,17 @@ impl TextEmbeddingsService { #[instrument(skip_all)] async fn tokenize_inner(&self, request: EncodeRequest) -> Result { let inputs = request.inputs; - let encoding = self + let (encoded_inputs, encoding) = self .infer - .tokenize(inputs.clone(), request.add_special_tokens) + .tokenize( + inputs.clone(), + request.add_special_tokens, + request.prompt_name, + ) .await .map_err(ErrorResponse::from)?; + let inputs = encoded_inputs.unwrap_or(inputs); + let tokens: Vec = encoding .get_ids() .iter() @@ -589,7 +598,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -600,7 +610,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_pooled_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -629,7 +640,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -640,7 +652,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_sparse_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -669,7 +682,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -680,7 +694,8 @@ impl grpc::embed_server::Embed for TextEmbeddingsService { let (response, metadata) = self.embed_all_inner(request, permit).await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -713,7 +728,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let permit = self .infer @@ -733,7 +749,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -746,7 +763,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { &self, request: Request, ) -> Result, Status> { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let request = request.into_inner(); let mut inputs = request.inputs; @@ -782,7 +800,8 @@ impl grpc::predict_server::Predict for TextEmbeddingsService { .await?; let headers = HeaderMap::from(metadata); - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); Ok(Response::from_parts( MetadataMap::from_headers(headers), @@ -886,20 +905,23 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } match &self.info.model_type { ModelType::Classifier(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) } ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -937,7 +959,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { )) }; - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = request.texts.len(); if batch_size > self.info.max_client_batch_size { @@ -950,7 +973,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1015,7 +1039,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); let response_metadata = ResponseMetadata::new( total_compute_chars, @@ -1065,14 +1090,16 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { // Check model type match &self.info.model_type { ModelType::Classifier(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) } ModelType::Reranker(_) => Ok(()), ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a classifier model".to_string(); tracing::error!("{message}"); Err(Status::new(Code::FailedPrecondition, message)) @@ -1112,7 +1139,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { )) }; - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let mut request_stream = request.into_inner(); @@ -1261,7 +1289,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { error: message, error_type: ErrorType::Backend, }; - metrics::increment_counter!("te_request_failure", "err" => "missing_values"); + let counter = metrics::counter!("te_request_failure", "err" => "missing_values"); + counter.increment(1); Err(err)?; } @@ -1271,7 +1300,8 @@ impl grpc::rerank_server::Rerank for TextEmbeddingsService { let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); let response_metadata = ResponseMetadata::new( total_compute_chars, @@ -1504,6 +1534,7 @@ impl From for Status { ErrorType::Overloaded => Code::ResourceExhausted, ErrorType::Validation => Code::InvalidArgument, ErrorType::Tokenizer => Code::FailedPrecondition, + ErrorType::Empty => Code::InvalidArgument, }; Status::new(code, value.error) diff --git a/router/src/http/server.rs b/router/src/http/server.rs index 11b3a521..ae3d8a60 100644 --- a/router/src/http/server.rs +++ b/router/src/http/server.rs @@ -4,8 +4,10 @@ use crate::http::types::{ EmbedSparseRequest, EmbedSparseResponse, Embedding, EncodingFormat, Input, InputIds, InputType, OpenAICompatEmbedding, OpenAICompatErrorResponse, OpenAICompatRequest, OpenAICompatResponse, OpenAICompatUsage, PredictInput, PredictRequest, PredictResponse, Prediction, Rank, - RerankRequest, RerankResponse, Sequence, SimpleToken, SparseValue, TokenizeInput, - TokenizeRequest, TokenizeResponse, VertexPrediction, VertexRequest, VertexResponse, + RerankRequest, RerankResponse, Sequence, SimilarityInput, SimilarityParameters, + SimilarityRequest, SimilarityResponse, SimpleToken, SparseValue, TokenizeInput, + TokenizeRequest, TokenizeResponse, TruncationDirection, VertexPrediction, VertexRequest, + VertexResponse, }; use crate::{ shutdown, ClassifierModel, EmbeddingModel, ErrorResponse, ErrorType, Info, ModelType, @@ -25,6 +27,7 @@ use futures::future::join_all; use futures::FutureExt; use http::header::AUTHORIZATION; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; +use simsimd::SpatialSimilarity; use std::net::SocketAddr; use std::time::{Duration, Instant}; use text_embeddings_backend::BackendError; @@ -32,7 +35,6 @@ use text_embeddings_core::infer::{ AllEmbeddingsInferResponse, Infer, InferMetadata, PooledEmbeddingsInferResponse, }; use text_embeddings_core::TextEmbeddingsError; -use tokenizers::TruncationDirection; use tokio::sync::OwnedSemaphorePermit; use tower_http::cors::{AllowOrigin, CorsLayer}; use tracing::instrument; @@ -87,6 +89,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -118,7 +122,7 @@ async fn predict( .predict( inputs, truncate, - req.truncation_direction, + req.truncation_direction.into(), req.raw_scores, permit, ) @@ -163,14 +167,16 @@ async fn predict( let (response, metadata) = match req.inputs { PredictInput::Single(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = inputs.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let (prompt_tokens, tokenization, queue, inference, predictions) = predict_inner(inputs, truncate, infer.0, info.0, Some(permit)).await?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( PredictResponse::Single(predictions), @@ -185,7 +191,8 @@ async fn predict( ) } PredictInput::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = inputs.len(); if batch_size > info.max_client_batch_size { @@ -198,7 +205,8 @@ async fn predict( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -237,7 +245,8 @@ async fn predict( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( PredictResponse::Batch(predictions), @@ -278,6 +287,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -299,16 +310,18 @@ async fn rerank( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } match &info.model_type { ModelType::Reranker(_) => Ok(()), ModelType::Classifier(_) | ModelType::Embedding(_) => { - metrics::increment_counter!("te_request_failure", "err" => "model_type"); + let counter = metrics::counter!("te_request_failure", "err" => "model_type"); + counter.increment(1); let message = "model is not a re-ranker model".to_string(); Err(TextEmbeddingsError::Backend(BackendError::Inference( message, @@ -328,7 +341,7 @@ async fn rerank( .predict( (query, text), truncate, - req.truncation_direction, + req.truncation_direction.into(), req.raw_scores, permit, ) @@ -349,7 +362,8 @@ async fn rerank( let truncate = req.truncate.unwrap_or(info.auto_truncate); let (response, metadata) = { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); let batch_size = req.texts.len(); if batch_size > info.max_client_batch_size { @@ -362,7 +376,8 @@ async fn rerank( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -420,7 +435,8 @@ async fn rerank( let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( RerankResponse(ranks), @@ -445,6 +461,90 @@ async fn rerank( Ok((headers, Json(response))) } +/// Get Sentence Similarity. Returns a 424 status code if the model is not an embedding model. +#[utoipa::path( +post, +tag = "Text Embeddings Inference", +path = "/similarity", +request_body = SimilarityRequest, +responses( +(status = 200, description = "Sentence Similarity", body = SimilarityResponse), +(status = 424, description = "Embedding Error", body = ErrorResponse, +example = json ! ({"error": "Inference failed", "error_type": "backend"})), +(status = 429, description = "Model is overloaded", body = ErrorResponse, +example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), +(status = 422, description = "Tokenization error", body = ErrorResponse, +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), +) +)] +#[instrument( + skip_all, + fields(total_time, tokenization_time, queue_time, inference_time,) +)] +async fn similarity( + infer: Extension, + info: Extension, + Json(req): Json, +) -> Result<(HeaderMap, Json), (StatusCode, Json)> { + if req.inputs.sentences.is_empty() { + let message = "`inputs.sentences` cannot be empty".to_string(); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Empty, + }; + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); + Err(err)?; + } + // +1 because of the source sentence + let batch_size = req.inputs.sentences.len() + 1; + if batch_size > info.max_client_batch_size { + let message = format!( + "batch size {batch_size} > maximum allowed batch size {}", + info.max_client_batch_size + ); + tracing::error!("{message}"); + let err = ErrorResponse { + error: message, + error_type: ErrorType::Validation, + }; + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); + Err(err)?; + } + + // Convert request to embed request + let mut inputs = Vec::with_capacity(req.inputs.sentences.len() + 1); + inputs.push(InputType::String(req.inputs.source_sentence)); + for s in req.inputs.sentences { + inputs.push(InputType::String(s)); + } + let parameters = req.parameters.unwrap_or_default(); + let embed_req = EmbedRequest { + inputs: Input::Batch(inputs), + truncate: parameters.truncate, + truncation_direction: parameters.truncation_direction, + prompt_name: parameters.prompt_name, + normalize: false, + }; + + // Get embeddings + let (header_map, embed_response) = embed(infer, info, Json(embed_req)).await?; + let embeddings = embed_response.0 .0; + + // Compute cosine + let distances = (1..batch_size) + .map(|i| 1.0 - f32::cosine(&embeddings[0], &embeddings[i]).unwrap() as f32) + .collect(); + + Ok((header_map, Json(SimilarityResponse(distances)))) +} + /// Get Embeddings. Returns a 424 status code if the model is not an embedding model. #[utoipa::path( post, @@ -459,6 +559,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -479,7 +581,8 @@ async fn embed( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); @@ -488,14 +591,16 @@ async fn embed( .embed_pooled( input, truncate, - req.truncation_direction, + req.truncation_direction.into(), + req.prompt_name, req.normalize, permit, ) .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedResponse(vec![response.results]), @@ -510,16 +615,18 @@ async fn embed( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -534,7 +641,8 @@ async fn embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -545,13 +653,15 @@ async fn embed( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer .embed_pooled( input, truncate, - req.truncation_direction, + req.truncation_direction.into(), + prompt_name, req.normalize, permit, ) @@ -579,7 +689,8 @@ async fn embed( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedResponse(embeddings), @@ -619,6 +730,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -648,17 +761,25 @@ async fn embed_sparse( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_sparse(input, truncate, req.truncation_direction, permit) + .embed_sparse( + input, + truncate, + req.truncation_direction.into(), + req.prompt_name, + permit, + ) .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedSparseResponse(vec![sparsify(response.results)]), @@ -673,16 +794,18 @@ async fn embed_sparse( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -697,7 +820,8 @@ async fn embed_sparse( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -708,10 +832,17 @@ async fn embed_sparse( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; let response = local_infer - .embed_sparse(input, truncate, req.truncation_direction, permit) + .embed_sparse( + input, + truncate, + req.truncation_direction.into(), + prompt_name, + permit, + ) .await?; Ok((sparsify(response.results), response.metadata)) }) @@ -737,7 +868,8 @@ async fn embed_sparse( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedSparseResponse(embeddings), @@ -778,6 +910,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -798,17 +932,25 @@ async fn embed_all( let (response, metadata) = match req.inputs { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_all(input, truncate, req.truncation_direction, permit) + .embed_all( + input, + truncate, + req.truncation_direction.into(), + req.prompt_name, + permit, + ) .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); ( EmbedAllResponse(vec![response.results]), @@ -823,16 +965,18 @@ async fn embed_all( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -847,7 +991,8 @@ async fn embed_all( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -858,10 +1003,17 @@ async fn embed_all( compute_chars += input.count_chars(); let local_infer = infer.clone(); + let prompt_name = req.prompt_name.clone(); futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_all(input, truncate, req.truncation_direction, permit) + .embed_all( + input, + truncate, + req.truncation_direction.into(), + prompt_name, + permit, + ) .await }) } @@ -886,7 +1038,8 @@ async fn embed_all( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( EmbedAllResponse(embeddings), @@ -926,6 +1079,8 @@ example = json ! ({"message": "Inference failed", "type": "backend"})), example = json ! ({"message": "Model is overloaded", "type": "overloaded"})), (status = 422, description = "Tokenization error", body = OpenAICompatErrorResponse, example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = OpenAICompatErrorResponse, +example = json ! ({"message": "Batch is empty", "type": "empty"})), (status = 413, description = "Batch size error", body = OpenAICompatErrorResponse, example = json ! ({"message": "Batch size error", "type": "validation"})), ) @@ -962,17 +1117,26 @@ async fn openai_embed( let (embeddings, metadata) = match req.input { Input::Single(input) => { - metrics::increment_counter!("te_request_count", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let compute_chars = input.count_chars(); let permit = infer.try_acquire_permit().map_err(ErrorResponse::from)?; let response = infer - .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) + .embed_pooled( + input, + truncate, + tokenizers::TruncationDirection::Right, + None, + true, + permit, + ) .await .map_err(ErrorResponse::from)?; - metrics::increment_counter!("te_request_success", "method" => "single"); + let counter = metrics::counter!("te_request_count", "method" => "single"); + counter.increment(1); let embedding = encode_embedding(response.results); ( @@ -992,16 +1156,18 @@ async fn openai_embed( ) } Input::Batch(inputs) => { - metrics::increment_counter!("te_request_count", "method" => "batch"); + let counter = metrics::counter!("te_request_count", "method" => "batch"); + counter.increment(1); if inputs.is_empty() { let message = "`inputs` cannot be empty".to_string(); tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1016,7 +1182,8 @@ async fn openai_embed( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1030,7 +1197,14 @@ async fn openai_embed( futures.push(async move { let permit = local_infer.acquire_permit().await; local_infer - .embed_pooled(input, truncate, TruncationDirection::Right, true, permit) + .embed_pooled( + input, + truncate, + tokenizers::TruncationDirection::Right, + None, + true, + permit, + ) .await }) } @@ -1060,7 +1234,8 @@ async fn openai_embed( } let batch_size = batch_size as u64; - metrics::increment_counter!("te_request_success", "method" => "batch"); + let counter = metrics::counter!("te_request_success", "method" => "batch"); + counter.increment(1); ( embeddings, @@ -1104,8 +1279,12 @@ path = "/tokenize", request_body = TokenizeRequest, responses( (status = 200, description = "Tokenized ids", body = TokenizeResponse), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), (status = 422, description = "Tokenization error", body = ErrorResponse, -example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), ) )] #[instrument(skip_all)] @@ -1114,11 +1293,16 @@ async fn tokenize( info: Extension, Json(req): Json, ) -> Result, (StatusCode, Json)> { - let tokenize_inner = move |input: String, add_special_tokens: bool, infer: Infer| async move { - let encoding = infer - .tokenize(input.clone(), add_special_tokens) + let tokenize_inner = move |input: String, + add_special_tokens: bool, + prompt_name: Option, + infer: Infer| async move { + let (encoded_input, encoding) = infer + .tokenize(input.clone(), add_special_tokens, prompt_name) .await .map_err(ErrorResponse::from)?; + let input = encoded_input.unwrap_or(input); + let tokens: Vec = encoding .get_ids() .iter() @@ -1153,7 +1337,7 @@ async fn tokenize( let tokens = match req.inputs { TokenizeInput::Single(input) => { - vec![tokenize_inner(input, req.add_special_tokens, infer.0).await?] + vec![tokenize_inner(input, req.add_special_tokens, req.prompt_name, infer.0).await?] } TokenizeInput::Batch(inputs) => { if inputs.is_empty() { @@ -1161,9 +1345,10 @@ async fn tokenize( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1178,7 +1363,8 @@ async fn tokenize( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1187,6 +1373,7 @@ async fn tokenize( futures.push(tokenize_inner( input, req.add_special_tokens, + req.prompt_name.clone(), infer.0.clone(), )); } @@ -1208,8 +1395,12 @@ path = "/decode", request_body = DecodeRequest, responses( (status = 200, description = "Decoded ids", body = DecodeResponse), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), +(status = 413, description = "Batch size error", body = ErrorResponse, +example = json ! ({"error": "Batch size error", "error_type": "validation"})), (status = 422, description = "Tokenization error", body = ErrorResponse, -example = json ! ({"message": "Tokenization error", "type": "tokenizer"})), +example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), ) )] #[instrument(skip_all)] @@ -1234,9 +1425,10 @@ async fn decode( tracing::error!("{message}"); let err = ErrorResponse { error: message, - error_type: ErrorType::Validation, + error_type: ErrorType::Empty, }; - metrics::increment_counter!("te_request_failure", "err" => "validation"); + let counter = metrics::counter!("te_request_failure", "err" => "validation"); + counter.increment(1); Err(err)?; } @@ -1251,7 +1443,8 @@ async fn decode( error: message, error_type: ErrorType::Validation, }; - metrics::increment_counter!("te_request_failure", "err" => "batch_size"); + let counter = metrics::counter!("te_request_failure", "err" => "batch_size"); + counter.increment(1); Err(err)?; } @@ -1283,6 +1476,8 @@ example = json ! ({"error": "Inference failed", "error_type": "backend"})), example = json ! ({"error": "Model is overloaded", "error_type": "overloaded"})), (status = 422, description = "Tokenization error", body = ErrorResponse, example = json ! ({"error": "Tokenization error", "error_type": "tokenizer"})), +(status = 400, description = "Batch is empty", body = ErrorResponse, +example = json ! ({"error": "Batch is empty", "error_type": "empty"})), (status = 413, description = "Batch size error", body = ErrorResponse, example = json ! ({"error": "Batch size error", "error_type": "validation"})), ) @@ -1385,6 +1580,7 @@ pub async fn run( embed_all, embed_sparse, openai_embed, + similarity, tokenize, decode, metrics, @@ -1396,6 +1592,8 @@ pub async fn run( Info, ModelType, ClassifierModel, + Embedding, + EncodingFormat, EmbeddingModel, PredictRequest, Prediction, @@ -1419,6 +1617,11 @@ pub async fn run( TokenizeInput, TokenizeRequest, TokenizeResponse, + TruncationDirection, + SimilarityInput, + SimilarityParameters, + SimilarityRequest, + SimilarityResponse, SimpleToken, InputType, InputIds, @@ -1444,16 +1647,23 @@ pub async fn run( // map to go inside the option and then map to parse from String to HeaderValue // Finally, convert to AllowOrigin let allow_origin: Option = cors_allow_origin.map(|cors_allow_origin| { - AllowOrigin::list( - cors_allow_origin - .into_iter() - .map(|origin| origin.parse::().unwrap()), - ) + if cors_allow_origin.iter().any(|origin| origin == "*") { + AllowOrigin::any() + } else { + AllowOrigin::list( + cors_allow_origin + .into_iter() + .map(|origin| origin.parse::().unwrap()), + ) + } }); - let prom_handle = prom_builder - .install_recorder() - .context("failed to install metrics recorder")?; + // See: https://github.com/metrics-rs/metrics/issues/467#issuecomment-2022755151 + let (recorder, _) = prom_builder + .build() + .context("failed to build prometheus recorder")?; + let prom_handle = recorder.handle(); + metrics::set_global_recorder(recorder).context("Failed to set global recorder")?; // CORS layer let allow_origin = allow_origin.unwrap_or(AllowOrigin::any()); @@ -1483,9 +1693,7 @@ pub async fn run( ApiDoc::openapi() }; - // Create router - let mut app = Router::new() - .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) + let mut routes = Router::new() // Base routes .route("/info", get(get_model_info)) .route("/embed", post(embed)) @@ -1493,13 +1701,17 @@ pub async fn run( .route("/embed_sparse", post(embed_sparse)) .route("/predict", post(predict)) .route("/rerank", post(rerank)) + .route("/similarity", post(similarity)) .route("/tokenize", post(tokenize)) .route("/decode", post(decode)) // OpenAI compat route .route("/embeddings", post(openai_embed)) .route("/v1/embeddings", post(openai_embed)) // Vertex compat route - .route("/vertex", post(vertex_compatibility)) + .route("/vertex", post(vertex_compatibility)); + + #[allow(unused_mut)] + let mut public_routes = Router::new() // Base Health route .route("/health", get(health)) // Inference API health route @@ -1507,9 +1719,7 @@ pub async fn run( // AWS Sagemaker health route .route("/ping", get(health)) // Prometheus metrics route - .route("/metrics", get(metrics)) - // Update payload limit - .layer(DefaultBodyLimit::max(payload_limit)); + .route("/metrics", get(metrics)); #[cfg(feature = "google")] { @@ -1517,35 +1727,44 @@ pub async fn run( if let Ok(env_predict_route) = std::env::var("AIP_PREDICT_ROUTE") { tracing::info!("Serving Vertex compatible route on {env_predict_route}"); - app = app.route(&env_predict_route, post(vertex_compatibility)); + routes = routes.route(&env_predict_route, post(vertex_compatibility)); } if let Ok(env_health_route) = std::env::var("AIP_HEALTH_ROUTE") { tracing::info!("Serving Vertex compatible health route on {env_health_route}"); - app = app.route(&env_health_route, get(health)); + public_routes = public_routes.route(&env_health_route, get(health)); } } #[cfg(not(feature = "google"))] { // Set default routes - app = match &info.model_type { + routes = match &info.model_type { ModelType::Classifier(_) => { - app.route("/", post(predict)) + routes + .route("/", post(predict)) // AWS Sagemaker route .route("/invocations", post(predict)) } ModelType::Reranker(_) => { - app.route("/", post(rerank)) + routes + .route("/", post(rerank)) // AWS Sagemaker route .route("/invocations", post(rerank)) } ModelType::Embedding(model) => { - if model.pooling == "splade" { - app.route("/", post(embed_sparse)) + if std::env::var("TASK").ok() == Some("sentence-similarity".to_string()) { + routes + .route("/", post(similarity)) + // AWS Sagemaker route + .route("/invocations", post(similarity)) + } else if model.pooling == "splade" { + routes + .route("/", post(embed_sparse)) // AWS Sagemaker route .route("/invocations", post(embed_sparse)) } else { - app.route("/", post(embed)) + routes + .route("/", post(embed)) // AWS Sagemaker route .route("/invocations", post(embed)) } @@ -1553,16 +1772,8 @@ pub async fn run( }; } - app = app - .layer(Extension(infer)) - .layer(Extension(info)) - .layer(Extension(prom_handle.clone())) - .layer(OtelAxumLayer::default()) - .layer(cors_layer); - if let Some(api_key) = api_key { - let mut prefix = "Bearer ".to_string(); - prefix.push_str(&api_key); + let prefix = format!("Bearer {}", api_key); // Leak to allow FnMut let api_key: &'static str = prefix.leak(); @@ -1579,9 +1790,20 @@ pub async fn run( } }; - app = app.layer(axum::middleware::from_fn(auth)); + routes = routes.layer(axum::middleware::from_fn(auth)); } + let app = Router::new() + .merge(SwaggerUi::new("/docs").url("/api-doc/openapi.json", doc)) + .merge(routes) + .merge(public_routes) + .layer(Extension(infer)) + .layer(Extension(info)) + .layer(Extension(prom_handle.clone())) + .layer(OtelAxumLayer::default()) + .layer(DefaultBodyLimit::max(payload_limit)) + .layer(cors_layer); + // Run server let listener = tokio::net::TcpListener::bind(&addr) .await @@ -1606,6 +1828,7 @@ impl From<&ErrorType> for StatusCode { ErrorType::Overloaded => StatusCode::TOO_MANY_REQUESTS, ErrorType::Tokenizer => StatusCode::UNPROCESSABLE_ENTITY, ErrorType::Validation => StatusCode::PAYLOAD_TOO_LARGE, + ErrorType::Empty => StatusCode::BAD_REQUEST, } } } diff --git a/router/src/http/types.rs b/router/src/http/types.rs index a2a773e8..60122888 100644 --- a/router/src/http/types.rs +++ b/router/src/http/types.rs @@ -4,7 +4,6 @@ use serde::{de, Deserialize, Deserializer, Serialize}; use serde_json::json; use std::fmt::Formatter; use text_embeddings_core::tokenization::EncodingInput; -use tokenizers::TruncationDirection; use utoipa::openapi::{RefOr, Schema}; use utoipa::ToSchema; @@ -194,6 +193,22 @@ impl<'__s> ToSchema<'__s> for PredictInput { } } +#[derive(Debug, Clone, Copy, PartialEq, Deserialize, ToSchema, Eq, Default)] +pub(crate) enum TruncationDirection { + Left, + #[default] + Right, +} + +impl From for tokenizers::TruncationDirection { + fn from(value: TruncationDirection) -> Self { + match value { + TruncationDirection::Left => Self::Left, + TruncationDirection::Right => Self::Right, + } + } +} + #[derive(Deserialize, ToSchema)] pub(crate) struct PredictRequest { pub inputs: PredictInput, @@ -262,6 +277,7 @@ pub(crate) enum InputType { String(String), Ids(Vec), } + impl InputType { pub(crate) fn count_chars(&self) -> usize { match self { @@ -270,6 +286,7 @@ impl InputType { } } } + impl From for EncodingInput { fn from(value: InputType) -> Self { match value { @@ -278,6 +295,7 @@ impl From for EncodingInput { } } } + #[derive(Deserialize, ToSchema)] #[serde(untagged)] pub(crate) enum Input { @@ -342,6 +360,49 @@ pub(crate) struct OpenAICompatResponse { pub usage: OpenAICompatUsage, } +#[derive(Deserialize, ToSchema)] +pub(crate) struct SimilarityInput { + /// The string that you wish to compare the other strings with. This can be a phrase, sentence, + /// or longer passage, depending on the model being used. + #[schema(example = "What is Deep Learning?")] + pub source_sentence: String, + /// A list of strings which will be compared against the source_sentence. + #[schema(example = json!(["What is Machine Learning?"]))] + pub sentences: Vec, +} + +#[derive(Deserialize, ToSchema, Default)] +pub(crate) struct SimilarityParameters { + #[schema(default = "false", example = "false", nullable = true)] + pub truncate: Option, + #[serde(default)] + #[schema(default = "right", example = "right")] + pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, +} + +#[derive(Deserialize, ToSchema)] +pub(crate) struct SimilarityRequest { + pub inputs: SimilarityInput, + /// Additional inference parameters for Sentence Similarity + #[schema(default = "null", example = "null", nullable = true)] + pub parameters: Option, +} + +#[derive(Serialize, ToSchema)] +#[schema(example = json!([0.0, 1.0, 0.5]))] +pub(crate) struct SimilarityResponse(pub Vec); + #[derive(Deserialize, ToSchema)] pub(crate) struct EmbedRequest { pub inputs: Input, @@ -351,6 +412,17 @@ pub(crate) struct EmbedRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, #[serde(default = "default_normalize")] #[schema(default = "true", example = "true")] pub normalize: bool, @@ -373,6 +445,17 @@ pub(crate) struct EmbedSparseRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } #[derive(Serialize, ToSchema)] @@ -393,6 +476,17 @@ pub(crate) struct EmbedAllRequest { #[serde(default)] #[schema(default = "right", example = "right")] pub truncation_direction: TruncationDirection, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } #[derive(Serialize, ToSchema)] @@ -420,6 +514,17 @@ pub(crate) struct TokenizeRequest { #[serde(default = "default_add_special_tokens")] #[schema(default = "true", example = "true")] pub add_special_tokens: bool, + /// The name of the prompt that should be used by for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + #[schema(default = "null", example = "null", nullable = true)] + pub prompt_name: Option, } fn default_add_special_tokens() -> bool { diff --git a/router/src/lib.rs b/router/src/lib.rs index d2023515..b7b214e6 100644 --- a/router/src/lib.rs +++ b/router/src/lib.rs @@ -26,15 +26,18 @@ use std::fs; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::path::Path; use std::time::{Duration, Instant}; -use text_embeddings_backend::DType; +use text_embeddings_backend::{DType, Pool}; use text_embeddings_core::download::{ - download_artifacts, download_pool_config, download_st_config, ST_CONFIG_NAMES, + download_artifacts, download_new_st_config, download_pool_config, download_st_config, + ST_CONFIG_NAMES, }; use text_embeddings_core::infer::Infer; use text_embeddings_core::queue::Queue; use text_embeddings_core::tokenization::Tokenization; use text_embeddings_core::TextEmbeddingsError; -use tokenizers::Tokenizer; +use tokenizers::processors::sequence::Sequence; +use tokenizers::processors::template::TemplateProcessing; +use tokenizers::{PostProcessorWrapper, Tokenizer}; use tracing::Span; pub use logging::init_logging; @@ -52,6 +55,8 @@ pub async fn run( max_batch_requests: Option, max_client_batch_size: usize, auto_truncate: bool, + default_prompt: Option, + default_prompt_name: Option, hf_api_token: Option, hostname: Option, port: u16, @@ -86,11 +91,20 @@ pub async fn run( // Optionally download the pooling config. if pooling.is_none() { // If a pooling config exist, download it - let _ = download_pool_config(&api_repo).await; + let _ = download_pool_config(&api_repo).await.map_err(|err| { + tracing::warn!("Download failed: {err}"); + err + }); } - // Download sentence transformers config + // Download legacy sentence transformers config + // We don't warn on failure as it is a legacy file let _ = download_st_config(&api_repo).await; + // Download new sentence transformers config + let _ = download_new_st_config(&api_repo).await.map_err(|err| { + tracing::warn!("Download failed: {err}"); + err + }); // Download model from the Hub download_artifacts(&api_repo) @@ -139,6 +153,28 @@ pub async fn run( "tokenizer.json not found. text-embeddings-inference only supports fast tokenizers", ); tokenizer.with_padding(None); + // Qwen2 updates the post processor manually instead of into the tokenizer.json... + // https://huggingface.co/Alibaba-NLP/gte-Qwen2-1.5B-instruct/blob/main/tokenization_qwen.py#L246 + if config.model_type == "qwen2" { + let template = TemplateProcessing::builder() + .try_single("$A:0 <|endoftext|>:0") + .unwrap() + .try_pair("$A:0 <|endoftext|>:0 $B:1 <|endoftext|>:1") + .unwrap() + .special_tokens(vec![("<|endoftext|>", 151643)]) + .build() + .unwrap(); + match tokenizer.get_post_processor() { + None => tokenizer.with_post_processor(template), + Some(post_processor) => { + let post_processor = Sequence::new(vec![ + post_processor.clone(), + PostProcessorWrapper::Template(template), + ]); + tokenizer.with_post_processor(post_processor) + } + }; + } // Position IDs offset. Used for Roberta and camembert. let position_offset = if &config.model_type == "xlm-roberta" @@ -169,7 +205,31 @@ pub async fn run( }; tracing::info!("Maximum number of tokens per request: {max_input_length}"); - let tokenization_workers = tokenization_workers.unwrap_or_else(num_cpus::get_physical); + let tokenization_workers = tokenization_workers.unwrap_or_else(num_cpus::get); + + // Try to load new ST Config + let mut new_st_config: Option = None; + let config_path = model_root.join("config_sentence_transformers.json"); + if let Ok(config) = fs::read_to_string(config_path) { + new_st_config = Some( + serde_json::from_str(&config) + .context("Failed to parse `config_sentence_transformers.json`")?, + ); + } + let prompts = new_st_config.and_then(|c| c.prompts); + let default_prompt = if let Some(default_prompt_name) = default_prompt_name.as_ref() { + match &prompts { + None => { + anyhow::bail!(format!("`default-prompt-name` is set to `{default_prompt_name}` but no prompts were found in the Sentence Transformers configuration")); + } + Some(prompts) if !prompts.contains_key(default_prompt_name) => { + anyhow::bail!(format!("`default-prompt-name` is set to `{default_prompt_name}` but it was not found in the Sentence Transformers prompts. Available prompts: {:?}", prompts.keys())); + } + Some(prompts) => prompts.get(default_prompt_name).cloned(), + } + } else { + default_prompt + }; // Tokenization logic let tokenization = Tokenization::new( @@ -177,19 +237,12 @@ pub async fn run( tokenizer, max_input_length, position_offset, + default_prompt, + prompts, ); // Get dtype - let dtype = dtype.unwrap_or({ - #[cfg(any(feature = "accelerate", feature = "mkl", feature = "mkl-dynamic"))] - { - DType::Float32 - } - #[cfg(not(any(feature = "accelerate", feature = "mkl", feature = "mkl-dynamic")))] - { - DType::Float16 - } - }); + let dtype = dtype.unwrap_or_default(); // Create backend tracing::info!("Starting model backend"); @@ -207,6 +260,14 @@ pub async fn run( .await .context("Model backend is not healthy")?; + if !backend.padded_model { + tracing::info!("Warming up model"); + backend + .warmup(max_input_length, max_batch_tokens, max_batch_requests) + .await + .context("Model backend is not healthy")?; + } + let max_batch_requests = backend .max_batch_size .map(|s| { @@ -289,7 +350,7 @@ pub async fn run( api_key, cors_allow_origin, ) - .await?; + .await } #[cfg(feature = "grpc")] @@ -297,10 +358,8 @@ pub async fn run( // cors_allow_origin and payload_limit are not used for gRPC servers let _ = cors_allow_origin; let _ = payload_limit; - grpc::server::run(infer, info, addr, prom_builder, api_key).await?; + grpc::server::run(infer, info, addr, prom_builder, api_key).await } - - Ok(()) } fn get_backend_model_type( @@ -335,15 +394,20 @@ fn get_backend_model_type( None => { // Load pooling config let config_path = model_root.join("1_Pooling/config.json"); - let config = fs::read_to_string(config_path).context("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model.")?; - let config: PoolConfig = - serde_json::from_str(&config).context("Failed to parse `1_Pooling/config.json`")?; - if config.pooling_mode_cls_token { - text_embeddings_backend::Pool::Cls - } else if config.pooling_mode_mean_tokens { - text_embeddings_backend::Pool::Mean - } else { - return Err(anyhow!("Pooling config {config:?} is not supported")); + + match fs::read_to_string(config_path) { + Ok(config) => { + let config: PoolConfig = serde_json::from_str(&config) + .context("Failed to parse `1_Pooling/config.json`")?; + Pool::try_from(config)? + } + Err(err) => { + if !config.model_type.to_lowercase().contains("bert") { + return Err(err).context("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model."); + } + tracing::warn!("The `--pooling` arg is not set and we could not find a pooling configuration (`1_Pooling/config.json`) for this model but the model is a BERT variant. Defaulting to `CLS` pooling."); + text_embeddings_backend::Pool::Cls + } } } }; @@ -366,8 +430,25 @@ pub struct ModelConfig { pub struct PoolConfig { pooling_mode_cls_token: bool, pooling_mode_mean_tokens: bool, - pooling_mode_max_tokens: bool, - pooling_mode_mean_sqrt_len_tokens: bool, + #[serde(default)] + pooling_mode_lasttoken: bool, +} + +impl TryFrom for Pool { + type Error = anyhow::Error; + + fn try_from(config: PoolConfig) -> std::result::Result { + if config.pooling_mode_cls_token { + return Ok(Pool::Cls); + } + if config.pooling_mode_mean_tokens { + return Ok(Pool::Mean); + } + if config.pooling_mode_lasttoken { + return Ok(Pool::LastToken); + } + Err(anyhow!("Pooling config {config:?} is not supported")) + } } #[derive(Debug, Deserialize)] @@ -375,6 +456,11 @@ pub struct STConfig { pub max_seq_length: usize, } +#[derive(Debug, Deserialize)] +pub struct NewSTConfig { + pub prompts: Option>, +} + #[derive(Clone, Debug, Serialize)] #[cfg_attr(feature = "http", derive(utoipa::ToSchema))] pub struct EmbeddingModel { @@ -448,6 +534,7 @@ pub enum ErrorType { Overloaded, Validation, Tokenizer, + Empty, } #[derive(Serialize)] @@ -512,19 +599,14 @@ impl ResponseMetadata { fn record_metrics(&self) { // Metrics - metrics::histogram!( - "te_request_duration", - self.start_time.elapsed().as_secs_f64() - ); - metrics::histogram!( - "te_request_tokenization_duration", - self.tokenization_time.as_secs_f64() - ); - metrics::histogram!("te_request_queue_duration", self.queue_time.as_secs_f64()); - metrics::histogram!( - "te_request_inference_duration", - self.inference_time.as_secs_f64() - ); + let histogram = metrics::histogram!("te_request_duration"); + histogram.record(self.start_time.elapsed().as_secs_f64()); + let histogram = metrics::histogram!("te_request_tokenization_duration"); + histogram.record(self.tokenization_time.as_secs_f64()); + let histogram = metrics::histogram!("te_request_queue_duration"); + histogram.record(self.queue_time.as_secs_f64()); + let histogram = metrics::histogram!("te_request_inference_duration"); + histogram.record(self.inference_time.as_secs_f64()); } } diff --git a/router/src/logging.rs b/router/src/logging.rs index 7d5eb11e..7a8fe810 100644 --- a/router/src/logging.rs +++ b/router/src/logging.rs @@ -1,8 +1,8 @@ -use opentelemetry::sdk::propagation::TraceContextPropagator; -use opentelemetry::sdk::trace::Sampler; -use opentelemetry::sdk::{trace, Resource}; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::propagation::TraceContextPropagator; +use opentelemetry_sdk::trace::Sampler; +use opentelemetry_sdk::{trace, Resource}; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::{EnvFilter, Layer}; @@ -48,7 +48,7 @@ pub fn init_logging( )])) .with_sampler(Sampler::AlwaysOn), ) - .install_batch(opentelemetry::runtime::Tokio); + .install_batch(opentelemetry_sdk::runtime::Tokio); if let Ok(tracer) = tracer { layers.push(tracing_opentelemetry::layer().with_tracer(tracer).boxed()); diff --git a/router/src/main.rs b/router/src/main.rs index 2cdc7095..67fb76c7 100644 --- a/router/src/main.rs +++ b/router/src/main.rs @@ -1,12 +1,12 @@ use anyhow::Result; use clap::Parser; -use mimalloc::MiMalloc; use opentelemetry::global; use text_embeddings_backend::DType; use veil::Redact; +#[cfg(not(target_os = "linux"))] #[global_allocator] -static GLOBAL: MiMalloc = MiMalloc; +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; /// App Configuration #[derive(Parser, Redact)] @@ -14,10 +14,10 @@ static GLOBAL: MiMalloc = MiMalloc; struct Args { /// The name of the model to load. /// Can be a MODEL_ID as listed on like - /// `thenlper/gte-base`. + /// `BAAI/bge-large-en-v1.5`. /// Or it can be a local directory containing the necessary files /// as saved by `save_pretrained(...)` methods of transformers - #[clap(default_value = "thenlper/gte-base", long, env)] + #[clap(default_value = "BAAI/bge-large-en-v1.5", long, env)] #[redact(partial)] model_id: String, @@ -79,6 +79,33 @@ struct Args { #[clap(long, env)] auto_truncate: bool, + /// The name of the prompt that should be used by default for encoding. If not set, no prompt + /// will be applied. + /// + /// Must be a key in the `sentence-transformers` configuration `prompts` dictionary. + /// + /// For example if ``default_prompt_name`` is "query" and the ``prompts`` is {"query": "query: ", ...}, + /// then the sentence "What is the capital of France?" will be encoded as + /// "query: What is the capital of France?" because the prompt text will be prepended before + /// any text to encode. + /// + /// The argument '--default-prompt-name ' cannot be used with + /// '--default-prompt ` + #[clap(long, env, conflicts_with = "default_prompt")] + default_prompt_name: Option, + + /// The prompt that should be used by default for encoding. If not set, no prompt + /// will be applied. + /// + /// For example if ``default_prompt`` is "query: " then the sentence "What is the capital of + /// France?" will be encoded as "query: What is the capital of France?" because the prompt + /// text will be prepended before any text to encode. + /// + /// The argument '--default-prompt ' cannot be used with + /// '--default-prompt-name ` + #[clap(long, env, conflicts_with = "default_prompt_name")] + default_prompt: Option, + /// Your HuggingFace hub token #[clap(long, env)] #[redact(partial)] @@ -147,6 +174,20 @@ async fn main() -> Result<()> { tracing::info!("{args:?}"); + // Hack to trim pages regularly + // see: https://www.algolia.com/blog/engineering/when-allocators-are-hoarding-your-precious-memory/ + // and: https://github.com/huggingface/text-embeddings-inference/issues/156 + #[cfg(target_os = "linux")] + tokio::spawn(async move { + use tokio::time::Duration; + loop { + tokio::time::sleep(Duration::from_millis(100)).await; + unsafe { + libc::malloc_trim(0); + } + } + }); + text_embeddings_router::run( args.model_id, args.revision, @@ -158,6 +199,8 @@ async fn main() -> Result<()> { args.max_batch_requests, args.max_client_batch_size, args.auto_truncate, + args.default_prompt, + args.default_prompt_name, args.hf_api_token, Some(args.hostname), args.port, diff --git a/router/src/shutdown.rs b/router/src/shutdown.rs index 471eaf14..15fc8ea7 100644 --- a/router/src/shutdown.rs +++ b/router/src/shutdown.rs @@ -25,5 +25,4 @@ pub(crate) async fn shutdown_signal() { } tracing::info!("signal received, starting graceful shutdown"); - opentelemetry::global::shutdown_tracer_provider(); } diff --git a/router/tests/common.rs b/router/tests/common.rs index c8669c12..55fdf5f5 100644 --- a/router/tests/common.rs +++ b/router/tests/common.rs @@ -58,6 +58,8 @@ pub async fn start_server(model_id: String, revision: Option, dtype: DTy false, None, None, + None, + None, 8090, None, None, diff --git a/router/tests/test_http_predict.rs b/router/tests/test_http_predict.rs index 6869f721..850e0874 100644 --- a/router/tests/test_http_predict.rs +++ b/router/tests/test_http_predict.rs @@ -16,12 +16,13 @@ pub struct SnapshotPrediction { #[tokio::test] #[cfg(feature = "http")] async fn test_predict() -> Result<()> { - start_server( - "SamLowe/roberta-base-go_emotions".to_string(), - None, - DType::Float32, - ) - .await?; + let model_id = if cfg!(feature = "ort") { + "SamLowe/roberta-base-go_emotions-onnx" + } else { + "SamLowe/roberta-base-go_emotions" + }; + + start_server(model_id.to_string(), None, DType::Float32).await?; let request = json!({ "inputs": "test" diff --git a/router/tests/test_http_rerank.rs b/router/tests/test_http_rerank.rs index 0c5b6079..920eca4d 100644 --- a/router/tests/test_http_rerank.rs +++ b/router/tests/test_http_rerank.rs @@ -17,12 +17,7 @@ pub struct SnapshotRank { #[tokio::test] #[cfg(feature = "http")] async fn test_rerank() -> Result<()> { - start_server( - "BAAI/bge-reranker-base".to_string(), - Some("refs/pr/5".to_string()), - DType::Float32, - ) - .await?; + start_server("BAAI/bge-reranker-base".to_string(), None, DType::Float32).await?; let request = json!({ "query": "test",