diff --git a/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.h b/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.h index 28c58580628..9569e96e039 100644 --- a/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.h +++ b/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.h @@ -434,6 +434,114 @@ __attribute__((deprecated("This API is experimental."))) shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism NS_SWIFT_NAME(init(_:shape:strides:dimensionOrder:dataType:shapeDynamism:)); +/** + * Initializes a tensor with an array of scalar values, specifying shape, strides, dimension order, and data type, + * using a default dynamic bound shape for shape dynamism. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param shape An NSArray of NSNumber objects representing the desired tensor shape. + * @param strides An NSArray of NSNumber objects representing the tensor strides. + * @param dimensionOrder An NSArray of NSNumber objects indicating the order of dimensions. + * @param dataType An ExecuTorchDataType value specifying the element type. + * @return An initialized ExecuTorchTensor instance containing the scalar values. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + strides:(NSArray *)strides + dimensionOrder:(NSArray *)dimensionOrder + dataType:(ExecuTorchDataType)dataType + NS_SWIFT_NAME(init(_:shape:strides:dimensionOrder:dataType:)); + +/** + * Initializes a tensor with an array of scalar values, specifying the desired shape, data type, and explicit shape dynamism. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param shape An NSArray of NSNumber objects representing the desired tensor shape. + * @param dataType An ExecuTorchDataType value specifying the element type. + * @param shapeDynamism An ExecuTorchShapeDynamism value indicating the shape dynamism. + * @return An initialized ExecuTorchTensor instance. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + dataType:(ExecuTorchDataType)dataType + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism + NS_SWIFT_NAME(init(_:shape:dataType:shapeDynamism:)); + +/** + * Initializes a tensor with an array of scalar values and a specified shape, + * using a default dynamic bound shape for shape dynamism. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param shape An NSArray of NSNumber objects representing the desired tensor shape. + * @param dataType An ExecuTorchDataType value specifying the element type. + * @return An initialized ExecuTorchTensor instance. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + dataType:(ExecuTorchDataType)dataType + NS_SWIFT_NAME(init(_:shape:dataType:)); + +/** + * Initializes a tensor with an array of scalar values, specifying the tensor data type and explicit shape dynamism. + * The shape is deduced from the count of the scalar array. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param dataType An ExecuTorchDataType value specifying the element type. + * @param shapeDynamism An ExecuTorchShapeDynamism value indicating the shape dynamism. + * @return An initialized ExecuTorchTensor instance with the shape deduced from the scalar count. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + dataType:(ExecuTorchDataType)dataType + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism + NS_SWIFT_NAME(init(_:dataType:shapeDynamism:)); + +/** + * Initializes a tensor with an array of scalar values, specifying the tensor data type. + * The shape is deduced from the count of the scalar array. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param dataType An ExecuTorchDataType value specifying the element type. + * @return An initialized ExecuTorchTensor instance with the shape deduced from the scalar count. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + dataType:(ExecuTorchDataType)dataType + NS_SWIFT_NAME(init(_:dataType:)); + +/** + * Initializes a tensor with an array of scalar values, a specified shape and explicit shape dynamism. + * The data type is automatically deduced from the first element of the array. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param shape An NSArray of NSNumber objects representing the desired tensor shape. + * @param shapeDynamism An ExecuTorchShapeDynamism value indicating the shape dynamism. + * @return An initialized ExecuTorchTensor instance. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism + NS_SWIFT_NAME(init(_:shape:shapeDynamism:)); + +/** + * Initializes a tensor with an array of scalar values and a specified shape. + * The data type is automatically deduced from the first element of the array. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @param shape An NSArray of NSNumber objects representing the desired tensor shape. + * @return An initialized ExecuTorchTensor instance. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + NS_SWIFT_NAME(init(_:shape:)); + +/** + * Initializes a tensor with an array of scalar values, automatically deducing the tensor shape and data type. + * + * @param scalars An NSArray of NSNumber objects representing the scalar values. + * @return An initialized ExecuTorchTensor instance with shape and data type deduced. + */ +- (instancetype)initWithScalars:(NSArray *)scalars + NS_SWIFT_NAME(init(_:)); + @end NS_ASSUME_NONNULL_END diff --git a/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm b/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm index e1bc522fbd0..c5b16a1982e 100644 --- a/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm +++ b/extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm @@ -367,4 +367,91 @@ - (instancetype)initWithScalars:(NSArray *)scalars return [self initWithNativeInstance:&tensor]; } +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + strides:(NSArray *)strides + dimensionOrder:(NSArray *)dimensionOrder + dataType:(ExecuTorchDataType)dataType { + return [self initWithScalars:scalars + shape:shape + strides:strides + dimensionOrder:dimensionOrder + dataType:dataType + shapeDynamism:ExecuTorchShapeDynamismDynamicBound]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + dataType:(ExecuTorchDataType)dataType + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism { + return [self initWithScalars:scalars + shape:shape + strides:@[] + dimensionOrder:@[] + dataType:dataType + shapeDynamism:shapeDynamism]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + dataType:(ExecuTorchDataType)dataType { + return [self initWithScalars:scalars + shape:shape + strides:@[] + dimensionOrder:@[] + dataType:dataType + shapeDynamism:ExecuTorchShapeDynamismDynamicBound]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + dataType:(ExecuTorchDataType)dataType + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism { + return [self initWithScalars:scalars + shape:@[@(scalars.count)] + strides:@[] + dimensionOrder:@[] + dataType:dataType + shapeDynamism:shapeDynamism]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + dataType:(ExecuTorchDataType)dataType { + return [self initWithScalars:scalars + shape:@[@(scalars.count)] + strides:@[] + dimensionOrder:@[] + dataType:dataType + shapeDynamism:ExecuTorchShapeDynamismDynamicBound]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape + shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism { + return [self initWithScalars:scalars + shape:shape + strides:@[] + dimensionOrder:@[] + dataType:static_cast(utils::deduceType(scalars.firstObject)) + shapeDynamism:shapeDynamism]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars + shape:(NSArray *)shape { + return [self initWithScalars:scalars + shape:shape + strides:@[] + dimensionOrder:@[] + dataType:static_cast(utils::deduceType(scalars.firstObject)) + shapeDynamism:ExecuTorchShapeDynamismDynamicBound]; +} + +- (instancetype)initWithScalars:(NSArray *)scalars { + return [self initWithScalars:scalars + shape:@[@(scalars.count)] + strides:@[] + dimensionOrder:@[] + dataType:static_cast(utils::deduceType(scalars.firstObject)) + shapeDynamism:ExecuTorchShapeDynamismDynamicBound]; +} + @end diff --git a/extension/apple/ExecuTorch/__tests__/TensorTest.swift b/extension/apple/ExecuTorch/__tests__/TensorTest.swift index 69f20a03348..9d540bfa1a4 100644 --- a/extension/apple/ExecuTorch/__tests__/TensorTest.swift +++ b/extension/apple/ExecuTorch/__tests__/TensorTest.swift @@ -225,12 +225,12 @@ class TensorTest: XCTestCase { } func testInitScalarsFloat() { - let data: [Float] = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] - let tensor = Tensor(data.map(NSNumber.init), shape: [2, 3], strides: [3, 1], dimensionOrder: [0, 1], dataType: .float, shapeDynamism: .dynamicBound) + let data: [Float] = [1, 2, 3, 4, 5, 6] + let tensor = Tensor(data.map(NSNumber.init)) XCTAssertEqual(tensor.dataType, .float) - XCTAssertEqual(tensor.shape, [2, 3]) - XCTAssertEqual(tensor.strides, [3, 1]) - XCTAssertEqual(tensor.dimensionOrder, [0, 1]) + XCTAssertEqual(tensor.shape, [6]) + XCTAssertEqual(tensor.strides, [1]) + XCTAssertEqual(tensor.dimensionOrder, [0]) XCTAssertEqual(tensor.count, 6) tensor.bytes { pointer, count, dataType in XCTAssertEqual(Array(UnsafeBufferPointer(start: pointer.assumingMemoryBound(to: Float.self), count: count)), data)