Tensor işlemleri desteklenmeyen depolama düzenlerini reddeder

.NET 11'den başlayarak, çok boyutlu Tensor kopyalama ve hedef alma işlemleri, çıktı yazmadan önce ArgumentException ile desteklenmeyen çakışan depolama düzenlerini reddeder. Tensor-span oluşturucuları ayrıca System.Array depolamasının öğe türünü de doğrular.

Değişiklik, desteklenen hedef çerçeveleri de dahil olmak üzere System.Numerics.Tensors paketinde sunulur. Paketin güncelleştirilmesi, önceki .NET sürümleri hedefleyen uygulamaları etkileyebilir. Ayrı TensorPrimitives API'ler mevcut örtüşme sözleşmesini korur.

Sürüm kullanıma sunulmuştur

.NET 11

Önceki davranış

CopyTo, FlattenTo, TryCopyTo ve TryFlattenTo, çakışan kaynak ve hedef depolamayı desteklediğini belgeledi. Try Yöntemler, kaynağı önce geçici depolama alanına kopyalanmış gibi ele aldı.

Örneğin, aşağıdaki kaynak ve hedef aynı dizinin çakışan bölgelerine başvurur:

int[] storage = { 1, 2, 3, 4, 5, 6 };
ReadOnlyTensorSpan<int> source = new(storage, new nint[] { 2, 2 }, new nint[] { 3, 1 });
TensorSpan<int> destination = new(storage, new nint[] { 2, 2 });
source.CopyTo(destination);

Belgelenen anlık görüntü stili sözleşmesi varış noktasının [1, 2, 4, 5] alacağını ima etti. Desteklenmeyen çakışmanın gerçek sonuçları düzen ve geçiş sırasına bağlı olabilir; uygulama bu sözleşmeyi güvenilir bir şekilde karşılamadı.

System.Array parametresini alan oluşturucular, dizinin öğe türünün T ile uyumlu olup olmadığını tutarlı bir şekilde doğrulamadı.

Yeni davranış

Örnek, kopyalamadan önce ArgumentException fırlatır. Aynı desteklenmeyen çakışma, şekil ve kapasite denetimleri başarılı olduğunda TryCopyTo ve TryFlattenTo tarafından da fırlatılır.

Desteklenen çakışma işleme özgü olmaya devam eder:

Operasyon Desteklenen örtüşme
CopyTo ve TryCopyTo Kaynak ve hedefin öğe sayıları eşitse veya görünümler tamamen aynıysa.
FlattenTo ve TryFlattenTo Yoğun bir kaynak ve hedef aralığı.
Hedefli öğe bazlı işlemler Yinelenen mantıksal depolama konumları olmadan aynı giriş/çıkış görünümleri. Kaydırılmış çakışma ve çakışan yayın girişleri reddedilir.
Tensor.ResizeTo Yoğun kaynak ve hedef. Desteklenmeyen strided örtüşme kabul edilmez.
Aynı görünümde geri döndürme Yoğun, yerinde tersine çevirme veya no-op tersine çevirme.

Try Kopyalama yöntemleri, hedef çok kısa olduğunda yine de kopyalamadan false döndürür. TryCopyTo ayrıca uyumsuz şekiller için false döndürür. Desteklenmeyen çakışma, kapasite hatası değil geçersiz bir düzendir.

Tensor.ResizeTo ve mevcut bir hedefe birleştirme, birden fazla mantıksal öğe içeren sıfır adımlı boyutu reddeder. Boş hedeflere ve tekil boyutlarda sıfır adımlara izin verilir.

ArrayTypeMismatchException alan TensorSpan<T> ve ReadOnlyTensorSpan<T> oluşturucuları, uyumsuz dizi öğesi türleri için System.Array fırlatır. Yazılabilir tensor span'lar da kovaryan dizileri reddeder; salt okunur tensor span'lar uyumlu başvuru türü kovaryansa izin verir.

Kesinti yaratan değişiklik türü

Bu, bir davranış değişikliğidir.

Değişiklik nedeni

Rastgele çakışan strided tensörler arasındaki doğru kopyalar, tensörün tamamıyla orantılı geçici depolama gerektirebilir. Açıkça reddetme, tam tensor anlık görüntülerini sessizce ayırmadan dolaşmaya bağlı bozulmayı önler.

Yinelenen çıkış depolama konumları ayrı mantıksal sonuçları temsil edemez. Dizi öğesi türü doğrulaması, uyumsuz depolamanın T olarak yorumlanmasını engeller ve kovaryant dizi depolaması aracılığıyla yazmaları önler.

Örtüşmeyen çıkış depolama alanı kullanın veya çakışan bir kopyadan önce kaynağın anlık görüntüsünü açıkça alın. Yukarıdaki örnek için:

int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);

Anlık görüntü [1, 2, 4, 5] içerir. Hedefi alan öğe bazlı işlemler için çakışan her girdinin anlık kopyasını alın veya ayrı bir sonuç oluşturun. Yayın hedeflerini bağımsız olarak adreslenebilen çıkış depolama alanlarıyla değiştirin.

System.Array üzerinde bir tensör aralığı için uyumlu öğe depolaması sağlayın. Yazılabilir bir görünüm için, kovaryant olmayan bir dizi kullanın veya öğeleri yeni bir T[] içine kopyalayın.

Bir Try kopyalama yönteminin hata fırlatamayacağını varsaymayın. Sonuç false yetersiz kapasiteyi veya TryCopyTo için uyumsuz şekilleri işler. Hiçbir uyumluluk anahtarı rastgele çakışma davranışını geri yüklemez.

Etkilenen API'ler

Ayrıca bkz.