From fa051f4cdfa4352b9178113e1f0c8de932e7aee6 Mon Sep 17 00:00:00 2001 From: Pablo Gomez Date: Tue, 10 Oct 2023 11:07:50 +0200 Subject: [PATCH 01/14] Try allowing to skip coverage comment --- .github/workflows/run_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index c2b0a6c2..050a5f33 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -62,6 +62,7 @@ jobs: - name: pytest coverage comment uses: MishaKav/pytest-coverage-comment@main if: github.event_name == 'pull_request' + continue-on-error: true with: pytest-coverage-path: ./torchquad/tests/pytest-coverage.txt title: Coverage Report From c6baf398a9f369bc632093504ceb03fd085f7ba7 Mon Sep 17 00:00:00 2001 From: Pablo Gomez Date: Tue, 10 Oct 2023 11:22:31 +0200 Subject: [PATCH 02/14] flaking --- torchquad/tests/integration_test_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchquad/tests/integration_test_functions.py b/torchquad/tests/integration_test_functions.py index 9e2c63e5..e5284d2f 100644 --- a/torchquad/tests/integration_test_functions.py +++ b/torchquad/tests/integration_test_functions.py @@ -44,7 +44,7 @@ def __init__( """ self.integration_dim = integration_dim self.expected_result = expected_result - if type(integrand_dims) == int or hasattr(integrand_dims, "__len__"): + if type(integrand_dims) is int or hasattr(integrand_dims, "__len__"): self.integrand_dims = integrand_dims else: ValueError( From b088aec6211287e04bf323eab94cd9054dc71a0d Mon Sep 17 00:00:00 2001 From: FHof Date: Sun, 10 Sep 2023 14:43:43 +0200 Subject: [PATCH 03/14] Hide PyTorch trace compilation warnings The test execution shows warnings about traces being potentially incorrect because the Python3 control flow is not completely recorded. This includes conditions on the shape of the integration domain tensor. Since the only arguments of the compiled integration function are the integrand and integration domain, and the dimensionality of this integration domain is constant, we can ignore the warnings. After this change, the two `get_jit_compiled_integrate` functions hide PyTorch trace compilation warnings with `warnings.filterwarnings`. --- torchquad/integration/grid_integrator.py | 13 +++---------- torchquad/integration/monte_carlo.py | 16 +++++++--------- torchquad/utils/torch_trace_without_warnings.py | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 torchquad/utils/torch_trace_without_warnings.py diff --git a/torchquad/integration/grid_integrator.py b/torchquad/integration/grid_integrator.py index 2243399d..73ecd812 100644 --- a/torchquad/integration/grid_integrator.py +++ b/torchquad/integration/grid_integrator.py @@ -1,6 +1,7 @@ from loguru import logger from autoray import numpy as anp, infer_backend +from ..utils.torch_trace_without_warnings import _torch_trace_without_warnings from .base_integrator import BaseIntegrator from .integration_grid import IntegrationGrid from .utils import ( @@ -229,7 +230,7 @@ def step3(function_values, hs, integration_domain): ) # Trace the first step - step1 = torch.jit.trace(step1, (integration_domain,)) + step1 = _torch_trace_without_warnings(step1, (integration_domain,)) # Get example input for the third step grid_points, hs, n_per_dim = step1(integration_domain) @@ -241,15 +242,7 @@ def step3(function_values, hs, integration_domain): ) # Trace the third step - # Avoid the warnings about a .grad attribute access of a - # non-leaf Tensor - if hs.requires_grad: - hs = hs.detach() - hs.requires_grad = True - if function_values.requires_grad: - function_values = function_values.detach() - function_values.requires_grad = True - step3 = torch.jit.trace( + step3 = _torch_trace_without_warnings( step3, (function_values, hs, integration_domain) ) diff --git a/torchquad/integration/monte_carlo.py b/torchquad/integration/monte_carlo.py index 3d854b61..cc0bf079 100644 --- a/torchquad/integration/monte_carlo.py +++ b/torchquad/integration/monte_carlo.py @@ -2,6 +2,7 @@ from autoray import infer_backend from loguru import logger +from ..utils.torch_trace_without_warnings import _torch_trace_without_warnings from .base_integrator import BaseIntegrator from .utils import _setup_integration_domain, expand_func_values_and_squeeze_integral from .rng import RNG @@ -195,8 +196,6 @@ def compiled_integrate(fn, integration_domain): elif backend == "torch": # Torch requires explicit tracing with example inputs. def do_compile(example_integrand): - import torch - # Define traceable first and third steps def step1(integration_domain): return self.calculate_sample_points( @@ -206,7 +205,9 @@ def step1(integration_domain): step3 = self.calculate_result # Trace the first step (which is non-deterministic) - step1 = torch.jit.trace(step1, (integration_domain,), check_trace=False) + step1 = _torch_trace_without_warnings( + step1, (integration_domain,), check_trace=False + ) # Get example input for the third step sample_points = step1(integration_domain) @@ -215,12 +216,9 @@ def step1(integration_domain): ) # Trace the third step - if function_values.requires_grad: - # Avoid the warning about a .grad attribute access of a - # non-leaf Tensor - function_values = function_values.detach() - function_values.requires_grad = True - step3 = torch.jit.trace(step3, (function_values, integration_domain)) + step3 = _torch_trace_without_warnings( + step3, (function_values, integration_domain) + ) # Define a compiled integrate function def compiled_integrate(fn, integration_domain): diff --git a/torchquad/utils/torch_trace_without_warnings.py b/torchquad/utils/torch_trace_without_warnings.py new file mode 100644 index 00000000..c45e17d7 --- /dev/null +++ b/torchquad/utils/torch_trace_without_warnings.py @@ -0,0 +1,16 @@ +import warnings + + +def _torch_trace_without_warnings(*args, **kwargs): + """Execute `torch.jit.trace` on the passed arguments and hide tracer warnings + + PyTorch can show warnings about traces being potentially incorrect because + the Python3 control flow is not completely recorded. + This function can be used to hide the warnings in situations where they are + false positives. + """ + import torch + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=torch.jit.TracerWarning) + return torch.jit.trace(*args, **kwargs) From 1e3ac69e0bf38144c8f6007c119054eaf961834c Mon Sep 17 00:00:00 2001 From: FHof Date: Wed, 18 Oct 2023 17:05:57 +0200 Subject: [PATCH 04/14] no relative imports --- torchquad/integration/grid_integrator.py | 2 +- torchquad/integration/monte_carlo.py | 7 +++++-- torchquad/integration/utils.py | 15 +++++++++++++++ torchquad/utils/torch_trace_without_warnings.py | 16 ---------------- 4 files changed, 21 insertions(+), 19 deletions(-) delete mode 100644 torchquad/utils/torch_trace_without_warnings.py diff --git a/torchquad/integration/grid_integrator.py b/torchquad/integration/grid_integrator.py index 73ecd812..c3f919f2 100644 --- a/torchquad/integration/grid_integrator.py +++ b/torchquad/integration/grid_integrator.py @@ -1,13 +1,13 @@ from loguru import logger from autoray import numpy as anp, infer_backend -from ..utils.torch_trace_without_warnings import _torch_trace_without_warnings from .base_integrator import BaseIntegrator from .integration_grid import IntegrationGrid from .utils import ( _linspace_with_grads, expand_func_values_and_squeeze_integral, _setup_integration_domain, + _torch_trace_without_warnings, ) diff --git a/torchquad/integration/monte_carlo.py b/torchquad/integration/monte_carlo.py index cc0bf079..432e6242 100644 --- a/torchquad/integration/monte_carlo.py +++ b/torchquad/integration/monte_carlo.py @@ -2,9 +2,12 @@ from autoray import infer_backend from loguru import logger -from ..utils.torch_trace_without_warnings import _torch_trace_without_warnings from .base_integrator import BaseIntegrator -from .utils import _setup_integration_domain, expand_func_values_and_squeeze_integral +from .utils import ( + _setup_integration_domain, + expand_func_values_and_squeeze_integral, + _torch_trace_without_warnings, +) from .rng import RNG diff --git a/torchquad/integration/utils.py b/torchquad/integration/utils.py index c2ab3fcc..71d7556c 100644 --- a/torchquad/integration/utils.py +++ b/torchquad/integration/utils.py @@ -261,3 +261,18 @@ def wrap(*args, **kwargs): return f(*args, **kwargs) return wrap + + +def _torch_trace_without_warnings(*args, **kwargs): + """Execute `torch.jit.trace` on the passed arguments and hide tracer warnings + + PyTorch can show warnings about traces being potentially incorrect because + the Python3 control flow is not completely recorded. + This function can be used to hide the warnings in situations where they are + false positives. + """ + import torch + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=torch.jit.TracerWarning) + return torch.jit.trace(*args, **kwargs) diff --git a/torchquad/utils/torch_trace_without_warnings.py b/torchquad/utils/torch_trace_without_warnings.py deleted file mode 100644 index c45e17d7..00000000 --- a/torchquad/utils/torch_trace_without_warnings.py +++ /dev/null @@ -1,16 +0,0 @@ -import warnings - - -def _torch_trace_without_warnings(*args, **kwargs): - """Execute `torch.jit.trace` on the passed arguments and hide tracer warnings - - PyTorch can show warnings about traces being potentially incorrect because - the Python3 control flow is not completely recorded. - This function can be used to hide the warnings in situations where they are - false positives. - """ - import torch - - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=torch.jit.TracerWarning) - return torch.jit.trace(*args, **kwargs) From dece20c1f62c41f6123f7219c915a969714c03ca Mon Sep 17 00:00:00 2001 From: FHof Date: Wed, 18 Oct 2023 17:16:09 +0200 Subject: [PATCH 05/14] avoid a torch import --- torchquad/integration/grid_integrator.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/torchquad/integration/grid_integrator.py b/torchquad/integration/grid_integrator.py index c3f919f2..6c574d81 100644 --- a/torchquad/integration/grid_integrator.py +++ b/torchquad/integration/grid_integrator.py @@ -209,8 +209,6 @@ def compiled_integrate(fn, integration_domain): elif backend == "torch": # Torch requires explicit tracing with example inputs. def do_compile(example_integrand): - import torch - # Define traceable first and third steps def step1(integration_domain): grid_points, hs, n_per_dim = self.calculate_grid( @@ -219,7 +217,7 @@ def step1(integration_domain): return ( grid_points, hs, - torch.Tensor([n_per_dim]), + anp.array([n_per_dim], like="torch"), ) # n_per_dim is constant dim = int(integration_domain.shape[0]) From 4695531ea3dc8f8de0475ebdf227cc9feaaff86b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20G=C3=B3mez?= Date: Tue, 31 Oct 2023 12:17:05 +0100 Subject: [PATCH 06/14] Update .readthedocs.yml --- .readthedocs.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 879ddda2..8a33003c 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,6 +5,11 @@ # Required version: 2 +build: + os: "ubuntu-22.04" + tools: + python: "3.8" + # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/source/conf.py @@ -20,4 +25,4 @@ python: path: . conda: - environment: rtd_environment.yml \ No newline at end of file + environment: rtd_environment.yml From ca84bfeac972a44139a4ada27b72fc162a1ec774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20G=C3=B3mez?= Date: Tue, 31 Oct 2023 12:20:03 +0100 Subject: [PATCH 07/14] Update .readthedocs.yml --- .readthedocs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 8a33003c..242ee042 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -19,7 +19,6 @@ formats: all # Optionally set the version of Python and requirements required to build your docs python: - version: 3.8 install: - method: setuptools path: . From 718340d33b834e06304d4d01dbfcb2419dbb0b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20G=C3=B3mez?= Date: Tue, 31 Oct 2023 12:24:18 +0100 Subject: [PATCH 08/14] Update .readthedocs.yml --- .readthedocs.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 242ee042..2ebcbd7a 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,7 +8,7 @@ version: 2 build: os: "ubuntu-22.04" tools: - python: "3.8" + python: "mambaforge-22.9" # Build documentation in the docs/ directory with Sphinx sphinx: @@ -17,11 +17,5 @@ sphinx: # Optionally build your docs in additional formats such as PDF formats: all -# Optionally set the version of Python and requirements required to build your docs -python: - install: - - method: setuptools - path: . - conda: environment: rtd_environment.yml From 7d7cffc32d4efd3b7aa68096239c8855a798f054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui-Zhi=20Li=20=28=E6=9D=8E=E7=9D=BF=E6=99=BA=29?= <61745903+Astro-Lee@users.noreply.github.com> Date: Tue, 5 Dec 2023 13:18:46 +0800 Subject: [PATCH 09/14] Update tutorial.rst fixed a bug. --- docs/source/tutorial.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index ac148beb..6c33a743 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -724,11 +724,11 @@ sample points for both functions: # Integrate the first integrand with the sample points function_values, _ = integrator.evaluate_integrand(integrand1, grid_points) - integral1 = integrator.calculate_result(function_values, dim, n_per_dim, hs) + integral1 = integrator.calculate_result(function_values, dim, n_per_dim, hs, integration_domain) # Integrate the second integrand with the same sample points function_values, _ = integrator.evaluate_integrand(integrand2, grid_points) - integral2 = integrator.calculate_result(function_values, dim, n_per_dim, hs) + integral2 = integrator.calculate_result(function_values, dim, n_per_dim, hs, integration_domain) print(f"Quadrature results: {integral1}, {integral2}") From ef953ae1e281362a264eefbff97d805b8adb0ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui-Zhi=20Li=20=28=E6=9D=8E=E7=9D=BF=E6=99=BA=29?= <61745903+Astro-Lee@users.noreply.github.com> Date: Tue, 5 Dec 2023 13:29:29 +0800 Subject: [PATCH 10/14] Update tutorial.rst I fixed a bug for tutorial.rst. --- docs/source/tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index ac148beb..97cac14f 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -745,7 +745,7 @@ As an example, here we evaluate a similar integrand many times for different val .. code:: ipython3 def parametrized_integrand(x, a, b): - return torch.sqrt(torch.cos(torch.sin((a + b) * x))) + return torch.sqrt(torch.cos(torch.sin((a + b) * x))) a_params = torch.arange(40) b_params = torch.arange(10, 20) From ce7cf119251cc6ec83049cae55e9cfd1372b8868 Mon Sep 17 00:00:00 2001 From: FHof Date: Mon, 25 Dec 2023 16:47:03 +0100 Subject: [PATCH 11/14] Fix JIT compilation with TensorFlow >= 2.14.0 The previous check if code is currently being compiled no longer works with new TensorFlow versions because the `Tensor` type is now called `SymbolicTensor`. This change adds a helper function to check if code is being compiled for JAX, TensorFlow or PyTorch. If tf.is_symbolic_tensor() is available, i.e. if the TensorFlow version is high enough, we use this function to check if code is being compiled. To avoid inconsistencies between backends, the check for integration domain values is disabled if code is being compiled with PyTorch even if the check works with PyTorch. --- torchquad/integration/utils.py | 48 +++++++++++++++++------ torchquad/tests/utils_integration_test.py | 38 ++++++++++++++++++ 2 files changed, 73 insertions(+), 13 deletions(-) diff --git a/torchquad/integration/utils.py b/torchquad/integration/utils.py index 71d7556c..64cceb88 100644 --- a/torchquad/integration/utils.py +++ b/torchquad/integration/utils.py @@ -193,20 +193,11 @@ def _check_integration_domain(integration_domain): raise ValueError("integration_domain.shape[0] needs to be 1 or larger.") if num_bounds != 2: raise ValueError("integration_domain must have 2 values per boundary") - # Skip the values check if an integrator.integrate method is JIT - # compiled with JAX - if any( - nam in type(integration_domain).__name__ for nam in ["Jaxpr", "JVPTracer"] - ): + # The boundary values check does not work if the code is JIT compiled + # with JAX or TensorFlow. + if _is_compiling(integration_domain): return dim - boundaries_are_invalid = ( - anp.min(integration_domain[:, 1] - integration_domain[:, 0]) < 0.0 - ) - # Skip the values check if an integrator.integrate method is - # compiled with tensorflow.function - if type(boundaries_are_invalid).__name__ == "Tensor": - return dim - if boundaries_are_invalid: + if anp.min(integration_domain[:, 1] - integration_domain[:, 0]) < 0.0: raise ValueError("integration_domain has invalid boundary values") return dim @@ -263,6 +254,37 @@ def wrap(*args, **kwargs): return wrap +def _is_compiling(x): + """ + Check if code is currently being compiled with PyTorch, JAX or TensorFlow + + Args: + x (backend tensor): A tensor currently used for computations + Returns: + bool: True if code is currently being compiled, False otherwise + """ + backend = infer_backend(x) + if backend == "jax": + return any(nam in type(x).__name__ for nam in ["Jaxpr", "JVPTracer"]) + if backend == "torch": + import torch + + if hasattr(torch.jit, "is_tracing"): + # We ignore torch.jit.is_scripting() since we do not support + # compilation to TorchScript + return torch.jit.is_tracing() + # torch.jit.is_tracing() is unavailable below PyTorch version 1.11.0 + return type(x.shape[0]).__name__ == "Tensor" + if backend == "tensorflow": + import tensorflow as tf + + if hasattr(tf, "is_symbolic_tensor"): + return tf.is_symbolic_tensor(x) + # tf.is_symbolic_tensor() is unavailable below TensorFlow version 2.13.0 + return type(x).__name__ == "Tensor" + return False + + def _torch_trace_without_warnings(*args, **kwargs): """Execute `torch.jit.trace` on the passed arguments and hide tracer warnings diff --git a/torchquad/tests/utils_integration_test.py b/torchquad/tests/utils_integration_test.py index 9a3b02ba..ad35de41 100644 --- a/torchquad/tests/utils_integration_test.py +++ b/torchquad/tests/utils_integration_test.py @@ -12,6 +12,7 @@ _linspace_with_grads, _add_at_indices, _setup_integration_domain, + _is_compiling, ) from utils.set_precision import set_precision from utils.enable_cuda import enable_cuda @@ -196,11 +197,48 @@ def test_setup_integration_domain(): _run_tests_with_all_backends(_run_setup_integration_domain_tests) +def _run_is_compiling_tests(dtype_name, backend): + """ + Test _is_compiling with the given dtype and numerical backend + """ + dtype = to_backend_dtype(dtype_name, like=backend) + x = anp.array([[0.0, 1.0], [1.0, 2.0]], dtype=dtype, like=backend) + assert not _is_compiling( + x + ), f"_is_compiling has a false positive with backend {backend}" + + def check_compiling(x): + assert _is_compiling( + x + ), f"_is_compiling has a false negative with backend {backend}" + return x + + if backend == "jax": + import jax + + jax.jit(check_compiling)(x) + elif backend == "torch": + import torch + + torch.jit.trace(check_compiling, (x,), check_trace=False)(x) + elif backend == "tensorflow": + import tensorflow as tf + + tf.function(check_compiling, jit_compile=True)(x) + tf.function(check_compiling, jit_compile=False)(x) + + +def test_is_compiling(): + """Test _is_compiling with all possible configurations""" + _run_tests_with_all_backends(_run_is_compiling_tests) + + if __name__ == "__main__": try: # used to run this test individually test_linspace_with_grads() test_add_at_indices() test_setup_integration_domain() + test_is_compiling() except KeyboardInterrupt: pass From 1a15c66ec080ceb63cbab719e7153b4734a6ba69 Mon Sep 17 00:00:00 2001 From: Pablo Gomez Date: Thu, 27 Jun 2024 15:47:46 +0200 Subject: [PATCH 12/14] Switch black version --- .github/workflows/autoblack.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/autoblack.yml b/.github/workflows/autoblack.yml index 58b10247..12d48bc0 100644 --- a/.github/workflows/autoblack.yml +++ b/.github/workflows/autoblack.yml @@ -10,11 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - name: Set up Python 3.8 + - name: Set up Python 3.11 uses: actions/setup-python@v1 with: - python-version: 3.8 + python-version: 3.11 - name: Install Black - run: pip install black + run: pip install black==24.4.2 - name: Run black --check . run: black --check . From 54b5cc7930a978aed0336c49c3a7f94cfc6873ab Mon Sep 17 00:00:00 2001 From: Pablo Gomez Date: Thu, 27 Jun 2024 15:51:36 +0200 Subject: [PATCH 13/14] Fix formatting --- torchquad/integration/boole.py | 1 - torchquad/integration/simpson.py | 1 - torchquad/integration/utils.py | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/torchquad/integration/boole.py b/torchquad/integration/boole.py index 99e1b22a..a064dff3 100644 --- a/torchquad/integration/boole.py +++ b/torchquad/integration/boole.py @@ -6,7 +6,6 @@ class Boole(NewtonCotes): - """Boole's rule. See https://en.wikipedia.org/wiki/Newton%E2%80%93Cotes_formulas#Closed_Newton%E2%80%93Cotes_formulas .""" def __init__(self): diff --git a/torchquad/integration/simpson.py b/torchquad/integration/simpson.py index 68bea5c7..e67ce47b 100644 --- a/torchquad/integration/simpson.py +++ b/torchquad/integration/simpson.py @@ -6,7 +6,6 @@ class Simpson(NewtonCotes): - """Simpson's rule. See https://en.wikipedia.org/wiki/Newton%E2%80%93Cotes_formulas#Closed_Newton%E2%80%93Cotes_formulas .""" def __init__(self): diff --git a/torchquad/integration/utils.py b/torchquad/integration/utils.py index 64cceb88..9e78ac4a 100644 --- a/torchquad/integration/utils.py +++ b/torchquad/integration/utils.py @@ -2,6 +2,7 @@ Utility functions for the integrator implementations including extensions for autoray, which are registered when importing this file """ + import sys from pathlib import Path From 87da956c9fe16cd6bcd6006c9edafacbcfff8143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20G=C3=B3mez?= Date: Mon, 25 Nov 2024 15:09:52 +0100 Subject: [PATCH 14/14] Update run_tests.yml Fixing mamba setup in CI --- .github/workflows/run_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 050a5f33..00fecde7 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -45,7 +45,7 @@ jobs: # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: provision-with-micromamba - uses: mamba-org/provision-with-micromamba@main + uses: mamba-org/setup-micromamba@v1 with: environment-file: environment_all_backends.yml environment-name: torchquad