-
Notifications
You must be signed in to change notification settings - Fork 77
ML-based Anomaly Detection for data content #990
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
vb-dbrks
wants to merge
121
commits into
main
Choose a base branch
from
957-ml-has_no_anomaly
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
121 commits
Select commit
Hold shift + click to select a range
c54e18e
feat: isolation forest based has_no_anomaly
vb-dbrks b41ead1
feat: changed to using sklearn
vb-dbrks 0f7b1c4
tests: int tests
vb-dbrks 472cc7e
demo: demo notebook updated
vb-dbrks 1dc4c6b
bug fixes on Algorithm naming, feature importance, drift warning etc
vb-dbrks 172fef4
feat: progressive api for setup complexity
vb-dbrks 0214d88
fix: tests
vb-dbrks 3fada9b
fix: explainability and tests
vb-dbrks aa79dda
bug: model drift detection and yaml check tests, model name and uri i…
vb-dbrks 830c8b5
fix: integration tests with feature scaling
vb-dbrks 30029cc
feat: feature scaling with robust scaler for long tails
vb-dbrks bce81fa
fix: integration tests
vb-dbrks 352b198
feat: mlflow model registration updates
vb-dbrks a8d2b6f
fix: merg_cols added back
vb-dbrks e1e3bb3
feat: auto-discovery (heuristics and profile based)
vb-dbrks 76db51c
fix: column selection and model baseline statistics
vb-dbrks dba8860
cleanup
vb-dbrks 0bed8a0
fmt
vb-dbrks 3aa27c5
fmt
vb-dbrks b2e3149
fmt
vb-dbrks 04a272c
fmt
vb-dbrks 9af5be0
refactor: helper functions, dead code, formatting
vb-dbrks d8096a9
fmt: fixed a ton of formatting issues
vb-dbrks 788b676
fix: merge_columns are always provided and validated
vb-dbrks 7eaf71e
bug fixes, optimisation, code formatting, documentation, tests
vb-dbrks 55b712f
bug fix: model registry
vb-dbrks 3646c1d
performance improvements for demp and documentation
vb-dbrks f91c7eb
demo: bug fixes
vb-dbrks f21e397
feat: improve pk and fk key identification
vb-dbrks d74ba0b
fix: collision on model registry table + test fixes
vb-dbrks 2ad4354
fix+fmt: demo, tests and code fomatting
vb-dbrks 22b0161
fix: integration tests, fixtures
vb-dbrks c1e01ba
fix: integration tests and demo
vb-dbrks 90d9416
refactoring: code complexity.
vb-dbrks 61facae
fix: mlflow artifact path to name change and demo updates, integratio…
vb-dbrks b528f21
fix: mlflow warnings and deprecation
vb-dbrks 1db8c4f
fix: demo
vb-dbrks 598b830
feat: improve message and feature contributions + _info column renami…
vb-dbrks e163607
feat: update anomaly detection examples and enhance documentation and…
vb-dbrks b0cba9a
feat: enhance anomaly detection configuration and auto-discovery logi…
vb-dbrks 70cec2d
cleanup: removed nightly markers and makefile changes
vb-dbrks a2743ef
fix and test improvements: improvements to shared fixtures
vb-dbrks e898209
chore: enhance anomaly detection documentation with detailed drift de…
vb-dbrks 2450aaa
feat: update anomaly detection demos and documentation, enhance model…
vb-dbrks 3d757b7
feat: update anomaly detection demo and documentation, adjust default…
vb-dbrks 4d4a743
fix: update anomaly detection demo with improved markdown formatting …
vb-dbrks 2837586
fix and docs: ci and docs issue + unit tests
vb-dbrks d6cec1b
fmt: minor import for mlflow issue
vb-dbrks 5b94b06
fmt: removing overrides
vb-dbrks 91cab17
feat: add telemetry logging for anomaly detection checks and training…
vb-dbrks 269abba
fix: remove dataset rule registration decorator from anomaly check fu…
vb-dbrks 23574b7
fix: update exception handling to catch all exceptions for anomaly de…
vb-dbrks 08cbefa
feat: integrate Azure authentication and environment variable setup f…
vb-dbrks 5df0360
feat: remove outdated anomaly detection demo notebook and add corresp…
vb-dbrks 37fcef5
fmt
vb-dbrks ce05754
test: fixes to int and e2e
vb-dbrks 5ced589
test fix for int tests
vb-dbrks 732cd24
Merge branch 'main' into 957-ml-has_no_anomaly
mwojtyczka 71cfc9b
chore: update dependencies and enhance MLflow configuration for anoma…
vb-dbrks d3144bd
Merge branch 'main' into 957-ml-has_no_anomaly
mwojtyczka e147e84
fix: update MLFLOW_TRACKING_URI in CI workflows and enhance feature e…
vb-dbrks 29fae5b
Merge branch '957-ml-has_no_anomaly' of https://github.com/databricks…
vb-dbrks 4620ce6
fmt
vb-dbrks 59303e7
refactor: Set MLFLOW_TRACKING_URI and MLFLOW_REGISTRY_URI directly in…
vb-dbrks ad0f9e9
chore: update anomaly dependency and add azure-cli auth type to CI wo…
vb-dbrks eac5842
chore: Azure authentication in CI workflows
vb-dbrks a67907d
test: checking a different approach
vb-dbrks bcc6f82
trial 2: minimal
vb-dbrks bf3da2b
test3
vb-dbrks af19080
test4: DATABRICKS_HOST env variable set
vb-dbrks 361fa35
fix: integration test config
vb-dbrks 211d2cf
fix: testing workaround for mlflow with dummy databrickscfg
vb-dbrks de9cd03
fix: mlflow experiment_id
vb-dbrks 416a77f
fix: create schema fixture for anomaly tests
vb-dbrks 5f661b0
fix: udf self contained for datbaricks-connect
vb-dbrks 430084d
fmt: code formatting fixes and pytest ignore for files for udfs
vb-dbrks 9407ae1
fix: Correct SHAP value calculation for single-feature models and ref…
vb-dbrks 9caab66
fix+feat: anomaly test split and simplification
vb-dbrks 54d70de
fix: dorny/pathfilter to git diff
vb-dbrks 5f4e9e8
fix: pytest filters and mlflow fixture
vb-dbrks de596f0
refactor: delay TreeSHAP explainer creation until needed in anomaly c…
vb-dbrks c50175b
fix: glob pattern
vb-dbrks 3bd00b0
refactor: enhance anomaly detection UDFs with improved SHAP contribut…
vb-dbrks 334a511
refactor: streamline SHAP value computation in anomaly detection UDFs…
vb-dbrks b36031b
refactor: change spark fixture to session-scoped for improved paralle…
vb-dbrks caf46f4
refactor: enhance anomaly detection profiling and training functions …
vb-dbrks dd2dc4b
refactor: improve column shuffling logic in anomaly trainer by introd…
vb-dbrks 04bdbbf
debug
vb-dbrks b0ed20b
debug
vb-dbrks 1ee0796
mlflow debug
vb-dbrks fce341e
debug mlflow xdist pytest n 0
vb-dbrks 0faa67f
refactor: Inject WorkspaceClient as a fixture argument into anomaly t…
vb-dbrks 1ff4831
fix: databricks-sdk to install dependencies for anomal detection
vb-dbrks c49ac53
debug: pytest_collection_modifyitems for preinstallation step
vb-dbrks 4bd6061
fmt
vb-dbrks cca504f
fmt
vb-dbrks 1b578f7
xdist controller only install
vb-dbrks 28f8f37
fix: re-enable all but integration_anomaly
vb-dbrks 7dea5e7
fix: driver_only mode for databricks connect compatibility
vb-dbrks 9785215
fix: flaky tests
vb-dbrks 1f81a90
Merge branch 'main' into 957-ml-has_no_anomaly
mwojtyczka 56920d8
Update demos/dqx_anomaly_detection_101_demo.py
vb-dbrks 543bcb9
fix: improve handling of empty segments and is_not_null errors in ano…
vb-dbrks 18d8231
fix:max_by instead of first to join back the _info
vb-dbrks 605f08a
refactor: enhance anomaly testing framework and CI configuration
vb-dbrks 43f013a
chore: update anomaly workflow and refactor test fixtures
vb-dbrks e0a03e4
refactor: remove HAS_ANOMALY checks from test fixtures
vb-dbrks 2e9dfad
refactor: streamline anomaly engine fixture and clean up integration …
vb-dbrks b23d533
refactor: improve MLflow tracking configuration in integration tests
vb-dbrks 3df1196
refactor: reorganize anomaly test structure and update configurations
vb-dbrks a546aa1
debug
vb-dbrks c47cc67
feat: add DATABRICKS_WAREHOUSE_ID to GitHub Actions workflow
vb-dbrks dbad305
refactor: enhance anomaly detection workflow and documentation
vb-dbrks b446f7a
fix: demo
vb-dbrks 7686342
test fixes
vb-dbrks a6af046
refactor: enhance anomaly detection demo and improve documentation
vb-dbrks d798c64
refactor: enhance dataframe equality assertions in integration tests
vb-dbrks 09c1fc5
refactor: update anomaly detection parameters and enhance demo
vb-dbrks 27b7abe
refactor: pytest:numba compatilbity root conftest.py removed. adding …
vb-dbrks adef56f
fmt
vb-dbrks c3bbcbd
refactor: enhance GitHub Actions and local testing for DQX library re…
vb-dbrks File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -70,6 +70,7 @@ jobs: | |
| ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }} | ||
| ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }} | ||
| COVERAGE_FILE: ${{ github.workspace }}/.coverage # make sure the coverage report is preserved | ||
| PYTEST_ADDOPTS: "--ignore=tests/integration_anomaly/" # Exclude anomaly tests (run separately in anomaly workflow) | ||
|
|
||
| - name: Merge coverage reports and convert them to XML | ||
| run: | | ||
|
|
@@ -129,6 +130,7 @@ jobs: | |
| ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }} | ||
| DATABRICKS_SERVERLESS_COMPUTE_ID: ${{ env.DATABRICKS_SERVERLESS_COMPUTE_ID }} | ||
| COVERAGE_FILE: ${{ github.workspace }}/.coverage # make sure the coverage report is preserved | ||
| PYTEST_ADDOPTS: "--ignore=tests/integration_anomaly/" # Exclude anomaly tests (run separately in anomaly workflow) | ||
|
|
||
| - name: Merge coverage reports and convert them to XML | ||
| run: | | ||
|
|
@@ -189,7 +191,7 @@ jobs: | |
| timeout: 2h | ||
| codegen_path: tests/e2e/.codegen.json | ||
| env: | ||
| REF_NAME: ${{ github.ref_name }} # NOTE: end-to-end tests use this to pip install from the current PR branch | ||
| REF_NAME: ${{ github.head_ref || github.ref_name }} # NOTE: end-to-end tests use this to pip install from the current PR branch (head_ref for PRs, ref_name for push events) | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }} | ||
| ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }} | ||
|
|
@@ -245,7 +247,7 @@ jobs: | |
| timeout: 2h | ||
| codegen_path: tests/e2e/.codegen.json | ||
| env: | ||
| REF_NAME: ${{ github.ref_name }} # NOTE: end-to-end tests use this to pip install from the current PR branch | ||
| REF_NAME: ${{ github.head_ref || github.ref_name }} # NOTE: end-to-end tests use this to pip install from the current PR branch (head_ref for PRs, ref_name for push events) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why do we need this change? |
||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }} | ||
| ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }} | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,209 @@ | ||
| name: anomaly | ||
|
|
||
| on: | ||
| pull_request: | ||
| types: [ opened, synchronize, ready_for_review ] | ||
| merge_group: | ||
| types: [ checks_requested ] | ||
| push: | ||
| branches: | ||
| - main | ||
|
|
||
| permissions: | ||
| id-token: write | ||
| contents: read | ||
| pull-requests: write | ||
|
|
||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: false # don't cancel ongoing runs to ensure fixtures are completed and resources terminated | ||
|
|
||
| jobs: | ||
| anomaly-tests: | ||
| if: github.event_name == 'pull_request' && !github.event.pull_request.draft && !github.event.pull_request.head.repo.fork | ||
| environment: tool | ||
| runs-on: larger | ||
| steps: | ||
| - name: Checkout Code | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Install Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| cache: 'pip' | ||
| cache-dependency-path: '**/pyproject.toml' | ||
| python-version: '3.12' | ||
|
|
||
| - name: Install hatch | ||
| run: pip install hatch==1.15.0 | ||
|
|
||
| # Anomaly tests are run from within tests/integration_anomaly folder. | ||
| # Create .coveragerc with correct relative path to source code. | ||
| - name: Prepare code coverage configuration for anomaly tests | ||
| run: | | ||
| cat > tests/integration_anomaly/.coveragerc << EOF | ||
| [run] | ||
| source = ../../../src | ||
| parallel = true | ||
| relative_files = true | ||
| EOF | ||
|
|
||
| - name: Azure login (OIDC) | ||
| uses: azure/login@v2 | ||
| with: | ||
| client-id: ${{ secrets.ARM_CLIENT_ID }} | ||
| tenant-id: ${{ secrets.ARM_TENANT_ID }} | ||
| allow-no-subscriptions: true | ||
|
|
||
| - name: Set env vars for Azure CLI auth + MLflow | ||
| shell: bash | ||
| run: | | ||
| val=$(az keyvault secret show --id "${{ secrets.VAULT_URI }}/secrets/DATABRICKS-HOST" --query value -o tsv) | ||
| # Ensure host has https:// prefix (SDK and MLflow expect full URL) | ||
| if [[ ! "$val" =~ ^https?:// ]]; then | ||
| val="https://$val" | ||
| fi | ||
| # Workaround for MLflow OIDC auth: MLflow requires a profile to exist even when it uses SDK auth. | ||
| dummy_profile="${RUNNER_TEMP}/databricks_profile" | ||
| cat > "$dummy_profile" << EOF | ||
| [DEFAULT] | ||
| host = $val | ||
| token = dummy | ||
| EOF | ||
| echo "DATABRICKS_HOST=$val" >> $GITHUB_ENV | ||
| # Set cluster ID without printing to logs | ||
| echo "DATABRICKS_CLUSTER_ID=$(az keyvault secret show --id "${{ secrets.VAULT_URI }}/secrets/DATABRICKS-CLUSTER-ID" --query value -o tsv)" >> $GITHUB_ENV | ||
| # Set warehouse ID without printing to logs | ||
| echo "DATABRICKS_WAREHOUSE_ID=$(az keyvault secret show --id "${{ secrets.VAULT_URI }}/secrets/DATABRICKS-WAREHOUSE-ID" --query value -o tsv)" >> $GITHUB_ENV | ||
| echo "DATABRICKS_AUTH_TYPE=azure-cli" >> $GITHUB_ENV | ||
| echo "DATABRICKS_CONFIG_FILE=$dummy_profile" >> $GITHUB_ENV | ||
|
|
||
| # MLflow: Use databricks scheme so MLflow uses SDK auth (with dummy profile present). | ||
| echo "MLFLOW_ENABLE_DB_SDK=true" >> $GITHUB_ENV | ||
| echo "MLFLOW_TRACKING_URI=databricks" >> $GITHUB_ENV | ||
| echo "MLFLOW_REGISTRY_URI=databricks-uc" >> $GITHUB_ENV | ||
|
|
||
| - name: Run anomaly integration tests and generate test coverage report | ||
| timeout-minutes: 120 | ||
| env: | ||
| COVERAGE_FILE: ${{ github.workspace }}/.coverage | ||
| DATABRICKS_HOST: ${{ env.DATABRICKS_HOST }} | ||
| DATABRICKS_CLUSTER_ID: ${{ env.DATABRICKS_CLUSTER_ID }} | ||
| DATABRICKS_WAREHOUSE_ID: ${{ env.DATABRICKS_WAREHOUSE_ID }} | ||
| DATABRICKS_AUTH_TYPE: ${{ env.DATABRICKS_AUTH_TYPE }} | ||
| DATABRICKS_CONFIG_FILE: ${{ env.DATABRICKS_CONFIG_FILE }} | ||
| MLFLOW_ENABLE_DB_SDK: "true" | ||
| MLFLOW_TRACKING_URI: ${{ env.MLFLOW_TRACKING_URI }} | ||
| MLFLOW_REGISTRY_URI: "databricks-uc" | ||
| MLFLOW_HTTP_REQUEST_TIMEOUT: "600" | ||
| MLFLOW_HTTP_REQUEST_MAX_RETRIES: "10" | ||
| run: | | ||
| hatch run pytest tests/integration_anomaly/ -v -rs -n 10 --cov --cov-report=xml --timeout=1200 --reruns 2 --reruns-delay 5 | ||
|
|
||
| - name: Merge coverage reports and convert them to XML | ||
| if: ${{ false }} # disabled temporarily | ||
| run: | | ||
| hatch run combine_coverage | ||
|
|
||
| # Recursively search the entire workspace directory for all coverage reports. | ||
| # All uploaded test coverage reports will be used even if publish is done multiple time. | ||
| - name: Publish test coverage | ||
| if: ${{ false }} # disabled temporarily | ||
| uses: codecov/codecov-action@v5 | ||
| with: | ||
| use_oidc: true | ||
|
|
||
| anomaly-tests-serverless: | ||
| if: github.event_name == 'pull_request' && !github.event.pull_request.draft && !github.event.pull_request.head.repo.fork | ||
| environment: tool | ||
| runs-on: larger | ||
| steps: | ||
| - name: Checkout Code | ||
| uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Install Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| cache: 'pip' | ||
| cache-dependency-path: '**/pyproject.toml' | ||
| python-version: '3.12' | ||
|
|
||
| - name: Install hatch | ||
| run: pip install hatch==1.15.0 | ||
|
|
||
| # Anomaly tests are run from within tests/integration_anomaly folder. | ||
| # Create .coveragerc with correct relative path to source code. | ||
| - name: Prepare code coverage configuration for anomaly tests | ||
| run: | | ||
| cat > tests/integration_anomaly/.coveragerc << EOF | ||
| [run] | ||
| source = ../../../src | ||
| parallel = true | ||
| relative_files = true | ||
| EOF | ||
|
|
||
| - name: Azure login (OIDC) | ||
| uses: azure/login@v2 | ||
| with: | ||
| client-id: ${{ secrets.ARM_CLIENT_ID }} | ||
| tenant-id: ${{ secrets.ARM_TENANT_ID }} | ||
| allow-no-subscriptions: true | ||
|
|
||
| - name: Set env vars for Azure CLI auth + MLflow | ||
| shell: bash | ||
| run: | | ||
| val=$(az keyvault secret show --id "${{ secrets.VAULT_URI }}/secrets/DATABRICKS-HOST" --query value -o tsv) | ||
| # Ensure host has https:// prefix (SDK and MLflow expect full URL) | ||
| if [[ ! "$val" =~ ^https?:// ]]; then | ||
| val="https://$val" | ||
| fi | ||
| # Workaround for MLflow OIDC auth: MLflow requires a profile to exist even when it uses SDK auth. | ||
| dummy_profile="${RUNNER_TEMP}/databricks_profile" | ||
| cat > "$dummy_profile" << EOF | ||
| [DEFAULT] | ||
| host = $val | ||
| token = dummy | ||
| EOF | ||
| echo "DATABRICKS_HOST=$val" >> $GITHUB_ENV | ||
| echo "DATABRICKS_AUTH_TYPE=azure-cli" >> $GITHUB_ENV | ||
| echo "DATABRICKS_CONFIG_FILE=$dummy_profile" >> $GITHUB_ENV | ||
| # Set warehouse ID without printing to logs | ||
| echo "DATABRICKS_WAREHOUSE_ID=$(az keyvault secret show --id "${{ secrets.VAULT_URI }}/secrets/DATABRICKS-WAREHOUSE-ID" --query value -o tsv)" >> $GITHUB_ENV | ||
|
|
||
| # MLflow: Use databricks scheme so MLflow uses SDK auth (with dummy profile present). | ||
| echo "MLFLOW_ENABLE_DB_SDK=true" >> $GITHUB_ENV | ||
| echo "MLFLOW_TRACKING_URI=databricks" >> $GITHUB_ENV | ||
| echo "MLFLOW_REGISTRY_URI=databricks-uc" >> $GITHUB_ENV | ||
|
|
||
| - name: Run anomaly integration tests on serverless cluster | ||
| timeout-minutes: 120 | ||
| env: | ||
| COVERAGE_FILE: ${{ github.workspace }}/.coverage | ||
| DATABRICKS_SERVERLESS_COMPUTE_ID: auto | ||
| DATABRICKS_HOST: ${{ env.DATABRICKS_HOST }} | ||
| DATABRICKS_WAREHOUSE_ID: ${{ env.DATABRICKS_WAREHOUSE_ID }} | ||
| DATABRICKS_AUTH_TYPE: ${{ env.DATABRICKS_AUTH_TYPE }} | ||
| DATABRICKS_CONFIG_FILE: ${{ env.DATABRICKS_CONFIG_FILE }} | ||
| MLFLOW_ENABLE_DB_SDK: "true" | ||
| MLFLOW_TRACKING_URI: ${{ env.MLFLOW_TRACKING_URI }} | ||
| MLFLOW_REGISTRY_URI: "databricks-uc" | ||
| MLFLOW_HTTP_REQUEST_TIMEOUT: "600" | ||
| MLFLOW_HTTP_REQUEST_MAX_RETRIES: "10" | ||
| run: | | ||
| hatch run pytest tests/integration_anomaly/ -v -rs -n 10 --cov --cov-report=xml --timeout=1200 --reruns 2 --reruns-delay 5 | ||
|
|
||
| - name: Merge coverage reports and convert them to XML | ||
| if: ${{ false }} # disabled temporarily | ||
| run: | | ||
| hatch run combine_coverage | ||
|
|
||
| # collects all coverage reports | ||
| - name: Publish test coverage | ||
| if: ${{ false }} # disabled temporarily | ||
| uses: codecov/codecov-action@v5 | ||
| with: | ||
| use_oidc: true |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why do we need this change?