Le operazioni tensor allineano forme equivalenti e tensori vuoti

A partire da .NET 11, le operazioni tensor usano regole di allineamento delle forme coerenti. I tensori e gli intervalli vuoti di rango zero predefiniti hanno una forma efficace di [0] durante i calcoli e le operazioni possono ignorare le dimensioni singleton iniziali ridondanti quando allineano le forme.

La modifica viene recapitata nel pacchetto System.Numerics.Tensors , inclusi i framework di destinazione supportati. L'aggiornamento del pacchetto può influire sulle app destinate a versioni precedenti .NET.

Versione introdotta

.NET 11

Comportamento precedente

Le operazioni tensor gestiscono le forme in modo incoerente. Alcune operazioni richiedono corrispondenze esatte della forma, mentre altre allineavano le dimensioni in modo diverso. Di conseguenza, le forme equivalenti con dimensioni singleton iniziali ridondanti, ad esempio [1, 1, 3] e [3], possono essere rifiutate o interpretate in modo diverso nelle diverse operazioni.

I tensori vuoti predefiniti e gli span conservavano i metadati rank-zero, ma le operazioni non li consideravano costantemente come vettori con una forma efficace di [0]. Le operazioni stack e concatenate possono anche interpretare un asse in modo diverso in base ai ranghi degli input.

Alcune operazioni limitavano anche i conteggi o gli offset degli elementi logici a int, impedendo il corretto attraversamento degli span di tensori supportati da codice nativo con più di int.MaxValue elementi. Le operazioni EqualsAny, GreaterThanAny, LessThanAny, GreaterThanOrEqualAny e LessThanOrEqualAny non hanno controllato in modo coerente la lunghezza completa dell'input logico, anche nel caso di input vuoti.

Nuovo comportamento

Le operazioni sui tensori ora usano regole condivise di allineamento delle forme:

  • I tensori e gli span vuoti di rango zero predefiniti hanno una forma efficace di [0] per i calcoli. I relativi elementi archiviati Rank, Lengths e Strides non cambiano e le forme vuote classificate esplicitamente mantengono le dimensioni.
  • Le operazioni possono aggiungere o rimuovere dimensioni singleton iniziali ridondanti quando allineano le shape. Ad esempio, [1, 1, 3] è allineato con [3], ma [2, 1] e [1, 2] rimangono distinti. Le dimensioni a lunghezza zero e le dimensioni singleton non iniziali rimangono significative.
  • L'uguaglianza delle forme ignora solo le dimensioni singleton iniziali ridondanti. Non trasmette altre dimensioni.
  • Le operazioni stack e concatenate interpretano l'asse usando la forma effettiva del primo input. Altri input e destinazioni sono allineati a tale forma.
  • I valori vuoti predefiniti possono essere diffusi in broadcast a [2, 0]. Un'operazione binaria tra forme [0] effettive e [0, 2] rifiuta le dimensioni finali incompatibili.
  • Le sorgenti e le destinazioni mantengono i metadati della forma richiesti quando le operazioni le allineano.

È ora possibile percorrere span tensor con supporto nativo con lunghezze e offset di dimensioni native, inclusi span con più di int.MaxValue elementi logici. Le visualizzazioni vuote mantengono anche un'origine di archiviazione all'interno della loro sorgente. Le operazioni EqualsAny, GreaterThanOrEqualAny, GreaterThanAny, LessThanAny e LessThanOrEqualAny ora controllano l'intervallo di input logico completo e gestiscono correttamente gli input vuoti.

Tipo di cambiamento che interrompe la compatibilità

Si tratta di un cambiamento comportamentale.

Motivo della modifica

Le regole delle forme coerenti rendono le operazioni di tensore più prevedibili e mantengono le dimensioni richieste in modo esplicito, consentendo al contempo l'interazione tra forme equivalenti. L'attraversamento con dimensioni native consente anche alle operazioni di coprire l'intera gamma logica di intervalli supportati da una memoria di dimensioni maggiori.

Per altre informazioni, vedere dotnet/runtime#135060.

Esaminare il codice che dipende da un'operazione tensor che accetta o rifiuta una determinata combinazione di forme dei tensori. Considerare i valori vuoti predefiniti di rango zero come aventi una forma effettiva di [0], e ignorare le dimensioni singleton iniziali ridondanti durante l’allineamento e il confronto delle forme. Le dimensioni esplicite di lunghezza zero e le dimensioni singleton non iniziali rimangono significative.

Per le operazioni di stack e concatenazione, interpretare l'asse in relazione alla forma effettiva del primo input. Se il codice richiede ranghi o lunghezze archiviati esatti, convalidare i metadati prima di chiamare l'operazione. I metadati archiviati dei valori vuoti predefiniti non cambiano.

Le API interessate