From e7632e168ee049984ead57f40f1325598b3f4e90 Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Wed, 11 Dec 2024 13:38:51 -0500
Subject: [PATCH 1/6] Enable GRFTree to work with plot_tree

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 econml/grf/_base_grftree.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/econml/grf/_base_grftree.py b/econml/grf/_base_grftree.py
index 7635dd59f..9635504f5 100644
--- a/econml/grf/_base_grftree.py
+++ b/econml/grf/_base_grftree.py
@@ -497,3 +497,9 @@ def feature_importances(self, max_depth=4, depth_decay_exponent=2.0):
     @property
     def feature_importances_(self):
         return self.feature_importances()
+
+
+# HACK: sklearn 1.3 enforces that the input to plot_tree is a DecisionTreeClassifier or DecisionTreeRegressor
+#       This is a hack to get around that restriction by declaring that GRFTree inherits from DecisionTreeClassifier
+from sklearn.tree import DecisionTreeClassifier  # noqa: E402
+DecisionTreeClassifier.register(GRFTree)

From 7093f51701e09a1c1d8c7089da41b7c79aef2fce Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Wed, 11 Dec 2024 13:45:44 -0500
Subject: [PATCH 2/6] Remove CLA content from README

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 README.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 2a66f357a..4299e261d 100644
--- a/README.md
+++ b/README.md
@@ -729,9 +729,7 @@ BibTex:
 
 This project welcomes contributions and suggestions.  We use the [DCO bot](https://github.com/apps/dco) to enforce a [Developer Certificate of Origin](https://developercertificate.org/) which requires users to sign-off on their commits.  This is a simple way to certify that you wrote or otherwise have the right to submit the code you are contributing to the project.  Git provides a `-s` command line option to include this automatically when you commit via `git commit`.
 
-When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
-a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
-provided by the bot. You will only need to do this once across all repos using our CLA.
+If you forget to sign one of your commits, the DCO bot will provide specific instructions along with the failed check; alternatively you can use `git commit --amend -s` to add the sign-off to your last commit if you forgot it or `git rebase --signoff` to sign all of the commits in the branch, after which you can force push the changes to your branch with `git push --force-with-lease`.
 
 This project has adopted the [PyWhy Code of Conduct](https://github.com/py-why/governance/blob/main/CODE-OF-CONDUCT.md).
 

From 53abc4ec70829d72e71128cd87f7fcba40d72b5d Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Wed, 11 Dec 2024 13:50:49 -0500
Subject: [PATCH 3/6] Improve formatting of generated lkg files

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 .github/workflows/generate_lkg.py |  12 +-
 lkg-notebook.txt                  | 294 +++++++++++++++---------------
 lkg.txt                           | 217 +++++++++++-----------
 3 files changed, 272 insertions(+), 251 deletions(-)

diff --git a/.github/workflows/generate_lkg.py b/.github/workflows/generate_lkg.py
index bc6a98a8d..2dd3e04ff 100644
--- a/.github/workflows/generate_lkg.py
+++ b/.github/workflows/generate_lkg.py
@@ -74,9 +74,17 @@ def simple_constraint_map(all_combos: frozenset[Combo]) -> tuple[dict[frozenset[
         if i > 0:
             less_than = frozenset({combo for combo in all_combos if combo.py_version < py_version})
             constraint_map[less_than] = f"; python_version<'{py_version}'"
+        # We want to use >= next version instead of > this version
+        #       because otherwise we have pairs like
+        #           somelib==1.2, python_version<'3.9'
+        #           somelib==1.3, python_version>'3.8'
+        #       which is correct but looks more confusing than
+        #           somelib==1.2, python_version<'3.9'
+        #           somelib==1.3, python_version>='3.9'
         if i < len(all_py_versions)-2:
-            greater_than = frozenset({combo for combo in all_combos if combo.py_version > py_version})
-            constraint_map[greater_than] = f"; python_version>'{py_version}'"
+            next_version = sorted(all_py_versions)[i+1]
+            greater_than = frozenset({combo for combo in all_combos if combo.py_version >= next_version})
+            constraint_map[greater_than] = f"; python_version>='{next_version}'"
 
     # if every combination is present, we don't need to add any constraint
     constraint_map[all_combos] = ""
diff --git a/lkg-notebook.txt b/lkg-notebook.txt
index 1043399d4..e104b01e1 100644
--- a/lkg-notebook.txt
+++ b/lkg-notebook.txt
@@ -1,190 +1,196 @@
-Babel==2.14.0
-Cython==3.0.10; '3.9'<=python_version
-Jinja2==3.1.3
-Keras-Applications==1.0.8; python_version<='3.8'
-Keras-Preprocessing==1.1.2; python_version<='3.8'
-Keras==2.3.1; python_version<='3.8'
-Markdown==3.6; python_version<='3.8'
-MarkupSafe==2.1.5
-PyYAML==6.0.1
-Pygments==2.17.2
-QtPy==2.4.1
+Cython==0.29.37; python_version=='3.9'
+Jinja2==3.1.4
+Keras==2.3.1; python_version<'3.9'
+Keras-Applications==1.0.8; python_version<'3.9'
+Keras-Preprocessing==1.1.2; python_version<'3.9'
+Markdown==3.7; python_version<'3.9'
+MarkupSafe==2.1.5; python_version<'3.9'
+MarkupSafe==3.0.2; python_version=='3.9'
+PyYAML==6.0.2
+Pygments==2.18.0
 Send2Trash==1.8.3
-Werkzeug==3.0.2; python_version<='3.8'
-absl-py==2.1.0; python_version<='3.8'
-aiosignal==1.3.1; python_version<='3.8'
-anyio==4.3.0
-argon2-cffi-bindings==21.2.0
+Werkzeug==3.0.6; python_version<'3.9'
+absl-py==2.1.0; python_version<'3.9'
+aiosignal==1.3.1; python_version<'3.9'
+anyio==4.5.2; python_version<'3.9'
+anyio==4.6.2.post1; python_version=='3.9'
 argon2-cffi==23.1.0
+argon2-cffi-bindings==21.2.0
 arrow==1.3.0
-asttokens==2.4.1
-astunparse==1.6.3; python_version<='3.8'
+asttokens==3.0.0
+astunparse==1.6.3; python_version<'3.9'
 async-lru==2.0.4
-attrs==23.2.0
-backcall==0.2.0; python_version<='3.8'
+attrs==24.2.0
+babel==2.16.0
+backcall==0.2.0; python_version<'3.9'
 beautifulsoup4==4.12.3
-bleach==6.1.0
-cachetools==4.2.4; python_version<='3.8'
-causal-learn==0.1.3.8; '3.9'<=python_version
-certifi==2024.2.2
-cffi==1.16.0
-charset-normalizer==3.3.2
-clarabel==0.7.1; '3.9'<=python_version
-click==8.1.7; python_version<='3.8'
-cloudpickle==3.0.0
+bleach==6.1.0; python_version<'3.9'
+bleach==6.2.0; python_version=='3.9'
+cachetools==4.2.4; python_version<'3.9'
+causal-learn==0.1.3.8; python_version=='3.9'
+certifi==2024.8.30
+cffi==1.17.1
+charset-normalizer==3.4.0
+clarabel==0.9.0; python_version=='3.9'
+click==8.1.7; python_version<'3.9'
+cloudpickle==3.1.0
 comm==0.2.2
-contourpy==1.1.1; python_version<='3.8'
-contourpy==1.2.1; '3.9'<=python_version
-cvxpy==1.4.3; '3.9'<=python_version
+contourpy==1.1.1; python_version<'3.9'
+contourpy==1.3.0; python_version=='3.9'
+cvxpy==1.6.0; python_version=='3.9'
 cycler==0.12.1
-debugpy==1.8.1
+debugpy==1.8.9
 decorator==5.1.1
 defusedxml==0.7.1
-dowhy==0.11.1; '3.9'<=python_version
-ecos==2.0.13; '3.9'<=python_version
-exceptiongroup==1.2.1
-executing==2.0.1
-fastjsonschema==2.19.1
-filelock==3.13.4; python_version<='3.8'
-fonttools==4.51.0
+dowhy==0.12; python_version=='3.9'
+exceptiongroup==1.2.2
+executing==2.1.0
+fastjsonschema==2.21.1
+filelock==3.16.1; python_version<'3.9'
+fonttools==4.55.1
 fqdn==1.5.1
-frozenlist==1.4.1; python_version<='3.8'
-gast==0.3.3; python_version<='3.8'
-google-auth-oauthlib==0.4.6; python_version<='3.8'
-google-auth==1.35.0; python_version<='3.8'
-google-pasta==0.2.0; python_version<='3.8'
+frozenlist==1.5.0; python_version<'3.9'
+gast==0.3.3; python_version<'3.9'
+google-auth==1.35.0; python_version<'3.9'
+google-auth-oauthlib==0.4.6; python_version<'3.9'
+google-pasta==0.2.0; python_version<'3.9'
 graphviz==0.20.3
-grpcio==1.62.2; python_version<='3.8'
+grpcio==1.68.1; python_version<'3.9'
 h11==0.14.0
-h5py==2.10.0; python_version<='3.8'
-httpcore==1.0.5
-httpx==0.27.0
-idna==3.7
-importlib_metadata==7.1.0
-importlib_resources==6.4.0
-ipykernel==6.29.4
-ipython==8.12.3; python_version<='3.8'
-ipython==8.18.1; '3.9'<=python_version
-ipywidgets==8.1.2
+h5py==2.10.0; python_version<'3.9'
+httpcore==1.0.7
+httpx==0.28.0
+idna==3.10
+importlib_metadata==8.5.0
+importlib_resources==6.4.5
+ipykernel==6.29.5
+ipython==8.12.3; python_version<'3.9'
+ipython==8.18.1; python_version=='3.9'
+ipywidgets==8.1.5
 isoduration==20.11.0
-jedi==0.19.1
-joblib==1.4.0
-json5==0.9.25
-jsonpointer==2.4
-jsonschema-specifications==2023.12.1
-jsonschema==4.21.1
+jedi==0.19.2
+joblib==1.4.2
+json5==0.10.0
+jsonpointer==3.0.0
+jsonschema==4.23.0
+jsonschema-specifications==2023.12.1; python_version<'3.9'
+jsonschema-specifications==2024.10.1; python_version=='3.9'
+jupyter==1.1.1
 jupyter-console==6.6.3
 jupyter-events==0.10.0
 jupyter-lsp==2.2.5
-jupyter==1.0.0
-jupyter_client==8.6.1
+jupyter_client==8.6.3
 jupyter_core==5.7.2
-jupyter_server==2.14.0
+jupyter_server==2.14.2
 jupyter_server_terminals==0.5.3
-jupyterlab==4.1.6
+jupyterlab==4.3.2
 jupyterlab_pygments==0.3.0
-jupyterlab_server==2.27.1
-jupyterlab_widgets==3.0.10
-kiwisolver==1.4.5
-lightgbm==4.3.0
-llvmlite==0.41.1; python_version<='3.8'
-llvmlite==0.42.0; '3.9'<=python_version
+jupyterlab_server==2.27.3
+jupyterlab_widgets==3.0.13
+kiwisolver==1.4.7
+lightgbm==4.5.0
+llvmlite==0.41.1; python_version<'3.9'
+llvmlite==0.43.0; python_version=='3.9'
+matplotlib==3.7.5; python_version<'3.9'
+matplotlib==3.9.3; python_version=='3.9'
 matplotlib-inline==0.1.7
-matplotlib==3.7.5; python_version<='3.8'
-matplotlib==3.8.4; '3.9'<=python_version
 mistune==3.0.2
-mpmath==1.3.0; '3.9'<=python_version
-msgpack==1.0.8; python_version<='3.8'
-nbclient==0.10.0
-nbconvert==7.16.3
+mpmath==1.3.0; python_version=='3.9'
+msgpack==1.1.0; python_version<'3.9'
+nbclient==0.10.1
+nbconvert==7.16.4
 nbformat==5.10.4
 nest-asyncio==1.6.0
-networkx==3.2.1; '3.9'<=python_version
-notebook==7.1.3
+networkx==3.2.1; python_version=='3.9'
+notebook==7.3.0
 notebook_shim==0.2.4
-numba==0.58.1; python_version<='3.8'
-numba==0.59.1; '3.9'<=python_version
-numpy==1.23.5; python_version<='3.8'
-numpy==1.26.4; '3.9'<=python_version
-oauthlib==3.2.2; python_version<='3.8'
-opt-einsum==3.3.0; python_version<='3.8'
-osqp==0.6.4; '3.9'<=python_version
+numba==0.58.1; python_version<'3.9'
+numba==0.60.0; python_version=='3.9'
+numpy==1.23.5; python_version<'3.9'
+numpy==1.26.4; python_version=='3.9'
+nvidia-nccl-cu12==2.23.4
+oauthlib==3.2.2; python_version<'3.9'
+opt_einsum==3.4.0; python_version<'3.9'
+osqp==0.6.7.post3; python_version=='3.9'
 overrides==7.7.0
-packaging==24.0
-pandas==2.0.3; python_version<='3.8'
-pandas==2.2.2; '3.9'<=python_version
+packaging==24.2
+pandas==2.0.3; python_version<'3.9'
+pandas==2.2.3; python_version=='3.9'
 pandocfilters==1.5.1
 parso==0.8.4
-patsy==0.5.6
+patsy==1.0.1
 pexpect==4.9.0
-pickleshare==0.7.5; python_version<='3.8'
-pillow==10.3.0
-pkgutil_resolve_name==1.3.10; python_version<='3.8'
-platformdirs==4.2.1
-prometheus_client==0.20.0
-prompt-toolkit==3.0.43
-protobuf==3.20.3; python_version<='3.8'
-psutil==5.9.8
+pickleshare==0.7.5; python_version<'3.9'
+pillow==10.4.0; python_version<'3.9'
+pillow==11.0.0; python_version=='3.9'
+pkgutil_resolve_name==1.3.10; python_version<'3.9'
+platformdirs==4.3.6
+prometheus_client==0.21.1
+prompt_toolkit==3.0.48
+protobuf==3.20.3; python_version<'3.9'
+psutil==6.1.0
 ptyprocess==0.7.0
-pure-eval==0.2.2
-pyasn1==0.6.0; python_version<='3.8'
-pyasn1_modules==0.4.0; python_version<='3.8'
-pybind11==2.12.0; '3.9'<=python_version
+pure_eval==0.2.3
+pyasn1==0.6.1; python_version<'3.9'
+pyasn1_modules==0.4.1; python_version<'3.9'
 pycparser==2.22
-pydot==2.0.0; '3.9'<=python_version
-pyparsing==3.1.2
+pydot==3.0.3; python_version=='3.9'
+pyparsing==3.1.4; python_version<'3.9'
+pyparsing==3.2.0; python_version=='3.9'
 python-dateutil==2.9.0.post0
 python-json-logger==2.0.7
-pytz==2024.1
-pyzmq==26.0.2
-qdldl==0.1.7.post2; '3.9'<=python_version
-qtconsole==5.5.1
-ray==2.10.0; python_version<='3.8'
-referencing==0.35.0
-requests-oauthlib==2.0.0; python_version<='3.8'
-requests==2.31.0
+pytz==2024.2
+pyzmq==26.2.0
+qdldl==0.1.7.post4; python_version=='3.9'
+ray==2.10.0; python_version<'3.9'
+referencing==0.35.1
+requests==2.32.3
+requests-oauthlib==2.0.0; python_version<'3.9'
 rfc3339-validator==0.1.4
 rfc3986-validator==0.1.1
-rpds-py==0.18.0
-rsa==4.9; python_version<='3.8'
-scikit-learn==1.2.2; python_version<='3.8'
-scikit-learn==1.4.2; '3.9'<=python_version
-scipy==1.13.0; '3.9'<=python_version
-scipy==1.4.1; python_version<='3.8'
-scs==3.2.4.post1; '3.9'<=python_version
+rpds-py==0.20.1; python_version<'3.9'
+rpds-py==0.22.3; python_version=='3.9'
+rsa==4.9; python_version<'3.9'
+scikit-learn==1.2.2; python_version<'3.9'
+scikit-learn==1.5.2; python_version=='3.9'
+scipy==1.4.1; python_version<'3.9'
+scipy==1.13.1; python_version=='3.9'
+scs==3.2.7; python_version=='3.9'
 seaborn==0.13.2
 shap==0.43.0
 six==1.16.0
 slicer==0.0.7
 sniffio==1.3.1
-soupsieve==2.5
-sparse==0.15.1
+soupsieve==2.6
+sparse==0.15.4
 stack-data==0.6.3
-statsmodels==0.14.1; python_version<='3.8'
-statsmodels==0.14.2; '3.9'<=python_version
-sympy==1.12; '3.9'<=python_version
-tensorboard-plugin-wit==1.8.1; python_version<='3.8'
-tensorboard==2.2.2; python_version<='3.8'
-tensorflow-estimator==2.2.0; python_version<='3.8'
-tensorflow==2.2.0; python_version<='3.8'
-termcolor==2.4.0; python_version<='3.8'
+statsmodels==0.14.1; python_version<'3.9'
+statsmodels==0.14.4; python_version=='3.9'
+sympy==1.13.3; python_version=='3.9'
+tensorboard==2.2.2; python_version<'3.9'
+tensorboard-plugin-wit==1.8.1; python_version<'3.9'
+tensorflow==2.2.0; python_version<'3.9'
+tensorflow-estimator==2.2.0; python_version<'3.9'
+termcolor==2.4.0; python_version<'3.9'
 terminado==0.18.1
-threadpoolctl==3.4.0
-tinycss2==1.3.0
-tomli==2.0.1
-tornado==6.4
-tqdm==4.66.2
+threadpoolctl==3.5.0
+tinycss2==1.4.0
+tomli==2.2.1
+tornado==6.4.2
+tqdm==4.67.1
 traitlets==5.14.3
-types-python-dateutil==2.9.0.20240316
-typing_extensions==4.11.0
-tzdata==2024.1
+types-python-dateutil==2.9.0.20241003
+typing_extensions==4.12.2
+tzdata==2024.2
 uri-template==1.3.0
-urllib3==2.2.1
+urllib3==2.2.3
 wcwidth==0.2.13
-webcolors==1.13
+webcolors==24.8.0; python_version<'3.9'
+webcolors==24.11.1; python_version=='3.9'
 webencodings==0.5.1
 websocket-client==1.8.0
-widgetsnbextension==4.0.10
-wrapt==1.16.0; python_version<='3.8'
-xgboost==2.0.3
-zipp==3.18.1
\ No newline at end of file
+widgetsnbextension==4.0.13
+wrapt==1.17.0; python_version<'3.9'
+xgboost==2.1.3
+zipp==3.20.2; python_version<'3.9'
+zipp==3.21.0; python_version=='3.9'
\ No newline at end of file
diff --git a/lkg.txt b/lkg.txt
index 95acb9cb1..033d0bfa8 100644
--- a/lkg.txt
+++ b/lkg.txt
@@ -1,112 +1,119 @@
-Cython==0.29.37; python_version<='3.8'
-Cython==3.0.9; '3.9'<=python_version and python_version<='3.11'
-Keras-Applications==1.0.8; python_version<='3.8'
-Keras-Preprocessing==1.1.2; python_version<='3.8'
-Keras==2.3.1; python_version<='3.8'
-Markdown==3.5.2; python_version<='3.8'
-MarkupSafe==2.1.5; python_version<='3.8'
-PyYAML==6.0.1
-Werkzeug==3.0.1; python_version<='3.8'
-absl-py==2.1.0; python_version<='3.8'
-aiosignal==1.3.1; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-argcomplete==3.2.2; python_version=='3.9' and platform_system=='Windows'
-astunparse==1.6.3; python_version<='3.8'
-attrs==23.2.0; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-cachetools==4.2.4; python_version<='3.8'
-causal-learn==0.1.3.8; python_version<='3.11'
-certifi==2024.2.2
-charset-normalizer==3.3.2
-clarabel==0.7.1; python_version<='3.11'
-click==8.1.7; python_version=='3.9'
-cloudpickle==3.0.0
+Cython==0.29.37
+Keras==2.3.1; python_version<'3.9'
+Keras-Applications==1.0.8; python_version<'3.9'
+Keras-Preprocessing==1.1.2; python_version<'3.9'
+Markdown==3.7; python_version<'3.9'
+MarkupSafe==2.1.5; python_version<'3.9'
+PyYAML==6.0.2
+Werkzeug==3.0.6; python_version<'3.9'
+absl-py==2.1.0; python_version<'3.9'
+aiosignal==1.3.1
+argcomplete==3.5.1; platform_system=='Windows' and python_version=='3.9'
+astunparse==1.6.3; python_version<'3.9'
+attrs==24.2.0
+cachetools==4.2.4; python_version<'3.9'
+causal-learn==0.1.3.8
+certifi==2024.8.30
+charset-normalizer==3.4.0
+clarabel==0.9.0
+click==8.1.7
+cloudpickle==3.1.0
 colorama==0.4.6; platform_system=='Windows'
-contourpy==1.1.1; python_version<='3.8'
-contourpy==1.2.0; '3.9'<=python_version
-cvxpy==1.4.2
+contourpy==1.1.1; python_version<'3.9'
+contourpy==1.3.0; python_version=='3.9'
+contourpy==1.3.1; python_version>='3.10'
+cvxpy==1.5.2; python_version<'3.9'
+cvxpy==1.6.0; python_version>='3.9'
 cycler==0.12.1
-dowhy==0.10.1; python_version<='3.8'
-dowhy==0.11.1; '3.9'<=python_version and python_version<='3.11'
-dowhy==0.8; '3.12'<=python_version
-ecos==2.0.13; python_version<='3.11'
-filelock==3.13.1; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-fonttools==4.49.0
-frozenlist==1.4.1; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-gast==0.3.3; python_version<='3.8'
-google-auth-oauthlib==0.4.6; python_version<='3.8'
-google-auth==1.35.0; python_version<='3.8'
-google-pasta==0.2.0; python_version<='3.8'
-graphviz==0.20.1
-grpcio==1.62.0; python_version<='3.8'
-h5py==2.10.0; python_version<='3.8'
-idna==3.6
-importlib-metadata==7.0.1; python_version<='3.8'
-importlib_resources==6.1.2; python_version<='3.9'
-joblib==1.3.2
-jsonschema-specifications==2023.12.1; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-jsonschema==4.21.1; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-kiwisolver==1.4.5
-lightgbm==4.3.0
-llvmlite==0.41.1; python_version<='3.8'
-llvmlite==0.42.0; '3.9'<=python_version
-matplotlib==3.7.5; python_version<='3.8'
-matplotlib==3.8.3; '3.9'<=python_version
+dowhy==0.10.1; python_version<'3.9'
+dowhy==0.12; python_version>='3.9'
+ecos==2.0.14; python_version<'3.9'
+filelock==3.16.1
+fonttools==4.55.1
+frozenlist==1.5.0
+gast==0.3.3; python_version<'3.9'
+google-auth==1.35.0; python_version<'3.9'
+google-auth-oauthlib==0.4.6; python_version<'3.9'
+google-pasta==0.2.0; python_version<'3.9'
+graphviz==0.20.3
+grpcio==1.68.1; python_version<'3.9'
+h5py==2.10.0; python_version<'3.9'
+idna==3.10
+importlib_metadata==8.5.0; python_version<'3.9'
+importlib_resources==6.4.5; python_version<'3.10'
+joblib==1.4.2
+jsonschema==4.23.0
+jsonschema-specifications==2023.12.1; python_version<'3.9'
+jsonschema-specifications==2024.10.1; python_version>='3.9'
+kiwisolver==1.4.7
+lightgbm==4.5.0
+llvmlite==0.41.1; python_version<'3.9'
+llvmlite==0.43.0; python_version>='3.9'
+matplotlib==3.7.5; python_version<'3.9'
+matplotlib==3.9.3; python_version>='3.9'
 mpmath==1.3.0
-msgpack==1.0.8; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-networkx==3.1; python_version<='3.8'
-networkx==3.2.1; '3.9'<=python_version
-numba==0.58.1; python_version<='3.8'
-numba==0.59.0; '3.9'<=python_version
-numpy==1.23.5; python_version<='3.8'
-numpy==1.26.4; '3.9'<=python_version
-oauthlib==3.2.2; python_version<='3.8'
-opt-einsum==3.3.0; python_version<='3.8'
-osqp==0.6.4; '3.9'<=python_version and python_version<='3.11'
-osqp==0.6.5; python_version<='3.8'
-packaging==23.2
-pandas==2.0.3; python_version<='3.8'
-pandas==2.2.1; '3.9'<=python_version
-patsy==0.5.6
-pillow==10.2.0
-pipx==1.4.3; python_version=='3.9' and platform_system=='Windows'
-pkgutil_resolve_name==1.3.10; python_version<='3.8' and (platform_system=='Darwin' or platform_system=='Linux')
-platformdirs==4.2.0; python_version=='3.9' and platform_system=='Windows'
-protobuf==3.20.3; python_version<='3.8'
-protobuf==4.25.3; '3.9'<=python_version and python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-pyasn1-modules==0.3.0; python_version<='3.8'
-pyasn1==0.5.1; python_version<='3.8'
-pybind11==2.11.1; python_version<='3.11'
-pydot==2.0.0
-pyparsing==3.1.2
+msgpack==1.1.0
+networkx==3.1; python_version<'3.9'
+networkx==3.2.1; python_version=='3.9'
+networkx==3.4.2; python_version>='3.10'
+numba==0.58.1; python_version<'3.9'
+numba==0.60.0; python_version>='3.9'
+numpy==1.23.5; python_version<'3.9'
+numpy==1.26.4; python_version>='3.9'
+oauthlib==3.2.2; python_version<'3.9'
+opt_einsum==3.4.0; python_version<'3.9'
+osqp==0.6.7.post3
+packaging==24.2
+pandas==2.0.3; python_version<'3.9'
+pandas==2.2.3; python_version>='3.9'
+patsy==1.0.1
+pillow==10.4.0; python_version<'3.9'
+pillow==11.0.0; python_version>='3.9'
+pipx==1.7.1; platform_system=='Windows' and python_version=='3.9'
+pkgutil_resolve_name==1.3.10; python_version<'3.9'
+platformdirs==4.3.6; platform_system=='Windows' and python_version=='3.9'
+protobuf==3.20.3; python_version<'3.9'
+protobuf==5.29.0; python_version>='3.9'
+pyasn1==0.6.1; python_version<'3.9'
+pyasn1_modules==0.4.1; python_version<'3.9'
+pydot==3.0.3
+pyparsing==3.1.4; python_version<'3.9'
+pyparsing==3.2.0; python_version>='3.9'
 python-dateutil==2.9.0.post0
-pytz==2024.1
-qdldl==0.1.7.post0; python_version<='3.11'
-ray==2.9.3; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-referencing==0.33.0; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-requests-oauthlib==1.3.1; python_version<='3.8'
-requests==2.31.0
-rpds-py==0.18.0; python_version<='3.11' and (platform_system=='Darwin' or platform_system=='Linux')
-rsa==4.9; python_version<='3.8'
-scikit-learn==1.2.2; python_version<='3.8'
-scikit-learn==1.4.1.post1; '3.9'<=python_version
-scipy==1.12.0; '3.9'<=python_version
-scipy==1.4.1; python_version<='3.8'
-scs==3.2.4.post1; python_version<='3.11'
+pytz==2024.2
+qdldl==0.1.7.post4
+ray==2.10.0; python_version<'3.9'
+ray==2.40.0; python_version>='3.9'
+referencing==0.35.1
+requests==2.32.3
+requests-oauthlib==2.0.0; python_version<'3.9'
+rpds-py==0.20.1; python_version<'3.9'
+rpds-py==0.22.3; python_version>='3.9'
+rsa==4.9; python_version<'3.9'
+scikit-learn==1.2.2; python_version<'3.9'
+scikit-learn==1.5.2; python_version>='3.9'
+scipy==1.4.1; python_version<'3.9'
+scipy==1.13.1; python_version=='3.9'
+scipy==1.14.1; python_version>='3.10'
+scs==3.2.7
 shap==0.43.0
 six==1.16.0
 slicer==0.0.7
-sparse==0.15.1
-statsmodels==0.14.1
-sympy==1.12
-tensorboard-plugin-wit==1.8.1; python_version<='3.8'
-tensorboard==2.2.2; python_version<='3.8'
-tensorflow-estimator==2.2.0; python_version<='3.8'
-tensorflow==2.2.0; python_version<='3.8'
-termcolor==2.4.0; python_version<='3.8'
-threadpoolctl==3.3.0
-tomli==2.0.1; python_version=='3.9' and platform_system=='Windows'
-tqdm==4.66.2
-tzdata==2024.1
-urllib3==2.2.1
-userpath==1.9.2; python_version=='3.9' and platform_system=='Windows'
-wrapt==1.16.0; python_version<='3.8'
-zipp==3.17.0; python_version<='3.9'
\ No newline at end of file
+sparse==0.15.4
+statsmodels==0.14.1; python_version<'3.9'
+statsmodels==0.14.4; python_version>='3.9'
+sympy==1.13.3
+tensorboard==2.2.2; python_version<'3.9'
+tensorboard-plugin-wit==1.8.1; python_version<'3.9'
+tensorflow==2.2.0; python_version<'3.9'
+tensorflow-estimator==2.2.0; python_version<'3.9'
+termcolor==2.4.0; python_version<'3.9'
+threadpoolctl==3.5.0
+tomli==2.2.1; platform_system=='Windows' and python_version=='3.9'
+tqdm==4.67.1
+tzdata==2024.2
+urllib3==2.2.3
+userpath==1.9.2; platform_system=='Windows' and python_version=='3.9'
+wrapt==1.17.0; python_version<'3.9'
+zipp==3.20.2; python_version<'3.9'
+zipp==3.21.0; python_version=='3.9'
\ No newline at end of file

From 784a57b91dd404e5fdb103873c5a4107ef35803a Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Wed, 11 Dec 2024 15:07:12 -0500
Subject: [PATCH 4/6] Enable sklearn 1.6

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index 73ccdae3e..e2c360e81 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -22,7 +22,7 @@ classifiers = [
 dependencies = [
     "numpy<2",
     "scipy > 1.4.0",
-    "scikit-learn >= 1.0, < 1.6",
+    "scikit-learn >= 1.0, < 1.7",
     "sparse",
     "joblib >= 0.13.0",
     "statsmodels >= 0.10",

From 284396e5be911daeb9f3b726b541bc929508b0ca Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Fri, 10 Jan 2025 15:00:06 -0500
Subject: [PATCH 5/6] Use specific sklearn intersphinx link

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 doc/conf.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/conf.py b/doc/conf.py
index b44578b77..24fef5ec5 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -228,7 +228,7 @@
 # Example configuration for intersphinx: refer to the Python standard library.
 intersphinx_mapping = {'python': ('https://docs.python.org/3', None),
                        'numpy': ('https://numpy.org/doc/stable/', None),
-                       'sklearn': ('https://scikit-learn.org/stable/', None),
+                       'sklearn': ('https://scikit-learn.org/1.5/', None),
                        'matplotlib': ('https://matplotlib.org/stable/', None),
                        'shap': ('https://shap.readthedocs.io/en/stable/', None),
                        'dowhy': ('https://www.pywhy.org/dowhy/v0.8/', None),

From dcf516fef1a00060efe8685d76302c014fa7e847 Mon Sep 17 00:00:00 2001
From: Keith Battocchi <kebatt@microsoft.com>
Date: Fri, 10 Jan 2025 15:03:50 -0500
Subject: [PATCH 6/6] Update sphinx version used to generate docs

Signed-off-by: Keith Battocchi <kebatt@microsoft.com>
---
 .github/workflows/publish-documentation.yml | 4 ++--
 doc/conf.py                                 | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/publish-documentation.yml b/.github/workflows/publish-documentation.yml
index 264675d6d..a173cb89e 100644
--- a/.github/workflows/publish-documentation.yml
+++ b/.github/workflows/publish-documentation.yml
@@ -79,14 +79,14 @@ jobs:
       - name: Install graphviz
         run: sudo apt-get -yq install graphviz
       - name: Build documentation
-        run: pip install "sphinx~=4.4.0" "sphinx_rtd_theme~=1.0.0" && python setup.py build_sphinx -W
+        run: pip install "sphinx~=7.0" "sphinx_rtd_theme~=2.0.0" && sphinx-build ./doc/ ./build/sphinx/html/ -W
       - name: Upload docs as artifact
         uses: actions/upload-artifact@v4
         with:
           name: docs
           path: build/sphinx/html/
       - name: Run doctests
-        run: python setup.py build_sphinx -b doctest
+        run: sphinx-build ./doc/ ./build/sphinx/doctest/ -b doctest
         if : ${{ inputs.run_doctests }}
         
   publish-docs:
diff --git a/doc/conf.py b/doc/conf.py
index 24fef5ec5..700bcab86 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -231,7 +231,7 @@
                        'sklearn': ('https://scikit-learn.org/1.5/', None),
                        'matplotlib': ('https://matplotlib.org/stable/', None),
                        'shap': ('https://shap.readthedocs.io/en/stable/', None),
-                       'dowhy': ('https://www.pywhy.org/dowhy/v0.8/', None),
+                       'dowhy': ('https://www.pywhy.org/dowhy/main/', None),
                        'statsmodels': ('https://www.statsmodels.org/stable/', None)}