Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mulai dari .NET 11, penyalinan Tensor multidimensi dan operasi yang menerima tujuan menolak tata letak penyimpanan yang tumpang tindih yang tidak didukung dengan ArgumentException sebelum menulis output. Konstruktor tensor-span juga memvalidasi jenis elemen dari penyimpanan System.Array.
Perubahan ini disertakan dalam paket System.Numerics.Tensors, termasuk kerangka kerja target yang didukung. Memperbarui paket dapat memengaruhi aplikasi yang menargetkan versi .NET sebelumnya. API terpisah TensorPrimitives mempertahankan kontrak overlap yang ada.
Versi yang diperkenalkan
.NET 11
Perilaku sebelumnya
CopyTo, FlattenTo, TryCopyTo, dan TryFlattenTo mendokumentasikan dukungan untuk penyimpanan sumber dan tujuan yang tumpang tindih. Metode Try dijelaskan menangani sumber seolah-olah pertama kali disalin ke penyimpanan sementara.
Misalnya, sumber dan tujuan berikut mengacu pada wilayah yang tumpang tindih dari array yang sama:
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);
Kontrak bergaya snapshot yang didokumentasikan menyiratkan bahwa destinasi akan menerima [1, 2, 4, 5]. Hasil aktual untuk tumpang tindih yang tidak didukung dapat bergantung pada tata letak dan urutan traversal; implementasi tidak memenuhi kontrak itu dengan andal.
Konstruktor yang mengambil System.Array tidak secara konsisten memvalidasi apakah jenis elemen array kompatibel dengan T.
Perilaku baru
Contohnya menghasilkan error ArgumentException sebelum menyalin. Tumpang tindih tak didukung yang sama juga menghasilkan exception dari TryCopyTo dan TryFlattenTo ketika pemeriksaan bentuk dan kapasitasnya berhasil.
Dukungan tumpang tindih tetap spesifik untuk tiap operasi:
| Operasi | Overlap yang didukung |
|---|---|
CopyTo dan TryCopyTo |
Sumber dan tujuan padat dengan jumlah elemen yang sama, atau tampilan padat yang persis identik. |
FlattenTo dan TryFlattenTo |
Sumber yang rapat dan rentang target. |
| Operasi elementwise yang menggunakan destination | Tampilan input/output yang identik tanpa pengulangan tampilan lokasi penyimpanan logis. Input siaran dengan tumpang tindih yang digeser dan yang tumpang tindih ditolak. |
Tensor.ResizeTo |
Sumber dan tujuan langsung. Tumpang tindih berstride yang tidak didukung ditolak. |
| Membalik ke tampilan yang sama | Pembalikan in-place yang rapat, atau pembalikan no-op. |
Metode penyalinan Try masih mengembalikan false, tanpa menyalin, ketika buffer tujuan terlalu pendek.
TryCopyTo juga mengembalikan false untuk bentuk yang tidak kompatibel. Tumpang tindih yang tidak didukung adalah tata letak yang tidak valid, bukan kegagalan kapasitas.
Tensor.ResizeTo dan penggabungan ke dalam tujuan yang ada menolak dimensi zero-stride yang berisi lebih dari satu elemen logis. Tujuan kosong dan stride nol dalam dimensi singleton tetap diizinkan.
TensorSpan<T> dan ReadOnlyTensorSpan<T> konstruktor yang menerima System.Array melemparkan ArrayTypeMismatchException untuk jenis elemen array yang tidak kompatibel. Rentang tensor yang dapat ditulis juga menolak array kovarian; rentang tensor baca-saja memungkinkan kovarian pada array tipe referensi yang kompatibel.
Jenis perubahan yang memutus kompatibilitas
Ini adalah perubahan perilaku.
Alasan perubahan
Penyalinan yang benar antara tensor yang tumpang tindih secara arbitrer dapat memerlukan penyimpanan sementara yang proporsional dengan seluruh tensor. Penolakan eksplisit menghindari kerusakan yang bergantung pada traversal tanpa mengalokasikan rekam jepret tensor penuh secara diam-diam.
Lokasi penyimpanan output yang sama tidak dapat mewakili hasil logis yang berbeda. Validasi jenis elemen array mencegah penyimpanan yang tidak sesuai ditafsirkan sebagai T, dan mencegah penulisan melalui penyimpanan array kovarian.
Tindakan yang disarankan
Gunakan penyimpanan output yang tidak tumpang tindih, atau buat snapshot sumber secara eksplisit sebelum melakukan penyalinan yang tumpang tindih. Untuk contoh sebelumnya:
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
Rekam jepret berisi [1, 2, 4, 5]. Untuk operasi elementwise yang menggunakan argumen tujuan, buat snapshot untuk setiap input yang tumpang tindih atau alokasikan hasil terpisah. Ganti tujuan siaran dengan penyimpanan output yang dapat dialamati secara independen.
Untuk rentang tensor yang mencakup System.Array, berikan penyimpanan elemen yang kompatibel. Untuk view yang dapat ditulis, gunakan array yang tidak kovarian, atau salin elemen ke T[] yang baru.
Jangan berasumsi bahwa metode penyalinan Try tidak dapat memunculkan pengecualian.
false Hasil menunjukkan kapasitas yang tidak mencukupi atau, untuk TryCopyTo, bentuk yang tidak kompatibel. Tidak ada sakelar kompatibilitas yang memulihkan perilaku tumpang tindih arbitrer.
API yang Terpengaruh
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.CopyTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.FlattenTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryCopyTo.
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryFlattenTo.
- Metode copy dan flatten yang sesuai pada Tensor<T>, TensorSpan<T>, dan ReadOnlyTensorSpan<T>.
- Metode elementwise dengan argumen output pada Tensor, termasuk operasi unary, biner, dan tensor/skalar.
- System.Numerics.Tensors.Tensor.ResizeTo (semua overload).
- System.Numerics.Tensors.Tensor.Reverse dan System.Numerics.Tensors.Tensor.ReverseDimension (overload yang menerima parameter tujuan).
- System.Numerics.Tensors.Tensor.Concatenate (overload yang menerima parameter tujuan).
-
TensorSpan<T> dan ReadOnlyTensorSpan<T> (dua overload pada setiap jenis yang menerima
System.Array).