As operações do Tensor alinham formas equivalentes e tensores vazios

A partir do .NET 11, as operações com tensores usam regras consistentes de alinhamento de forma. Tensores e spans vazios padrão de classificação zero têm forma efetiva de [0] durante os cálculos, e as operações podem ignorar dimensões singleton líderes redundantes quando alinham formas.

A alteração é entregue no pacote System.Numerics.Tensors, incluindo seus frameworks de destino com suporte. A atualização do pacote pode afetar aplicativos destinados a versões de .NET anteriores.

Versão introduzida

.NET 11

Comportamento anterior

As operações com tensores manipulavam shapes inconsistentemente. Algumas operações exigiram correspondências exatas de forma, enquanto outras alinharam dimensões de forma diferente. Como resultado, formas equivalentes com dimensões singleton líderes redundantes, como [1, 1, 3] e [3], podem ser rejeitadas ou interpretadas de forma diferente entre as operações.

Tensores e spans vazios padrão mantiveram metadados de rank zero, mas as operações não os trataram consistentemente como vetores com uma forma eficaz de [0]. Operações de empilhamento e concatenação também podem interpretar um eixo de forma diferente com base nos ranks de entrada.

Algumas operações também restringiram contagens ou deslocamentos de elementos lógicos a int, o que impediu que intervalos de tensor com suporte nativo com mais de int.MaxValue elementos fossem percorridos corretamente. As operações EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny e LessThanOrEqualAny não inspecionaram consistentemente o comprimento lógico completo da entrada, inclusive para entradas vazias.

Novo comportamento

As operações de tensor agora usam regras compartilhadas de alinhamento de forma:

  • Tensores e spans vazios padrão de rank zero têm uma forma efetiva de [0] para cálculos. Seus Rank, Lengths e Strides armazenados não mudam, e formas vazias explicitamente classificadas mantêm suas dimensões.
  • As operações podem adicionar ou remover dimensões singleton à esquerda redundantes quando alinham formas de tensor. Por exemplo, [1, 1, 3] alinha-se com [3], mas [2, 1] e [1, 2] permanecem distintos. Dimensões de comprimento zero e dimensões singleton não líderes permanecem significativas.
  • A igualdade de formas ignora apenas dimensões singleton líderes redundantes. Ele não faz broadcast de outras dimensões.
  • As operações de pilha e concatenação interpretam o eixo usando a forma efetiva da primeira entrada. Outras entradas e destinos se alinham a essa forma.
  • Os valores vazios padrão podem ser propagados para [2, 0]. Uma operação binária entre formas efetivas [0] e [0, 2] rejeita as dimensões finais incompatíveis.
  • Fontes e destinos mantêm os metadados da forma solicitados quando as operações os alinham.

Os intervalos de tensor com suporte nativo agora podem ser percorridos com comprimentos e deslocamentos de tamanho nativo, incluindo intervalos com mais de int.MaxValue elementos lógicos. Visualizações vazias também mantêm uma origem de armazenamento dentro de sua origem. As operações EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny e LessThanOrEqualAny agora inspecionam o intervalo lógico de entrada completo e manipulam corretamente as entradas vazias.

Tipo de mudança disruptiva

Essa é uma mudança comportamental.

Motivo da alteração

Regras de forma consistentes tornam as operações com tensores mais previsíveis e preservam dimensões explicitamente solicitadas, permitindo que formas equivalentes trabalhem juntas. O percorrimento de tamanho nativo também permite que as operações cubram todo o intervalo lógico de intervalos com suporte de armazenamento maior.

Para obter mais informações, consulte dotnet/runtime#135060.

Examine o código que depende de uma operação de tensor aceitando ou rejeitando uma determinada combinação de formatos. Considere valores vazios padrão de rank zero como tendo uma forma efetiva de [0], e que dimensões singleton líderes redundantes sejam ignoradas durante o alinhamento e a comparação de forma. Dimensões explícitas de comprimento zero e dimensões singleton não líderes permanecem significativas.

Para operações de stack e concatenação, interprete o eixo em relação à forma efetiva da primeira entrada. Se o código exigir classificações ou comprimentos armazenados exatos, valide esses metadados antes de chamar a operação. Os metadados armazenados de valores vazios padrão não são alterados.

APIs afetadas