Операции Tensor выравнивают эквивалентные формы и пустые тензоры

Начиная с .NET 11, тензорные операции используют согласованные правила согласования размерностей. По умолчанию пустые тензоры и спаны нулевого ранга имеют эффективную размерность [0] во время вычислений, а операции могут игнорировать избыточные начальные единичные измерения при выравнивании размерностей.

Это изменение поставляется в пакете System.Numerics.Tensors, включая его поддерживаемые целевые платформы .NET. Обновление пакета может повлиять на приложения, предназначенные для более ранних .NET версий.

Представленная версия

.NET 11

Предыдущее поведение

Операции Tensor обрабатывают формы несогласованно. Некоторые операции требовали точного совпадения форм, а в других размеры выравнивали по-разному. В результате эквивалентные формы с избыточными ведущими одноэлементными измерениями, такими как [1, 1, 3] и [3], могут быть отклонены или по-разному интерпретированы в разных операциях.

Пустые тензоры и спаны по умолчанию сохранили метаданные ранга нуля, но операции не последовательно обрабатывают их как векторы с эффективной формой [0]. Операции стека и объединения также могут интерпретировать ось по-разному в зависимости от размерностей входов.

Некоторые операции также сужали количество логических элементов или смещения до int, что препятствовало корректному обходу диапазонов тензоров с собственной поддержкой, содержащих более int.MaxValue элементов. Операции EqualsAny, GreaterThanOrEqualAny, GreaterThanAny, LessThanAny и LessThanOrEqualAny не всегда проверяли полную логическую длину входных данных, включая пустые входные данные.

Новое поведение

Теперь операции тензора используют общие правила выравнивания форм:

  • Пустые тензоры и спаны ранга 0 по умолчанию имеют эффективную форму [0] для вычислений. Их сохраненные Rank, Lengths и Strides не изменяются, и пустые фигуры с явным рангом сохраняют свои измерения.
  • Операции могут добавлять или удалять избыточные ведущие единичные измерения при выравнивании форм. Например, [1, 1, 3] выравнивается с [3], но [2, 1] и [1, 2] остаются различными. Измерения нулевой длины и неведущие одноэлементные измерения остаются значительными.
  • Равенство форм игнорирует только избыточные начальные измерения размера 1. Он не транслирует другие измерения.
  • Операции стека и объединения интерпретируют ось с помощью эффективной формы первого входа. Другие входные данные и назначения соответствуют этой форме.
  • Пустые значения по умолчанию могут транслироваться в [2, 0]. Двоичная операция между эффективными формами [0] и [0, 2] отклоняет несовместимые последние измерения.
  • Источники и назначения сохраняют запрошенные метаданные фигуры, когда операции выравнивают их.

Теперь диапазоны тензоров, основанные на native-памяти, можно просматривать с помощью длины и смещения собственного размера, включая диапазоны с более чем int.MaxValue логическими элементами. Пустые представления также сохраняют происхождение хранилища в пределах своего источника. Операции EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny и LessThanOrEqualAny теперь проверяют полный логический диапазон входных данных и правильно обрабатывают пустые входные данные.

Тип разрушающего изменения

Изменение поведения .

Причина изменения

Согласованные правила форм делают тензорные операции более предсказуемыми и сохраняют явно запрошенные измерения, позволяя эквивалентным формам работать вместе. Обход с нативным размером также позволяет операциям охватывать полный логический диапазон интервалов, поддерживаемых большим хранилищем.

Дополнительные сведения см. в статье dotnet/runtime#135060.

Проверьте код, зависящий от операции тензора, принимающей или отклоняющей определенную комбинацию форм. Считать пустые значения ранга 0 имеющими эффективную форму [0], а избыточные ведущие одноэлементные измерения — игнорировать при выравнивании и сравнении форм. Явные измерения нулевой длины и непервые одноэлементные измерения остаются значительными.

Для операций stack и конкатенации интерпретируйте ось относительно эффективной формы первого входа. Если для кода требуются точные сохранённые ранги или длины, проверьте эти метаданные перед вызовом операции. Сохранённые метаданные пустых значений по умолчанию не изменяются.

Затронутые API