Skip to content

Commit e5d2791

Browse files
shoumikhinfacebook-github-bot
authored andcommitted
Tensor constructor to create with an existing NSData.
Summary: #8366 Reviewed By: mergennachin Differential Revision: D71929159
1 parent fa67bde commit e5d2791

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

extension/apple/ExecuTorch/Exported/ExecuTorchTensor.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,4 +345,28 @@ __attribute__((deprecated("This API is experimental.")))
345345

346346
@end
347347

348+
#pragma mark - Data Category
349+
350+
@interface ExecuTorchTensor (Data)
351+
352+
/**
353+
* Initializes a tensor using an NSData object as the underlying data buffer.
354+
*
355+
* @param data An NSData object containing the tensor data.
356+
* @param shape An NSArray of NSNumber objects representing the tensor's shape.
357+
* @param strides An NSArray of NSNumber objects representing the tensor's strides.
358+
* @param dimensionOrder An NSArray of NSNumber objects indicating the order of dimensions.
359+
* @param dataType An ExecuTorchDataType value specifying the element type.
360+
* @param shapeDynamism An ExecuTorchShapeDynamism value indicating the shape dynamism.
361+
* @return An initialized ExecuTorchTensor instance using the provided data.
362+
*/
363+
- (instancetype)initWithData:(NSData *)data
364+
shape:(NSArray<NSNumber *> *)shape
365+
strides:(NSArray<NSNumber *> *)strides
366+
dimensionOrder:(NSArray<NSNumber *> *)dimensionOrder
367+
dataType:(ExecuTorchDataType)dataType
368+
shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism;
369+
370+
@end
371+
348372
NS_ASSUME_NONNULL_END

extension/apple/ExecuTorch/Exported/ExecuTorchTensor.mm

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ NSInteger ExecuTorchElementCountOfShape(NSArray<NSNumber *> *shape) {
3131

3232
@implementation ExecuTorchTensor {
3333
TensorPtr _tensor;
34+
NSData *_data;
3435
NSArray<NSNumber *> *_shape;
3536
NSArray<NSNumber *> *_strides;
3637
NSArray<NSNumber *> *_dimensionOrder;
@@ -274,3 +275,27 @@ - (instancetype)initWithBytes:(const void *)pointer
274275
}
275276

276277
@end
278+
279+
@implementation ExecuTorchTensor (Data)
280+
281+
- (instancetype)initWithData:(NSData *)data
282+
shape:(NSArray<NSNumber *> *)shape
283+
strides:(NSArray<NSNumber *> *)strides
284+
dimensionOrder:(NSArray<NSNumber *> *)dimensionOrder
285+
dataType:(ExecuTorchDataType)dataType
286+
shapeDynamism:(ExecuTorchShapeDynamism)shapeDynamism {
287+
ET_CHECK_MSG(data.length >= ExecuTorchElementCountOfShape(shape) * ExecuTorchSizeOfDataType(dataType),
288+
"Data length is too small");
289+
self = [self initWithBytesNoCopy:(void *)data.bytes
290+
shape:shape
291+
strides:strides
292+
dimensionOrder:dimensionOrder
293+
dataType:dataType
294+
shapeDynamism:shapeDynamism];
295+
if (self) {
296+
_data = data;
297+
}
298+
return self;
299+
}
300+
301+
@end

extension/apple/ExecuTorch/__tests__/TensorTest.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,16 @@ class TensorTest: XCTestCase {
101101
}
102102
}
103103

104+
func testInitData() {
105+
let dataArray: [Float] = [1.0, 2.0, 3.0, 4.0]
106+
let data = Data(bytes: dataArray, count: dataArray.count * MemoryLayout<Float>.size)
107+
let tensor = Tensor(data: data, shape: [4], strides: [1], dimensionOrder: [0], dataType: .float, shapeDynamism: .static)
108+
XCTAssertEqual(tensor.count, 4)
109+
tensor.bytes { pointer, count, dataType in
110+
XCTAssertEqual(Array(UnsafeBufferPointer(start: pointer.assumingMemoryBound(to: Float.self), count: count)), dataArray)
111+
}
112+
}
113+
104114
func testWithCustomStridesAndDimensionOrder() {
105115
let data: [Float] = [1.0, 2.0, 3.0, 4.0]
106116
let tensor = Tensor(

0 commit comments

Comments
 (0)