File: OnnxruntimeModuleTest.mm

package info (click to toggle)
onnxruntime 1.23.2%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 340,744 kB
  • sloc: cpp: 3,222,135; python: 188,267; ansic: 114,318; asm: 37,927; cs: 36,849; java: 10,962; javascript: 6,811; pascal: 4,126; sh: 2,996; xml: 705; objc: 281; makefile: 67
file content (152 lines) | stat: -rw-r--r-- 5,532 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#import "OnnxruntimeModule.h"
#import "FakeRCTBlobManager.h"
#import "TensorHelper.h"

#import <XCTest/XCTest.h>
#import <onnxruntime/onnxruntime_cxx_api.h>

@interface OnnxruntimeModuleTest : XCTestCase

@end

@implementation OnnxruntimeModuleTest

FakeRCTBlobManager* fakeBlobManager = nil;

+ (void)initialize {
  if (self == [OnnxruntimeModuleTest class]) {
    fakeBlobManager = [FakeRCTBlobManager new];
  }
}

- (void)testOnnxruntimeModule {
  NSBundle* bundle = [NSBundle bundleForClass:[OnnxruntimeModuleTest class]];
  NSString* dataPath = [bundle pathForResource:@"test_types_float" ofType:@"ort"];
  NSString* sessionKey = @"";
  NSString* sessionKey2 = @"";

  OnnxruntimeModule* onnxruntimeModule = [OnnxruntimeModule new];
  [onnxruntimeModule setBlobManager:fakeBlobManager];

  {
    // test loadModelFromBuffer()
    NSMutableDictionary* options = [NSMutableDictionary dictionary];
    NSData* fileData = [NSData dataWithContentsOfFile:dataPath];

    NSDictionary* resultMap = [onnxruntimeModule loadModelFromBuffer:fileData options:options];
    sessionKey = resultMap[@"key"];
    NSArray* inputNames = resultMap[@"inputNames"];
    XCTAssertEqual([inputNames count], 1);
    XCTAssertEqualObjects(inputNames[0], @"input");
    NSArray* outputNames = resultMap[@"outputNames"];
    XCTAssertEqual([outputNames count], 1);
    XCTAssertEqualObjects(outputNames[0], @"output");

    // test loadModel()
    NSDictionary* resultMap2 = [onnxruntimeModule loadModel:dataPath options:options];
    sessionKey2 = resultMap2[@"key"];
    NSArray* inputNames2 = resultMap2[@"inputNames"];
    XCTAssertEqual([inputNames2 count], 1);
    XCTAssertEqualObjects(inputNames2[0], @"input");
    NSArray* outputNames2 = resultMap2[@"outputNames"];
    XCTAssertEqual([outputNames2 count], 1);
    XCTAssertEqualObjects(outputNames2[0], @"output");
  }

  // test run()
  {
    NSMutableDictionary* inputTensorMap = [NSMutableDictionary dictionary];

    // dims
    NSArray* dims = @[ [NSNumber numberWithLong:1], [NSNumber numberWithLong:5] ];
    inputTensorMap[@"dims"] = dims;

    // type
    inputTensorMap[@"type"] = JsTensorTypeFloat;

    // data
    std::array<float, 5> outValues{std::numeric_limits<float>::min(), 1.0f, -2.0f, 3.0f,
                                   std::numeric_limits<float>::max()};

    const NSInteger byteBufferSize = outValues.size() * sizeof(float);
    unsigned char* byteBuffer = static_cast<unsigned char*>(malloc(byteBufferSize));
    NSData* byteBufferRef = [NSData dataWithBytesNoCopy:byteBuffer length:byteBufferSize];
    float* floatPtr = (float*)[byteBufferRef bytes];
    for (NSUInteger i = 0; i < outValues.size(); ++i) {
      *floatPtr++ = outValues[i];
    }
    floatPtr = (float*)[byteBufferRef bytes];

    XCTAssertNotNil(fakeBlobManager);
    inputTensorMap[@"data"] = [fakeBlobManager testCreateData:byteBufferRef];

    NSMutableDictionary* inputDataMap = [NSMutableDictionary dictionary];
    inputDataMap[@"input"] = inputTensorMap;

    NSMutableDictionary* options = [NSMutableDictionary dictionary];

    NSMutableArray* output = [NSMutableArray array];
    [output addObject:@"output"];

    NSDictionary* resultMap = [onnxruntimeModule run:sessionKey input:inputDataMap output:output options:options];
    NSDictionary* resultMap2 = [onnxruntimeModule run:sessionKey2 input:inputDataMap output:output options:options];

    // Compare output & input, but data.blobId is different
    // dims
    XCTAssertTrue([[resultMap objectForKey:@"output"][@"dims"] isEqualToArray:inputTensorMap[@"dims"]]);
    XCTAssertTrue([[resultMap2 objectForKey:@"output"][@"dims"] isEqualToArray:inputTensorMap[@"dims"]]);

    // type
    XCTAssertEqual([resultMap objectForKey:@"output"][@"type"], JsTensorTypeFloat);
    XCTAssertEqual([resultMap2 objectForKey:@"output"][@"type"], JsTensorTypeFloat);

    // data ({ blobId, offset, size })
    XCTAssertEqual([[resultMap objectForKey:@"output"][@"data"][@"offset"] longValue], 0);
    XCTAssertEqual([[resultMap2 objectForKey:@"output"][@"data"][@"size"] longValue], byteBufferSize);
  }

  // test dispose
  {
    [onnxruntimeModule dispose:sessionKey];
    [onnxruntimeModule dispose:sessionKey2];
  }
}

- (void)testOnnxruntimeModule_AppendCoreml {
  NSBundle* bundle = [NSBundle bundleForClass:[OnnxruntimeModuleTest class]];
  NSString* dataPath = [bundle pathForResource:@"test_types_float" ofType:@"ort"];
  NSString* sessionKey = @"";

  OnnxruntimeModule* onnxruntimeModule = [OnnxruntimeModule new];
  [onnxruntimeModule setBlobManager:fakeBlobManager];

  {
    // test loadModel() with coreml options
    NSMutableDictionary* options = [NSMutableDictionary dictionary];

    // register coreml ep options
    NSMutableArray* epList = [NSMutableArray array];
    [epList addObject:@"coreml"];
    NSArray* immutableEpList = [NSArray arrayWithArray:epList];
    [options setObject:immutableEpList forKey:@"executionProviders"];

    NSDictionary* resultMap = [onnxruntimeModule loadModel:dataPath options:options];

    sessionKey = resultMap[@"key"];
    NSArray* inputNames = resultMap[@"inputNames"];
    XCTAssertEqual([inputNames count], 1);
    XCTAssertEqualObjects(inputNames[0], @"input");
    NSArray* outputNames = resultMap[@"outputNames"];
    XCTAssertEqual([outputNames count], 1);
    XCTAssertEqualObjects(outputNames[0], @"output");
  }

  {
    [onnxruntimeModule dispose:sessionKey];
  }
}

@end