metatensor / metatensor

Self-describing sparse tensor data format for atomistic machine learning and beyond
https://docs.metatensor.org
BSD 3-Clause "New" or "Revised" License
49 stars 16 forks source link

Sorting an empty TensorBlock #652

Open PicoCentauri opened 3 months ago

PicoCentauri commented 3 months ago

When trying to sort an empty TensorBlock

from metatensor.operations import sort_block
from metatensor import Labels, TensorBlock

empty_block = TensorBlock(
    samples=Labels.empty(names="samples"),
    components=[],
    properties=Labels.single(),
    values=np.array([]).reshape(-1, 1),
)

sort_block(empty_block)

There will be an IndexError:

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

See details below for full traceback. However, sorting an empty block should be possible in my opinion.

Thanks to @curiosity54 for finding this issue.

--------------------------------------------------------------------------- IndexError Traceback (most recent call last) Cell In[105], [line 11](vscode-notebook-cell:?execution_count=105&line=11) [2](vscode-notebook-cell:?execution_count=105&line=2) from metatensor import Labels, TensorBlock [4](vscode-notebook-cell:?execution_count=105&line=4) empty_block = TensorBlock( [5](vscode-notebook-cell:?execution_count=105&line=5) samples=Labels.empty(names="samples"), [6](vscode-notebook-cell:?execution_count=105&line=6) components=[], [7](vscode-notebook-cell:?execution_count=105&line=7) properties=Labels.single(), [8](vscode-notebook-cell:?execution_count=105&line=8) values=np.array([]).reshape(-1, 1), [9](vscode-notebook-cell:?execution_count=105&line=9) ) ---> [11](vscode-notebook-cell:?execution_count=105&line=11) sort_block(empty_block) File ~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:253, in sort_block(block, axes, descending) [247](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:247) if axis not in ["samples", "components", "properties"]: [248](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:248) raise ValueError( [249](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:249) "`axes` must be one of 'samples', 'components' or 'properties', " [250](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:250) f"not '{axis}'" [251](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:251) ) --> [253](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:253) result_block = _sort_single_block(block, axes_list, descending) [255](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:255) for parameter, gradient in block.gradients(): [256](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:256) if len(gradient.gradients_list()) != 0: File ~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:117, in _sort_single_block(block, axes, descending) [115](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:115) values = block.values [116](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:116) if "samples" in axes: --> [117](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:117) sorted_idx = _dispatch.argsort_labels_values(sample_values, reverse=descending) [118](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:118) sample_values = sample_values[sorted_idx] [119](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/sort.py:119) values = values[sorted_idx] File ~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:142, in argsort_labels_values(labels_values, reverse) [140](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:140) list_tuples[i].append(i) [141](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:141) list_tuples.sort(reverse=reverse) --> [142](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:142) return np.array(list_tuples)[:, -1] [143](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:143) else: [144](https://file+.vscode-resource.vscode-cdn.net/Users/philiploche/repos/lab-cosmo/pair_descriptor/~/repos/lab-cosmo/pair_descriptor/pair/lib/python3.11/site-packages/metatensor/operations/_dispatch.py:144) raise TypeError(UNKNOWN_ARRAY_TYPE) IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
Luthaf commented 3 months ago

We should have a check if the block is empty and then immediately return. This should be an easy fix!