From 578cd6785b9e0a5bd8f35a4c59548435aeba0e52 Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 13 Feb 2024 10:08:06 +0000 Subject: [PATCH 01/20] remove unused imports --- lib/iris/experimental/geobridge.py | 74 ++++++++ .../unit/experimental/geobridge/__init__.py | 5 + .../geobridge/test_cube_faces_to_polydata.py | 165 ++++++++++++++++++ .../geobridge/test_region_extraction.py | 1 + 4 files changed, 245 insertions(+) create mode 100644 lib/iris/experimental/geobridge.py create mode 100644 lib/iris/tests/unit/experimental/geobridge/__init__.py create mode 100644 lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py create mode 100644 lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py diff --git a/lib/iris/experimental/geobridge.py b/lib/iris/experimental/geobridge.py new file mode 100644 index 0000000000..ffb6dfb308 --- /dev/null +++ b/lib/iris/experimental/geobridge.py @@ -0,0 +1,74 @@ +from geovista import Transform +from geovista.common import VTK_CELL_IDS + +from iris.exceptions import CoordinateNotFoundError +from iris.experimental.ugrid import Mesh + + +def _get_coord(cube, axis): + try: + coord = cube.coord(axis=axis, dim_coords=True) + except CoordinateNotFoundError: + coord = cube.coord(axis=axis) + return coord + + +def cube_faces_to_polydata(cube): + if cube.mesh: + lons, lats = cube.mesh.node_coords + face_node = cube.mesh.face_node_connectivity + indices = face_node.indices_by_location() + + polydata = Transform.from_unstructured( + lons.points, + lats.points, + indices, + data=cube.data, + name=f"{cube.name()} / {cube.units}", + start_index=face_node.start_index, + ) + elif cube.ndim == 2: + x_coord = _get_coord(cube, "X") + y_coord = _get_coord(cube, "Y") + kwargs = dict( + xs=x_coord.contiguous_bounds(), + ys=y_coord.contiguous_bounds(), + data=cube.data, + name=f"{cube.name()} / {cube.units}", + ) + coord_system = cube.coord_system() + if coord_system: + kwargs["crs"] = coord_system.as_cartopy_crs().proj4_init + + if x_coord.ndim == 2 and y_coord.ndim == 2: + polydata = Transform.from_2d(**kwargs) + + elif x_coord.ndim == 1 and y_coord.ndim == 1: + polydata = Transform.from_1d(**kwargs) + + else: + raise NotImplementedError( + "Only 1D and 2D coordinates are supported" + ) + else: + raise NotImplementedError("Cube must have a mesh or have 2 dimensions") + + return polydata + + +def region_extraction(cube, mesh, region, preference): + region_polydata = region.enclosed(mesh, preference=preference) + indices = region_polydata[VTK_CELL_IDS] + + region_cube = cube[:, indices] + + new_mesh = Mesh.from_coords( + *region_cube.coords(dimensions=cube.mesh_dim()) + ) + new_mesh_coords = new_mesh.to_MeshCoords(cube.location) + + for coord in new_mesh_coords: + region_cube.remove_coord(coord.name()) + region_cube.add_aux_coord(coord, 1) + + return region_cube diff --git a/lib/iris/tests/unit/experimental/geobridge/__init__.py b/lib/iris/tests/unit/experimental/geobridge/__init__.py new file mode 100644 index 0000000000..5afd8aeabc --- /dev/null +++ b/lib/iris/tests/unit/experimental/geobridge/__init__.py @@ -0,0 +1,5 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.experimental.geobridge` module.""" diff --git a/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py b/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py new file mode 100644 index 0000000000..b5f2528315 --- /dev/null +++ b/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py @@ -0,0 +1,165 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the `iris.experimental.geobridge.cube_faces_to_polydata` function.""" + + +from unittest.mock import Mock + +from geovista import Transform +import numpy as np +import pytest + +import iris.analysis.cartography +import iris.coord_systems +from iris.experimental.geobridge import cube_faces_to_polydata +from iris.tests.stock import lat_lon_cube, sample_2d_latlons +from iris.tests.stock.mesh import sample_mesh_cube + + +@pytest.fixture() +def cube_mesh(): + return sample_mesh_cube() + + +@pytest.fixture() +def cube_1d(): + sample_1d_cube = lat_lon_cube() + for coord in sample_1d_cube.dim_coords: + coord.coord_system = None + return sample_1d_cube + + +@pytest.fixture() +def cube_2d(): + return sample_2d_latlons() + + +class ParentClass: + @pytest.fixture() + def expected(self): + pass + + @pytest.fixture() + def operation(self): + pass + + @pytest.fixture() + def cube(self): + pass + + @staticmethod + def test_to_poly(expected, operation, cube): + mocking = Mock() + setattr(Transform, operation, mocking) + cube_faces_to_polydata(cube) + getattr(Transform, operation) + actual = mocking.call_args.kwargs + for key, actual_value in actual.items(): + if isinstance(actual_value, np.ndarray): + np.testing.assert_array_equal(expected[key], actual_value) + else: + assert expected[key] == actual_value + + @staticmethod + def test_to_poly_crs(expected, operation, cube): + default_cs = iris.coord_systems.GeogCS( + iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS + ) + expected["crs"] = default_cs.as_cartopy_crs().proj4_init + for coord in cube.coords(): + coord.coord_system = default_cs + mocking = Mock() + setattr(Transform, operation, mocking) + cube_faces_to_polydata(cube) + getattr(Transform, operation) + actual = mocking.call_args.kwargs + print(actual) + for key, actual_value in actual.items(): + if isinstance(actual_value, np.ndarray): + np.testing.assert_array_equal(expected[key], actual_value) + else: + assert expected[key] == actual_value + + +class Test2dToPoly(ParentClass): + @pytest.fixture() + def expected(self, cube_2d): + return { + "xs": cube_2d.coord(axis="X").contiguous_bounds(), + "ys": cube_2d.coord(axis="Y").contiguous_bounds(), + "data": cube_2d.data, + "name": cube_2d.name() + " / " + str(cube_2d.units), + } + + @pytest.fixture() + def operation(self): + return "from_2d" + + @pytest.fixture() + def cube(self, cube_2d): + return cube_2d + + +class Test1dToPoly(ParentClass): + @pytest.fixture() + def expected(self, cube_1d): + return { + "xs": cube_1d.coord(axis="X").contiguous_bounds(), + "ys": cube_1d.coord(axis="Y").contiguous_bounds(), + "data": cube_1d.data, + "name": cube_1d.name() + " / " + str(cube_1d.units), + } + + @pytest.fixture() + def operation(self): + return "from_1d" + + @pytest.fixture() + def cube(self, cube_1d): + return cube_1d + + +class TestMeshToPoly(ParentClass): + @pytest.fixture() + def expected(self, cube_mesh): + return { + "xs": cube_mesh.coord(axis="X"), + "ys": cube_mesh.coord(axis="Y"), + "data": cube_mesh.data, + "name": cube_mesh.name() + " / " + str(cube_mesh.units), + "start_index": 0, + } + + @pytest.fixture() + def operation(self): + return "from_unstructured" + + @pytest.fixture() + def cube(self, cube_mesh): + return cube_mesh + + @pytest.mark.skip(reason="Meshes do not support crs currently") + def test_to_poly_crs(self, expected, actual): + return NotImplemented + + +class TestExtras: + def test_too_many_dims(self): + pytest.raises( + ValueError, + match=r"There are too many dimensions on this coordinate", + ) + + def test_not_1d_or_2d(self): + pytest.raises( + NotImplementedError, + match=r"Only 1D and 2D coordinates are supported", + ) + + def test_no_mesh_or_2d(self): + pytest.raises( + NotImplementedError, + match=r"Cube must have a mesh or have 2 dimensions", + ) diff --git a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py new file mode 100644 index 0000000000..ccd5e6c20a --- /dev/null +++ b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py @@ -0,0 +1 @@ +# TODO: All of these tests need to be written. From 2fb10460e8d4c2f6abc2e2cde629cd4296cb72e7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 11:19:26 +0000 Subject: [PATCH 02/20] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- lib/iris/experimental/geobridge.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/iris/experimental/geobridge.py b/lib/iris/experimental/geobridge.py index ffb6dfb308..4c0d1d824f 100644 --- a/lib/iris/experimental/geobridge.py +++ b/lib/iris/experimental/geobridge.py @@ -47,9 +47,7 @@ def cube_faces_to_polydata(cube): polydata = Transform.from_1d(**kwargs) else: - raise NotImplementedError( - "Only 1D and 2D coordinates are supported" - ) + raise NotImplementedError("Only 1D and 2D coordinates are supported") else: raise NotImplementedError("Cube must have a mesh or have 2 dimensions") @@ -62,9 +60,7 @@ def region_extraction(cube, mesh, region, preference): region_cube = cube[:, indices] - new_mesh = Mesh.from_coords( - *region_cube.coords(dimensions=cube.mesh_dim()) - ) + new_mesh = Mesh.from_coords(*region_cube.coords(dimensions=cube.mesh_dim())) new_mesh_coords = new_mesh.to_MeshCoords(cube.location) for coord in new_mesh_coords: From 6f861fa1c031757227edeef1f8ab3b0fc62a3180 Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Fri, 16 Feb 2024 15:55:48 +0000 Subject: [PATCH 03/20] wip --- lib/iris/experimental/geobridge.py | 70 --------- lib/iris/experimental/ugrid/mesh.py | 1 + .../unit/experimental/geobridge/__init__.py | 2 +- .../geobridge/test_cube_faces_to_polydata.py | 111 ++++++++----- .../geobridge/test_region_extraction.py | 146 +++++++++++++++++- 5 files changed, 216 insertions(+), 114 deletions(-) delete mode 100644 lib/iris/experimental/geobridge.py diff --git a/lib/iris/experimental/geobridge.py b/lib/iris/experimental/geobridge.py deleted file mode 100644 index 4c0d1d824f..0000000000 --- a/lib/iris/experimental/geobridge.py +++ /dev/null @@ -1,70 +0,0 @@ -from geovista import Transform -from geovista.common import VTK_CELL_IDS - -from iris.exceptions import CoordinateNotFoundError -from iris.experimental.ugrid import Mesh - - -def _get_coord(cube, axis): - try: - coord = cube.coord(axis=axis, dim_coords=True) - except CoordinateNotFoundError: - coord = cube.coord(axis=axis) - return coord - - -def cube_faces_to_polydata(cube): - if cube.mesh: - lons, lats = cube.mesh.node_coords - face_node = cube.mesh.face_node_connectivity - indices = face_node.indices_by_location() - - polydata = Transform.from_unstructured( - lons.points, - lats.points, - indices, - data=cube.data, - name=f"{cube.name()} / {cube.units}", - start_index=face_node.start_index, - ) - elif cube.ndim == 2: - x_coord = _get_coord(cube, "X") - y_coord = _get_coord(cube, "Y") - kwargs = dict( - xs=x_coord.contiguous_bounds(), - ys=y_coord.contiguous_bounds(), - data=cube.data, - name=f"{cube.name()} / {cube.units}", - ) - coord_system = cube.coord_system() - if coord_system: - kwargs["crs"] = coord_system.as_cartopy_crs().proj4_init - - if x_coord.ndim == 2 and y_coord.ndim == 2: - polydata = Transform.from_2d(**kwargs) - - elif x_coord.ndim == 1 and y_coord.ndim == 1: - polydata = Transform.from_1d(**kwargs) - - else: - raise NotImplementedError("Only 1D and 2D coordinates are supported") - else: - raise NotImplementedError("Cube must have a mesh or have 2 dimensions") - - return polydata - - -def region_extraction(cube, mesh, region, preference): - region_polydata = region.enclosed(mesh, preference=preference) - indices = region_polydata[VTK_CELL_IDS] - - region_cube = cube[:, indices] - - new_mesh = Mesh.from_coords(*region_cube.coords(dimensions=cube.mesh_dim())) - new_mesh_coords = new_mesh.to_MeshCoords(cube.location) - - for coord in new_mesh_coords: - region_cube.remove_coord(coord.name()) - region_cube.add_aux_coord(coord, 1) - - return region_cube diff --git a/lib/iris/experimental/ugrid/mesh.py b/lib/iris/experimental/ugrid/mesh.py index 68d208d867..c847d423d4 100644 --- a/lib/iris/experimental/ugrid/mesh.py +++ b/lib/iris/experimental/ugrid/mesh.py @@ -871,6 +871,7 @@ def check_shape(array_name): ##### # TODO: remove axis assignment once Mesh supports arbitrary coords. + # TODO: consider filtering coords as the first action in this method. axes_present = [guess_coord_axis(coord) for coord in coords] axes_required = ("X", "Y") if all([req in axes_present for req in axes_required]): diff --git a/lib/iris/tests/unit/experimental/geobridge/__init__.py b/lib/iris/tests/unit/experimental/geobridge/__init__.py index 5afd8aeabc..b2024ce97d 100644 --- a/lib/iris/tests/unit/experimental/geobridge/__init__.py +++ b/lib/iris/tests/unit/experimental/geobridge/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.geobridge` module.""" +"""Unit tests for the :mod:`iris.experimental.geovista` module.""" diff --git a/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py b/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py index b5f2528315..a03731d621 100644 --- a/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py +++ b/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py @@ -13,7 +13,7 @@ import iris.analysis.cartography import iris.coord_systems -from iris.experimental.geobridge import cube_faces_to_polydata +from iris.experimental.geovista import cube_faces_to_polydata from iris.tests.stock import lat_lon_cube, sample_2d_latlons from iris.tests.stock.mesh import sample_mesh_cube @@ -36,7 +36,16 @@ def cube_2d(): return sample_2d_latlons() +@pytest.fixture() +def default_cs(): + return iris.coord_systems.GeogCS( + iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS + ) + + class ParentClass: + MOCKED_OPERATION = NotImplemented + @pytest.fixture() def expected(self): pass @@ -49,41 +58,46 @@ def operation(self): def cube(self): pass - @staticmethod - def test_to_poly(expected, operation, cube): + @pytest.fixture() + def cube_with_crs(self, default_cs, cube): + cube_crs = cube.copy() + for coord in cube_crs.coords(): + coord.coord_system = default_cs + return cube_crs + + @pytest.fixture() + def mocked_operation(self): mocking = Mock() - setattr(Transform, operation, mocking) - cube_faces_to_polydata(cube) - getattr(Transform, operation) - actual = mocking.call_args.kwargs - for key, actual_value in actual.items(): - if isinstance(actual_value, np.ndarray): - np.testing.assert_array_equal(expected[key], actual_value) - else: - assert expected[key] == actual_value + setattr(Transform, self.MOCKED_OPERATION, mocking) + return mocking @staticmethod - def test_to_poly_crs(expected, operation, cube): - default_cs = iris.coord_systems.GeogCS( - iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS - ) - expected["crs"] = default_cs.as_cartopy_crs().proj4_init - for coord in cube.coords(): - coord.coord_system = default_cs - mocking = Mock() - setattr(Transform, operation, mocking) + def test_to_poly(expected, mocked_operation, cube): cube_faces_to_polydata(cube) - getattr(Transform, operation) - actual = mocking.call_args.kwargs - print(actual) - for key, actual_value in actual.items(): - if isinstance(actual_value, np.ndarray): - np.testing.assert_array_equal(expected[key], actual_value) + actual = mocked_operation.call_args.kwargs + for key, expected_value in expected.items(): + if hasattr(expected_value, "shape"): + np.testing.assert_array_equal(actual[key], expected_value) else: - assert expected[key] == actual_value + assert actual[key] == expected_value + + @staticmethod + def test_to_poly_crs(mocked_operation, default_cs, cube_with_crs): + cube_faces_to_polydata(cube_with_crs) + actual = mocked_operation.call_args.kwargs + assert actual["crs"] == default_cs.as_cartopy_crs().proj4_init + + @staticmethod + def test_to_poly_kwargs(mocked_operation, cube): + kwargs = {"test": "test"} + cube_faces_to_polydata(cube, **kwargs) + actual = mocked_operation.call_args.kwargs + assert actual["test"] == "test" class Test2dToPoly(ParentClass): + MOCKED_OPERATION = "from_2d" + @pytest.fixture() def expected(self, cube_2d): return { @@ -103,6 +117,8 @@ def cube(self, cube_2d): class Test1dToPoly(ParentClass): + MOCKED_OPERATION = "from_1d" + @pytest.fixture() def expected(self, cube_1d): return { @@ -122,11 +138,14 @@ def cube(self, cube_1d): class TestMeshToPoly(ParentClass): + MOCKED_OPERATION = "from_unstructured" + @pytest.fixture() def expected(self, cube_mesh): return { - "xs": cube_mesh.coord(axis="X"), - "ys": cube_mesh.coord(axis="Y"), + "xs": cube_mesh.mesh.node_coords[0].points, + "ys": cube_mesh.mesh.node_coords[1].points, + "connectivity": cube_mesh.mesh.face_node_connectivity.indices_by_location(), "data": cube_mesh.data, "name": cube_mesh.name() + " / " + str(cube_mesh.units), "start_index": 0, @@ -146,20 +165,28 @@ def test_to_poly_crs(self, expected, actual): class TestExtras: - def test_too_many_dims(self): - pytest.raises( - ValueError, - match=r"There are too many dimensions on this coordinate", - ) - - def test_not_1d_or_2d(self): - pytest.raises( + @pytest.fixture() + def cube_1d_2d(self, cube_2d): + my_cube = cube_2d.copy() + lat_coord = my_cube.aux_coords[0] + lat_coord_small = lat_coord[0] + lat_coord_small.bounds = None + lat_coord_small.points = np.arange(len(lat_coord_small.points)) + my_cube.remove_coord(lat_coord) + my_cube.add_aux_coord(lat_coord_small, 1) + return my_cube + + def test_not_1d_or_2d(self, cube_1d_2d): + with pytest.raises( NotImplementedError, match=r"Only 1D and 2D coordinates are supported", - ) + ): + cube_faces_to_polydata(cube_1d_2d) - def test_no_mesh_or_2d(self): - pytest.raises( + def test_no_mesh_or_2d(self, cube_1d): + cube = cube_1d[0] + with pytest.raises( NotImplementedError, match=r"Cube must have a mesh or have 2 dimensions", - ) + ): + cube_faces_to_polydata(cube) diff --git a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py index ccd5e6c20a..426ab40b89 100644 --- a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py +++ b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py @@ -1 +1,145 @@ -# TODO: All of these tests need to be written. +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the `iris.experimental.geobridge.region_extraction` function.""" + +from unittest.mock import MagicMock, Mock + +from geovista.common import VTK_CELL_IDS, VTK_POINT_IDS +import numpy as np +import pytest + +from iris.experimental.geovista import region_extraction +from iris.tests.stock import sample_2d_latlons +from iris.tests.stock.mesh import sample_mesh_cube + + +class TestRegionExtraction: + @pytest.fixture() + def cube_2d(self): + return sample_2d_latlons() + + @pytest.fixture(params=["face", "node"], autouse=True) + def cube_mesh(self, request): + self.cube_mesh = sample_mesh_cube(location=request.param, n_z=10) + + @pytest.fixture() + def cube_mesh_edge(self): + return sample_mesh_cube(location="edge") + + @pytest.fixture(autouse=True) + def mocked_polydata(self): + mock_polydata_scalars = { + VTK_CELL_IDS: np.arange(2), + VTK_POINT_IDS: np.arange(14), + } + polydata = MagicMock() + polydata.__getitem__.side_effect = mock_polydata_scalars.__getitem__ + polydata.GetNumberOfCells.return_value = 3 + polydata.GetNumberOfPoints.return_value = 15 + self.mocked_polydata = polydata + + @pytest.fixture(autouse=True) + def mocked_region(self): + region = Mock() + region.enclosed.return_value = self.mocked_polydata + self.mocked_region = region + + def test_called_with(self): + region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + self.mocked_region.enclosed.assert_called_with(self.mocked_polydata) + + def test_kwarg(self): + region_extraction( + self.cube_mesh, + self.mocked_polydata, + self.mocked_region, + test="test", + ) + actual = self.mocked_region.enclosed.call_args.kwargs + assert actual["test"] == "test" + + @pytest.mark.parametrize( + "transpose_cube", [True, False], ids=["Transposed", "Not Transposed"] + ) + def test_indices(self, transpose_cube): + if transpose_cube: + self.cube_mesh.transpose() + extracted_region = region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + expected_length = len(self.mocked_polydata[VTK_CELL_IDS]) + else: + assert self.cube_mesh.location == "node" + expected_length = len(self.mocked_polydata[VTK_POINT_IDS]) + mesh_dim = self.cube_mesh.mesh_dim() + assert extracted_region.shape[mesh_dim] == expected_length + + def test_empty_indices(self): + mock_polydata_scalars = { + VTK_CELL_IDS: np.arange(0), + VTK_POINT_IDS: np.arange(0), + } + self.mocked_polydata.__getitem__.side_effect = ( + mock_polydata_scalars.__getitem__ + ) + with pytest.raises( + IndexError, match="No part of `polydata` falls within `region`." + ): + region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + + def test_recreate_mesh(self): + extracted_region = region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + assert extracted_region.mesh is not None + else: + assert extracted_region.mesh is None + + def test_new_mesh_coords(self): + extracted_region = region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) + if self.cube_mesh.location == "face": + mesh_coords = extracted_region.coords(mesh_coords=True) + np.testing.assert_array_equal( + mesh_coords[0].bounds, + [[1200, 1201, 1202, 1203], [1204, 1205, 1206, 1207]], + ) + np.testing.assert_array_equal(mesh_coords[0].points, [3200, 3201]) + np.testing.assert_array_equal( + mesh_coords[1].bounds, + [[1100, 1101, 1102, 1103], [1104, 1105, 1106, 1107]], + ) + np.testing.assert_array_equal(mesh_coords[1].points, [3100, 3101]) + + def test_no_mesh(self, cube_2d): + cube = cube_2d + with pytest.raises(ValueError, match="Cube must have a mesh"): + region_extraction(cube, self.mocked_polydata, self.mocked_region) + + def test_edge_location(self, cube_mesh_edge): + with pytest.raises( + NotImplementedError, match="Must be on face or node." + ): + region_extraction( + cube_mesh_edge, self.mocked_polydata, self.mocked_region + ) + + def test_cube_and_poly_shapes_mismatch(self): + self.mocked_polydata.GetNumberOfCells.return_value = 4 + self.mocked_polydata.GetNumberOfPoints.return_value = 16 + with pytest.raises( + ValueError, + match="The mesh on the cube and the polydata must have the same shape.", + ): + region_extraction( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) From 1a083d8aa179165a866234c5748552f620f3c5cd Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Fri, 16 Feb 2024 15:59:06 +0000 Subject: [PATCH 04/20] wip --- lib/iris/experimental/geovista.py | 146 ++++++++++++++++++ .../experimental/test_cube_to_poly.py | 49 ++++++ 2 files changed, 195 insertions(+) create mode 100644 lib/iris/experimental/geovista.py create mode 100644 lib/iris/tests/integration/experimental/test_cube_to_poly.py diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py new file mode 100644 index 0000000000..990f72d1de --- /dev/null +++ b/lib/iris/experimental/geovista.py @@ -0,0 +1,146 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Experimental module for using some GeoVista operations with Iris cubes.""" + +from geovista import Transform +from geovista.common import VTK_CELL_IDS, VTK_POINT_IDS + +from iris.exceptions import CoordinateNotFoundError +from iris.experimental.ugrid import Mesh + + +def _get_coord(cube, axis): + """ + Helper function to get the coordinates from the cube. + + """ + try: + coord = cube.coord(axis=axis, dim_coords=True) + except CoordinateNotFoundError: + coord = cube.coord(axis=axis) + return coord + + +def cube_faces_to_polydata(cube, **kwargs): + """ + Function to convert a cube or the mesh attached to a cube into a polydata + object that can be used by GeoVista to generate plots. + + Parameters + ---------- + cube : :class:`~iris.cube.Cube` + Incoming cube containing the arrays or the mesh to be converted into the + polydata object. + + **kwargs : dict + Additional keyword arguments to be passed to the Transform method. + + """ + if cube.mesh: + if cube.ndim != 1: + raise NotImplementedError( + "Cubes with a mesh must be one dimensional" + ) + lons, lats = cube.mesh.node_coords + face_node = cube.mesh.face_node_connectivity + indices = face_node.indices_by_location() + + polydata = Transform.from_unstructured( + xs=lons.points, + ys=lats.points, + connectivity=indices, + data=cube.data, + name=f"{cube.name()} / {cube.units}", + start_index=face_node.start_index, + **kwargs, + ) + elif cube.ndim == 2: + x_coord = _get_coord(cube, "X") + y_coord = _get_coord(cube, "Y") + transform_kwargs = dict( + xs=x_coord.contiguous_bounds(), + ys=y_coord.contiguous_bounds(), + data=cube.data, + name=f"{cube.name()} / {cube.units}", + **kwargs, + ) + coord_system = cube.coord_system() + if coord_system: + transform_kwargs["crs"] = coord_system.as_cartopy_crs().proj4_init + + if x_coord.ndim == 2 and y_coord.ndim == 2: + polydata = Transform.from_2d(**transform_kwargs) + + elif x_coord.ndim == 1 and y_coord.ndim == 1: + polydata = Transform.from_1d(**transform_kwargs) + + else: + raise NotImplementedError( + "Only 1D and 2D coordinates are supported" + ) + else: + raise NotImplementedError("Cube must have a mesh or have 2 dimensions") + + return polydata + + +def region_extraction(cube, polydata, region, **kwargs): + """ + Function to extract a region from a cube and its associated mesh and return + a new cube containing the region. + + """ + if cube.mesh: + # Find what dimension the mesh is in on the cube + mesh_dim = cube.mesh_dim() + recreate_mesh = False + + if cube.location == "face": + polydata_length = polydata.GetNumberOfCells() + indices_key = VTK_CELL_IDS + recreate_mesh = True + elif cube.location == "node": + polydata_length = polydata.GetNumberOfPoints() + indices_key = VTK_POINT_IDS + else: + raise NotImplementedError("Must be on face or node.") + + if cube.shape[mesh_dim] != polydata_length: + raise ValueError( + "The mesh on the cube and the polydata must have the" + " same shape." + ) + + region_polydata = region.enclosed(polydata, **kwargs) + indices = region_polydata[indices_key] + if len(indices) == 0: + raise IndexError("No part of `polydata` falls within `region`.") + + my_tuple = tuple( + [ + slice(None) if i != mesh_dim else indices + for i in range(cube.ndim) + ] + ) + + region_cube = cube[my_tuple] + + if recreate_mesh: + coords_on_mesh_dim = region_cube.coords(dimensions=mesh_dim) + new_mesh = Mesh.from_coords( + *[c for c in coords_on_mesh_dim if c.has_bounds()] + ) + + new_mesh_coords = new_mesh.to_MeshCoords(cube.location) + + for coord in new_mesh_coords: + region_cube.remove_coord(coord.name()) + region_cube.add_aux_coord(coord, mesh_dim) + + # TODO: Support unstructured point based data without a mesh + else: + raise ValueError("Cube must have a mesh") + + return region_cube diff --git a/lib/iris/tests/integration/experimental/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/test_cube_to_poly.py new file mode 100644 index 0000000000..ce748961ae --- /dev/null +++ b/lib/iris/tests/integration/experimental/test_cube_to_poly.py @@ -0,0 +1,49 @@ +import numpy as np + +from iris import load_cube +from iris.experimental.geovista import cube_faces_to_polydata +from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD +from iris.tests import get_data_path + + +def test_integration_2d(): + pass + + +def test_integration_1d(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_surface_mean.nc", + ] + ) + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path, "tstar_sea") + + polydata = cube_faces_to_polydata(global_cube) + + assert polydata.GetNumberOfCells() == 13824 + assert polydata.GetNumberOfPoints() == 13826 + np.testing.assert_array_equal(polydata.active_scalars, global_cube.data) + + +def test_integration_mesh(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ] + ) + + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path, "conv_rain") + + polydata = cube_faces_to_polydata(global_cube[0, :]) + + assert polydata.GetNumberOfCells() == 864 + assert polydata.GetNumberOfPoints() == 866 + np.testing.assert_array_equal( + polydata.active_scalars, global_cube[0, :].data + ) From 663c34e1abd39d2369f72facfd980bdc07374982 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 16:00:47 +0000 Subject: [PATCH 05/20] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- lib/iris/experimental/geovista.py | 27 +++++-------------- .../experimental/test_cube_to_poly.py | 4 +-- .../geobridge/test_region_extraction.py | 24 +++++------------ 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 990f72d1de..4133210e57 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -12,10 +12,7 @@ def _get_coord(cube, axis): - """ - Helper function to get the coordinates from the cube. - - """ + """Helper function to get the coordinates from the cube.""" try: coord = cube.coord(axis=axis, dim_coords=True) except CoordinateNotFoundError: @@ -24,8 +21,7 @@ def _get_coord(cube, axis): def cube_faces_to_polydata(cube, **kwargs): - """ - Function to convert a cube or the mesh attached to a cube into a polydata + """Function to convert a cube or the mesh attached to a cube into a polydata object that can be used by GeoVista to generate plots. Parameters @@ -40,9 +36,7 @@ def cube_faces_to_polydata(cube, **kwargs): """ if cube.mesh: if cube.ndim != 1: - raise NotImplementedError( - "Cubes with a mesh must be one dimensional" - ) + raise NotImplementedError("Cubes with a mesh must be one dimensional") lons, lats = cube.mesh.node_coords face_node = cube.mesh.face_node_connectivity indices = face_node.indices_by_location() @@ -77,9 +71,7 @@ def cube_faces_to_polydata(cube, **kwargs): polydata = Transform.from_1d(**transform_kwargs) else: - raise NotImplementedError( - "Only 1D and 2D coordinates are supported" - ) + raise NotImplementedError("Only 1D and 2D coordinates are supported") else: raise NotImplementedError("Cube must have a mesh or have 2 dimensions") @@ -87,8 +79,7 @@ def cube_faces_to_polydata(cube, **kwargs): def region_extraction(cube, polydata, region, **kwargs): - """ - Function to extract a region from a cube and its associated mesh and return + """Function to extract a region from a cube and its associated mesh and return a new cube containing the region. """ @@ -109,8 +100,7 @@ def region_extraction(cube, polydata, region, **kwargs): if cube.shape[mesh_dim] != polydata_length: raise ValueError( - "The mesh on the cube and the polydata must have the" - " same shape." + "The mesh on the cube and the polydata must have the" " same shape." ) region_polydata = region.enclosed(polydata, **kwargs) @@ -119,10 +109,7 @@ def region_extraction(cube, polydata, region, **kwargs): raise IndexError("No part of `polydata` falls within `region`.") my_tuple = tuple( - [ - slice(None) if i != mesh_dim else indices - for i in range(cube.ndim) - ] + [slice(None) if i != mesh_dim else indices for i in range(cube.ndim)] ) region_cube = cube[my_tuple] diff --git a/lib/iris/tests/integration/experimental/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/test_cube_to_poly.py index ce748961ae..27cf5901c5 100644 --- a/lib/iris/tests/integration/experimental/test_cube_to_poly.py +++ b/lib/iris/tests/integration/experimental/test_cube_to_poly.py @@ -44,6 +44,4 @@ def test_integration_mesh(): assert polydata.GetNumberOfCells() == 864 assert polydata.GetNumberOfPoints() == 866 - np.testing.assert_array_equal( - polydata.active_scalars, global_cube[0, :].data - ) + np.testing.assert_array_equal(polydata.active_scalars, global_cube[0, :].data) diff --git a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py index 426ab40b89..76c9169659 100644 --- a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py +++ b/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py @@ -47,9 +47,7 @@ def mocked_region(self): self.mocked_region = region def test_called_with(self): - region_extraction( - self.cube_mesh, self.mocked_polydata, self.mocked_region - ) + region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) self.mocked_region.enclosed.assert_called_with(self.mocked_polydata) def test_kwarg(self): @@ -84,15 +82,11 @@ def test_empty_indices(self): VTK_CELL_IDS: np.arange(0), VTK_POINT_IDS: np.arange(0), } - self.mocked_polydata.__getitem__.side_effect = ( - mock_polydata_scalars.__getitem__ - ) + self.mocked_polydata.__getitem__.side_effect = mock_polydata_scalars.__getitem__ with pytest.raises( IndexError, match="No part of `polydata` falls within `region`." ): - region_extraction( - self.cube_mesh, self.mocked_polydata, self.mocked_region - ) + region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) def test_recreate_mesh(self): extracted_region = region_extraction( @@ -126,12 +120,8 @@ def test_no_mesh(self, cube_2d): region_extraction(cube, self.mocked_polydata, self.mocked_region) def test_edge_location(self, cube_mesh_edge): - with pytest.raises( - NotImplementedError, match="Must be on face or node." - ): - region_extraction( - cube_mesh_edge, self.mocked_polydata, self.mocked_region - ) + with pytest.raises(NotImplementedError, match="Must be on face or node."): + region_extraction(cube_mesh_edge, self.mocked_polydata, self.mocked_region) def test_cube_and_poly_shapes_mismatch(self): self.mocked_polydata.GetNumberOfCells.return_value = 4 @@ -140,6 +130,4 @@ def test_cube_and_poly_shapes_mismatch(self): ValueError, match="The mesh on the cube and the polydata must have the same shape.", ): - region_extraction( - self.cube_mesh, self.mocked_polydata, self.mocked_region - ) + region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) From f6c683400f43eac4f9182dc1baba698a6e0546f5 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 16 Feb 2024 16:38:15 +0000 Subject: [PATCH 06/20] Include GeoVista in dependencies. --- requirements/locks/py310-linux-64.lock | 138 ++++++++++++++++++++++-- requirements/locks/py311-linux-64.lock | 137 ++++++++++++++++++++++-- requirements/locks/py39-linux-64.lock | 139 +++++++++++++++++++++++-- requirements/py310.yml | 1 + requirements/py311.yml | 1 + requirements/py39.yml | 1 + 6 files changed, 387 insertions(+), 30 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 3cbf8fb510..3157030dbd 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 808932859f70a640fcdd10a6b3c7fb545b14087d3a6db4e60bf79e05a4272c0a +# input_hash: e9d209b616f9e4ffaf58cf10cdea760dd7bee6a2108632e0dc833c7c40ab610a @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,23 +10,35 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d @@ -38,22 +50,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a +https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.8.0-h59595ed_0.conda#a9fb862e9d3beb0ebc61c10806056a7d +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -62,37 +90,63 @@ https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 +https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 +https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 @@ -103,14 +157,17 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py310hc6cd4ac_0.conda#e533f96945907b2e81c6b604f578b69c +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py310hff52083_1.tar.bz2#21b8fa2179290505e607f5ccd65b01b0 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py310h2372a71_0.conda#f20cd4d9c1f4a8377d0818c819918bbb https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -119,32 +176,42 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py310hff52083_1.conda#157e6221a079a60c7f6f6fcb87c722aa https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0.conda#f6703fa0214a00bf49d1bef6dc7672d0 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py310hd41b1e2_0.conda#dc5263dcaa1347e5a456ead3537be27d +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py310h2372a71_0.conda#d4c91d19e4f2f18b64753ac660edad79 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda#c79cacf8a06a51552fc651652f170208 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a71_0.conda#b631b889b0b4bc2fca7b8b977ca484b2 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 +https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda#4531d2927578e7e254ff3bcf6457518c https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 @@ -153,71 +220,121 @@ https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py310h2372a71_1.co https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.1-py310h2372a71_0.conda#b2de1af90e44849451c9808312f964ae https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py310h2372a71_0.conda#21362970a6fea90ca507c253c20465f2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py310h2372a71_0.conda#480ff621e839c5f80a52975b167500d2 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py310h2372a71_0.conda#4ad35c8f6a64a6ab708780dad603aef4 +https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py310h2372a71_0.conda#7125fe11f08cdc41de9734dfb2ffd35b https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py310hcc13569_0.conda#514c836161e8b2e43e7d8fb7a28a92c4 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed +https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py310h1f7b6fc_0.conda#25ede13c92af9a12712dc33fdc3adc11 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h1f7b6fc_1.conda#be6f0382440ccbf9fb01bb19ab1f1fc0 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.1.1-pyhd8ed1ab_0.conda#81039f39690f341dcb0a68bf62e812be -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py310h62c0568_0.conda#3cbbc7d0b54df02c9a006d3de14911d9 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.0-pyha770c72_0.conda#473a7cfca197da0a10cff3f6dded7d4b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py310h1f7b6fc_1.conda#857b828a13cdddf568958f7575b25b22 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 +https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#671543f081d6be0b6b3e99b586386b44 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda#f4fe7a6e3d7c78c9de048ea9dda21690 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py310h1234567_220.conda#665737e30e12e5c1e20a8a3426df73f2 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py310hff52083_0.conda#e91d183a307d7bd667003291f690cbb0 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py310h1234567_220.conda#5611464975f4d2bd8c5beeab80ead9a0 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py310h1234567_220.conda#1c1089c9dc15089da0b1b3a24dff32d1 +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 @@ -228,3 +345,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e + diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 053251b045..f963884483 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 9f4d0f3ce6f3f0d7af7672fdc6f449b404e067882f805f0b3c416eb77ae0f4c0 +# input_hash: 2703a355756c12ca0341ba67a7c3faeb6db8597dedb5d40f78b74ad3a137c307 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,23 +10,35 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d @@ -38,22 +50,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a +https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.8.0-h59595ed_0.conda#a9fb862e9d3beb0ebc61c10806056a7d +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -62,37 +90,63 @@ https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 +https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 +https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 @@ -103,14 +157,17 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py311hb755f60_0.conda#28778bfea41b0f34141208783882649b +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -119,32 +176,42 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py311h38be061_1.conda#94a4521bd7933a66d76b0274dbf8d2dd https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda#a322b4185121935c871d201ae00ac143 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda#4288ea5cbe686d1b18fc3efb36c009a5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda#c79cacf8a06a51552fc651652f170208 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a +https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda#4531d2927578e7e254ff3bcf6457518c https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 @@ -152,71 +219,120 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2f https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.1-py311h459d7ec_0.conda#9caf3270065a2d40fd9a443ba1568e96 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py311h459d7ec_0.conda#36363685b6e56682b1b256eb0ad503f6 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda#02336abab4cb5dd794010ef53c54bd09 +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py311h459d7ec_0.conda#5b22b9390448faccbc41769389b514a9 +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda#e4d262cc3600e70b505a6761d29f6207 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py311h320fe9a_0.conda#b9e7a2cb2c47bbb99c05d1892500be45 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed +https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py311h1f0f07a_0.conda#8a18202ff25c26a81a230e3eaf657b3c https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 +https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.1.1-pyhd8ed1ab_0.conda#81039f39690f341dcb0a68bf62e812be -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.0-pyha770c72_0.conda#473a7cfca197da0a10cff3f6dded7d4b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#671543f081d6be0b6b3e99b586386b44 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda#ec7e45bc76d9d0b69a74a2075932b8e8 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py311h1234567_220.conda#bbfafb0cc0483c89ea2289381dc157a5 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py311h38be061_0.conda#0452c2cca94bdda38a16cf7b84edcd27 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py311h1234567_220.conda#0e894286dd36bdc569d7fd4e8033f8d9 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py311h1234567_220.conda#bd6689b3212fc662bd6cbc57e29ec0dc +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 @@ -227,3 +343,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e + diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index f68198c664..2708667be4 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 86ffb93b06ad756fa46d24f8877077b64c3a7cd8bda0399560525e53fed33f99 +# input_hash: f7181b3c93b7ce0524779056e3249a6f48c90ae100a1706fb064922066b47919 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,23 +10,35 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 +https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda#d211c42b9ce49aee3734fdc828731689 https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 +https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 +https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff +https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d @@ -38,22 +50,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a +https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-1.8.0-h59595ed_0.conda#a9fb862e9d3beb0ebc61c10806056a7d +https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -62,37 +90,63 @@ https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9 https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 +https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 +https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc +https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 +https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b +https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda#c48418c8b35f1d59ae9ae1174812b40a https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda#0876280e409658fc6f9e75d035960333 @@ -103,14 +157,17 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py39h3d6467e_0.conda#0261e43a0b124d1ced1e1af085e8bc3c +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py39hf3d152e_1.tar.bz2#adb733ec2ee669f6d010758d054da60f https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py39hd1e30aa_0.conda#194fa03bd6b1054b8de8d48d335e45b2 https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -119,104 +176,165 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py39hf3d152e_1.conda#80f2066f7641b913233f07b800e2afde https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda#9a9a22eb1f83c44953319ee3b027769f https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py39h7633fee_0.conda#f668e146a2ed03a4e62ffbb98b3115fb +https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py39hd1e30aa_0.conda#e2005168d5a334f88a1d95d02e139239 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 +https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.4-pyhd8ed1ab_0.conda#c79cacf8a06a51552fc651652f170208 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa_0.conda#756cb152772a225587a05ca0ec68fc08 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 +https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda#4531d2927578e7e254ff3bcf6457518c https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py39hd1e30aa_1.conda#cbe186eefb0bcd91e8f47c3908489874 https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 +https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.0-hd590300_1.conda#ae92aab42726eb29d16488924f7312cb https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py39hd1e30aa_0.conda#dc0fb8e157c7caba4c98f1e1f9d2e5f4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.48.1-py39hd1e30aa_0.conda#402ef3d9608c7653187a3fd6fd45b445 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py39hd1e30aa_0.conda#7288bccf99dd979dfcf80bb372c3de3f +https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 +https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39h7633fee_4.conda#b66595fbda99771266f042f42c7457be +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py39hd1e30aa_0.conda#15a521bec784b8903fd6396f234b6aec https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 +https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.1.1-pyhd8ed1ab_0.conda#1a92a5bd77b2430796696e25c3d8dbcb -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.33-pyhd8ed1ab_0.conda#93c8f8ceb83827d88deeba796f07fba7 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py39hddac248_0.conda#95aaa7baa61432a1ce85dedb7b86d2dd https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed +https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py39h44dd56e_0.conda#146e5b81c6c6b2279b2d71aec5ae0b5e https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h44dd56e_1.conda#d037c20e3da2e85f03ebd20ad480c359 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.1.1-pyhd8ed1ab_0.conda#81039f39690f341dcb0a68bf62e812be -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py39he9076e7_0.conda#6085411aa2f0b2b801d3b46e1d3b83c5 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.0-pyha770c72_0.conda#473a7cfca197da0a10cff3f6dded7d4b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py39h44dd56e_1.conda#90c5165691fdcb5a9f43907e32ea48b4 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 +https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 -https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 +https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#671543f081d6be0b6b3e99b586386b44 +https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py39h1234567_220.conda#dadcd0dc225d51a481df8f27f70feaef +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda#983f5b77540eb5aa00238e72ec9b1dfb +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py39h1234567_220.conda#37776296bbc64b7684d2af27aa2f1653 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py39h1234567_220.conda#aa08666bf3c8c425add2db0ff49af88c +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.5.0-pyhd8ed1ab_0.conda#264b3c697fa9cdade87eb0abe4440d54 @@ -227,3 +345,4 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e + diff --git a/requirements/py310.yml b/requirements/py310.yml index f0f8f97eea..c5ef74d508 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack diff --git a/requirements/py311.yml b/requirements/py311.yml index b40e5f75e1..d2c41d42c2 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack diff --git a/requirements/py39.yml b/requirements/py39.yml index 884c568575..692e78c7b9 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -26,6 +26,7 @@ dependencies: # Optional dependencies. - esmpy >=7.0 + - geovista - graphviz - iris-sample-data >=2.4.0 - mo_pack From a86956da569637fec61541605de0e07942d8f2ab Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 16 Feb 2024 18:18:50 +0000 Subject: [PATCH 07/20] Docstrings. --- docs/src/conf.py | 2 + lib/iris/experimental/geovista.py | 216 ++++++++++++++++++++++++++++-- 2 files changed, 210 insertions(+), 8 deletions(-) diff --git a/docs/src/conf.py b/docs/src/conf.py index 89133d0e1b..af364bb9c0 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -252,6 +252,8 @@ def _dotv(version): "scipy": ("https://docs.scipy.org/doc/scipy/", None), "pandas": ("https://pandas.pydata.org/docs/", None), "dask": ("https://docs.dask.org/en/stable/", None), + "geovista": ("https://geovista.readthedocs.io/en/latest/", None), + "pyvista": ("https://docs.pyvista.org/", None), } # The name of the Pygments (syntax highlighting) style to use. diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 4133210e57..644466b0b1 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -12,7 +12,7 @@ def _get_coord(cube, axis): - """Helper function to get the coordinates from the cube.""" + """Get the axis coordinates from the cube.""" try: coord = cube.coord(axis=axis, dim_coords=True) except CoordinateNotFoundError: @@ -21,17 +21,109 @@ def _get_coord(cube, axis): def cube_faces_to_polydata(cube, **kwargs): - """Function to convert a cube or the mesh attached to a cube into a polydata - object that can be used by GeoVista to generate plots. + r"""Create a :class:`pyvista.PolyData` object from a :class:`~iris.cube.Cube`. + + The resulting :class:`~pyvista.PolyData` object can be plotted using + a :class:`geovista.geoplotter.GeoPlotter`. + + Uses :class:`geovista.bridge.Transform` to parse the cube's information - one + of: :meth:`~geovista.bridge.Transform.from_1d` / + :meth:`~geovista.bridge.Transform.from_2d` / + :meth:`~geovista.bridge.Transform.from_unstructured`. Parameters ---------- cube : :class:`~iris.cube.Cube` - Incoming cube containing the arrays or the mesh to be converted into the - polydata object. + The Cube containing the spatial information and data for creating the + class:`~pyvista.PolyData`. **kwargs : dict - Additional keyword arguments to be passed to the Transform method. + Additional keyword arguments to be passed to the relevant + :class:`~geovista.bridge.Transform` method (e.g ``zlevel``). + + Returns + ------- + :class:`~pyvista.PolyData` + The PolyData object representing the cube's spatial information and data. + + Raises + ------ + NotImplementedError + If a :class:`~iris.cube.Cube` with too many dimensions is passed. Only + the horizontal data can be represented, meaning a 2D Cube, or 1D Cube + if the horizontal space is described by + :class:`~iris.experimental.ugrid.MeshCoord`\\ s. + + Examples + -------- + .. testsetup:: + + from iris import load_cube, sample_data_path + from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + + cube = load_cube(sample_data_path("air_temp.pp")) + cube_w_time = load_cube(sample_data_path("A1B_north_america.nc")) + with PARSE_UGRID_ON_LOAD.context(): + cube_mesh = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + + >>> from iris.experimental.geovista import cube_faces_to_polydata + + Converting a standard 2-dimensional :class:`~iris.cube.Cube` with + 1-dimensional coordinates: + + >>> print(cube.summary(shorten=True)) + air_temperature / (K) (latitude: 73; longitude: 96) + >>> print(cube_faces_to_polydata(cube)) + PolyData (... + N Cells: 7008 + N Points: 7178 + N Strips: 0 + X Bounds: -9.992e-01, 9.992e-01 + Y Bounds: -9.992e-01, 9.992e-01 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 + + Configure the conversion by passing additional keyword arguments: + + >>> print(cube_faces_to_polydata(cube, radius=2)) + PolyData (... + N Cells: 7008 + N Points: 7178 + N Strips: 0 + X Bounds: -1.998e+00, 1.998e+00 + Y Bounds: -1.998e+00, 1.998e+00 + Z Bounds: -2.000e+00, 2.000e+00 + N Arrays: 4 + + Converting a :class:`~iris.cube.Cube` that has a + :attr:`~iris.cube.Cube.mesh` describing its horizontal space: + + >>> print(cube_mesh.summary(shorten=True)) + synthetic / (1) (-- : 96) + >>> print(cube_faces_to_polydata(cube_mesh)) + PolyData (... + N Cells: 96 + N Points: 98 + N Strips: 0 + X Bounds: -1.000e+00, 1.000e+00 + Y Bounds: -1.000e+00, 1.000e+00 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 + + Remember to reduce the dimensionality of your :class:`~iris.cube.Cube` to + just be the horizontal space: + + >>> print(cube_w_time.summary(shorten=True)) + air_temperature / (K) (time: 240; latitude: 37; longitude: 49) + >>> print(cube_faces_to_polydata(cube_w_time[0, :, :])) + PolyData (... + N Cells: 1813 + N Points: 1900 + N Strips: 0 + X Bounds: -6.961e-01, 6.961e-01 + Y Bounds: -9.686e-01, -3.411e-01 + Z Bounds: 2.483e-01, 8.714e-01 + N Arrays: 4 """ if cube.mesh: @@ -79,8 +171,116 @@ def cube_faces_to_polydata(cube, **kwargs): def region_extraction(cube, polydata, region, **kwargs): - """Function to extract a region from a cube and its associated mesh and return - a new cube containing the region. + """Index a :class:`~iris.cube.Cube` with a :attr:`~iris.cube.Cube.mesh` to a specific region. + + Uses :meth:`geovista.geodesic.BBox.enclosed` to identify the `cube` indices + that are within the specified region (`region` being a + :class:`~geovista.geodesic.BBox` class). + + Parameters + ---------- + cube : :class:`~iris.cube.Cube` + The cube to be indexed (must have a :attr:`~iris.cube.Cube.mesh`). + polydata : :class:`pyvista.PolyData` + A :class:`~pyvista.PolyData` representing the same horizontal space as + `cube`. The region extraction is first applied to `polydata`, with the + resulting indices then applied to `cube`. In many cases `polydata` can + be created by applying :func:`cube_faces_to_polydata` to `cube`. + region : :class:`geovista.geodesic.BBox` + A :class:`~geovista.geodesic.BBox` representing the region to be + extracted. + **kwargs : dict + Additional keyword arguments to be passed to the + :meth:`geovista.geodesic.BBox.enclosed` method (e.g ``preference``). + + Returns + ------- + :class:`~iris.cube.Cube` + The region extracted cube. + + Raises + ------ + ValueError + If `polydata` and the :attr:`~iris.cube.Cube.mesh` on `cube` do not + have the same shape. + + Examples + -------- + .. testsetup:: + + from iris import load_cube, sample_data_path + from iris.coords import AuxCoord + from iris.cube import CubeList + from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + + file_path = sample_data_path("mesh_C4_synthetic_float.nc") + with PARSE_UGRID_ON_LOAD.context(): + cube_w_mesh = load_cube(file_path) + + level_cubes = CubeList() + for height_level in range(72): + height_coord = AuxCoord([height_level], standard_name="height") + level_cube = cube_w_mesh.copy() + level_cube.add_aux_coord(height_coord) + level_cubes.append(level_cube) + + cube_w_mesh = level_cubes.merge_cube() + other_cube_w_mesh = cube_w_mesh[:20, :] + + The parameters of :func:`region_extraction` have been designed with + flexibility and reuse in mind. This is demonstrated below. + + >>> from geovista import BBox + >>> from iris.experimental.geovista import cube_faces_to_polydata, region_extraction + >>> print(cube_w_mesh.shape) + (72, 96) + >>> # The mesh dimension represents the horizontal space of the cube. + >>> print(cube_w_mesh.shape[cube_w_mesh.mesh_dim()]) + 96 + >>> cube_polydata = cube_faces_to_polydata(cube_w_mesh[0, :]) + >>> extracted_cube = region_extraction( + ... cube=cube_w_mesh, + ... polydata=cube_polydata, + ... region=BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]), + ... ) + >>> print(extracted_cube.shape) + (72, 11) + + Now reuse the same `cube` and `polydata` to extract a different region: + + >>> new_region = BBox(lons=[0, 35, 35, 0], lats=[-25, -25, 45, 45]) + >>> extracted_cube = region_extraction( + ... cube=cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... ) + >>> print(extracted_cube.shape) + (72, 6) + + Now apply the same region extraction to a different `cube` that has the + same horizontal shape: + + >>> print(other_cube_w_mesh.shape) + (20, 96) + >>> extracted_cube = region_extraction( + ... cube=other_cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... ) + >>> print(extracted_cube.shape) + (20, 6) + + Arbitrary keywords can be passed down to + :meth:`geovista.geodesic.BBox.enclosed` (``outside`` in this example): + + >>> extracted_cube = region_extraction( + ... cube=other_cube_w_mesh, + ... polydata=cube_polydata, + ... region=new_region, + ... outside=True, + ... ) + >>> print(extracted_cube.shape) + (20, 90) """ if cube.mesh: From 465113dcad43c6542c7194022dbc0a00abb6090b Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 16 Feb 2024 18:23:58 +0000 Subject: [PATCH 08/20] Correct pluralisation. --- lib/iris/experimental/geovista.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 644466b0b1..468530d6d9 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -52,7 +52,7 @@ def cube_faces_to_polydata(cube, **kwargs): If a :class:`~iris.cube.Cube` with too many dimensions is passed. Only the horizontal data can be represented, meaning a 2D Cube, or 1D Cube if the horizontal space is described by - :class:`~iris.experimental.ugrid.MeshCoord`\\ s. + :class:`~iris.experimental.ugrid.MeshCoord`\ s. Examples -------- From 8243d41a1021fe18d62797158224231b9fda447f Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 16 Feb 2024 19:58:09 +0000 Subject: [PATCH 09/20] Update to ugrid_operations docs. --- .../ugrid/images/plotting_basic.png | Bin 42338 -> 0 bytes .../ugrid/images/plotting_global.png | Bin 133531 -> 0 bytes docs/src/further_topics/ugrid/operations.rst | 324 ++++++------------ lib/iris/experimental/geovista.py | 4 +- 4 files changed, 104 insertions(+), 224 deletions(-) delete mode 100644 docs/src/further_topics/ugrid/images/plotting_basic.png delete mode 100644 docs/src/further_topics/ugrid/images/plotting_global.png diff --git a/docs/src/further_topics/ugrid/images/plotting_basic.png b/docs/src/further_topics/ugrid/images/plotting_basic.png deleted file mode 100644 index ba2b0b3329d8930508ece378d1317940f964f58e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42338 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 z 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 from geovista import GeoPlotter, Transform - >>> from geovista.common import to_xyz + from geovista import GeoPlotter, Transform + from geovista.common import to_cartesian + import matplotlib.pyplot as plt + from iris import load_cube, sample_data_path + from iris.experimental.geovista import cube_faces_to_polydata + from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - # We'll re-use this to plot some real global data later. - >>> def cube_faces_to_polydata(cube): - ... lons, lats = cube.mesh.node_coords - ... face_node = cube.mesh.face_node_connectivity - ... indices = face_node.indices_by_location() - ... - ... mesh = Transform.from_unstructured( - ... lons.points, - ... lats.points, - ... indices, - ... data=cube.data, - ... name=f"{cube.name()} / {cube.units}", - ... start_index=face_node.start_index, - ... ) - ... return mesh - - >>> print(face_cube) - face_data / (K) (-- : 2; height: 3) - Dimension coordinates: - height - x + with PARSE_UGRID_ON_LOAD.context(): + sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + print(sample_mesh_cube) + """ + synthetic / (1) (-- : 96) Mesh coordinates: - latitude x - - longitude x - + latitude x + longitude x + Mesh: + name Topology data of 2D unstructured mesh + location face Attributes: - Conventions 'CF-1.7' + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number 1 + """ # Convert our mesh+data to a PolyData object. - # Just plotting a single height level. - >>> face_polydata = cube_faces_to_polydata(face_cube[:, 0]) - >>> print(face_polydata) - PolyData (0x7ff4861ff4c0) - N Cells: 2 - N Points: 5 - X Bounds: 9.903e-01, 1.000e+00 - Y Bounds: 0.000e+00, 1.392e-01 - Z Bounds: 6.123e-17, 5.234e-02 - N Arrays: 2 + face_polydata = cube_faces_to_polydata(sample_mesh_cube) + print(face_polydata) + """ + PolyData (0x7f99ef5a4f40) + N Cells: 96 + N Points: 98 + N Strips: 0 + X Bounds: -1.000e+00, 1.000e+00 + Y Bounds: -1.000e+00, 1.000e+00 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 4 + """ # Create the GeoVista plotter and add our mesh+data to it. - >>> my_plotter = GeoPlotter() - >>> my_plotter.add_coastlines(color="black") - >>> my_plotter.add_base_layer(color="grey") - >>> my_plotter.add_mesh(face_polydata) - - # Centre the camera on the data. - >>> camera_region = to_xyz( - ... face_cube.coord("longitude").points, - ... face_cube.coord("latitude").points, - ... radius=3, - ... ) - >>> camera_pos = camera_region.mean(axis=0) - >>> my_plotter.camera.position = camera_pos - - >>> my_plotter.show() - - .. image:: images/plotting_basic.png - :alt: A GeoVista plot of the basic example Mesh. - - This artificial data makes West Africa rather chilly! - -Here's another example using a global cubed-sphere data set: - -.. dropdown:: Code - :icon: code - - .. code-block:: python - - >>> from iris import load_cube - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - - # Demonstrating with a global data set. - # You could also download this file from github.com/SciTools/iris-test-data. - >>> from iris.tests import get_data_path - >>> file_path = get_data_path( - ... [ - ... "NetCDF", - ... "unstructured_grid", - ... "lfric_surface_mean.nc", - ... ] - ... ) - >>> with PARSE_UGRID_ON_LOAD.context(): - ... global_cube = load_cube(file_path, "tstar_sea") - >>> print(global_cube) - sea_surface_temperature / (K) (-- : 1; -- : 13824) - Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: mean (interval: 300 s) - 1 time_counter: mean - Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 1 d - name lfric_surface - online_operation average - timeStamp 2020-Feb-07 16:23:14 GMT - title Created by xios - uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b - - >>> global_polydata = cube_faces_to_polydata(global_cube) - >>> print(global_polydata) - PolyData (0x7f761b536160) - N Cells: 13824 - N Points: 13826 - X Bounds: -1.000e+00, 1.000e+00 - Y Bounds: -1.000e+00, 1.000e+00 - Z Bounds: -1.000e+00, 1.000e+00 - N Arrays: 2 + my_plotter = GeoPlotter(off_screen=True) + my_plotter.add_coastlines() + my_plotter.add_mesh(face_polydata) + my_plotter.camera.zoom(1.5) + + # We usually view GeoVista plots dynamically. To work on the + # documentation page we will save the plot to an image. + plot_image_path = "sample_mesh_plotted.png" + my_plotter.screenshot(plot_image_path) + my_plotter.close() + # Display the saved plot image using Matplotlib. + image = plt.imread(plot_image_path) + figure, axes = plt.subplots() + image_plotted = axes.imshow(image) + axes.axis("off") + plt.show() - >>> my_plotter = GeoPlotter() - >>> my_plotter.add_coastlines() - >>> my_plotter.add_mesh(global_polydata, show_edges=True) - - >>> my_plotter.show() - - .. image:: images/plotting_global.png - :alt: A GeoVista plot of a global sea surface temperature Mesh. Region Extraction ----------------- @@ -656,118 +593,59 @@ position of the data points before they can be analysed as inside/outside the selected region. The recommended way to do this is using tools provided by :ref:`ugrid geovista`, which is optimised for performant mesh analysis. -This approach centres around using :meth:`geovista.geodesic.BBox.enclosed` to -get the subset of the original mesh that is inside the -:class:`~geovista.geodesic.BBox`. This subset :class:`pyvista.PolyData` object -includes the original indices of each datapoint - the ``vtkOriginalCellIds`` -array, which can be used to index the original :class:`~iris.cube.Cube`. Since -we **know** that this subset :class:`~iris.cube.Cube` represents a regional -mesh, we then reconstruct a :class:`~iris.experimental.ugrid.Mesh` from the -:class:`~iris.cube.Cube`\'s :attr:`~iris.cube.Cube.aux_coords` using -:meth:`iris.experimental.ugrid.Mesh.from_coords`: +Performing GeoVista operations on your :class:`~iris.cube.Cube` is made +easy via this convenience: +:func:`iris.experimental.geovista.cube_faces_to_polydata`. + +An Iris convenience for regional extraction is also provided: +:func:`iris.experimental.geovista.region_extraction`; demonstrated +below: -.. - Not using doctest here as want to keep GeoVista as optional dependency. .. dropdown:: Code :icon: code - .. code-block:: python + .. doctest:: ugrid_operations - >>> from geovista import Transform >>> from geovista.geodesic import BBox - >>> from iris import load_cube - >>> from iris.experimental.ugrid import Mesh, PARSE_UGRID_ON_LOAD - - # Need a larger dataset to demonstrate this operation. - # You could also download this file from github.com/SciTools/iris-test-data. - >>> from iris.tests import get_data_path - >>> file_path = get_data_path( - ... [ - ... "NetCDF", - ... "unstructured_grid", - ... "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", - ... ] - ... ) + >>> from iris import load_cube, sample_data_path + >>> from iris.experimental.geovista import cube_faces_to_polydata, region_extraction + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD >>> with PARSE_UGRID_ON_LOAD.context(): - ... global_cube = load_cube(file_path, "conv_rain") - >>> print(global_cube) - surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 864) + ... sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + >>> print(sample_mesh_cube) + synthetic / (1) (-- : 96) Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: point + latitude x + longitude x + Mesh: + name Topology data of 2D unstructured mesh + location face Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 300 s - name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain - online_operation instant - timeStamp 2020-Oct-18 21:18:35 GMT - title Created by xios - uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 - - # Convert the Mesh to a GeoVista PolyData object. - >>> lons, lats = global_cube.mesh.node_coords - >>> face_node = global_cube.mesh.face_node_connectivity - >>> indices = face_node.indices_by_location() - >>> global_polydata = Transform.from_unstructured( - ... lons.points, lats.points, indices, start_index=face_node.start_index + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number 1 + + >>> regional_cube = region_extraction( + ... cube=sample_mesh_cube, + ... polydata=cube_faces_to_polydata(sample_mesh_cube), + ... region=BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]), + ... preference="center", ... ) - - # Define a region of 4 corners connected by great circles. - # Specialised sub-classes of BBox are also available e.g. panel/wedge. - >>> region = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) - # 'Apply' the region to the PolyData object. - >>> region_polydata = region.enclosed(global_polydata, preference="center") - # Get the remaining face indices, to use for indexing the Cube. - >>> indices = region_polydata["vtkOriginalCellIds"] - - >>> print(type(indices)) - - # 101 is smaller than the original 864. - >>> print(len(indices)) - 101 - >>> print(indices[:10]) - [ 6 7 8 9 10 11 18 19 20 21] - - # Use the face indices to subset the global cube. - >>> region_cube = global_cube[:, indices] - - # In this case we **know** the indices correspond to a contiguous - # region, so we will convert the sub-setted Cube back into a - # Cube-with-Mesh. - >>> new_mesh = Mesh.from_coords(*region_cube.coords(dimensions=1)) - >>> new_mesh_coords = new_mesh.to_MeshCoords(global_cube.location) - >>> for coord in new_mesh_coords: - ... region_cube.remove_coord(coord.name()) - ... region_cube.add_aux_coord(coord, 1) - - # A Mesh-Cube with a subset (101) of the original 864 faces. - >>> print(region_cube) - surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 101) + >>> print(regional_cube) + synthetic / (1) (-- : 11) Mesh coordinates: - latitude - x - longitude - x - Auxiliary coordinates: - time x - - Cell methods: - 0 time: point + latitude x + longitude x + Mesh: + name unknown + location face Attributes: - Conventions UGRID - description Created by xios - interval_operation 300 s - interval_write 300 s - name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain - online_operation instant - timeStamp 2020-Oct-18 21:18:35 GMT - title Created by xios - uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 + NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' + history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' + nco_openmp_thread_number 1 + Regridding ---------- @@ -1029,4 +907,6 @@ data content. .. |new| replace:: ✨ New .. |unchanged| replace:: ♻️ Unchanged .. |different| replace:: ⚠️ Different -.. |pending| replace:: 🚧 Support Pending \ No newline at end of file +.. |pending| replace:: 🚧 Support Pending + +.. _GeoVista gallery: https://geovista.readthedocs.io/en/latest/generated/gallery/index.html \ No newline at end of file diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 468530d6d9..cf712ccf67 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -37,7 +37,7 @@ def cube_faces_to_polydata(cube, **kwargs): The Cube containing the spatial information and data for creating the class:`~pyvista.PolyData`. - **kwargs : dict + **kwargs : dict, optional Additional keyword arguments to be passed to the relevant :class:`~geovista.bridge.Transform` method (e.g ``zlevel``). @@ -189,7 +189,7 @@ def region_extraction(cube, polydata, region, **kwargs): region : :class:`geovista.geodesic.BBox` A :class:`~geovista.geodesic.BBox` representing the region to be extracted. - **kwargs : dict + **kwargs : dict, optional Additional keyword arguments to be passed to the :meth:`geovista.geodesic.BBox.enclosed` method (e.g ``preference``). From dec4edb828ed9b660575ccd4774ca775312d05d5 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 16 Feb 2024 20:12:13 +0000 Subject: [PATCH 10/20] Try 110m coastlines. --- docs/src/further_topics/ugrid/operations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index fcce1eba58..4823a24a43 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -529,7 +529,7 @@ some truly spectacular visualisations of high-res data please see the # Create the GeoVista plotter and add our mesh+data to it. my_plotter = GeoPlotter(off_screen=True) - my_plotter.add_coastlines() + my_plotter.add_coastlines(resolution="110m") my_plotter.add_mesh(face_polydata) my_plotter.camera.zoom(1.5) From 9a3945f9b54d2aac84b60e1c8f6b53a3e1e22d20 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 19 Feb 2024 09:05:41 +0000 Subject: [PATCH 11/20] Revert "Try 110m coastlines." This reverts commit dec4edb828ed9b660575ccd4774ca775312d05d5. --- docs/src/further_topics/ugrid/operations.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 4823a24a43..fcce1eba58 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -529,7 +529,7 @@ some truly spectacular visualisations of high-res data please see the # Create the GeoVista plotter and add our mesh+data to it. my_plotter = GeoPlotter(off_screen=True) - my_plotter.add_coastlines(resolution="110m") + my_plotter.add_coastlines() my_plotter.add_mesh(face_polydata) my_plotter.camera.zoom(1.5) From 0470dee714e4f83cf1ddf6d5d0cf8cb1cdebd090 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 19 Feb 2024 09:12:36 +0000 Subject: [PATCH 12/20] Try a pre_build step. --- .readthedocs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.readthedocs.yml b/.readthedocs.yml index d82bd513ca..dc24f99e06 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -17,6 +17,8 @@ build: - git stash post_install: - git stash pop + pre_build: + - python -c "from geovista.cache import fetch_coastlines; _ = fetch_coastlines();" conda: environment: requirements/readthedocs.yml From 343179e6bbd680f0bf6295f93893f696abb350d9 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 19 Feb 2024 09:31:12 +0000 Subject: [PATCH 13/20] Revert "Try a pre_build step." This reverts commit 0470dee714e4f83cf1ddf6d5d0cf8cb1cdebd090. --- .readthedocs.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index dc24f99e06..d82bd513ca 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -17,8 +17,6 @@ build: - git stash post_install: - git stash pop - pre_build: - - python -c "from geovista.cache import fetch_coastlines; _ = fetch_coastlines();" conda: environment: requirements/readthedocs.yml From 7b6588caa80dd7ff2eb4a7606eed896ae12034d6 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 19 Feb 2024 09:55:05 +0000 Subject: [PATCH 14/20] Static GeoVista plot in docs. --- .../further_topics/ugrid/images/plotting.png | Bin 0 -> 32335 bytes docs/src/further_topics/ugrid/operations.rst | 53 +++++++----------- 2 files changed, 19 insertions(+), 34 deletions(-) create mode 100644 docs/src/further_topics/ugrid/images/plotting.png diff --git a/docs/src/further_topics/ugrid/images/plotting.png b/docs/src/further_topics/ugrid/images/plotting.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7d570ba2f3a1342e0392adc08e7917242298c0 GIT binary patch literal 32335 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 from geovista import GeoPlotter, Transform + >>> from geovista.common import to_cartesian + >>> import matplotlib.pyplot as plt - from iris import load_cube, sample_data_path - from iris.experimental.geovista import cube_faces_to_polydata - from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + >>> from iris import load_cube, sample_data_path + >>> from iris.experimental.geovista import cube_faces_to_polydata + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - with PARSE_UGRID_ON_LOAD.context(): - sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) - print(sample_mesh_cube) - """ + >>> with PARSE_UGRID_ON_LOAD.context(): + ... sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) + >>> print(sample_mesh_cube) synthetic / (1) (-- : 96) Mesh coordinates: latitude x @@ -511,13 +509,11 @@ some truly spectacular visualisations of high-res data please see the NCO 'netCDF Operators version 4.7.5 (Homepage = http://nco.sf.net, Code = h ...' history 'Mon Apr 12 01:44:41 2021: ncap2 -s synthetic=float(synthetic) mesh_C4_synthetic.nc ...' nco_openmp_thread_number 1 - """ # Convert our mesh+data to a PolyData object. - face_polydata = cube_faces_to_polydata(sample_mesh_cube) - print(face_polydata) - """ - PolyData (0x7f99ef5a4f40) + >>> face_polydata = cube_faces_to_polydata(sample_mesh_cube) + >>> print(face_polydata) + PolyData (... N Cells: 96 N Points: 98 N Strips: 0 @@ -525,26 +521,15 @@ some truly spectacular visualisations of high-res data please see the Y Bounds: -1.000e+00, 1.000e+00 Z Bounds: -1.000e+00, 1.000e+00 N Arrays: 4 - """ # Create the GeoVista plotter and add our mesh+data to it. - my_plotter = GeoPlotter(off_screen=True) - my_plotter.add_coastlines() - my_plotter.add_mesh(face_polydata) - my_plotter.camera.zoom(1.5) - - # We usually view GeoVista plots dynamically. To work on the - # documentation page we will save the plot to an image. - plot_image_path = "sample_mesh_plotted.png" - my_plotter.screenshot(plot_image_path) - my_plotter.close() - # Display the saved plot image using Matplotlib. - image = plt.imread(plot_image_path) - figure, axes = plt.subplots() - image_plotted = axes.imshow(image) - axes.axis("off") - plt.show() + >>> my_plotter = GeoPlotter() + >>> my_plotter.add_coastlines() + >>> my_plotter.add_mesh(face_polydata) + >>> my_plotter.show() + .. image:: images/plotting.png + :alt: A GeoVista plot of low-res sample data. Region Extraction ----------------- From db83c67cad50790591eb6f29ed330af4c6794f65 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 19 Feb 2024 10:15:52 +0000 Subject: [PATCH 15/20] Use intersphinx for GeoVista gallery. --- docs/src/further_topics/ugrid/operations.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 9e87decf61..95f5ded172 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -480,7 +480,7 @@ easy via this convenience: Below is an example of using GeoVista to plot a low-res sample :attr:`~iris.cube.Cube.mesh` based :class:`~iris.cube.Cube`. For some truly spectacular visualisations of high-res data please see the -`GeoVista gallery`_. +GeoVista :external+geovista:doc:`generated/gallery/index`. .. dropdown:: Code :icon: code @@ -893,5 +893,3 @@ data content. .. |unchanged| replace:: ♻️ Unchanged .. |different| replace:: ⚠️ Different .. |pending| replace:: 🚧 Support Pending - -.. _GeoVista gallery: https://geovista.readthedocs.io/en/latest/generated/gallery/index.html \ No newline at end of file From 7dbfc4dc8c0fc73f0251b387359304c91d0b7100 Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Wed, 27 Mar 2024 12:54:07 +0000 Subject: [PATCH 16/20] Requested changes + integration tests --- docs/src/further_topics/ugrid/operations.rst | 6 +- lib/iris/experimental/geovista.py | 32 +++------ .../experimental/geovista/__init__.py | 5 ++ .../geovista/test_cube_to_poly.py | 67 +++++++++++++++++++ .../test_extract_unstructured_region.py | 35 ++++++++++ .../experimental/test_cube_to_poly.py | 47 ------------- .../{geobridge => geovista}/__init__.py | 0 .../test_cube_to_polydata.py} | 33 +++++---- .../test_extract_unstructured_region.py} | 45 +++++++++---- 9 files changed, 168 insertions(+), 102 deletions(-) create mode 100644 lib/iris/tests/integration/experimental/geovista/__init__.py create mode 100644 lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py create mode 100644 lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py delete mode 100644 lib/iris/tests/integration/experimental/test_cube_to_poly.py rename lib/iris/tests/unit/experimental/{geobridge => geovista}/__init__.py (100%) rename lib/iris/tests/unit/experimental/{geobridge/test_cube_faces_to_polydata.py => geovista/test_cube_to_polydata.py} (88%) rename lib/iris/tests/unit/experimental/{geobridge/test_region_extraction.py => geovista/test_extract_unstructured_region.py} (73%) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index a088b588e1..075ddd8a0a 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -488,7 +488,7 @@ earlier: # We'll re-use this to plot some real global data later. - >>> def cube_faces_to_polydata(cube): + >>> def cube_to_polydata(cube): ... lons, lats = cube.mesh.node_coords ... face_node = cube.mesh.face_node_connectivity ... indices = face_node.indices_by_location() @@ -515,7 +515,7 @@ earlier: # Convert our mesh+data to a PolyData object. # Just plotting a single height level. - >>> face_polydata = cube_faces_to_polydata(face_cube[:, 0]) + >>> face_polydata = cube_to_polydata(face_cube[:, 0]) >>> print(face_polydata) PolyData (0x7ff4861ff4c0) N Cells: 2 @@ -590,7 +590,7 @@ Here's another example using a global cubed-sphere data set: title Created by xios uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b - >>> global_polydata = cube_faces_to_polydata(global_cube) + >>> global_polydata = cube_to_polydata(global_cube) >>> print(global_polydata) PolyData (0x7f761b536160) N Cells: 13824 diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 4133210e57..1a5f2211b4 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -12,7 +12,6 @@ def _get_coord(cube, axis): - """Helper function to get the coordinates from the cube.""" try: coord = cube.coord(axis=axis, dim_coords=True) except CoordinateNotFoundError: @@ -20,20 +19,7 @@ def _get_coord(cube, axis): return coord -def cube_faces_to_polydata(cube, **kwargs): - """Function to convert a cube or the mesh attached to a cube into a polydata - object that can be used by GeoVista to generate plots. - - Parameters - ---------- - cube : :class:`~iris.cube.Cube` - Incoming cube containing the arrays or the mesh to be converted into the - polydata object. - - **kwargs : dict - Additional keyword arguments to be passed to the Transform method. - - """ +def cube_to_polydata(cube, **kwargs): if cube.mesh: if cube.ndim != 1: raise NotImplementedError("Cubes with a mesh must be one dimensional") @@ -50,6 +36,7 @@ def cube_faces_to_polydata(cube, **kwargs): start_index=face_node.start_index, **kwargs, ) + # TODO: Add support for point clouds elif cube.ndim == 2: x_coord = _get_coord(cube, "X") y_coord = _get_coord(cube, "Y") @@ -78,11 +65,7 @@ def cube_faces_to_polydata(cube, **kwargs): return polydata -def region_extraction(cube, polydata, region, **kwargs): - """Function to extract a region from a cube and its associated mesh and return - a new cube containing the region. - - """ +def extract_unstructured_region(cube, polydata, region, **kwargs): if cube.mesh: # Find what dimension the mesh is in on the cube mesh_dim = cube.mesh_dim() @@ -96,11 +79,16 @@ def region_extraction(cube, polydata, region, **kwargs): polydata_length = polydata.GetNumberOfPoints() indices_key = VTK_POINT_IDS else: - raise NotImplementedError("Must be on face or node.") + raise NotImplementedError( + f"Must be on face or node. Found: {cube.location}." + ) if cube.shape[mesh_dim] != polydata_length: raise ValueError( - "The mesh on the cube and the polydata must have the" " same shape." + f"The mesh on the cube and the polydata" + f"must have the same shape." + f" Found Mesh: {cube.shape[mesh_dim]}," + f" Polydata: {polydata_length}." ) region_polydata = region.enclosed(polydata, **kwargs) diff --git a/lib/iris/tests/integration/experimental/geovista/__init__.py b/lib/iris/tests/integration/experimental/geovista/__init__.py new file mode 100644 index 0000000000..6a56e09db4 --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/__init__.py @@ -0,0 +1,5 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the :mod:`iris.experimental.geovista` module.""" diff --git a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py new file mode 100644 index 0000000000..614cf4e4a4 --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py @@ -0,0 +1,67 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the `iris.experimental.geovista.cube_to_polydata` function.""" + + +import numpy as np + +from iris import load_cube +from iris.experimental.geovista import cube_to_polydata +from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD +from iris.tests import get_data_path + + +def test_integration_2d(): + file_path = get_data_path( + [ + "NetCDF", + "ORCA2", + "votemper.nc", + ] + ) + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path, "votemper") + + polydata = cube_to_polydata(global_cube[0, 1, :]) + + assert polydata.GetNumberOfCells() == 26640 + assert polydata.GetNumberOfPoints() == 26969 + + +def test_integration_1d(): + file_path = get_data_path( + [ + "NetCDF", + "global", + "xyt", + "SMALL_hires_wind_u_for_ipcc4.nc", + ] + ) + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path) + + polydata = cube_to_polydata(global_cube[0, :]) + + assert polydata.GetNumberOfCells() == 51200 + assert polydata.GetNumberOfPoints() == 51681 + + +def test_integration_mesh(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ] + ) + + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path, "conv_rain") + + polydata = cube_to_polydata(global_cube[0, :]) + + assert polydata.GetNumberOfCells() == 864 + assert polydata.GetNumberOfPoints() == 866 + np.testing.assert_array_equal(polydata.active_scalars, global_cube[0, :].data) diff --git a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py new file mode 100644 index 0000000000..87028acb48 --- /dev/null +++ b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py @@ -0,0 +1,35 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Integration tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" + + +from geovista.geodesic import BBox + +from iris import load_cube +from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region +from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD +from iris.tests import get_data_path + + +def test_face_region_extraction(): + file_path = get_data_path( + [ + "NetCDF", + "unstructured_grid", + "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ] + ) + + with PARSE_UGRID_ON_LOAD.context(): + global_cube = load_cube(file_path, "conv_rain") + polydata = cube_to_polydata(global_cube[0, :]) + region = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) + + extracted_cube = extract_unstructured_region( + global_cube, polydata, region, preference="center" + ) + + assert extracted_cube.ndim == 2 + assert extracted_cube.shape == (72, 101) diff --git a/lib/iris/tests/integration/experimental/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/test_cube_to_poly.py deleted file mode 100644 index 27cf5901c5..0000000000 --- a/lib/iris/tests/integration/experimental/test_cube_to_poly.py +++ /dev/null @@ -1,47 +0,0 @@ -import numpy as np - -from iris import load_cube -from iris.experimental.geovista import cube_faces_to_polydata -from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD -from iris.tests import get_data_path - - -def test_integration_2d(): - pass - - -def test_integration_1d(): - file_path = get_data_path( - [ - "NetCDF", - "unstructured_grid", - "lfric_surface_mean.nc", - ] - ) - with PARSE_UGRID_ON_LOAD.context(): - global_cube = load_cube(file_path, "tstar_sea") - - polydata = cube_faces_to_polydata(global_cube) - - assert polydata.GetNumberOfCells() == 13824 - assert polydata.GetNumberOfPoints() == 13826 - np.testing.assert_array_equal(polydata.active_scalars, global_cube.data) - - -def test_integration_mesh(): - file_path = get_data_path( - [ - "NetCDF", - "unstructured_grid", - "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", - ] - ) - - with PARSE_UGRID_ON_LOAD.context(): - global_cube = load_cube(file_path, "conv_rain") - - polydata = cube_faces_to_polydata(global_cube[0, :]) - - assert polydata.GetNumberOfCells() == 864 - assert polydata.GetNumberOfPoints() == 866 - np.testing.assert_array_equal(polydata.active_scalars, global_cube[0, :].data) diff --git a/lib/iris/tests/unit/experimental/geobridge/__init__.py b/lib/iris/tests/unit/experimental/geovista/__init__.py similarity index 100% rename from lib/iris/tests/unit/experimental/geobridge/__init__.py rename to lib/iris/tests/unit/experimental/geovista/__init__.py diff --git a/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py similarity index 88% rename from lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py rename to lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py index a03731d621..f515a533ac 100644 --- a/lib/iris/tests/unit/experimental/geobridge/test_cube_faces_to_polydata.py +++ b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the `iris.experimental.geobridge.cube_faces_to_polydata` function.""" +"""Unit tests for the `iris.experimental.geovista.cube_to_polydata` function.""" from unittest.mock import Mock @@ -13,7 +13,7 @@ import iris.analysis.cartography import iris.coord_systems -from iris.experimental.geovista import cube_faces_to_polydata +from iris.experimental.geovista import cube_to_polydata from iris.tests.stock import lat_lon_cube, sample_2d_latlons from iris.tests.stock.mesh import sample_mesh_cube @@ -73,7 +73,7 @@ def mocked_operation(self): @staticmethod def test_to_poly(expected, mocked_operation, cube): - cube_faces_to_polydata(cube) + cube_to_polydata(cube) actual = mocked_operation.call_args.kwargs for key, expected_value in expected.items(): if hasattr(expected_value, "shape"): @@ -83,14 +83,14 @@ def test_to_poly(expected, mocked_operation, cube): @staticmethod def test_to_poly_crs(mocked_operation, default_cs, cube_with_crs): - cube_faces_to_polydata(cube_with_crs) + cube_to_polydata(cube_with_crs) actual = mocked_operation.call_args.kwargs assert actual["crs"] == default_cs.as_cartopy_crs().proj4_init @staticmethod def test_to_poly_kwargs(mocked_operation, cube): kwargs = {"test": "test"} - cube_faces_to_polydata(cube, **kwargs) + cube_to_polydata(cube, **kwargs) actual = mocked_operation.call_args.kwargs assert actual["test"] == "test" @@ -107,10 +107,6 @@ def expected(self, cube_2d): "name": cube_2d.name() + " / " + str(cube_2d.units), } - @pytest.fixture() - def operation(self): - return "from_2d" - @pytest.fixture() def cube(self, cube_2d): return cube_2d @@ -128,10 +124,6 @@ def expected(self, cube_1d): "name": cube_1d.name() + " / " + str(cube_1d.units), } - @pytest.fixture() - def operation(self): - return "from_1d" - @pytest.fixture() def cube(self, cube_1d): return cube_1d @@ -146,18 +138,25 @@ def expected(self, cube_mesh): "xs": cube_mesh.mesh.node_coords[0].points, "ys": cube_mesh.mesh.node_coords[1].points, "connectivity": cube_mesh.mesh.face_node_connectivity.indices_by_location(), - "data": cube_mesh.data, + "data": cube_mesh.data[0], "name": cube_mesh.name() + " / " + str(cube_mesh.units), "start_index": 0, } + def test_if_1d(self, cube_mesh): + with pytest.raises( + NotImplementedError, + match=r"Cubes with a mesh must be one dimensional", + ): + cube_to_polydata(cube_mesh) + @pytest.fixture() def operation(self): return "from_unstructured" @pytest.fixture() def cube(self, cube_mesh): - return cube_mesh + return cube_mesh[0] @pytest.mark.skip(reason="Meshes do not support crs currently") def test_to_poly_crs(self, expected, actual): @@ -181,7 +180,7 @@ def test_not_1d_or_2d(self, cube_1d_2d): NotImplementedError, match=r"Only 1D and 2D coordinates are supported", ): - cube_faces_to_polydata(cube_1d_2d) + cube_to_polydata(cube_1d_2d) def test_no_mesh_or_2d(self, cube_1d): cube = cube_1d[0] @@ -189,4 +188,4 @@ def test_no_mesh_or_2d(self, cube_1d): NotImplementedError, match=r"Cube must have a mesh or have 2 dimensions", ): - cube_faces_to_polydata(cube) + cube_to_polydata(cube) diff --git a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py similarity index 73% rename from lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py rename to lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py index 76c9169659..7e24abf19c 100644 --- a/lib/iris/tests/unit/experimental/geobridge/test_region_extraction.py +++ b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the `iris.experimental.geobridge.region_extraction` function.""" +"""Unit tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" from unittest.mock import MagicMock, Mock @@ -10,7 +10,7 @@ import numpy as np import pytest -from iris.experimental.geovista import region_extraction +from iris.experimental.geovista import extract_unstructured_region from iris.tests.stock import sample_2d_latlons from iris.tests.stock.mesh import sample_mesh_cube @@ -47,11 +47,13 @@ def mocked_region(self): self.mocked_region = region def test_called_with(self): - region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) self.mocked_region.enclosed.assert_called_with(self.mocked_polydata) def test_kwarg(self): - region_extraction( + extract_unstructured_region( self.cube_mesh, self.mocked_polydata, self.mocked_region, @@ -66,7 +68,7 @@ def test_kwarg(self): def test_indices(self, transpose_cube): if transpose_cube: self.cube_mesh.transpose() - extracted_region = region_extraction( + extracted_region = extract_unstructured_region( self.cube_mesh, self.mocked_polydata, self.mocked_region ) if self.cube_mesh.location == "face": @@ -86,10 +88,12 @@ def test_empty_indices(self): with pytest.raises( IndexError, match="No part of `polydata` falls within `region`." ): - region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) def test_recreate_mesh(self): - extracted_region = region_extraction( + extracted_region = extract_unstructured_region( self.cube_mesh, self.mocked_polydata, self.mocked_region ) if self.cube_mesh.location == "face": @@ -98,7 +102,7 @@ def test_recreate_mesh(self): assert extracted_region.mesh is None def test_new_mesh_coords(self): - extracted_region = region_extraction( + extracted_region = extract_unstructured_region( self.cube_mesh, self.mocked_polydata, self.mocked_region ) if self.cube_mesh.location == "face": @@ -117,17 +121,32 @@ def test_new_mesh_coords(self): def test_no_mesh(self, cube_2d): cube = cube_2d with pytest.raises(ValueError, match="Cube must have a mesh"): - region_extraction(cube, self.mocked_polydata, self.mocked_region) + extract_unstructured_region(cube, self.mocked_polydata, self.mocked_region) def test_edge_location(self, cube_mesh_edge): - with pytest.raises(NotImplementedError, match="Must be on face or node."): - region_extraction(cube_mesh_edge, self.mocked_polydata, self.mocked_region) + with pytest.raises( + NotImplementedError, + match=f"Must be on face or node." f" Found: {cube_mesh_edge.location}.", + ): + extract_unstructured_region( + cube_mesh_edge, self.mocked_polydata, self.mocked_region + ) def test_cube_and_poly_shapes_mismatch(self): self.mocked_polydata.GetNumberOfCells.return_value = 4 self.mocked_polydata.GetNumberOfPoints.return_value = 16 + polydata_length = () + if self.cube_mesh.location == "face": + polydata_length = self.mocked_polydata.GetNumberOfCells() + elif self.cube_mesh.location == "node": + polydata_length = self.mocked_polydata.GetNumberOfPoints() with pytest.raises( ValueError, - match="The mesh on the cube and the polydata must have the same shape.", + match=f"The mesh on the cube and the polydata" + f"must have the same shape." + f" Found Mesh: {self.cube_mesh.shape[self.cube_mesh.mesh_dim()]}," + f" Polydata: {polydata_length}.", ): - region_extraction(self.cube_mesh, self.mocked_polydata, self.mocked_region) + extract_unstructured_region( + self.cube_mesh, self.mocked_polydata, self.mocked_region + ) From cb1196317408a7aeb174dd0fc170fb201aa71f1d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 12:56:13 +0000 Subject: [PATCH 17/20] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../tests/integration/experimental/geovista/test_cube_to_poly.py | 1 - .../experimental/geovista/test_extract_unstructured_region.py | 1 - .../tests/unit/experimental/geovista/test_cube_to_polydata.py | 1 - 3 files changed, 3 deletions(-) diff --git a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py index 614cf4e4a4..5fbe4143d0 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py +++ b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Integration tests for the `iris.experimental.geovista.cube_to_polydata` function.""" - import numpy as np from iris import load_cube diff --git a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py index 87028acb48..53962baca0 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py +++ b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Integration tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" - from geovista.geodesic import BBox from iris import load_cube diff --git a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py index f515a533ac..9d71324d90 100644 --- a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py +++ b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris.experimental.geovista.cube_to_polydata` function.""" - from unittest.mock import Mock from geovista import Transform From 371c081f4a8569a426a677737d8ef3ae34acfdb0 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Wed, 27 Mar 2024 15:46:28 +0000 Subject: [PATCH 18/20] Updated lock files. --- requirements/locks/py310-linux-64.lock | 174 ++++++++++++------------ requirements/locks/py311-linux-64.lock | 174 ++++++++++++------------ requirements/locks/py39-linux-64.lock | 175 ++++++++++++------------- 3 files changed, 249 insertions(+), 274 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 3157030dbd..83ce00da0d 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: e9d209b616f9e4ffaf58cf10cdea760dd7bee6a2108632e0dc833c7c40ab610a +# input_hash: b327d216cd2d5b0b3e64961022bed7554f06b5ef6958db82ac0170e2552f28e0 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-h59595ed_0.conda#df9ae69b85e0cab9bde23eff1e87f183 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26322ec5d7712c3ded99dd656142b8ce https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 @@ -19,11 +19,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 -https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.2-h59595ed_0.conda#625e1fed28a5139aed71b3a76117ef84 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 @@ -31,17 +31,17 @@ https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_1.conda#e358c7c5f6824c272b5034b3816438a7 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1002.conda#3ca330ce74f16d685d62e4553d36410f https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.1-cxx17_h59595ed_2.conda#75648bc5dd3b8eab22406876c24d81ec +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -52,22 +52,22 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.0-h59595ed_0.conda#01c76c6d71097a0f3bd8683a8f255123 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab @@ -91,27 +91,26 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.120-hd590300_0.conda#7c3071bdf1d28b331a06bda6e85ab607 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda#4d18d86916705d352d5f4adfb7f0edd3 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 @@ -125,17 +124,17 @@ https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#4 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda#0725f6081030c29b109088639824ff90 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda#ed38140af93f81319ebc472fbcf16cca -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 @@ -144,7 +143,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.con https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -155,19 +153,20 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py310hc6cd4ac_0.conda#e533f96945907b2e81c6b604f578b69c +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py310hc6cd4ac_0.conda#987a8359726157c7a7cdd198f882f82d https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py310hff52083_1.tar.bz2#21b8fa2179290505e607f5ccd65b01b0 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py310h2372a71_0.conda#f20cd4d9c1f4a8377d0818c819918bbb -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda#8fdb82e5d9694dd8e9ed9ac8fdf48a26 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda#939ddd853b1d98bf6fd22cc0adeda317 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -176,11 +175,11 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda#2d694a9ffdcc30e89dea34a8dcdab6ae https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda#9e49ec2a61d02623b379dc332eb6889d +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py310hff52083_1.conda#157e6221a079a60c7f6f6fcb87c722aa @@ -188,16 +187,14 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py310h2372a71_0 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py310hd41b1e2_0.conda#dc5263dcaa1347e5a456ead3537be27d https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py310h2372a71_0.conda#d4c91d19e4f2f18b64753ac660edad79 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 -https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d @@ -205,7 +202,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -216,10 +213,10 @@ https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04e https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py310h2372a71_1.conda#b23e0147fa5f7a9380e06334c7266ad5 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py310h2372a71_0.conda#48f39c24349d9ae5c8e8873c42fb6170 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -235,91 +232,88 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.1-py310h2372a71_0.conda#b2de1af90e44849451c9808312f964ae +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.4-py310h2372a71_0.conda#2d948842110ae68e4f2e7738f92bf7e1 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py310h2372a71_0.conda#21362970a6fea90ca507c253c20465f2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py310h2372a71_0.conda#e61ae80fde506b70a88e5e06376d2068 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py310h2372a71_0.conda#85c48c98c9f2b72b384fb11c9004920b +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda#d3bcc5c186f78feba6f39ea047c35950 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda#09b94dd3a7e304df5b83176239347920 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.0.0-h2e90f83_4.conda#126a2a61d276c4268f71adeef25bfc33 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-hd590300_0.conda#e50a2609159a3e336fe4092738c00687 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py310h01dd4db_0.conda#9ec32d0d90f7670eb29bbba18299cf29 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda#68d5bfccaba2d89a7812098dd3966d9b +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py310h2372a71_0.conda#4ad35c8f6a64a6ab708780dad603aef4 +https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.0.0-hd5fc58b_4.conda#de9c380fea8634540db5fc8422888df1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.0.0-hd5fc58b_4.conda#de1cbf145ecdc1d29af18e14eb267bca +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.0.0-h3ecfda7_4.conda#016b763e4776b4c2c536420a7e6a2349 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.0.0-h2e90f83_4.conda#d866cc8dc37f101505e65a4372794631 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.0.0-h2e90f83_4.conda#6ebefdc74cb700ec82cd6702125cc422 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.0.0-h3ecfda7_4.conda#6397395a4677d59bbd32c4f05bb8fa63 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.0.0-h757c851_4.conda#24c9cf1dd8f6d6189102a136a731758c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.0.0-h757c851_4.conda#259bd0c788f447fe78aab69895365528 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.0.0-h59595ed_4.conda#ec121a4195acadad086f84719cc91430 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.0.0-hca94c1a_4.conda#bdbf11f760f1a3b35d766e03cebd9c42 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.0.0-h59595ed_4.conda#4354ea9f30a8c5111403fa4b24a2ad66 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda#ef5333594a958b25912002886b82b253 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py310h2372a71_0.conda#7125fe11f08cdc41de9734dfb2ffd35b +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py310h2372a71_1.conda#dd21c88dfec3253cb9888c0e93fa5cd1 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py310hcc13569_0.conda#514c836161e8b2e43e7d8fb7a28a92c4 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed -https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py310hcc13569_0.conda#cf5d315e3601a6a2931f63aa9a84dc40 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.1-pyhd8ed1ab_0.conda#d15917f33140f8d2ac9ca44db7ec8a25 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py310h1f7b6fc_0.conda#25ede13c92af9a12712dc33fdc3adc11 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h1f7b6fc_1.conda#be6f0382440ccbf9fb01bb19ab1f1fc0 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.conda#cd3baec470071490bc5ab05da64c52b5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310hc3e127f_1.conda#fdaca8d27b3af78d617521eb37b1d055 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 -https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda#b0ad5ef44595ef37c3008fc04ecd2abf https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h38e077a_106.conda#23fe0f8b47e7b5527bcc1dfb6087dba6 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py310h62c0568_0.conda#4a7296c0273eb01dfbed728dd6a6725a https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py310h1f7b6fc_1.conda#857b828a13cdddf568958f7575b25b22 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b @@ -328,12 +322,10 @@ https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#6 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda#f4fe7a6e3d7c78c9de048ea9dda21690 https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py310h1234567_220.conda#665737e30e12e5c1e20a8a3426df73f2 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py310hff52083_0.conda#e91d183a307d7bd667003291f690cbb0 https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py310h1234567_220.conda#5611464975f4d2bd8c5beeab80ead9a0 https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py310h1234567_220.conda#1c1089c9dc15089da0b1b3a24dff32d1 -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.4-pyhd8ed1ab_0.conda#21e567168518369ce3f1c51e69b8ac0e https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index f963884483..23211439f4 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2703a355756c12ca0341ba67a7c3faeb6db8597dedb5d40f78b74ad3a137c307 +# input_hash: dd779de7b6186b184b545dfe7393741aa88a34b1cc6afb1399e872e5d3b52374 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-h59595ed_0.conda#df9ae69b85e0cab9bde23eff1e87f183 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d786502c97404c94d7d58d258a445a65 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 @@ -19,11 +19,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 -https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.2-h59595ed_0.conda#625e1fed28a5139aed71b3a76117ef84 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 @@ -31,17 +31,17 @@ https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_1.conda#e358c7c5f6824c272b5034b3816438a7 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1002.conda#3ca330ce74f16d685d62e4553d36410f https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.1-cxx17_h59595ed_2.conda#75648bc5dd3b8eab22406876c24d81ec +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -52,22 +52,22 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.0-h59595ed_0.conda#01c76c6d71097a0f3bd8683a8f255123 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab @@ -91,27 +91,26 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.120-hd590300_0.conda#7c3071bdf1d28b331a06bda6e85ab607 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda#4d18d86916705d352d5f4adfb7f0edd3 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 @@ -125,17 +124,17 @@ https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#4 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda#0725f6081030c29b109088639824ff90 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 -https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda#27cf681282c11dba7b0b1fd266e8f289 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.8-hab00c5b_0_cpython.conda#2fdc314ee058eda0114738a9309d3683 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 @@ -144,7 +143,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.con https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -155,19 +153,20 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py311hb755f60_0.conda#28778bfea41b0f34141208783882649b +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py311hb755f60_0.conda#c49924051b8336f6031eb3d019619cba https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda#8fdb82e5d9694dd8e9ed9ac8fdf48a26 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda#939ddd853b1d98bf6fd22cc0adeda317 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -176,11 +175,11 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda#2d694a9ffdcc30e89dea34a8dcdab6ae https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda#9e49ec2a61d02623b379dc332eb6889d +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py311h38be061_1.conda#94a4521bd7933a66d76b0274dbf8d2dd @@ -188,16 +187,14 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0 https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py311h9547e67_0.conda#3ac85c6c226e2a2e4b17864fc2ca88ff https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py311h459d7ec_0.conda#4288ea5cbe686d1b18fc3efb36c009a5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 -https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d @@ -205,7 +202,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -216,9 +213,9 @@ https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04e https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py311h459d7ec_0.conda#cc7727006191b8f3630936b339a76cd0 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -234,91 +231,88 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.1-py311h459d7ec_0.conda#9caf3270065a2d40fd9a443ba1568e96 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.4.4-py311h459d7ec_0.conda#1aa22cb84e68841ec206ee066457bdf0 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py311h459d7ec_0.conda#d66c9e36ab104f94e35b015c86c2fcb4 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py311h459d7ec_0.conda#fcdef52b45265eece45de756b164a9a7 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda#d3bcc5c186f78feba6f39ea047c35950 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda#09b94dd3a7e304df5b83176239347920 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.0.0-h2e90f83_4.conda#126a2a61d276c4268f71adeef25bfc33 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-hd590300_0.conda#e50a2609159a3e336fe4092738c00687 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda#a5ccd7f2271f28b7d2de0b02b64e3796 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda#02336abab4cb5dd794010ef53c54bd09 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py311h459d7ec_0.conda#5b22b9390448faccbc41769389b514a9 +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py311h459d7ec_1.conda#7fd17e8947afbddd2855720d643a48f0 +https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.0.0-hd5fc58b_4.conda#de9c380fea8634540db5fc8422888df1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.0.0-hd5fc58b_4.conda#de1cbf145ecdc1d29af18e14eb267bca +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.0.0-h3ecfda7_4.conda#016b763e4776b4c2c536420a7e6a2349 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.0.0-h2e90f83_4.conda#d866cc8dc37f101505e65a4372794631 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.0.0-h2e90f83_4.conda#6ebefdc74cb700ec82cd6702125cc422 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.0.0-h3ecfda7_4.conda#6397395a4677d59bbd32c4f05bb8fa63 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.0.0-h757c851_4.conda#24c9cf1dd8f6d6189102a136a731758c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.0.0-h757c851_4.conda#259bd0c788f447fe78aab69895365528 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.0.0-h59595ed_4.conda#ec121a4195acadad086f84719cc91430 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.0.0-hca94c1a_4.conda#bdbf11f760f1a3b35d766e03cebd9c42 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.0.0-h59595ed_4.conda#4354ea9f30a8c5111403fa4b24a2ad66 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda#e4d262cc3600e70b505a6761d29f6207 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py311h320fe9a_0.conda#b9e7a2cb2c47bbb99c05d1892500be45 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed -https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py311h320fe9a_0.conda#aac8d7137fedc2fd5f8320bf50e4204c +https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.1-pyhd8ed1ab_0.conda#d15917f33140f8d2ac9ca44db7ec8a25 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py311h1f0f07a_0.conda#8a18202ff25c26a81a230e3eaf657b3c https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py311h64a7726_2.conda#24ca5107ab75c5521067b8ba505dfae5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311h2032efe_1.conda#4ba860ff851768615b1a25b788022750 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.conda#e982956906078eeac9feb3b8db10d011 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b -https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda#b0ad5ef44595ef37c3008fc04ecd2abf https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h38e077a_106.conda#23fe0f8b47e7b5527bcc1dfb6087dba6 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py311h54ef318_0.conda#014c115be880802d2372ac6ed665f526 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c @@ -326,12 +320,10 @@ https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#6 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda#ec7e45bc76d9d0b69a74a2075932b8e8 https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py311h1234567_220.conda#bbfafb0cc0483c89ea2289381dc157a5 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py311h38be061_0.conda#0452c2cca94bdda38a16cf7b84edcd27 https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py311h1234567_220.conda#0e894286dd36bdc569d7fd4e8033f8d9 https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py311h1234567_220.conda#bd6689b3212fc662bd6cbc57e29ec0dc -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.4-pyhd8ed1ab_0.conda#21e567168518369ce3f1c51e69b8ac0e https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index 2708667be4..b9fbc9b311 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: f7181b3c93b7ce0524779056e3249a6f48c90ae100a1706fb064922066b47919 +# input_hash: 25bc65da646a05e5192138782bc95e942f6669b6decd1c9e3c1ec6007248f1bc @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda#2f4327a1cbe7f022401b236e915a5fef @@ -10,7 +10,7 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77 https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda#6185f640c43843e5ad6fd1c5372c3f80 https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda#f6f6600d18a4047b54f803cf708b868a -https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.2-h27087fc_0.tar.bz2#b7743cf3f8da023abe95afc215111555 +https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.11.3-h59595ed_0.conda#df9ae69b85e0cab9bde23eff1e87f183 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda#bfe4b3259a8ac6cdf0037752904da6a7 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 @@ -19,11 +19,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda# https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda#d4ff227c46917d3b4565302a2bbb276b -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.10-hd590300_0.conda#75dae9a4201732aa78a530b826ee5fe0 -https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.1-h59595ed_0.conda#50871627bc8ba3a46ec5650f4a5b9d43 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda#0bb492cca54017ea314b809b1ee3a176 +https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.2-h59595ed_0.conda#625e1fed28a5139aed71b3a76117ef84 https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.26.0-hd590300_0.conda#a86d90025198fd411845fc245ebc06c8 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.27.0-hd590300_0.conda#f6afff0e9ee08d2f1b897881a4f38cdb https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 @@ -31,17 +31,17 @@ https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda#0e33ef437202db431aa5a928248cf2e8 -https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 +https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_1.conda#e358c7c5f6824c272b5034b3816438a7 +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1002.conda#3ca330ce74f16d685d62e4553d36410f https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda#2785ddf4cb0e7e743477991d64353947 -https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.2-h59595ed_1.conda#127b0be54c1c90760d7fe02ea7a56426 +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.1-cxx17_h59595ed_2.conda#75648bc5dd3b8eab22406876c24d81ec +https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda#1635570038840ee3f9c71d22aa5b8b6d +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 @@ -52,22 +52,22 @@ https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.17-h166bdaf_0.tar.bz2#b7463391cf284065294e2941dd41ab95 +https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.13.1-h59595ed_0.conda#0974a6d3432e10bae02bcab0cce1b308 +https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.0-h59595ed_0.conda#01c76c6d71097a0f3bd8683a8f255123 https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda#30de3fd9b3b602f7473f30e684eeea8c https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda#3f1017b4141e943d9bc8739237f749e8 -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda#97da8860a0da5413c7c98a3b3838a645 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_0.conda#92e93490ee7f98bfadb389e3129b955c +https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda#51a753e64a3027bd7e23a189b1f6e91e +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda#9d731343cff6ee2e5a25c4a091bf8e2a https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab @@ -91,27 +91,26 @@ https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd7 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.114-h166bdaf_0.tar.bz2#efb58e80f5d0179a783c4e76c3df3b9c +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.120-hd590300_0.conda#7c3071bdf1d28b331a06bda6e85ab607 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda#e73e9cfd1191783392131e6238bdb3e9 -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda#c2097d0b46367996f09b4e8e4920384a +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda#4d18d86916705d352d5f4adfb7f0edd3 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda#d67729828dc6ff7ba44a61062ad79880 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.1-hf27288f_1.conda#78ad06185133494138cd5e922ed73ac7 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda#fc4ccadfbf6d4784de88c41704792562 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda#866983a220e27a80cb75e85cb30466a1 https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda#c442ebfda7a475f5e78f1c8e45f1e919 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda#6853448e9ca1cfd5f15382afd2a6d123 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.33-hf1915f5_6.conda#80bf3b277c120dd294b51d404b931a75 -https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-system-1.0.0-1.tar.bz2#577a4bd049737b11a24524e39a16a1f3 https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda#679c8961826aa4b50653bce17ee52abe +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 @@ -125,17 +124,17 @@ https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#4 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda#9bd06b12bbfa6fd1740fd23af4b0f0c7 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda#0725f6081030c29b109088639824ff90 https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda#f36ddc11ca46958197a45effdd286e45 https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda#8a35df3cbc0c8b12cc8af9473ae75eef https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda#760ae35415f5ba8b15d09df5afe8b23a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.33-hca2cd23_6.conda#e87530d1b12dd7f4e0f856dc07358d60 https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda#54b56c2fdf973656b748e0378900ec13 -https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda#255a7002aeec7a067ff19b545aca6328 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.1-h2c6b66d_0.conda#93acf31b379acebada263b9bce3dc6ed +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda#d9ee3647fbd9e8595b8df759b2bbefb8 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.45.2-h2c6b66d_0.conda#1423efca06ed343c1da0fc429bae0779 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 @@ -144,7 +143,6 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.con https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 -https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.1.0-pyhd8ed1ab_0.conda#0e8715bef534217eae333c53f645c9ed https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -155,19 +153,20 @@ https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.8-py39h3d6467e_0.conda#0261e43a0b124d1ced1e1af085e8bc3c +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py39h3d6467e_0.conda#82f4e576cbe74921703f91d3b43c8a73 https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py39hf3d152e_1.tar.bz2#adb733ec2ee669f6d010758d054da60f https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda#ff15f46b0d34308f4d40c1c51df07592 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py39hd1e30aa_0.conda#194fa03bd6b1054b8de8d48d335e45b2 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda#fad86b90138cf5d82c6f5a2ed6e683d9 -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.78.3-hfc55251_0.conda#41d2f46e0ac8372eeb959860713d9b21 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.3.1-pyhca7485f_0.conda#b7f0662ef2c9d4404f0af9eef5ed2fde +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda#8fdb82e5d9694dd8e9ed9ac8fdf48a26 +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda#939ddd853b1d98bf6fd22cc0adeda317 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda#1a76f09108576397c41c0b0c5bd84134 https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 @@ -176,11 +175,11 @@ https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda#0ac9f44fc096772b0aa092119b00c3ca -https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_ha2b6cf4_4.conda#898e0dd993afbed0d871b60c2eb33b83 +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h5d6823c_5.conda#2d694a9ffdcc30e89dea34a8dcdab6ae https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.5.0-hca28451_0.conda#7144d5a828e2cae218e0e3c98d8a0aeb -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_0.conda#fe0e297faf462ee579c95071a5211665 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda#24e2649ebd432e652aa72cfd05f23a8e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda#755c7f876815003337d2c61ff5d047e5 +https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda#9e49ec2a61d02623b379dc332eb6889d +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py39hf3d152e_1.conda#80f2066f7641b913233f07b800e2afde @@ -188,16 +187,14 @@ https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0. https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.7-py39h7633fee_0.conda#f668e146a2ed03a4e62ffbb98b3115fb https://conda.anaconda.org/conda-forge/linux-64/multidict-6.0.5-py39hd1e30aa_0.conda#e2005168d5a334f88a1d95d02e139239 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 -https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 -https://conda.anaconda.org/conda-forge/noarch/param-2.0.2-pyhca7485f_0.conda#3102a7194721176ad8c79ff20cc3b531 +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda#7f2e286780f072ed750df46dc2631138 +https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#248f521b64ce055e7feae3105e7abeb8 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976 -https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py39hd1e30aa_0.conda#ec86403fde8793ac1c36f8afa3d15902 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e -https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda#98206ea9954216ee7540f0c773f2104d @@ -205,7 +202,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/noarch/scooby-0.9.2-pyhd8ed1ab_0.conda#66dc03353b88f5f2db8c630854174a3f -https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda#40695fdfd15a92121ed2922900d0308b +https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda#da214ecd521a720a9d521c68047682dc https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -213,13 +210,12 @@ https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_0.conda#da1d979339e2714c30a8e806a33ec087 https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda#4531d2927578e7e254ff3bcf6457518c https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04eedddeb68ad39871c8127dd1c21f4f -https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 -https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py39hd1e30aa_1.conda#cbe186eefb0bcd91e8f47c3908489874 -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda#a92a6440c3fe7052d63244f3aba2a4a7 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda#1e865e9188204cdfb1fd2531780add88 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda#16ae769069b380646c47142d719ef466 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda#1da984bbb6e765743e13388ba7b7b2c8 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda#1cdea58981c5cbc17b51973bcaddcea7 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_0.conda#6e43a94e0ee67523b5e781f0faba5c45 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda#81f740407b45e3f9047b3174fa94eb9e https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec @@ -236,90 +232,87 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f9 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py39hd1e30aa_0.conda#dc0fb8e157c7caba4c98f1e1f9d2e5f4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.49.0-py39hd1e30aa_0.conda#dd1b02484cc8c31d4093111a82b6efb2 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.78.3-hfc55251_0.conda#e08e51acc7d1ae8dbe13255e7b4c64ac +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda#8b689d531a6f99ef71212081c0126147 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda#d3bcc5c186f78feba6f39ea047c35950 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_h4f84152_100.conda#d471a5c3abc984b662d9bae3bb7fd8a5 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.0.1-pyha770c72_0.conda#746623a787e06191d80a2133e5daff17 -https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda#0896606848b2dc5cebdf111b6543aa04 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda#e7d8df6509ba635247ff9aea31134262 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda#4a3816d06451c4946e2db26b86472cb6 -https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_hb11cfb5_4.conda#c90f4cbb57839c98fef8f830e4b9972f +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_h127d8a8_5.conda#09b94dd3a7e304df5b83176239347920 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda#1a42f305615c3867684e049e85927531 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2023.3.0-h2e90f83_0.conda#1cd43b2caa22f51118294978876502f7 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.20.0-hd590300_0.conda#933bcea637569c6cea6084957028cb53 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.6.0-hd429924_1.conda#1dbcc04604fdf1e526e6d1b0b6938396 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.0.0-h2e90f83_4.conda#126a2a61d276c4268f71adeef25bfc33 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-hd590300_0.conda#e50a2609159a3e336fe4092738c00687 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda#2972754dc054bb079d1d121918b5126f https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda#ac902ff3c1c6d750dd0dfc93a974ab74 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.0.0-pyhd8ed1ab_0.conda#5ba1cc5b924226349d4a49fb547b7579 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda#e667a3ab0df62c54e60e1843d2e6defb +https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda#94ff09cdedcb7b17e9cd5097ee2cfcff +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.11.0-h5ccd973_1.conda#9dd2dc16536b2839b8f895f716c0366c -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.9.0-hd8ed1ab_0.conda#c16524c1b7227dc80b36b4fa6f77cc86 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda#6a7e0694921f668a030d52f0c47baebd -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.0-pyhd8ed1ab_0.conda#c119653cba436d8183c27bf6d190e587 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.10.0-hd8ed1ab_0.conda#091683b9150d2ebaa62fd7e2c86433da +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda#08807a87fa7af10754d46f63b368e016 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.25.1-pyhd8ed1ab_0.conda#8797a4e26be36880a603aba29c785352 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py39hd1e30aa_0.conda#7288bccf99dd979dfcf80bb372c3de3f +https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_0.conda#bcc7157b06fce7f5e055402a8135dfd8 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda#5a6f6c00ef982a9bc83558d9ac8f64a0 -https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.1.1-pyhd8ed1ab_0.conda#d04bd1b5bed9177dd7c3cef15e2b6710 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.0.1-hd8ed1ab_0.conda#4a2f43a20fa404b998859c6a470ba316 +https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda#dcbadab7a68738a028e195ab68ab2d2e +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.1.0-hd8ed1ab_0.conda#6ef2b72d291b39e479d7694efa2b2b98 https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h9612171_113.conda#b2414908e43c442ddc68e6148774a304 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2023.3.0-hd5fc58b_0.conda#c246b3ce9b6976d3b31ebc0a107c4486 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2023.3.0-hd5fc58b_0.conda#bbdfe24aec88f9cded013e24da5a3cec -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2023.3.0-h3ecfda7_0.conda#93068e7b80a145689dfdd4b182957020 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2023.3.0-h2e90f83_0.conda#2c2735c63288953e2108dc804fe52adf -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2023.3.0-h2e90f83_0.conda#ee3930030324235a2e3ec5171b418481 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2023.3.0-h3ecfda7_0.conda#a3e2922d58b4cd9ee51ba8dbb80dfcc6 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2023.3.0-hfbc7f12_0.conda#da9b47d41e0357f66af895327a8ac72d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2023.3.0-hfbc7f12_0.conda#6860072c5ee02bb11f287416b73a0ff8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2023.3.0-h59595ed_0.conda#69676390abdff86e57c0d50b82ee72ad -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2023.3.0-h0bff32c_0.conda#9d3772f3ae8e4dfa31287bde490238de -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2023.3.0-h59595ed_0.conda#c1cec95aa4db6e625e2659c0ab31a9c5 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.0.0-hd5fc58b_4.conda#de9c380fea8634540db5fc8422888df1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.0.0-hd5fc58b_4.conda#de1cbf145ecdc1d29af18e14eb267bca +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.0.0-h3ecfda7_4.conda#016b763e4776b4c2c536420a7e6a2349 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.0.0-h2e90f83_4.conda#d866cc8dc37f101505e65a4372794631 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.0.0-h2e90f83_4.conda#6ebefdc74cb700ec82cd6702125cc422 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.0.0-h3ecfda7_4.conda#6397395a4677d59bbd32c4f05bb8fa63 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.0.0-h757c851_4.conda#24c9cf1dd8f6d6189102a136a731758c +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.0.0-h757c851_4.conda#259bd0c788f447fe78aab69895365528 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.0.0-h59595ed_4.conda#ec121a4195acadad086f84719cc91430 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.0.0-hca94c1a_4.conda#bdbf11f760f1a3b35d766e03cebd9c42 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.0.0-h59595ed_4.conda#4354ea9f30a8c5111403fa4b24a2ad66 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda#aa265f5697237aa13cc10f53fa8acc4f https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py39h15b0fa6_5.conda#85e186c7ff673b0d0026782ec353fb2a -https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda#93aff412f3e49fdb43361c0215cbd72d https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda#d5f595da2daead898ca958ac62f0307b https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b -https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_0.conda#3b8ef3a2d80f3d89d0ae7e3c975e6c57 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.0.4-pyhd8ed1ab_1.conda#a1986ad21c766ff22f7bae93f0641020 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39h7633fee_4.conda#b66595fbda99771266f042f42c7457be -https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py39hd1e30aa_0.conda#15a521bec784b8903fd6396f234b6aec +https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py39hd1e30aa_1.conda#437936123de28b9bf81d35b943170c4f https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py39h44dd56e_0.conda#baea2f5dfb3ab7b1c836385d2e1daca7 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda#ed71ad3e30eb03da363fb797419cce98 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.2.0-pyhd8ed1ab_0.conda#5973bc565e2aea620c3a431cafdde032 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32 https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.34-pyhd8ed1ab_0.conda#048ba98aa7b16ef0d8866f8c87d7c5b8 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054 https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py39hd1e30aa_1.conda#ca63612907462c8e36edcc9bbacc253e https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_103.conda#50f05f98d084805642d24dff910e11e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.0-py39hddac248_0.conda#95aaa7baa61432a1ce85dedb7b86d2dd -https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed -https://conda.anaconda.org/conda-forge/noarch/pyct-0.5.0-pyhd8ed1ab_0.conda#24c245c82396be3297c0aa26b69e18d8 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda#85293a042c24a08e71b7608ee66b6134 +https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.1-ha41ecd1_0.conda#5c0cc002bf4eaa56448b0729efd6e96c +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.1-pyhd8ed1ab_0.conda#d15917f33140f8d2ac9ca44db7ec8a25 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.11-py39h44dd56e_0.conda#146e5b81c6c6b2279b2d71aec5ae0b5e https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h44dd56e_1.conda#d037c20e3da2e85f03ebd20ad480c359 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda#6ab241b2023730f6b41712dc1b503afa -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py39h6404dd3_1.conda#05623249055d99c51cde021b525611db +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda#1520f039123452cd2de847068449a618 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 -https://conda.anaconda.org/conda-forge/noarch/colorcet-3.0.1-pyhd8ed1ab_0.tar.bz2#1e424f22b3e2713068fe12d57f2dec5b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.2.0-pyhd8ed1ab_0.conda#81c14e12f44f94613fe5922403e32341 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda#b0ad5ef44595ef37c3008fc04ecd2abf https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h8007c5b_104.conda#5d86b2425076a811f7321a97928eaccd -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h7f000aa_3.conda#0abfa7f9241a0f4fd732bc15773cfb0c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h38e077a_106.conda#23fe0f8b47e7b5527bcc1dfb6087dba6 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda#03bd1ddcc942867a19528877143b9852 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda#5456bdfe5809ebf5689eda6c808b686e https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.6.1-pyha770c72_0.conda#4efd2c755bf2079e5651e57e1999db6c +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.0-pyha770c72_0.conda#846ba0877cda9c4f11e13720cacd1968 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py39h44dd56e_1.conda#90c5165691fdcb5a9f43907e32ea48b4 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5810be5_19.conda#54866f708d43002a514d0b9b0f84bc11 https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b @@ -328,12 +321,10 @@ https://conda.anaconda.org/conda-forge/noarch/cmocean-3.1.3-pyhd8ed1ab_0.conda#6 https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.0-pyhc1e730c_0.conda#60404b48ef1ccfb92cfd055f8844b700 https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h78e8752_1.conda#a3f4cd4a512ec5db35ffbf25ba11f537 https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda#e1f148e57d071b09187719df86f513c1 https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.2.6-qt_py39h1234567_220.conda#dadcd0dc225d51a481df8f27f70feaef -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda#983f5b77540eb5aa00238e72ec9b1dfb https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.2.6-qt_py39h1234567_220.conda#37776296bbc64b7684d2af27aa2f1653 https://conda.anaconda.org/conda-forge/linux-64/vtk-9.2.6-qt_py39h1234567_220.conda#aa08666bf3c8c425add2db0ff49af88c -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.3-pyhd8ed1ab_0.conda#aba0f4dfb3cb2bad1e3b63084c33f6be +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.4-pyhd8ed1ab_0.conda#21e567168518369ce3f1c51e69b8ac0e https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.2-pyhd8ed1ab_0.conda#ce99859070b0e17ccc63234ca58f3ed8 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 From eed0380ae24eb7d993c04061142e26c0afe6cc6b Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Wed, 27 Mar 2024 16:30:04 +0000 Subject: [PATCH 19/20] some requested changes --- lib/iris/experimental/geovista.py | 4 ++-- .../experimental/geovista/test_cube_to_poly.py | 11 +++++------ .../geovista/test_extract_unstructured_region.py | 1 - .../experimental/geovista/test_cube_to_polydata.py | 7 +++---- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 1a5f2211b4..dae89bef2d 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -32,7 +32,7 @@ def cube_to_polydata(cube, **kwargs): ys=lats.points, connectivity=indices, data=cube.data, - name=f"{cube.name()} / {cube.units}", + name=f"{cube.name()} / ({cube.units})", start_index=face_node.start_index, **kwargs, ) @@ -44,7 +44,7 @@ def cube_to_polydata(cube, **kwargs): xs=x_coord.contiguous_bounds(), ys=y_coord.contiguous_bounds(), data=cube.data, - name=f"{cube.name()} / {cube.units}", + name=f"{cube.name()} / ({cube.units})", **kwargs, ) coord_system = cube.coord_system() diff --git a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py index 614cf4e4a4..50f8e9609a 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py +++ b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Integration tests for the `iris.experimental.geovista.cube_to_polydata` function.""" - import numpy as np from iris import load_cube @@ -21,11 +20,11 @@ def test_integration_2d(): "votemper.nc", ] ) - with PARSE_UGRID_ON_LOAD.context(): + with PARSE_UGRID_ON_LOAD: global_cube = load_cube(file_path, "votemper") polydata = cube_to_polydata(global_cube[0, 1, :]) - + # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 26640 assert polydata.GetNumberOfPoints() == 26969 @@ -39,11 +38,11 @@ def test_integration_1d(): "SMALL_hires_wind_u_for_ipcc4.nc", ] ) - with PARSE_UGRID_ON_LOAD.context(): + with PARSE_UGRID_ON_LOAD: global_cube = load_cube(file_path) polydata = cube_to_polydata(global_cube[0, :]) - + # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 51200 assert polydata.GetNumberOfPoints() == 51681 @@ -61,7 +60,7 @@ def test_integration_mesh(): global_cube = load_cube(file_path, "conv_rain") polydata = cube_to_polydata(global_cube[0, :]) - + # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 864 assert polydata.GetNumberOfPoints() == 866 np.testing.assert_array_equal(polydata.active_scalars, global_cube[0, :].data) diff --git a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py index 87028acb48..53962baca0 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py +++ b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Integration tests for the `iris.experimental.geovista.extract_unstructured_region` function.""" - from geovista.geodesic import BBox from iris import load_cube diff --git a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py index f515a533ac..4691f5cff7 100644 --- a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py +++ b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py @@ -4,7 +4,6 @@ # See LICENSE in the root of the repository for full licensing details. """Unit tests for the `iris.experimental.geovista.cube_to_polydata` function.""" - from unittest.mock import Mock from geovista import Transform @@ -104,7 +103,7 @@ def expected(self, cube_2d): "xs": cube_2d.coord(axis="X").contiguous_bounds(), "ys": cube_2d.coord(axis="Y").contiguous_bounds(), "data": cube_2d.data, - "name": cube_2d.name() + " / " + str(cube_2d.units), + "name": cube_2d.name() + " / " + "(" + str(cube_2d.units) + ")", } @pytest.fixture() @@ -121,7 +120,7 @@ def expected(self, cube_1d): "xs": cube_1d.coord(axis="X").contiguous_bounds(), "ys": cube_1d.coord(axis="Y").contiguous_bounds(), "data": cube_1d.data, - "name": cube_1d.name() + " / " + str(cube_1d.units), + "name": cube_1d.name() + " / " + "(" + str(cube_1d.units) + ")", } @pytest.fixture() @@ -139,7 +138,7 @@ def expected(self, cube_mesh): "ys": cube_mesh.mesh.node_coords[1].points, "connectivity": cube_mesh.mesh.face_node_connectivity.indices_by_location(), "data": cube_mesh.data[0], - "name": cube_mesh.name() + " / " + str(cube_mesh.units), + "name": cube_mesh.name() + " / " + "(" + str(cube_mesh.units) + ")", "start_index": 0, } From 37c4bb58aed3778e666679c35ca3889f55760195 Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Wed, 27 Mar 2024 16:54:48 +0000 Subject: [PATCH 20/20] All remaining changes --- lib/iris/experimental/geovista.py | 2 +- .../geovista/test_cube_to_poly.py | 19 ++++++++++--------- .../test_extract_unstructured_region.py | 2 ++ .../geovista/test_cube_to_polydata.py | 4 ++-- .../test_extract_unstructured_region.py | 3 ++- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 46321836a8..26bfa2e703 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -298,7 +298,7 @@ def extract_unstructured_region(cube, polydata, region, **kwargs): indices_key = VTK_POINT_IDS else: raise NotImplementedError( - f"Must be on face or node. Found: {cube.location}." + f"cube.location must be `face` or `node`. Found: {cube.location}." ) if cube.shape[mesh_dim] != polydata_length: diff --git a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py index 50f8e9609a..582c216a44 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py +++ b/lib/iris/tests/integration/experimental/geovista/test_cube_to_poly.py @@ -20,13 +20,14 @@ def test_integration_2d(): "votemper.nc", ] ) - with PARSE_UGRID_ON_LOAD: - global_cube = load_cube(file_path, "votemper") - polydata = cube_to_polydata(global_cube[0, 1, :]) + cube = load_cube(file_path, "votemper") + + polydata = cube_to_polydata(cube[0, 1, :]) # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 26640 assert polydata.GetNumberOfPoints() == 26969 + np.testing.assert_array_equal(cube[0, 1, :].data.flatten(), polydata.active_scalars) def test_integration_1d(): @@ -38,13 +39,13 @@ def test_integration_1d(): "SMALL_hires_wind_u_for_ipcc4.nc", ] ) - with PARSE_UGRID_ON_LOAD: - global_cube = load_cube(file_path) + cube = load_cube(file_path) - polydata = cube_to_polydata(global_cube[0, :]) + polydata = cube_to_polydata(cube[0, :]) # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 51200 assert polydata.GetNumberOfPoints() == 51681 + np.testing.assert_array_equal(cube[0, :].data.flatten(), polydata.active_scalars) def test_integration_mesh(): @@ -57,10 +58,10 @@ def test_integration_mesh(): ) with PARSE_UGRID_ON_LOAD.context(): - global_cube = load_cube(file_path, "conv_rain") + cube = load_cube(file_path, "conv_rain") - polydata = cube_to_polydata(global_cube[0, :]) + polydata = cube_to_polydata(cube[0, :]) # This is a known good output, we have plotted the result and checked it. assert polydata.GetNumberOfCells() == 864 assert polydata.GetNumberOfPoints() == 866 - np.testing.assert_array_equal(polydata.active_scalars, global_cube[0, :].data) + np.testing.assert_array_equal(polydata.active_scalars, cube[0, :].data) diff --git a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py index 53962baca0..47024dc1cd 100644 --- a/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py +++ b/lib/iris/tests/integration/experimental/geovista/test_extract_unstructured_region.py @@ -32,3 +32,5 @@ def test_face_region_extraction(): assert extracted_cube.ndim == 2 assert extracted_cube.shape == (72, 101) + assert global_cube.shape == (72, 864) + assert global_cube.ndim == 2 diff --git a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py index 4691f5cff7..1394465fb4 100644 --- a/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py +++ b/lib/iris/tests/unit/experimental/geovista/test_cube_to_polydata.py @@ -103,7 +103,7 @@ def expected(self, cube_2d): "xs": cube_2d.coord(axis="X").contiguous_bounds(), "ys": cube_2d.coord(axis="Y").contiguous_bounds(), "data": cube_2d.data, - "name": cube_2d.name() + " / " + "(" + str(cube_2d.units) + ")", + "name": f"{cube_2d.name()} / ({cube_2d.units})", } @pytest.fixture() @@ -120,7 +120,7 @@ def expected(self, cube_1d): "xs": cube_1d.coord(axis="X").contiguous_bounds(), "ys": cube_1d.coord(axis="Y").contiguous_bounds(), "data": cube_1d.data, - "name": cube_1d.name() + " / " + "(" + str(cube_1d.units) + ")", + "name": f"{cube_1d.name()} / ({cube_1d.units})", } @pytest.fixture() diff --git a/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py index 7e24abf19c..57babfc764 100644 --- a/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py +++ b/lib/iris/tests/unit/experimental/geovista/test_extract_unstructured_region.py @@ -126,7 +126,8 @@ def test_no_mesh(self, cube_2d): def test_edge_location(self, cube_mesh_edge): with pytest.raises( NotImplementedError, - match=f"Must be on face or node." f" Found: {cube_mesh_edge.location}.", + match=f"cube.location must be `face` or `node`." + f" Found: {cube_mesh_edge.location}.", ): extract_unstructured_region( cube_mesh_edge, self.mocked_polydata, self.mocked_region