From bda5145c378b298ae23a998a9a4bf4d8a8b0a4fc Mon Sep 17 00:00:00 2001 From: Anthony Shoumikhin Date: Sun, 3 Aug 2025 22:54:55 -0700 Subject: [PATCH] Make Tensor data accessors non-throwing. Summary: . Reviewed By: kirklandsign Differential Revision: D79381680 --- docs/source/using-executorch-ios.md | 8 +- .../Exported/ExecuTorch+Tensor.swift | 39 ++-- .../ExecuTorch/__tests__/TensorTest.swift | 188 +++++++++--------- 3 files changed, 114 insertions(+), 121 deletions(-) diff --git a/docs/source/using-executorch-ios.md b/docs/source/using-executorch-ios.md index 9b39f8f1e96..3e01f0d4688 100644 --- a/docs/source/using-executorch-ios.md +++ b/docs/source/using-executorch-ios.md @@ -246,7 +246,7 @@ let inputTensor = Tensor(&imageBuffer, shape: [1, 3, 224, 224]) let outputTensor: Tensor = try module.forward(inputTensor)[0].tensor()! // Copy the tensor data into logits array for easier access. -let logits = try outputTensor.scalars() +let logits = outputTensor.scalars() // Use logits... ``` @@ -444,11 +444,11 @@ Swift: let tensor = Tensor([1.0, 2.0, 3.0, 4.0], shape: [2, 2]) // Get data copy as a Swift array. -let scalars = try tensor.scalars() +let scalars = tensor.scalars() print("All scalars: \(scalars)") // [1.0, 2.0, 3.0, 4.0] // Access data via a buffer pointer. -try tensor.withUnsafeBytes { buffer in +tensor.withUnsafeBytes { buffer in print("First float element: \(buffer.first ?? 0.0)") } @@ -482,7 +482,7 @@ Swift: let tensor = Tensor([1.0, 2.0, 3.0, 4.0], shape: [2, 2]) // Modify the tensor's data in place. -try tensor.withUnsafeMutableBytes { buffer in +tensor.withUnsafeMutableBytes { buffer in buffer[1] = 200.0 } // tensor's data is now [1.0, 200.0, 3.0, 4.0] diff --git a/extension/apple/ExecuTorch/Exported/ExecuTorch+Tensor.swift b/extension/apple/ExecuTorch/Exported/ExecuTorch+Tensor.swift index 9dc68858054..06637054b5a 100644 --- a/extension/apple/ExecuTorch/Exported/ExecuTorch+Tensor.swift +++ b/extension/apple/ExecuTorch/Exported/ExecuTorch+Tensor.swift @@ -770,17 +770,14 @@ public final class Tensor: Equatable { /// - Parameter body: A closure that receives an `UnsafeBufferPointer` bound to the tensor’s data. /// - Returns: The value returned by `body`. /// - Throws: Any error thrown by `body`. - public func withUnsafeBytes(_ body: (UnsafeBufferPointer) throws -> R) throws -> R { - var result: Result? - anyTensor.bytes { pointer, count, _ in - result = Result { try body( - UnsafeBufferPointer( - start: pointer.assumingMemoryBound(to: T.self), - count: count - ) - ) } + public func withUnsafeBytes(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { + try withoutActuallyEscaping(body) { body in + var result: Result? + anyTensor.bytes { pointer, count, _ in + result = Result { try body(UnsafeBufferPointer(start: pointer.assumingMemoryBound(to: T.self), count: count)) } + } + return try result!.get() } - return try result!.get() } /// Calls the closure with a typed, mutable buffer pointer over the tensor’s elements. @@ -788,17 +785,14 @@ public final class Tensor: Equatable { /// - Parameter body: A closure that receives an `UnsafeMutableBufferPointer` bound to the tensor’s data. /// - Returns: The value returned by `body`. /// - Throws: Any error thrown by `body`. - public func withUnsafeMutableBytes(_ body: (UnsafeMutableBufferPointer) throws -> R) throws -> R { - var result: Result? - anyTensor.mutableBytes { pointer, count, _ in - result = Result { try body( - UnsafeMutableBufferPointer( - start: pointer.assumingMemoryBound(to: T.self), - count: count - ) - ) } + public func withUnsafeMutableBytes(_ body: (UnsafeMutableBufferPointer) throws -> R) rethrows -> R { + try withoutActuallyEscaping(body) { body in + var result: Result? + anyTensor.mutableBytes { pointer, count, _ in + result = Result { try body(UnsafeMutableBufferPointer(start: pointer.assumingMemoryBound(to: T.self), count: count)) } + } + return try result!.get() } - return try result!.get() } /// Resizes the tensor to a new shape. @@ -830,9 +824,8 @@ public extension Tensor { /// Returns the tensor's elements as an array of scalars. /// /// - Returns: An array of scalars of type `T`. - /// - Throws: An error if the underlying data cannot be accessed. - func scalars() throws -> [T] { - try withUnsafeBytes { Array($0) } + func scalars() -> [T] { + withUnsafeBytes { Array($0) } } } diff --git a/extension/apple/ExecuTorch/__tests__/TensorTest.swift b/extension/apple/ExecuTorch/__tests__/TensorTest.swift index 407a9ee03e7..52cd3421d6b 100644 --- a/extension/apple/ExecuTorch/__tests__/TensorTest.swift +++ b/extension/apple/ExecuTorch/__tests__/TensorTest.swift @@ -68,7 +68,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.dimensionOrder, [0, 1]) XCTAssertEqual(tensor.shapeDynamism, .dynamicBound) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitBytes() { @@ -85,7 +85,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.dimensionOrder, [0, 1]) XCTAssertEqual(tensor.shapeDynamism, .dynamicBound) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars().map { $0 + 1 }, data) + XCTAssertEqual(tensor.scalars().map { $0 + 1 }, data) } func testInitData() { @@ -93,7 +93,7 @@ class TensorTest: XCTestCase { let data = Data(bytes: dataArray, count: dataArray.count * MemoryLayout.size) let tensor = Tensor(data: data, shape: [4]) XCTAssertEqual(tensor.count, 4) - XCTAssertEqual(try tensor.scalars(), dataArray) + XCTAssertEqual(tensor.scalars(), dataArray) } func testWithCustomStridesAndDimensionOrder() { @@ -108,7 +108,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1, 2]) XCTAssertEqual(tensor.dimensionOrder, [1, 0]) XCTAssertEqual(tensor.count, 4) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testMutableBytes() { @@ -116,12 +116,12 @@ class TensorTest: XCTestCase { let tensor = data.withUnsafeMutableBytes { Tensor(bytes: $0.baseAddress!, shape: [4]) } - XCTAssertNoThrow(try tensor.withUnsafeMutableBytes { buffer in + tensor.withUnsafeMutableBytes { buffer in for i in buffer.indices { buffer[i] *= 2 } - }) - XCTAssertEqual(try tensor.scalars(), data.map { $0 * 2 }) + } + XCTAssertEqual(tensor.scalars(), data.map { $0 * 2 }) } func testInitWithTensor() throws { @@ -137,14 +137,14 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor2.dimensionOrder, tensor1.dimensionOrder) XCTAssertEqual(tensor2.count, tensor1.count) XCTAssertEqual( - try tensor1.withUnsafeMutableBytes { UnsafeMutableRawPointer($0.baseAddress!) }, - try tensor2.withUnsafeMutableBytes { UnsafeMutableRawPointer($0.baseAddress!) } + tensor1.withUnsafeMutableBytes { UnsafeMutableRawPointer($0.baseAddress!) }, + tensor2.withUnsafeMutableBytes { UnsafeMutableRawPointer($0.baseAddress!) } ) // Modify the original data to make sure the tensor does not copy the data. data.indices.forEach { data[$0] += 1 } - XCTAssertEqual(try tensor1.scalars(), try tensor2.scalars()) + XCTAssertEqual(tensor1.scalars(), tensor2.scalars()) try tensor2.resize(to: [4, 1]) XCTAssertEqual(tensor2.shape, [4, 1]) @@ -180,7 +180,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [2, 1]) XCTAssertEqual(tensor.dimensionOrder, [0, 1]) XCTAssertEqual(tensor.count, 4) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testResizeError() { @@ -233,7 +233,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.shapeDynamism, .static) XCTAssertEqual(tensor.count, 4) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyUInt8() { @@ -244,9 +244,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsUInt8() { @@ -257,7 +257,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyInt8() { @@ -268,9 +268,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsInt8() { @@ -281,7 +281,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyInt16() { @@ -292,9 +292,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsInt16() { @@ -305,7 +305,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyInt32() { @@ -316,9 +316,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsInt32() { @@ -329,7 +329,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyInt64() { @@ -340,9 +340,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsInt64() { @@ -353,7 +353,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyFloat() { @@ -364,9 +364,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsFloat() { @@ -377,7 +377,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyDouble() { @@ -388,9 +388,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsDouble() { @@ -401,7 +401,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyBool() { @@ -412,9 +412,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = false - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsBool() { @@ -425,7 +425,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyUInt16() { @@ -436,9 +436,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsUInt16() { @@ -449,7 +449,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyUInt32() { @@ -460,9 +460,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsUInt32() { @@ -473,7 +473,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyUInt64() { @@ -484,9 +484,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsUInt64() { @@ -497,7 +497,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyInt() { @@ -508,9 +508,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsInt() { @@ -521,7 +521,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsNoCopyUInt() { @@ -532,9 +532,9 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) data[2] = 42 - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitScalarsUInt() { @@ -545,7 +545,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, [1]) XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) - XCTAssertEqual(try tensor.scalars(), data) + XCTAssertEqual(tensor.scalars(), data) } func testInitInt8() { @@ -555,7 +555,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitInt16() { @@ -565,7 +565,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitInt32() { @@ -575,7 +575,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitInt64() { @@ -585,7 +585,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitUInt8() { @@ -595,7 +595,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitUInt16() { @@ -605,7 +605,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitUInt32() { @@ -615,7 +615,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitUInt64() { @@ -625,7 +625,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitBool() { @@ -635,7 +635,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, true) + XCTAssertEqual(tensor.scalars().first, true) } func testInitFloat() { @@ -645,7 +645,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitDouble() { @@ -655,7 +655,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitInt() { @@ -665,7 +665,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testInitUInt() { @@ -675,7 +675,7 @@ class TensorTest: XCTestCase { XCTAssertEqual(tensor.strides, []) XCTAssertEqual(tensor.dimensionOrder, []) XCTAssertEqual(tensor.count, 1) - XCTAssertEqual(try tensor.scalars().first, 42) + XCTAssertEqual(tensor.scalars().first, 42) } func testExtractAnyTensorMatchesOriginalDataAndMetadata() { @@ -711,20 +711,20 @@ class TensorTest: XCTestCase { let tensor = Tensor(&scalars, shape: [2, 2]) let viewTensor = Tensor(tensor) let scalarsAddress = scalars.withUnsafeBufferPointer { $0.baseAddress } - let tensorDataAddress = try tensor.withUnsafeBytes { $0.baseAddress } - let viewTensorDataAddress = try viewTensor.withUnsafeBytes { $0.baseAddress } + let tensorDataAddress = tensor.withUnsafeBytes { $0.baseAddress } + let viewTensorDataAddress = viewTensor.withUnsafeBytes { $0.baseAddress } XCTAssertEqual(tensorDataAddress, scalarsAddress) XCTAssertEqual(tensorDataAddress, viewTensorDataAddress) scalars[2] = 42 - XCTAssertEqual(try tensor.scalars(), scalars) - XCTAssertEqual(try viewTensor.scalars(), scalars) + XCTAssertEqual(tensor.scalars(), scalars) + XCTAssertEqual(viewTensor.scalars(), scalars) XCTAssertNoThrow(try viewTensor.resize(to: [4, 1])) XCTAssertEqual(viewTensor.shape, [4, 1]) XCTAssertEqual(tensor.shape, [2, 2]) - XCTAssertEqual(try tensor.scalars(), scalars) - XCTAssertEqual(try viewTensor.scalars(), scalars) + XCTAssertEqual(tensor.scalars(), scalars) + XCTAssertEqual(viewTensor.scalars(), scalars) } func testMultipleGenericFromAnyReflectChanges() { @@ -734,19 +734,19 @@ class TensorTest: XCTestCase { let tensor2: Tensor = anyTensor.asTensor()! XCTAssertEqual(tensor1, tensor2) - XCTAssertNoThrow(try tensor1.withUnsafeMutableBytes { $0[1] = 42 }) - XCTAssertEqual(try tensor2.withUnsafeBytes { $0[1] }, 42) + tensor1.withUnsafeMutableBytes { $0[1] = 42 } + XCTAssertEqual(tensor2.withUnsafeBytes { $0[1] }, 42) } func testEmpty() { let tensor = Tensor.empty(shape: [3, 4]) XCTAssertEqual(tensor.shape, [3, 4]) XCTAssertEqual(tensor.count, 12) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in XCTAssertNotNil(buffer.baseAddress) XCTAssertEqual(buffer.count, 12) XCTAssertEqual(tensor.dataType, .float) - }) + } } func testEmptyLike() { @@ -762,76 +762,76 @@ class TensorTest: XCTestCase { let tensor = Tensor.full(shape: [2, 2], scalar: 7) XCTAssertEqual(tensor.shape, [2, 2]) XCTAssertEqual(tensor.count, 4) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 7) } - }) + } } func testFullLike() { let other = Tensor.empty(shape: [2, 2]) let tensor = Tensor.full(like: other, scalar: 42) XCTAssertEqual(tensor.shape, other.shape) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 42.0) } - }) + } } func testOnes() { let tensor = Tensor.ones(shape: [2, 3]) XCTAssertEqual(tensor.shape, [2, 3]) XCTAssertEqual(tensor.count, 6) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 1.0) } - }) + } } func testOnesLike() { let other = Tensor.empty(shape: [2, 4]) let tensor = Tensor.ones(like: other) XCTAssertEqual(tensor.shape, other.shape) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 1.0) } - }) + } } func testZeros() { let tensor = Tensor.zeros(shape: [2, 3]) XCTAssertEqual(tensor.shape, [2, 3]) XCTAssertEqual(tensor.count, 6) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 0) } - }) + } } func testZerosLike() { let other = Tensor.full(shape: [3, 2], scalar: 9) let tensor = Tensor.zeros(like: other) XCTAssertEqual(tensor.shape, other.shape) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertEqual(value, 0) } - }) + } } func testRandom() { let tensor = Tensor.rand(shape: [3, 3]) XCTAssertEqual(tensor.shape, [3, 3]) XCTAssertEqual(tensor.count, 9) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in let uniqueValues = Set(buffer) XCTAssertTrue(uniqueValues.count > 1) - }) + } } func testRandomLike() { @@ -845,9 +845,9 @@ class TensorTest: XCTestCase { let tensor = Tensor.randn(shape: [4]) XCTAssertEqual(tensor.shape, [4]) XCTAssertEqual(tensor.count, 4) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in XCTAssertEqual(buffer.count, 4) - }) + } } func testRandomNormalLike() { @@ -861,20 +861,20 @@ class TensorTest: XCTestCase { let tensor = Tensor.randint(low: 10, high: 20, shape: [5]) XCTAssertEqual(tensor.shape, [5]) XCTAssertEqual(tensor.count, 5) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertTrue(value >= 10 && value < 20) } - }) + } } func testRandomIntegerLike() { let other = Tensor.ones(shape: [5]) let tensor = Tensor.randint(like: other, low: 100, high: 200) - XCTAssertNoThrow(try tensor.withUnsafeBytes { buffer in + tensor.withUnsafeBytes { buffer in for value in buffer { XCTAssertTrue(value >= 100 && value < 200) } - }) + } } }