1 // clang-format off
2 // Generated file (from: bbox_graph.mod.py). Do not edit
3 // Create the model
createTestModel_zero_sized()4 Model createTestModel_zero_sized() {
5     const std::vector<Operand> operands = {
6         {
7             .type = OperandType::TENSOR_FLOAT32,
8             .dimensions = {1, 1, 1, 1},
9             .numberOfConsumers = 1,
10             .scale = 0.0f,
11             .zeroPoint = 0,
12             .lifetime = OperandLifeTime::MODEL_INPUT,
13             .location = {.poolIndex = 0, .offset = 0, .length = 0},
14         },
15         {
16             .type = OperandType::TENSOR_FLOAT32,
17             .dimensions = {1, 1, 1, 4},
18             .numberOfConsumers = 1,
19             .scale = 0.0f,
20             .zeroPoint = 0,
21             .lifetime = OperandLifeTime::MODEL_INPUT,
22             .location = {.poolIndex = 0, .offset = 0, .length = 0},
23         },
24         {
25             .type = OperandType::TENSOR_FLOAT32,
26             .dimensions = {1, 4},
27             .numberOfConsumers = 1,
28             .scale = 0.0f,
29             .zeroPoint = 0,
30             .lifetime = OperandLifeTime::MODEL_INPUT,
31             .location = {.poolIndex = 0, .offset = 0, .length = 0},
32         },
33         {
34             .type = OperandType::TENSOR_FLOAT32,
35             .dimensions = {1, 2},
36             .numberOfConsumers = 2,
37             .scale = 0.0f,
38             .zeroPoint = 0,
39             .lifetime = OperandLifeTime::MODEL_INPUT,
40             .location = {.poolIndex = 0, .offset = 0, .length = 0},
41         },
42         {
43             .type = OperandType::FLOAT32,
44             .dimensions = {},
45             .numberOfConsumers = 1,
46             .scale = 0.0f,
47             .zeroPoint = 0,
48             .lifetime = OperandLifeTime::CONSTANT_COPY,
49             .location = {.poolIndex = 0, .offset = 0, .length = 4},
50         },
51         {
52             .type = OperandType::FLOAT32,
53             .dimensions = {},
54             .numberOfConsumers = 1,
55             .scale = 0.0f,
56             .zeroPoint = 0,
57             .lifetime = OperandLifeTime::CONSTANT_COPY,
58             .location = {.poolIndex = 0, .offset = 4, .length = 4},
59         },
60         {
61             .type = OperandType::INT32,
62             .dimensions = {},
63             .numberOfConsumers = 1,
64             .scale = 0.0f,
65             .zeroPoint = 0,
66             .lifetime = OperandLifeTime::CONSTANT_COPY,
67             .location = {.poolIndex = 0, .offset = 8, .length = 4},
68         },
69         {
70             .type = OperandType::INT32,
71             .dimensions = {},
72             .numberOfConsumers = 1,
73             .scale = 0.0f,
74             .zeroPoint = 0,
75             .lifetime = OperandLifeTime::CONSTANT_COPY,
76             .location = {.poolIndex = 0, .offset = 12, .length = 4},
77         },
78         {
79             .type = OperandType::FLOAT32,
80             .dimensions = {},
81             .numberOfConsumers = 1,
82             .scale = 0.0f,
83             .zeroPoint = 0,
84             .lifetime = OperandLifeTime::CONSTANT_COPY,
85             .location = {.poolIndex = 0, .offset = 16, .length = 4},
86         },
87         {
88             .type = OperandType::FLOAT32,
89             .dimensions = {},
90             .numberOfConsumers = 1,
91             .scale = 0.0f,
92             .zeroPoint = 0,
93             .lifetime = OperandLifeTime::CONSTANT_COPY,
94             .location = {.poolIndex = 0, .offset = 20, .length = 4},
95         },
96         {
97             .type = OperandType::BOOL,
98             .dimensions = {},
99             .numberOfConsumers = 2,
100             .scale = 0.0f,
101             .zeroPoint = 0,
102             .lifetime = OperandLifeTime::CONSTANT_COPY,
103             .location = {.poolIndex = 0, .offset = 24, .length = 1},
104         },
105         {
106             .type = OperandType::TENSOR_FLOAT32,
107             .dimensions = {0},
108             .numberOfConsumers = 0,
109             .scale = 0.0f,
110             .zeroPoint = 0,
111             .lifetime = OperandLifeTime::MODEL_OUTPUT,
112             .location = {.poolIndex = 0, .offset = 0, .length = 0},
113         },
114         {
115             .type = OperandType::TENSOR_FLOAT32,
116             .dimensions = {0, 4},
117             .numberOfConsumers = 2,
118             .scale = 0.0f,
119             .zeroPoint = 0,
120             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
121             .location = {.poolIndex = 0, .offset = 0, .length = 0},
122         },
123         {
124             .type = OperandType::TENSOR_INT32,
125             .dimensions = {0},
126             .numberOfConsumers = 3,
127             .scale = 0.0f,
128             .zeroPoint = 0,
129             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
130             .location = {.poolIndex = 0, .offset = 0, .length = 0},
131         },
132         {
133             .type = OperandType::TENSOR_FLOAT32,
134             .dimensions = {1, 1, 1, 1},
135             .numberOfConsumers = 1,
136             .scale = 0.0f,
137             .zeroPoint = 0,
138             .lifetime = OperandLifeTime::MODEL_INPUT,
139             .location = {.poolIndex = 0, .offset = 0, .length = 0},
140         },
141         {
142             .type = OperandType::INT32,
143             .dimensions = {},
144             .numberOfConsumers = 1,
145             .scale = 0.0f,
146             .zeroPoint = 0,
147             .lifetime = OperandLifeTime::CONSTANT_COPY,
148             .location = {.poolIndex = 0, .offset = 25, .length = 4},
149         },
150         {
151             .type = OperandType::INT32,
152             .dimensions = {},
153             .numberOfConsumers = 1,
154             .scale = 0.0f,
155             .zeroPoint = 0,
156             .lifetime = OperandLifeTime::CONSTANT_COPY,
157             .location = {.poolIndex = 0, .offset = 29, .length = 4},
158         },
159         {
160             .type = OperandType::FLOAT32,
161             .dimensions = {},
162             .numberOfConsumers = 1,
163             .scale = 0.0f,
164             .zeroPoint = 0,
165             .lifetime = OperandLifeTime::CONSTANT_COPY,
166             .location = {.poolIndex = 0, .offset = 33, .length = 4},
167         },
168         {
169             .type = OperandType::FLOAT32,
170             .dimensions = {},
171             .numberOfConsumers = 1,
172             .scale = 0.0f,
173             .zeroPoint = 0,
174             .lifetime = OperandLifeTime::CONSTANT_COPY,
175             .location = {.poolIndex = 0, .offset = 37, .length = 4},
176         },
177         {
178             .type = OperandType::INT32,
179             .dimensions = {},
180             .numberOfConsumers = 1,
181             .scale = 0.0f,
182             .zeroPoint = 0,
183             .lifetime = OperandLifeTime::CONSTANT_COPY,
184             .location = {.poolIndex = 0, .offset = 41, .length = 4},
185         },
186         {
187             .type = OperandType::INT32,
188             .dimensions = {},
189             .numberOfConsumers = 1,
190             .scale = 0.0f,
191             .zeroPoint = 0,
192             .lifetime = OperandLifeTime::CONSTANT_COPY,
193             .location = {.poolIndex = 0, .offset = 45, .length = 4},
194         },
195         {
196             .type = OperandType::TENSOR_FLOAT32,
197             .dimensions = {0, 2, 2, 1},
198             .numberOfConsumers = 2,
199             .scale = 0.0f,
200             .zeroPoint = 0,
201             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
202             .location = {.poolIndex = 0, .offset = 0, .length = 0},
203         },
204         {
205             .type = OperandType::TENSOR_FLOAT32,
206             .dimensions = {8, 4},
207             .numberOfConsumers = 1,
208             .scale = 0.0f,
209             .zeroPoint = 0,
210             .lifetime = OperandLifeTime::CONSTANT_COPY,
211             .location = {.poolIndex = 0, .offset = 49, .length = 128},
212         },
213         {
214             .type = OperandType::TENSOR_FLOAT32,
215             .dimensions = {8},
216             .numberOfConsumers = 1,
217             .scale = 0.0f,
218             .zeroPoint = 0,
219             .lifetime = OperandLifeTime::CONSTANT_COPY,
220             .location = {.poolIndex = 0, .offset = 177, .length = 32},
221         },
222         {
223             .type = OperandType::INT32,
224             .dimensions = {},
225             .numberOfConsumers = 1,
226             .scale = 0.0f,
227             .zeroPoint = 0,
228             .lifetime = OperandLifeTime::CONSTANT_COPY,
229             .location = {.poolIndex = 0, .offset = 209, .length = 4},
230         },
231         {
232             .type = OperandType::TENSOR_FLOAT32,
233             .dimensions = {0, 8},
234             .numberOfConsumers = 1,
235             .scale = 0.0f,
236             .zeroPoint = 0,
237             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
238             .location = {.poolIndex = 0, .offset = 0, .length = 0},
239         },
240         {
241             .type = OperandType::TENSOR_FLOAT32,
242             .dimensions = {2, 4},
243             .numberOfConsumers = 1,
244             .scale = 0.0f,
245             .zeroPoint = 0,
246             .lifetime = OperandLifeTime::CONSTANT_COPY,
247             .location = {.poolIndex = 0, .offset = 213, .length = 32},
248         },
249         {
250             .type = OperandType::TENSOR_FLOAT32,
251             .dimensions = {2},
252             .numberOfConsumers = 1,
253             .scale = 0.0f,
254             .zeroPoint = 0,
255             .lifetime = OperandLifeTime::CONSTANT_COPY,
256             .location = {.poolIndex = 0, .offset = 245, .length = 8},
257         },
258         {
259             .type = OperandType::INT32,
260             .dimensions = {},
261             .numberOfConsumers = 1,
262             .scale = 0.0f,
263             .zeroPoint = 0,
264             .lifetime = OperandLifeTime::CONSTANT_COPY,
265             .location = {.poolIndex = 0, .offset = 253, .length = 4},
266         },
267         {
268             .type = OperandType::TENSOR_FLOAT32,
269             .dimensions = {0, 2},
270             .numberOfConsumers = 1,
271             .scale = 0.0f,
272             .zeroPoint = 0,
273             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
274             .location = {.poolIndex = 0, .offset = 0, .length = 0},
275         },
276         {
277             .type = OperandType::TENSOR_FLOAT32,
278             .dimensions = {0, 8},
279             .numberOfConsumers = 1,
280             .scale = 0.0f,
281             .zeroPoint = 0,
282             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
283             .location = {.poolIndex = 0, .offset = 0, .length = 0},
284         },
285         {
286             .type = OperandType::FLOAT32,
287             .dimensions = {},
288             .numberOfConsumers = 1,
289             .scale = 0.0f,
290             .zeroPoint = 0,
291             .lifetime = OperandLifeTime::CONSTANT_COPY,
292             .location = {.poolIndex = 0, .offset = 257, .length = 4},
293         },
294         {
295             .type = OperandType::INT32,
296             .dimensions = {},
297             .numberOfConsumers = 1,
298             .scale = 0.0f,
299             .zeroPoint = 0,
300             .lifetime = OperandLifeTime::CONSTANT_COPY,
301             .location = {.poolIndex = 0, .offset = 261, .length = 4},
302         },
303         {
304             .type = OperandType::INT32,
305             .dimensions = {},
306             .numberOfConsumers = 1,
307             .scale = 0.0f,
308             .zeroPoint = 0,
309             .lifetime = OperandLifeTime::CONSTANT_COPY,
310             .location = {.poolIndex = 0, .offset = 265, .length = 4},
311         },
312         {
313             .type = OperandType::FLOAT32,
314             .dimensions = {},
315             .numberOfConsumers = 1,
316             .scale = 0.0f,
317             .zeroPoint = 0,
318             .lifetime = OperandLifeTime::CONSTANT_COPY,
319             .location = {.poolIndex = 0, .offset = 269, .length = 4},
320         },
321         {
322             .type = OperandType::FLOAT32,
323             .dimensions = {},
324             .numberOfConsumers = 1,
325             .scale = 0.0f,
326             .zeroPoint = 0,
327             .lifetime = OperandLifeTime::CONSTANT_COPY,
328             .location = {.poolIndex = 0, .offset = 273, .length = 4},
329         },
330         {
331             .type = OperandType::FLOAT32,
332             .dimensions = {},
333             .numberOfConsumers = 1,
334             .scale = 0.0f,
335             .zeroPoint = 0,
336             .lifetime = OperandLifeTime::CONSTANT_COPY,
337             .location = {.poolIndex = 0, .offset = 277, .length = 4},
338         },
339         {
340             .type = OperandType::TENSOR_FLOAT32,
341             .dimensions = {0},
342             .numberOfConsumers = 0,
343             .scale = 0.0f,
344             .zeroPoint = 0,
345             .lifetime = OperandLifeTime::MODEL_OUTPUT,
346             .location = {.poolIndex = 0, .offset = 0, .length = 0},
347         },
348         {
349             .type = OperandType::TENSOR_FLOAT32,
350             .dimensions = {0, 4},
351             .numberOfConsumers = 0,
352             .scale = 0.0f,
353             .zeroPoint = 0,
354             .lifetime = OperandLifeTime::MODEL_OUTPUT,
355             .location = {.poolIndex = 0, .offset = 0, .length = 0},
356         },
357         {
358             .type = OperandType::TENSOR_INT32,
359             .dimensions = {0},
360             .numberOfConsumers = 0,
361             .scale = 0.0f,
362             .zeroPoint = 0,
363             .lifetime = OperandLifeTime::MODEL_OUTPUT,
364             .location = {.poolIndex = 0, .offset = 0, .length = 0},
365         },
366         {
367             .type = OperandType::TENSOR_INT32,
368             .dimensions = {0},
369             .numberOfConsumers = 0,
370             .scale = 0.0f,
371             .zeroPoint = 0,
372             .lifetime = OperandLifeTime::MODEL_OUTPUT,
373             .location = {.poolIndex = 0, .offset = 0, .length = 0},
374         }
375     };
376 
377     const std::vector<Operation> operations = {
378         {
379             .type = OperationType::GENERATE_PROPOSALS,
380             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
381             .outputs = {11, 12, 13},
382         },
383         {
384             .type = OperationType::ROI_ALIGN,
385             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
386             .outputs = {21},
387         },
388         {
389             .type = OperationType::FULLY_CONNECTED,
390             .inputs = {21, 22, 23, 24},
391             .outputs = {25},
392         },
393         {
394             .type = OperationType::FULLY_CONNECTED,
395             .inputs = {21, 26, 27, 28},
396             .outputs = {29},
397         },
398         {
399             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
400             .inputs = {12, 25, 13, 3},
401             .outputs = {30},
402         },
403         {
404             .type = OperationType::BOX_WITH_NMS_LIMIT,
405             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
406             .outputs = {37, 38, 39, 40},
407         }
408     };
409 
410     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
411     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
412     std::vector<uint8_t> operandValues = {
413       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
414     };
415     const std::vector<hidl_memory> pools = {};
416 
417     return {
418         .operands = operands,
419         .operations = operations,
420         .inputIndexes = inputIndexes,
421         .outputIndexes = outputIndexes,
422         .operandValues = operandValues,
423         .pools = pools,
424     };
425 }
426 
is_ignored_zero_sized(int i)427 inline bool is_ignored_zero_sized(int i) {
428   static std::set<int> ignore = {};
429   return ignore.find(i) != ignore.end();
430 }
431 
432 // Create the model
createTestModel_zero_sized_relaxed()433 Model createTestModel_zero_sized_relaxed() {
434     const std::vector<Operand> operands = {
435         {
436             .type = OperandType::TENSOR_FLOAT32,
437             .dimensions = {1, 1, 1, 1},
438             .numberOfConsumers = 1,
439             .scale = 0.0f,
440             .zeroPoint = 0,
441             .lifetime = OperandLifeTime::MODEL_INPUT,
442             .location = {.poolIndex = 0, .offset = 0, .length = 0},
443         },
444         {
445             .type = OperandType::TENSOR_FLOAT32,
446             .dimensions = {1, 1, 1, 4},
447             .numberOfConsumers = 1,
448             .scale = 0.0f,
449             .zeroPoint = 0,
450             .lifetime = OperandLifeTime::MODEL_INPUT,
451             .location = {.poolIndex = 0, .offset = 0, .length = 0},
452         },
453         {
454             .type = OperandType::TENSOR_FLOAT32,
455             .dimensions = {1, 4},
456             .numberOfConsumers = 1,
457             .scale = 0.0f,
458             .zeroPoint = 0,
459             .lifetime = OperandLifeTime::MODEL_INPUT,
460             .location = {.poolIndex = 0, .offset = 0, .length = 0},
461         },
462         {
463             .type = OperandType::TENSOR_FLOAT32,
464             .dimensions = {1, 2},
465             .numberOfConsumers = 2,
466             .scale = 0.0f,
467             .zeroPoint = 0,
468             .lifetime = OperandLifeTime::MODEL_INPUT,
469             .location = {.poolIndex = 0, .offset = 0, .length = 0},
470         },
471         {
472             .type = OperandType::FLOAT32,
473             .dimensions = {},
474             .numberOfConsumers = 1,
475             .scale = 0.0f,
476             .zeroPoint = 0,
477             .lifetime = OperandLifeTime::CONSTANT_COPY,
478             .location = {.poolIndex = 0, .offset = 0, .length = 4},
479         },
480         {
481             .type = OperandType::FLOAT32,
482             .dimensions = {},
483             .numberOfConsumers = 1,
484             .scale = 0.0f,
485             .zeroPoint = 0,
486             .lifetime = OperandLifeTime::CONSTANT_COPY,
487             .location = {.poolIndex = 0, .offset = 4, .length = 4},
488         },
489         {
490             .type = OperandType::INT32,
491             .dimensions = {},
492             .numberOfConsumers = 1,
493             .scale = 0.0f,
494             .zeroPoint = 0,
495             .lifetime = OperandLifeTime::CONSTANT_COPY,
496             .location = {.poolIndex = 0, .offset = 8, .length = 4},
497         },
498         {
499             .type = OperandType::INT32,
500             .dimensions = {},
501             .numberOfConsumers = 1,
502             .scale = 0.0f,
503             .zeroPoint = 0,
504             .lifetime = OperandLifeTime::CONSTANT_COPY,
505             .location = {.poolIndex = 0, .offset = 12, .length = 4},
506         },
507         {
508             .type = OperandType::FLOAT32,
509             .dimensions = {},
510             .numberOfConsumers = 1,
511             .scale = 0.0f,
512             .zeroPoint = 0,
513             .lifetime = OperandLifeTime::CONSTANT_COPY,
514             .location = {.poolIndex = 0, .offset = 16, .length = 4},
515         },
516         {
517             .type = OperandType::FLOAT32,
518             .dimensions = {},
519             .numberOfConsumers = 1,
520             .scale = 0.0f,
521             .zeroPoint = 0,
522             .lifetime = OperandLifeTime::CONSTANT_COPY,
523             .location = {.poolIndex = 0, .offset = 20, .length = 4},
524         },
525         {
526             .type = OperandType::BOOL,
527             .dimensions = {},
528             .numberOfConsumers = 2,
529             .scale = 0.0f,
530             .zeroPoint = 0,
531             .lifetime = OperandLifeTime::CONSTANT_COPY,
532             .location = {.poolIndex = 0, .offset = 24, .length = 1},
533         },
534         {
535             .type = OperandType::TENSOR_FLOAT32,
536             .dimensions = {0},
537             .numberOfConsumers = 0,
538             .scale = 0.0f,
539             .zeroPoint = 0,
540             .lifetime = OperandLifeTime::MODEL_OUTPUT,
541             .location = {.poolIndex = 0, .offset = 0, .length = 0},
542         },
543         {
544             .type = OperandType::TENSOR_FLOAT32,
545             .dimensions = {0, 4},
546             .numberOfConsumers = 2,
547             .scale = 0.0f,
548             .zeroPoint = 0,
549             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
550             .location = {.poolIndex = 0, .offset = 0, .length = 0},
551         },
552         {
553             .type = OperandType::TENSOR_INT32,
554             .dimensions = {0},
555             .numberOfConsumers = 3,
556             .scale = 0.0f,
557             .zeroPoint = 0,
558             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
559             .location = {.poolIndex = 0, .offset = 0, .length = 0},
560         },
561         {
562             .type = OperandType::TENSOR_FLOAT32,
563             .dimensions = {1, 1, 1, 1},
564             .numberOfConsumers = 1,
565             .scale = 0.0f,
566             .zeroPoint = 0,
567             .lifetime = OperandLifeTime::MODEL_INPUT,
568             .location = {.poolIndex = 0, .offset = 0, .length = 0},
569         },
570         {
571             .type = OperandType::INT32,
572             .dimensions = {},
573             .numberOfConsumers = 1,
574             .scale = 0.0f,
575             .zeroPoint = 0,
576             .lifetime = OperandLifeTime::CONSTANT_COPY,
577             .location = {.poolIndex = 0, .offset = 25, .length = 4},
578         },
579         {
580             .type = OperandType::INT32,
581             .dimensions = {},
582             .numberOfConsumers = 1,
583             .scale = 0.0f,
584             .zeroPoint = 0,
585             .lifetime = OperandLifeTime::CONSTANT_COPY,
586             .location = {.poolIndex = 0, .offset = 29, .length = 4},
587         },
588         {
589             .type = OperandType::FLOAT32,
590             .dimensions = {},
591             .numberOfConsumers = 1,
592             .scale = 0.0f,
593             .zeroPoint = 0,
594             .lifetime = OperandLifeTime::CONSTANT_COPY,
595             .location = {.poolIndex = 0, .offset = 33, .length = 4},
596         },
597         {
598             .type = OperandType::FLOAT32,
599             .dimensions = {},
600             .numberOfConsumers = 1,
601             .scale = 0.0f,
602             .zeroPoint = 0,
603             .lifetime = OperandLifeTime::CONSTANT_COPY,
604             .location = {.poolIndex = 0, .offset = 37, .length = 4},
605         },
606         {
607             .type = OperandType::INT32,
608             .dimensions = {},
609             .numberOfConsumers = 1,
610             .scale = 0.0f,
611             .zeroPoint = 0,
612             .lifetime = OperandLifeTime::CONSTANT_COPY,
613             .location = {.poolIndex = 0, .offset = 41, .length = 4},
614         },
615         {
616             .type = OperandType::INT32,
617             .dimensions = {},
618             .numberOfConsumers = 1,
619             .scale = 0.0f,
620             .zeroPoint = 0,
621             .lifetime = OperandLifeTime::CONSTANT_COPY,
622             .location = {.poolIndex = 0, .offset = 45, .length = 4},
623         },
624         {
625             .type = OperandType::TENSOR_FLOAT32,
626             .dimensions = {0, 2, 2, 1},
627             .numberOfConsumers = 2,
628             .scale = 0.0f,
629             .zeroPoint = 0,
630             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
631             .location = {.poolIndex = 0, .offset = 0, .length = 0},
632         },
633         {
634             .type = OperandType::TENSOR_FLOAT32,
635             .dimensions = {8, 4},
636             .numberOfConsumers = 1,
637             .scale = 0.0f,
638             .zeroPoint = 0,
639             .lifetime = OperandLifeTime::CONSTANT_COPY,
640             .location = {.poolIndex = 0, .offset = 49, .length = 128},
641         },
642         {
643             .type = OperandType::TENSOR_FLOAT32,
644             .dimensions = {8},
645             .numberOfConsumers = 1,
646             .scale = 0.0f,
647             .zeroPoint = 0,
648             .lifetime = OperandLifeTime::CONSTANT_COPY,
649             .location = {.poolIndex = 0, .offset = 177, .length = 32},
650         },
651         {
652             .type = OperandType::INT32,
653             .dimensions = {},
654             .numberOfConsumers = 1,
655             .scale = 0.0f,
656             .zeroPoint = 0,
657             .lifetime = OperandLifeTime::CONSTANT_COPY,
658             .location = {.poolIndex = 0, .offset = 209, .length = 4},
659         },
660         {
661             .type = OperandType::TENSOR_FLOAT32,
662             .dimensions = {0, 8},
663             .numberOfConsumers = 1,
664             .scale = 0.0f,
665             .zeroPoint = 0,
666             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
667             .location = {.poolIndex = 0, .offset = 0, .length = 0},
668         },
669         {
670             .type = OperandType::TENSOR_FLOAT32,
671             .dimensions = {2, 4},
672             .numberOfConsumers = 1,
673             .scale = 0.0f,
674             .zeroPoint = 0,
675             .lifetime = OperandLifeTime::CONSTANT_COPY,
676             .location = {.poolIndex = 0, .offset = 213, .length = 32},
677         },
678         {
679             .type = OperandType::TENSOR_FLOAT32,
680             .dimensions = {2},
681             .numberOfConsumers = 1,
682             .scale = 0.0f,
683             .zeroPoint = 0,
684             .lifetime = OperandLifeTime::CONSTANT_COPY,
685             .location = {.poolIndex = 0, .offset = 245, .length = 8},
686         },
687         {
688             .type = OperandType::INT32,
689             .dimensions = {},
690             .numberOfConsumers = 1,
691             .scale = 0.0f,
692             .zeroPoint = 0,
693             .lifetime = OperandLifeTime::CONSTANT_COPY,
694             .location = {.poolIndex = 0, .offset = 253, .length = 4},
695         },
696         {
697             .type = OperandType::TENSOR_FLOAT32,
698             .dimensions = {0, 2},
699             .numberOfConsumers = 1,
700             .scale = 0.0f,
701             .zeroPoint = 0,
702             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
703             .location = {.poolIndex = 0, .offset = 0, .length = 0},
704         },
705         {
706             .type = OperandType::TENSOR_FLOAT32,
707             .dimensions = {0, 8},
708             .numberOfConsumers = 1,
709             .scale = 0.0f,
710             .zeroPoint = 0,
711             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
712             .location = {.poolIndex = 0, .offset = 0, .length = 0},
713         },
714         {
715             .type = OperandType::FLOAT32,
716             .dimensions = {},
717             .numberOfConsumers = 1,
718             .scale = 0.0f,
719             .zeroPoint = 0,
720             .lifetime = OperandLifeTime::CONSTANT_COPY,
721             .location = {.poolIndex = 0, .offset = 257, .length = 4},
722         },
723         {
724             .type = OperandType::INT32,
725             .dimensions = {},
726             .numberOfConsumers = 1,
727             .scale = 0.0f,
728             .zeroPoint = 0,
729             .lifetime = OperandLifeTime::CONSTANT_COPY,
730             .location = {.poolIndex = 0, .offset = 261, .length = 4},
731         },
732         {
733             .type = OperandType::INT32,
734             .dimensions = {},
735             .numberOfConsumers = 1,
736             .scale = 0.0f,
737             .zeroPoint = 0,
738             .lifetime = OperandLifeTime::CONSTANT_COPY,
739             .location = {.poolIndex = 0, .offset = 265, .length = 4},
740         },
741         {
742             .type = OperandType::FLOAT32,
743             .dimensions = {},
744             .numberOfConsumers = 1,
745             .scale = 0.0f,
746             .zeroPoint = 0,
747             .lifetime = OperandLifeTime::CONSTANT_COPY,
748             .location = {.poolIndex = 0, .offset = 269, .length = 4},
749         },
750         {
751             .type = OperandType::FLOAT32,
752             .dimensions = {},
753             .numberOfConsumers = 1,
754             .scale = 0.0f,
755             .zeroPoint = 0,
756             .lifetime = OperandLifeTime::CONSTANT_COPY,
757             .location = {.poolIndex = 0, .offset = 273, .length = 4},
758         },
759         {
760             .type = OperandType::FLOAT32,
761             .dimensions = {},
762             .numberOfConsumers = 1,
763             .scale = 0.0f,
764             .zeroPoint = 0,
765             .lifetime = OperandLifeTime::CONSTANT_COPY,
766             .location = {.poolIndex = 0, .offset = 277, .length = 4},
767         },
768         {
769             .type = OperandType::TENSOR_FLOAT32,
770             .dimensions = {0},
771             .numberOfConsumers = 0,
772             .scale = 0.0f,
773             .zeroPoint = 0,
774             .lifetime = OperandLifeTime::MODEL_OUTPUT,
775             .location = {.poolIndex = 0, .offset = 0, .length = 0},
776         },
777         {
778             .type = OperandType::TENSOR_FLOAT32,
779             .dimensions = {0, 4},
780             .numberOfConsumers = 0,
781             .scale = 0.0f,
782             .zeroPoint = 0,
783             .lifetime = OperandLifeTime::MODEL_OUTPUT,
784             .location = {.poolIndex = 0, .offset = 0, .length = 0},
785         },
786         {
787             .type = OperandType::TENSOR_INT32,
788             .dimensions = {0},
789             .numberOfConsumers = 0,
790             .scale = 0.0f,
791             .zeroPoint = 0,
792             .lifetime = OperandLifeTime::MODEL_OUTPUT,
793             .location = {.poolIndex = 0, .offset = 0, .length = 0},
794         },
795         {
796             .type = OperandType::TENSOR_INT32,
797             .dimensions = {0},
798             .numberOfConsumers = 0,
799             .scale = 0.0f,
800             .zeroPoint = 0,
801             .lifetime = OperandLifeTime::MODEL_OUTPUT,
802             .location = {.poolIndex = 0, .offset = 0, .length = 0},
803         }
804     };
805 
806     const std::vector<Operation> operations = {
807         {
808             .type = OperationType::GENERATE_PROPOSALS,
809             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
810             .outputs = {11, 12, 13},
811         },
812         {
813             .type = OperationType::ROI_ALIGN,
814             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
815             .outputs = {21},
816         },
817         {
818             .type = OperationType::FULLY_CONNECTED,
819             .inputs = {21, 22, 23, 24},
820             .outputs = {25},
821         },
822         {
823             .type = OperationType::FULLY_CONNECTED,
824             .inputs = {21, 26, 27, 28},
825             .outputs = {29},
826         },
827         {
828             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
829             .inputs = {12, 25, 13, 3},
830             .outputs = {30},
831         },
832         {
833             .type = OperationType::BOX_WITH_NMS_LIMIT,
834             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
835             .outputs = {37, 38, 39, 40},
836         }
837     };
838 
839     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
840     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
841     std::vector<uint8_t> operandValues = {
842       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
843     };
844     const std::vector<hidl_memory> pools = {};
845 
846     return {
847         .operands = operands,
848         .operations = operations,
849         .inputIndexes = inputIndexes,
850         .outputIndexes = outputIndexes,
851         .operandValues = operandValues,
852         .pools = pools,
853         .relaxComputationFloat32toFloat16 = true,
854     };
855 }
856 
is_ignored_zero_sized_relaxed(int i)857 inline bool is_ignored_zero_sized_relaxed(int i) {
858   static std::set<int> ignore = {};
859   return ignore.find(i) != ignore.end();
860 }
861 
862 // Create the model
createTestModel_zero_sized_float16()863 Model createTestModel_zero_sized_float16() {
864     const std::vector<Operand> operands = {
865         {
866             .type = OperandType::TENSOR_FLOAT16,
867             .dimensions = {1, 1, 1, 1},
868             .numberOfConsumers = 1,
869             .scale = 0.0f,
870             .zeroPoint = 0,
871             .lifetime = OperandLifeTime::MODEL_INPUT,
872             .location = {.poolIndex = 0, .offset = 0, .length = 0},
873         },
874         {
875             .type = OperandType::TENSOR_FLOAT16,
876             .dimensions = {1, 1, 1, 4},
877             .numberOfConsumers = 1,
878             .scale = 0.0f,
879             .zeroPoint = 0,
880             .lifetime = OperandLifeTime::MODEL_INPUT,
881             .location = {.poolIndex = 0, .offset = 0, .length = 0},
882         },
883         {
884             .type = OperandType::TENSOR_FLOAT16,
885             .dimensions = {1, 4},
886             .numberOfConsumers = 1,
887             .scale = 0.0f,
888             .zeroPoint = 0,
889             .lifetime = OperandLifeTime::MODEL_INPUT,
890             .location = {.poolIndex = 0, .offset = 0, .length = 0},
891         },
892         {
893             .type = OperandType::TENSOR_FLOAT16,
894             .dimensions = {1, 2},
895             .numberOfConsumers = 2,
896             .scale = 0.0f,
897             .zeroPoint = 0,
898             .lifetime = OperandLifeTime::MODEL_INPUT,
899             .location = {.poolIndex = 0, .offset = 0, .length = 0},
900         },
901         {
902             .type = OperandType::FLOAT16,
903             .dimensions = {},
904             .numberOfConsumers = 1,
905             .scale = 0.0f,
906             .zeroPoint = 0,
907             .lifetime = OperandLifeTime::CONSTANT_COPY,
908             .location = {.poolIndex = 0, .offset = 0, .length = 2},
909         },
910         {
911             .type = OperandType::FLOAT16,
912             .dimensions = {},
913             .numberOfConsumers = 1,
914             .scale = 0.0f,
915             .zeroPoint = 0,
916             .lifetime = OperandLifeTime::CONSTANT_COPY,
917             .location = {.poolIndex = 0, .offset = 2, .length = 2},
918         },
919         {
920             .type = OperandType::INT32,
921             .dimensions = {},
922             .numberOfConsumers = 1,
923             .scale = 0.0f,
924             .zeroPoint = 0,
925             .lifetime = OperandLifeTime::CONSTANT_COPY,
926             .location = {.poolIndex = 0, .offset = 4, .length = 4},
927         },
928         {
929             .type = OperandType::INT32,
930             .dimensions = {},
931             .numberOfConsumers = 1,
932             .scale = 0.0f,
933             .zeroPoint = 0,
934             .lifetime = OperandLifeTime::CONSTANT_COPY,
935             .location = {.poolIndex = 0, .offset = 8, .length = 4},
936         },
937         {
938             .type = OperandType::FLOAT16,
939             .dimensions = {},
940             .numberOfConsumers = 1,
941             .scale = 0.0f,
942             .zeroPoint = 0,
943             .lifetime = OperandLifeTime::CONSTANT_COPY,
944             .location = {.poolIndex = 0, .offset = 12, .length = 2},
945         },
946         {
947             .type = OperandType::FLOAT16,
948             .dimensions = {},
949             .numberOfConsumers = 1,
950             .scale = 0.0f,
951             .zeroPoint = 0,
952             .lifetime = OperandLifeTime::CONSTANT_COPY,
953             .location = {.poolIndex = 0, .offset = 14, .length = 2},
954         },
955         {
956             .type = OperandType::BOOL,
957             .dimensions = {},
958             .numberOfConsumers = 2,
959             .scale = 0.0f,
960             .zeroPoint = 0,
961             .lifetime = OperandLifeTime::CONSTANT_COPY,
962             .location = {.poolIndex = 0, .offset = 16, .length = 1},
963         },
964         {
965             .type = OperandType::TENSOR_FLOAT16,
966             .dimensions = {0},
967             .numberOfConsumers = 0,
968             .scale = 0.0f,
969             .zeroPoint = 0,
970             .lifetime = OperandLifeTime::MODEL_OUTPUT,
971             .location = {.poolIndex = 0, .offset = 0, .length = 0},
972         },
973         {
974             .type = OperandType::TENSOR_FLOAT16,
975             .dimensions = {0, 4},
976             .numberOfConsumers = 2,
977             .scale = 0.0f,
978             .zeroPoint = 0,
979             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
980             .location = {.poolIndex = 0, .offset = 0, .length = 0},
981         },
982         {
983             .type = OperandType::TENSOR_INT32,
984             .dimensions = {0},
985             .numberOfConsumers = 3,
986             .scale = 0.0f,
987             .zeroPoint = 0,
988             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
989             .location = {.poolIndex = 0, .offset = 0, .length = 0},
990         },
991         {
992             .type = OperandType::TENSOR_FLOAT16,
993             .dimensions = {1, 1, 1, 1},
994             .numberOfConsumers = 1,
995             .scale = 0.0f,
996             .zeroPoint = 0,
997             .lifetime = OperandLifeTime::MODEL_INPUT,
998             .location = {.poolIndex = 0, .offset = 0, .length = 0},
999         },
1000         {
1001             .type = OperandType::INT32,
1002             .dimensions = {},
1003             .numberOfConsumers = 1,
1004             .scale = 0.0f,
1005             .zeroPoint = 0,
1006             .lifetime = OperandLifeTime::CONSTANT_COPY,
1007             .location = {.poolIndex = 0, .offset = 17, .length = 4},
1008         },
1009         {
1010             .type = OperandType::INT32,
1011             .dimensions = {},
1012             .numberOfConsumers = 1,
1013             .scale = 0.0f,
1014             .zeroPoint = 0,
1015             .lifetime = OperandLifeTime::CONSTANT_COPY,
1016             .location = {.poolIndex = 0, .offset = 21, .length = 4},
1017         },
1018         {
1019             .type = OperandType::FLOAT16,
1020             .dimensions = {},
1021             .numberOfConsumers = 1,
1022             .scale = 0.0f,
1023             .zeroPoint = 0,
1024             .lifetime = OperandLifeTime::CONSTANT_COPY,
1025             .location = {.poolIndex = 0, .offset = 25, .length = 2},
1026         },
1027         {
1028             .type = OperandType::FLOAT16,
1029             .dimensions = {},
1030             .numberOfConsumers = 1,
1031             .scale = 0.0f,
1032             .zeroPoint = 0,
1033             .lifetime = OperandLifeTime::CONSTANT_COPY,
1034             .location = {.poolIndex = 0, .offset = 27, .length = 2},
1035         },
1036         {
1037             .type = OperandType::INT32,
1038             .dimensions = {},
1039             .numberOfConsumers = 1,
1040             .scale = 0.0f,
1041             .zeroPoint = 0,
1042             .lifetime = OperandLifeTime::CONSTANT_COPY,
1043             .location = {.poolIndex = 0, .offset = 29, .length = 4},
1044         },
1045         {
1046             .type = OperandType::INT32,
1047             .dimensions = {},
1048             .numberOfConsumers = 1,
1049             .scale = 0.0f,
1050             .zeroPoint = 0,
1051             .lifetime = OperandLifeTime::CONSTANT_COPY,
1052             .location = {.poolIndex = 0, .offset = 33, .length = 4},
1053         },
1054         {
1055             .type = OperandType::TENSOR_FLOAT16,
1056             .dimensions = {0, 2, 2, 1},
1057             .numberOfConsumers = 2,
1058             .scale = 0.0f,
1059             .zeroPoint = 0,
1060             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1061             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1062         },
1063         {
1064             .type = OperandType::TENSOR_FLOAT16,
1065             .dimensions = {8, 4},
1066             .numberOfConsumers = 1,
1067             .scale = 0.0f,
1068             .zeroPoint = 0,
1069             .lifetime = OperandLifeTime::CONSTANT_COPY,
1070             .location = {.poolIndex = 0, .offset = 37, .length = 64},
1071         },
1072         {
1073             .type = OperandType::TENSOR_FLOAT16,
1074             .dimensions = {8},
1075             .numberOfConsumers = 1,
1076             .scale = 0.0f,
1077             .zeroPoint = 0,
1078             .lifetime = OperandLifeTime::CONSTANT_COPY,
1079             .location = {.poolIndex = 0, .offset = 101, .length = 16},
1080         },
1081         {
1082             .type = OperandType::INT32,
1083             .dimensions = {},
1084             .numberOfConsumers = 1,
1085             .scale = 0.0f,
1086             .zeroPoint = 0,
1087             .lifetime = OperandLifeTime::CONSTANT_COPY,
1088             .location = {.poolIndex = 0, .offset = 117, .length = 4},
1089         },
1090         {
1091             .type = OperandType::TENSOR_FLOAT16,
1092             .dimensions = {0, 8},
1093             .numberOfConsumers = 1,
1094             .scale = 0.0f,
1095             .zeroPoint = 0,
1096             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1097             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1098         },
1099         {
1100             .type = OperandType::TENSOR_FLOAT16,
1101             .dimensions = {2, 4},
1102             .numberOfConsumers = 1,
1103             .scale = 0.0f,
1104             .zeroPoint = 0,
1105             .lifetime = OperandLifeTime::CONSTANT_COPY,
1106             .location = {.poolIndex = 0, .offset = 121, .length = 16},
1107         },
1108         {
1109             .type = OperandType::TENSOR_FLOAT16,
1110             .dimensions = {2},
1111             .numberOfConsumers = 1,
1112             .scale = 0.0f,
1113             .zeroPoint = 0,
1114             .lifetime = OperandLifeTime::CONSTANT_COPY,
1115             .location = {.poolIndex = 0, .offset = 137, .length = 4},
1116         },
1117         {
1118             .type = OperandType::INT32,
1119             .dimensions = {},
1120             .numberOfConsumers = 1,
1121             .scale = 0.0f,
1122             .zeroPoint = 0,
1123             .lifetime = OperandLifeTime::CONSTANT_COPY,
1124             .location = {.poolIndex = 0, .offset = 141, .length = 4},
1125         },
1126         {
1127             .type = OperandType::TENSOR_FLOAT16,
1128             .dimensions = {0, 2},
1129             .numberOfConsumers = 1,
1130             .scale = 0.0f,
1131             .zeroPoint = 0,
1132             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1133             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1134         },
1135         {
1136             .type = OperandType::TENSOR_FLOAT16,
1137             .dimensions = {0, 8},
1138             .numberOfConsumers = 1,
1139             .scale = 0.0f,
1140             .zeroPoint = 0,
1141             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1142             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1143         },
1144         {
1145             .type = OperandType::FLOAT16,
1146             .dimensions = {},
1147             .numberOfConsumers = 1,
1148             .scale = 0.0f,
1149             .zeroPoint = 0,
1150             .lifetime = OperandLifeTime::CONSTANT_COPY,
1151             .location = {.poolIndex = 0, .offset = 145, .length = 2},
1152         },
1153         {
1154             .type = OperandType::INT32,
1155             .dimensions = {},
1156             .numberOfConsumers = 1,
1157             .scale = 0.0f,
1158             .zeroPoint = 0,
1159             .lifetime = OperandLifeTime::CONSTANT_COPY,
1160             .location = {.poolIndex = 0, .offset = 147, .length = 4},
1161         },
1162         {
1163             .type = OperandType::INT32,
1164             .dimensions = {},
1165             .numberOfConsumers = 1,
1166             .scale = 0.0f,
1167             .zeroPoint = 0,
1168             .lifetime = OperandLifeTime::CONSTANT_COPY,
1169             .location = {.poolIndex = 0, .offset = 151, .length = 4},
1170         },
1171         {
1172             .type = OperandType::FLOAT16,
1173             .dimensions = {},
1174             .numberOfConsumers = 1,
1175             .scale = 0.0f,
1176             .zeroPoint = 0,
1177             .lifetime = OperandLifeTime::CONSTANT_COPY,
1178             .location = {.poolIndex = 0, .offset = 155, .length = 2},
1179         },
1180         {
1181             .type = OperandType::FLOAT16,
1182             .dimensions = {},
1183             .numberOfConsumers = 1,
1184             .scale = 0.0f,
1185             .zeroPoint = 0,
1186             .lifetime = OperandLifeTime::CONSTANT_COPY,
1187             .location = {.poolIndex = 0, .offset = 157, .length = 2},
1188         },
1189         {
1190             .type = OperandType::FLOAT16,
1191             .dimensions = {},
1192             .numberOfConsumers = 1,
1193             .scale = 0.0f,
1194             .zeroPoint = 0,
1195             .lifetime = OperandLifeTime::CONSTANT_COPY,
1196             .location = {.poolIndex = 0, .offset = 159, .length = 2},
1197         },
1198         {
1199             .type = OperandType::TENSOR_FLOAT16,
1200             .dimensions = {0},
1201             .numberOfConsumers = 0,
1202             .scale = 0.0f,
1203             .zeroPoint = 0,
1204             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1205             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1206         },
1207         {
1208             .type = OperandType::TENSOR_FLOAT16,
1209             .dimensions = {0, 4},
1210             .numberOfConsumers = 0,
1211             .scale = 0.0f,
1212             .zeroPoint = 0,
1213             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1214             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1215         },
1216         {
1217             .type = OperandType::TENSOR_INT32,
1218             .dimensions = {0},
1219             .numberOfConsumers = 0,
1220             .scale = 0.0f,
1221             .zeroPoint = 0,
1222             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1223             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1224         },
1225         {
1226             .type = OperandType::TENSOR_INT32,
1227             .dimensions = {0},
1228             .numberOfConsumers = 0,
1229             .scale = 0.0f,
1230             .zeroPoint = 0,
1231             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1232             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1233         }
1234     };
1235 
1236     const std::vector<Operation> operations = {
1237         {
1238             .type = OperationType::GENERATE_PROPOSALS,
1239             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
1240             .outputs = {11, 12, 13},
1241         },
1242         {
1243             .type = OperationType::ROI_ALIGN,
1244             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
1245             .outputs = {21},
1246         },
1247         {
1248             .type = OperationType::FULLY_CONNECTED,
1249             .inputs = {21, 22, 23, 24},
1250             .outputs = {25},
1251         },
1252         {
1253             .type = OperationType::FULLY_CONNECTED,
1254             .inputs = {21, 26, 27, 28},
1255             .outputs = {29},
1256         },
1257         {
1258             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
1259             .inputs = {12, 25, 13, 3},
1260             .outputs = {30},
1261         },
1262         {
1263             .type = OperationType::BOX_WITH_NMS_LIMIT,
1264             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
1265             .outputs = {37, 38, 39, 40},
1266         }
1267     };
1268 
1269     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
1270     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
1271     std::vector<uint8_t> operandValues = {
1272       0, 60, 0, 60, 255, 255, 255, 255, 255, 255, 255, 255, 205, 52, 0, 73, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 60, 0, 60, 4, 0, 0, 0, 4, 0, 0, 0, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 0, 0, 0, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 0, 0, 0, 102, 46, 255, 255, 255, 255, 0, 0, 0, 0, 205, 52, 0, 60, 102, 46
1273     };
1274     const std::vector<hidl_memory> pools = {};
1275 
1276     return {
1277         .operands = operands,
1278         .operations = operations,
1279         .inputIndexes = inputIndexes,
1280         .outputIndexes = outputIndexes,
1281         .operandValues = operandValues,
1282         .pools = pools,
1283     };
1284 }
1285 
is_ignored_zero_sized_float16(int i)1286 inline bool is_ignored_zero_sized_float16(int i) {
1287   static std::set<int> ignore = {};
1288   return ignore.find(i) != ignore.end();
1289 }
1290 
1291 // Create the model
createTestModel_zero_sized_quant8()1292 Model createTestModel_zero_sized_quant8() {
1293     const std::vector<Operand> operands = {
1294         {
1295             .type = OperandType::TENSOR_QUANT8_ASYMM,
1296             .dimensions = {1, 1, 1, 1},
1297             .numberOfConsumers = 1,
1298             .scale = 0.1f,
1299             .zeroPoint = 128,
1300             .lifetime = OperandLifeTime::MODEL_INPUT,
1301             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1302         },
1303         {
1304             .type = OperandType::TENSOR_QUANT8_ASYMM,
1305             .dimensions = {1, 1, 1, 4},
1306             .numberOfConsumers = 1,
1307             .scale = 0.1f,
1308             .zeroPoint = 128,
1309             .lifetime = OperandLifeTime::MODEL_INPUT,
1310             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1311         },
1312         {
1313             .type = OperandType::TENSOR_QUANT16_SYMM,
1314             .dimensions = {1, 4},
1315             .numberOfConsumers = 1,
1316             .scale = 0.125f,
1317             .zeroPoint = 0,
1318             .lifetime = OperandLifeTime::MODEL_INPUT,
1319             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1320         },
1321         {
1322             .type = OperandType::TENSOR_QUANT16_ASYMM,
1323             .dimensions = {1, 2},
1324             .numberOfConsumers = 2,
1325             .scale = 0.125f,
1326             .zeroPoint = 0,
1327             .lifetime = OperandLifeTime::MODEL_INPUT,
1328             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1329         },
1330         {
1331             .type = OperandType::FLOAT32,
1332             .dimensions = {},
1333             .numberOfConsumers = 1,
1334             .scale = 0.0f,
1335             .zeroPoint = 0,
1336             .lifetime = OperandLifeTime::CONSTANT_COPY,
1337             .location = {.poolIndex = 0, .offset = 0, .length = 4},
1338         },
1339         {
1340             .type = OperandType::FLOAT32,
1341             .dimensions = {},
1342             .numberOfConsumers = 1,
1343             .scale = 0.0f,
1344             .zeroPoint = 0,
1345             .lifetime = OperandLifeTime::CONSTANT_COPY,
1346             .location = {.poolIndex = 0, .offset = 4, .length = 4},
1347         },
1348         {
1349             .type = OperandType::INT32,
1350             .dimensions = {},
1351             .numberOfConsumers = 1,
1352             .scale = 0.0f,
1353             .zeroPoint = 0,
1354             .lifetime = OperandLifeTime::CONSTANT_COPY,
1355             .location = {.poolIndex = 0, .offset = 8, .length = 4},
1356         },
1357         {
1358             .type = OperandType::INT32,
1359             .dimensions = {},
1360             .numberOfConsumers = 1,
1361             .scale = 0.0f,
1362             .zeroPoint = 0,
1363             .lifetime = OperandLifeTime::CONSTANT_COPY,
1364             .location = {.poolIndex = 0, .offset = 12, .length = 4},
1365         },
1366         {
1367             .type = OperandType::FLOAT32,
1368             .dimensions = {},
1369             .numberOfConsumers = 1,
1370             .scale = 0.0f,
1371             .zeroPoint = 0,
1372             .lifetime = OperandLifeTime::CONSTANT_COPY,
1373             .location = {.poolIndex = 0, .offset = 16, .length = 4},
1374         },
1375         {
1376             .type = OperandType::FLOAT32,
1377             .dimensions = {},
1378             .numberOfConsumers = 1,
1379             .scale = 0.0f,
1380             .zeroPoint = 0,
1381             .lifetime = OperandLifeTime::CONSTANT_COPY,
1382             .location = {.poolIndex = 0, .offset = 20, .length = 4},
1383         },
1384         {
1385             .type = OperandType::BOOL,
1386             .dimensions = {},
1387             .numberOfConsumers = 2,
1388             .scale = 0.0f,
1389             .zeroPoint = 0,
1390             .lifetime = OperandLifeTime::CONSTANT_COPY,
1391             .location = {.poolIndex = 0, .offset = 24, .length = 1},
1392         },
1393         {
1394             .type = OperandType::TENSOR_QUANT8_ASYMM,
1395             .dimensions = {0},
1396             .numberOfConsumers = 0,
1397             .scale = 0.1f,
1398             .zeroPoint = 128,
1399             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1400             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1401         },
1402         {
1403             .type = OperandType::TENSOR_QUANT16_ASYMM,
1404             .dimensions = {0, 4},
1405             .numberOfConsumers = 2,
1406             .scale = 0.125f,
1407             .zeroPoint = 0,
1408             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1409             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1410         },
1411         {
1412             .type = OperandType::TENSOR_INT32,
1413             .dimensions = {0},
1414             .numberOfConsumers = 3,
1415             .scale = 0.0f,
1416             .zeroPoint = 0,
1417             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1418             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1419         },
1420         {
1421             .type = OperandType::TENSOR_QUANT8_ASYMM,
1422             .dimensions = {1, 1, 1, 1},
1423             .numberOfConsumers = 1,
1424             .scale = 0.1f,
1425             .zeroPoint = 128,
1426             .lifetime = OperandLifeTime::MODEL_INPUT,
1427             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1428         },
1429         {
1430             .type = OperandType::INT32,
1431             .dimensions = {},
1432             .numberOfConsumers = 1,
1433             .scale = 0.0f,
1434             .zeroPoint = 0,
1435             .lifetime = OperandLifeTime::CONSTANT_COPY,
1436             .location = {.poolIndex = 0, .offset = 25, .length = 4},
1437         },
1438         {
1439             .type = OperandType::INT32,
1440             .dimensions = {},
1441             .numberOfConsumers = 1,
1442             .scale = 0.0f,
1443             .zeroPoint = 0,
1444             .lifetime = OperandLifeTime::CONSTANT_COPY,
1445             .location = {.poolIndex = 0, .offset = 29, .length = 4},
1446         },
1447         {
1448             .type = OperandType::FLOAT32,
1449             .dimensions = {},
1450             .numberOfConsumers = 1,
1451             .scale = 0.0f,
1452             .zeroPoint = 0,
1453             .lifetime = OperandLifeTime::CONSTANT_COPY,
1454             .location = {.poolIndex = 0, .offset = 33, .length = 4},
1455         },
1456         {
1457             .type = OperandType::FLOAT32,
1458             .dimensions = {},
1459             .numberOfConsumers = 1,
1460             .scale = 0.0f,
1461             .zeroPoint = 0,
1462             .lifetime = OperandLifeTime::CONSTANT_COPY,
1463             .location = {.poolIndex = 0, .offset = 37, .length = 4},
1464         },
1465         {
1466             .type = OperandType::INT32,
1467             .dimensions = {},
1468             .numberOfConsumers = 1,
1469             .scale = 0.0f,
1470             .zeroPoint = 0,
1471             .lifetime = OperandLifeTime::CONSTANT_COPY,
1472             .location = {.poolIndex = 0, .offset = 41, .length = 4},
1473         },
1474         {
1475             .type = OperandType::INT32,
1476             .dimensions = {},
1477             .numberOfConsumers = 1,
1478             .scale = 0.0f,
1479             .zeroPoint = 0,
1480             .lifetime = OperandLifeTime::CONSTANT_COPY,
1481             .location = {.poolIndex = 0, .offset = 45, .length = 4},
1482         },
1483         {
1484             .type = OperandType::TENSOR_QUANT8_ASYMM,
1485             .dimensions = {0, 2, 2, 1},
1486             .numberOfConsumers = 2,
1487             .scale = 0.1f,
1488             .zeroPoint = 128,
1489             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1490             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1491         },
1492         {
1493             .type = OperandType::TENSOR_QUANT8_ASYMM,
1494             .dimensions = {8, 4},
1495             .numberOfConsumers = 1,
1496             .scale = 0.1f,
1497             .zeroPoint = 128,
1498             .lifetime = OperandLifeTime::CONSTANT_COPY,
1499             .location = {.poolIndex = 0, .offset = 49, .length = 32},
1500         },
1501         {
1502             .type = OperandType::TENSOR_INT32,
1503             .dimensions = {8},
1504             .numberOfConsumers = 1,
1505             .scale = 0.01f,
1506             .zeroPoint = 0,
1507             .lifetime = OperandLifeTime::CONSTANT_COPY,
1508             .location = {.poolIndex = 0, .offset = 81, .length = 32},
1509         },
1510         {
1511             .type = OperandType::INT32,
1512             .dimensions = {},
1513             .numberOfConsumers = 1,
1514             .scale = 0.0f,
1515             .zeroPoint = 0,
1516             .lifetime = OperandLifeTime::CONSTANT_COPY,
1517             .location = {.poolIndex = 0, .offset = 113, .length = 4},
1518         },
1519         {
1520             .type = OperandType::TENSOR_QUANT8_ASYMM,
1521             .dimensions = {0, 8},
1522             .numberOfConsumers = 1,
1523             .scale = 0.1f,
1524             .zeroPoint = 128,
1525             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1526             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1527         },
1528         {
1529             .type = OperandType::TENSOR_QUANT8_ASYMM,
1530             .dimensions = {2, 4},
1531             .numberOfConsumers = 1,
1532             .scale = 0.1f,
1533             .zeroPoint = 128,
1534             .lifetime = OperandLifeTime::CONSTANT_COPY,
1535             .location = {.poolIndex = 0, .offset = 117, .length = 8},
1536         },
1537         {
1538             .type = OperandType::TENSOR_INT32,
1539             .dimensions = {2},
1540             .numberOfConsumers = 1,
1541             .scale = 0.01f,
1542             .zeroPoint = 0,
1543             .lifetime = OperandLifeTime::CONSTANT_COPY,
1544             .location = {.poolIndex = 0, .offset = 125, .length = 8},
1545         },
1546         {
1547             .type = OperandType::INT32,
1548             .dimensions = {},
1549             .numberOfConsumers = 1,
1550             .scale = 0.0f,
1551             .zeroPoint = 0,
1552             .lifetime = OperandLifeTime::CONSTANT_COPY,
1553             .location = {.poolIndex = 0, .offset = 133, .length = 4},
1554         },
1555         {
1556             .type = OperandType::TENSOR_QUANT8_ASYMM,
1557             .dimensions = {0, 2},
1558             .numberOfConsumers = 1,
1559             .scale = 0.1f,
1560             .zeroPoint = 128,
1561             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1562             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1563         },
1564         {
1565             .type = OperandType::TENSOR_QUANT16_ASYMM,
1566             .dimensions = {0, 8},
1567             .numberOfConsumers = 1,
1568             .scale = 0.125f,
1569             .zeroPoint = 0,
1570             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1571             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1572         },
1573         {
1574             .type = OperandType::FLOAT32,
1575             .dimensions = {},
1576             .numberOfConsumers = 1,
1577             .scale = 0.0f,
1578             .zeroPoint = 0,
1579             .lifetime = OperandLifeTime::CONSTANT_COPY,
1580             .location = {.poolIndex = 0, .offset = 137, .length = 4},
1581         },
1582         {
1583             .type = OperandType::INT32,
1584             .dimensions = {},
1585             .numberOfConsumers = 1,
1586             .scale = 0.0f,
1587             .zeroPoint = 0,
1588             .lifetime = OperandLifeTime::CONSTANT_COPY,
1589             .location = {.poolIndex = 0, .offset = 141, .length = 4},
1590         },
1591         {
1592             .type = OperandType::INT32,
1593             .dimensions = {},
1594             .numberOfConsumers = 1,
1595             .scale = 0.0f,
1596             .zeroPoint = 0,
1597             .lifetime = OperandLifeTime::CONSTANT_COPY,
1598             .location = {.poolIndex = 0, .offset = 145, .length = 4},
1599         },
1600         {
1601             .type = OperandType::FLOAT32,
1602             .dimensions = {},
1603             .numberOfConsumers = 1,
1604             .scale = 0.0f,
1605             .zeroPoint = 0,
1606             .lifetime = OperandLifeTime::CONSTANT_COPY,
1607             .location = {.poolIndex = 0, .offset = 149, .length = 4},
1608         },
1609         {
1610             .type = OperandType::FLOAT32,
1611             .dimensions = {},
1612             .numberOfConsumers = 1,
1613             .scale = 0.0f,
1614             .zeroPoint = 0,
1615             .lifetime = OperandLifeTime::CONSTANT_COPY,
1616             .location = {.poolIndex = 0, .offset = 153, .length = 4},
1617         },
1618         {
1619             .type = OperandType::FLOAT32,
1620             .dimensions = {},
1621             .numberOfConsumers = 1,
1622             .scale = 0.0f,
1623             .zeroPoint = 0,
1624             .lifetime = OperandLifeTime::CONSTANT_COPY,
1625             .location = {.poolIndex = 0, .offset = 157, .length = 4},
1626         },
1627         {
1628             .type = OperandType::TENSOR_QUANT8_ASYMM,
1629             .dimensions = {0},
1630             .numberOfConsumers = 0,
1631             .scale = 0.1f,
1632             .zeroPoint = 128,
1633             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1634             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1635         },
1636         {
1637             .type = OperandType::TENSOR_QUANT16_ASYMM,
1638             .dimensions = {0, 4},
1639             .numberOfConsumers = 0,
1640             .scale = 0.125f,
1641             .zeroPoint = 0,
1642             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1643             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1644         },
1645         {
1646             .type = OperandType::TENSOR_INT32,
1647             .dimensions = {0},
1648             .numberOfConsumers = 0,
1649             .scale = 0.0f,
1650             .zeroPoint = 0,
1651             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1652             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1653         },
1654         {
1655             .type = OperandType::TENSOR_INT32,
1656             .dimensions = {0},
1657             .numberOfConsumers = 0,
1658             .scale = 0.0f,
1659             .zeroPoint = 0,
1660             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1661             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1662         }
1663     };
1664 
1665     const std::vector<Operation> operations = {
1666         {
1667             .type = OperationType::GENERATE_PROPOSALS,
1668             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
1669             .outputs = {11, 12, 13},
1670         },
1671         {
1672             .type = OperationType::ROI_ALIGN,
1673             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
1674             .outputs = {21},
1675         },
1676         {
1677             .type = OperationType::FULLY_CONNECTED,
1678             .inputs = {21, 22, 23, 24},
1679             .outputs = {25},
1680         },
1681         {
1682             .type = OperationType::FULLY_CONNECTED,
1683             .inputs = {21, 26, 27, 28},
1684             .outputs = {29},
1685         },
1686         {
1687             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
1688             .inputs = {12, 25, 13, 3},
1689             .outputs = {30},
1690         },
1691         {
1692             .type = OperationType::BOX_WITH_NMS_LIMIT,
1693             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
1694             .outputs = {37, 38, 39, 40},
1695         }
1696     };
1697 
1698     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
1699     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
1700     std::vector<uint8_t> operandValues = {
1701       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 100, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
1702     };
1703     const std::vector<hidl_memory> pools = {};
1704 
1705     return {
1706         .operands = operands,
1707         .operations = operations,
1708         .inputIndexes = inputIndexes,
1709         .outputIndexes = outputIndexes,
1710         .operandValues = operandValues,
1711         .pools = pools,
1712     };
1713 }
1714 
is_ignored_zero_sized_quant8(int i)1715 inline bool is_ignored_zero_sized_quant8(int i) {
1716   static std::set<int> ignore = {};
1717   return ignore.find(i) != ignore.end();
1718 }
1719 
1720 // Create the model
createTestModel_zero_sized_dynamic_output_shape()1721 Model createTestModel_zero_sized_dynamic_output_shape() {
1722     const std::vector<Operand> operands = {
1723         {
1724             .type = OperandType::TENSOR_FLOAT32,
1725             .dimensions = {1, 1, 1, 1},
1726             .numberOfConsumers = 1,
1727             .scale = 0.0f,
1728             .zeroPoint = 0,
1729             .lifetime = OperandLifeTime::MODEL_INPUT,
1730             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1731         },
1732         {
1733             .type = OperandType::TENSOR_FLOAT32,
1734             .dimensions = {1, 1, 1, 4},
1735             .numberOfConsumers = 1,
1736             .scale = 0.0f,
1737             .zeroPoint = 0,
1738             .lifetime = OperandLifeTime::MODEL_INPUT,
1739             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1740         },
1741         {
1742             .type = OperandType::TENSOR_FLOAT32,
1743             .dimensions = {1, 4},
1744             .numberOfConsumers = 1,
1745             .scale = 0.0f,
1746             .zeroPoint = 0,
1747             .lifetime = OperandLifeTime::MODEL_INPUT,
1748             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1749         },
1750         {
1751             .type = OperandType::TENSOR_FLOAT32,
1752             .dimensions = {1, 2},
1753             .numberOfConsumers = 2,
1754             .scale = 0.0f,
1755             .zeroPoint = 0,
1756             .lifetime = OperandLifeTime::MODEL_INPUT,
1757             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1758         },
1759         {
1760             .type = OperandType::FLOAT32,
1761             .dimensions = {},
1762             .numberOfConsumers = 1,
1763             .scale = 0.0f,
1764             .zeroPoint = 0,
1765             .lifetime = OperandLifeTime::CONSTANT_COPY,
1766             .location = {.poolIndex = 0, .offset = 0, .length = 4},
1767         },
1768         {
1769             .type = OperandType::FLOAT32,
1770             .dimensions = {},
1771             .numberOfConsumers = 1,
1772             .scale = 0.0f,
1773             .zeroPoint = 0,
1774             .lifetime = OperandLifeTime::CONSTANT_COPY,
1775             .location = {.poolIndex = 0, .offset = 4, .length = 4},
1776         },
1777         {
1778             .type = OperandType::INT32,
1779             .dimensions = {},
1780             .numberOfConsumers = 1,
1781             .scale = 0.0f,
1782             .zeroPoint = 0,
1783             .lifetime = OperandLifeTime::CONSTANT_COPY,
1784             .location = {.poolIndex = 0, .offset = 8, .length = 4},
1785         },
1786         {
1787             .type = OperandType::INT32,
1788             .dimensions = {},
1789             .numberOfConsumers = 1,
1790             .scale = 0.0f,
1791             .zeroPoint = 0,
1792             .lifetime = OperandLifeTime::CONSTANT_COPY,
1793             .location = {.poolIndex = 0, .offset = 12, .length = 4},
1794         },
1795         {
1796             .type = OperandType::FLOAT32,
1797             .dimensions = {},
1798             .numberOfConsumers = 1,
1799             .scale = 0.0f,
1800             .zeroPoint = 0,
1801             .lifetime = OperandLifeTime::CONSTANT_COPY,
1802             .location = {.poolIndex = 0, .offset = 16, .length = 4},
1803         },
1804         {
1805             .type = OperandType::FLOAT32,
1806             .dimensions = {},
1807             .numberOfConsumers = 1,
1808             .scale = 0.0f,
1809             .zeroPoint = 0,
1810             .lifetime = OperandLifeTime::CONSTANT_COPY,
1811             .location = {.poolIndex = 0, .offset = 20, .length = 4},
1812         },
1813         {
1814             .type = OperandType::BOOL,
1815             .dimensions = {},
1816             .numberOfConsumers = 2,
1817             .scale = 0.0f,
1818             .zeroPoint = 0,
1819             .lifetime = OperandLifeTime::CONSTANT_COPY,
1820             .location = {.poolIndex = 0, .offset = 24, .length = 1},
1821         },
1822         {
1823             .type = OperandType::TENSOR_FLOAT32,
1824             .dimensions = {0},
1825             .numberOfConsumers = 0,
1826             .scale = 0.0f,
1827             .zeroPoint = 0,
1828             .lifetime = OperandLifeTime::MODEL_OUTPUT,
1829             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1830         },
1831         {
1832             .type = OperandType::TENSOR_FLOAT32,
1833             .dimensions = {0, 4},
1834             .numberOfConsumers = 2,
1835             .scale = 0.0f,
1836             .zeroPoint = 0,
1837             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1838             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1839         },
1840         {
1841             .type = OperandType::TENSOR_INT32,
1842             .dimensions = {0},
1843             .numberOfConsumers = 3,
1844             .scale = 0.0f,
1845             .zeroPoint = 0,
1846             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1847             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1848         },
1849         {
1850             .type = OperandType::TENSOR_FLOAT32,
1851             .dimensions = {1, 1, 1, 1},
1852             .numberOfConsumers = 1,
1853             .scale = 0.0f,
1854             .zeroPoint = 0,
1855             .lifetime = OperandLifeTime::MODEL_INPUT,
1856             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1857         },
1858         {
1859             .type = OperandType::INT32,
1860             .dimensions = {},
1861             .numberOfConsumers = 1,
1862             .scale = 0.0f,
1863             .zeroPoint = 0,
1864             .lifetime = OperandLifeTime::CONSTANT_COPY,
1865             .location = {.poolIndex = 0, .offset = 25, .length = 4},
1866         },
1867         {
1868             .type = OperandType::INT32,
1869             .dimensions = {},
1870             .numberOfConsumers = 1,
1871             .scale = 0.0f,
1872             .zeroPoint = 0,
1873             .lifetime = OperandLifeTime::CONSTANT_COPY,
1874             .location = {.poolIndex = 0, .offset = 29, .length = 4},
1875         },
1876         {
1877             .type = OperandType::FLOAT32,
1878             .dimensions = {},
1879             .numberOfConsumers = 1,
1880             .scale = 0.0f,
1881             .zeroPoint = 0,
1882             .lifetime = OperandLifeTime::CONSTANT_COPY,
1883             .location = {.poolIndex = 0, .offset = 33, .length = 4},
1884         },
1885         {
1886             .type = OperandType::FLOAT32,
1887             .dimensions = {},
1888             .numberOfConsumers = 1,
1889             .scale = 0.0f,
1890             .zeroPoint = 0,
1891             .lifetime = OperandLifeTime::CONSTANT_COPY,
1892             .location = {.poolIndex = 0, .offset = 37, .length = 4},
1893         },
1894         {
1895             .type = OperandType::INT32,
1896             .dimensions = {},
1897             .numberOfConsumers = 1,
1898             .scale = 0.0f,
1899             .zeroPoint = 0,
1900             .lifetime = OperandLifeTime::CONSTANT_COPY,
1901             .location = {.poolIndex = 0, .offset = 41, .length = 4},
1902         },
1903         {
1904             .type = OperandType::INT32,
1905             .dimensions = {},
1906             .numberOfConsumers = 1,
1907             .scale = 0.0f,
1908             .zeroPoint = 0,
1909             .lifetime = OperandLifeTime::CONSTANT_COPY,
1910             .location = {.poolIndex = 0, .offset = 45, .length = 4},
1911         },
1912         {
1913             .type = OperandType::TENSOR_FLOAT32,
1914             .dimensions = {0, 2, 2, 1},
1915             .numberOfConsumers = 2,
1916             .scale = 0.0f,
1917             .zeroPoint = 0,
1918             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1919             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1920         },
1921         {
1922             .type = OperandType::TENSOR_FLOAT32,
1923             .dimensions = {8, 4},
1924             .numberOfConsumers = 1,
1925             .scale = 0.0f,
1926             .zeroPoint = 0,
1927             .lifetime = OperandLifeTime::CONSTANT_COPY,
1928             .location = {.poolIndex = 0, .offset = 49, .length = 128},
1929         },
1930         {
1931             .type = OperandType::TENSOR_FLOAT32,
1932             .dimensions = {8},
1933             .numberOfConsumers = 1,
1934             .scale = 0.0f,
1935             .zeroPoint = 0,
1936             .lifetime = OperandLifeTime::CONSTANT_COPY,
1937             .location = {.poolIndex = 0, .offset = 177, .length = 32},
1938         },
1939         {
1940             .type = OperandType::INT32,
1941             .dimensions = {},
1942             .numberOfConsumers = 1,
1943             .scale = 0.0f,
1944             .zeroPoint = 0,
1945             .lifetime = OperandLifeTime::CONSTANT_COPY,
1946             .location = {.poolIndex = 0, .offset = 209, .length = 4},
1947         },
1948         {
1949             .type = OperandType::TENSOR_FLOAT32,
1950             .dimensions = {0, 8},
1951             .numberOfConsumers = 1,
1952             .scale = 0.0f,
1953             .zeroPoint = 0,
1954             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1955             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1956         },
1957         {
1958             .type = OperandType::TENSOR_FLOAT32,
1959             .dimensions = {2, 4},
1960             .numberOfConsumers = 1,
1961             .scale = 0.0f,
1962             .zeroPoint = 0,
1963             .lifetime = OperandLifeTime::CONSTANT_COPY,
1964             .location = {.poolIndex = 0, .offset = 213, .length = 32},
1965         },
1966         {
1967             .type = OperandType::TENSOR_FLOAT32,
1968             .dimensions = {2},
1969             .numberOfConsumers = 1,
1970             .scale = 0.0f,
1971             .zeroPoint = 0,
1972             .lifetime = OperandLifeTime::CONSTANT_COPY,
1973             .location = {.poolIndex = 0, .offset = 245, .length = 8},
1974         },
1975         {
1976             .type = OperandType::INT32,
1977             .dimensions = {},
1978             .numberOfConsumers = 1,
1979             .scale = 0.0f,
1980             .zeroPoint = 0,
1981             .lifetime = OperandLifeTime::CONSTANT_COPY,
1982             .location = {.poolIndex = 0, .offset = 253, .length = 4},
1983         },
1984         {
1985             .type = OperandType::TENSOR_FLOAT32,
1986             .dimensions = {0, 2},
1987             .numberOfConsumers = 1,
1988             .scale = 0.0f,
1989             .zeroPoint = 0,
1990             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
1991             .location = {.poolIndex = 0, .offset = 0, .length = 0},
1992         },
1993         {
1994             .type = OperandType::TENSOR_FLOAT32,
1995             .dimensions = {0, 8},
1996             .numberOfConsumers = 1,
1997             .scale = 0.0f,
1998             .zeroPoint = 0,
1999             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2000             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2001         },
2002         {
2003             .type = OperandType::FLOAT32,
2004             .dimensions = {},
2005             .numberOfConsumers = 1,
2006             .scale = 0.0f,
2007             .zeroPoint = 0,
2008             .lifetime = OperandLifeTime::CONSTANT_COPY,
2009             .location = {.poolIndex = 0, .offset = 257, .length = 4},
2010         },
2011         {
2012             .type = OperandType::INT32,
2013             .dimensions = {},
2014             .numberOfConsumers = 1,
2015             .scale = 0.0f,
2016             .zeroPoint = 0,
2017             .lifetime = OperandLifeTime::CONSTANT_COPY,
2018             .location = {.poolIndex = 0, .offset = 261, .length = 4},
2019         },
2020         {
2021             .type = OperandType::INT32,
2022             .dimensions = {},
2023             .numberOfConsumers = 1,
2024             .scale = 0.0f,
2025             .zeroPoint = 0,
2026             .lifetime = OperandLifeTime::CONSTANT_COPY,
2027             .location = {.poolIndex = 0, .offset = 265, .length = 4},
2028         },
2029         {
2030             .type = OperandType::FLOAT32,
2031             .dimensions = {},
2032             .numberOfConsumers = 1,
2033             .scale = 0.0f,
2034             .zeroPoint = 0,
2035             .lifetime = OperandLifeTime::CONSTANT_COPY,
2036             .location = {.poolIndex = 0, .offset = 269, .length = 4},
2037         },
2038         {
2039             .type = OperandType::FLOAT32,
2040             .dimensions = {},
2041             .numberOfConsumers = 1,
2042             .scale = 0.0f,
2043             .zeroPoint = 0,
2044             .lifetime = OperandLifeTime::CONSTANT_COPY,
2045             .location = {.poolIndex = 0, .offset = 273, .length = 4},
2046         },
2047         {
2048             .type = OperandType::FLOAT32,
2049             .dimensions = {},
2050             .numberOfConsumers = 1,
2051             .scale = 0.0f,
2052             .zeroPoint = 0,
2053             .lifetime = OperandLifeTime::CONSTANT_COPY,
2054             .location = {.poolIndex = 0, .offset = 277, .length = 4},
2055         },
2056         {
2057             .type = OperandType::TENSOR_FLOAT32,
2058             .dimensions = {0},
2059             .numberOfConsumers = 0,
2060             .scale = 0.0f,
2061             .zeroPoint = 0,
2062             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2063             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2064         },
2065         {
2066             .type = OperandType::TENSOR_FLOAT32,
2067             .dimensions = {0, 0},
2068             .numberOfConsumers = 0,
2069             .scale = 0.0f,
2070             .zeroPoint = 0,
2071             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2072             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2073         },
2074         {
2075             .type = OperandType::TENSOR_INT32,
2076             .dimensions = {0},
2077             .numberOfConsumers = 0,
2078             .scale = 0.0f,
2079             .zeroPoint = 0,
2080             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2081             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2082         },
2083         {
2084             .type = OperandType::TENSOR_INT32,
2085             .dimensions = {0},
2086             .numberOfConsumers = 0,
2087             .scale = 0.0f,
2088             .zeroPoint = 0,
2089             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2090             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2091         }
2092     };
2093 
2094     const std::vector<Operation> operations = {
2095         {
2096             .type = OperationType::GENERATE_PROPOSALS,
2097             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
2098             .outputs = {11, 12, 13},
2099         },
2100         {
2101             .type = OperationType::ROI_ALIGN,
2102             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
2103             .outputs = {21},
2104         },
2105         {
2106             .type = OperationType::FULLY_CONNECTED,
2107             .inputs = {21, 22, 23, 24},
2108             .outputs = {25},
2109         },
2110         {
2111             .type = OperationType::FULLY_CONNECTED,
2112             .inputs = {21, 26, 27, 28},
2113             .outputs = {29},
2114         },
2115         {
2116             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
2117             .inputs = {12, 25, 13, 3},
2118             .outputs = {30},
2119         },
2120         {
2121             .type = OperationType::BOX_WITH_NMS_LIMIT,
2122             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
2123             .outputs = {37, 38, 39, 40},
2124         }
2125     };
2126 
2127     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
2128     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
2129     std::vector<uint8_t> operandValues = {
2130       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
2131     };
2132     const std::vector<hidl_memory> pools = {};
2133 
2134     return {
2135         .operands = operands,
2136         .operations = operations,
2137         .inputIndexes = inputIndexes,
2138         .outputIndexes = outputIndexes,
2139         .operandValues = operandValues,
2140         .pools = pools,
2141     };
2142 }
2143 
is_ignored_zero_sized_dynamic_output_shape(int i)2144 inline bool is_ignored_zero_sized_dynamic_output_shape(int i) {
2145   static std::set<int> ignore = {};
2146   return ignore.find(i) != ignore.end();
2147 }
2148 
2149 // Create the model
createTestModel_zero_sized_dynamic_output_shape_relaxed()2150 Model createTestModel_zero_sized_dynamic_output_shape_relaxed() {
2151     const std::vector<Operand> operands = {
2152         {
2153             .type = OperandType::TENSOR_FLOAT32,
2154             .dimensions = {1, 1, 1, 1},
2155             .numberOfConsumers = 1,
2156             .scale = 0.0f,
2157             .zeroPoint = 0,
2158             .lifetime = OperandLifeTime::MODEL_INPUT,
2159             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2160         },
2161         {
2162             .type = OperandType::TENSOR_FLOAT32,
2163             .dimensions = {1, 1, 1, 4},
2164             .numberOfConsumers = 1,
2165             .scale = 0.0f,
2166             .zeroPoint = 0,
2167             .lifetime = OperandLifeTime::MODEL_INPUT,
2168             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2169         },
2170         {
2171             .type = OperandType::TENSOR_FLOAT32,
2172             .dimensions = {1, 4},
2173             .numberOfConsumers = 1,
2174             .scale = 0.0f,
2175             .zeroPoint = 0,
2176             .lifetime = OperandLifeTime::MODEL_INPUT,
2177             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2178         },
2179         {
2180             .type = OperandType::TENSOR_FLOAT32,
2181             .dimensions = {1, 2},
2182             .numberOfConsumers = 2,
2183             .scale = 0.0f,
2184             .zeroPoint = 0,
2185             .lifetime = OperandLifeTime::MODEL_INPUT,
2186             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2187         },
2188         {
2189             .type = OperandType::FLOAT32,
2190             .dimensions = {},
2191             .numberOfConsumers = 1,
2192             .scale = 0.0f,
2193             .zeroPoint = 0,
2194             .lifetime = OperandLifeTime::CONSTANT_COPY,
2195             .location = {.poolIndex = 0, .offset = 0, .length = 4},
2196         },
2197         {
2198             .type = OperandType::FLOAT32,
2199             .dimensions = {},
2200             .numberOfConsumers = 1,
2201             .scale = 0.0f,
2202             .zeroPoint = 0,
2203             .lifetime = OperandLifeTime::CONSTANT_COPY,
2204             .location = {.poolIndex = 0, .offset = 4, .length = 4},
2205         },
2206         {
2207             .type = OperandType::INT32,
2208             .dimensions = {},
2209             .numberOfConsumers = 1,
2210             .scale = 0.0f,
2211             .zeroPoint = 0,
2212             .lifetime = OperandLifeTime::CONSTANT_COPY,
2213             .location = {.poolIndex = 0, .offset = 8, .length = 4},
2214         },
2215         {
2216             .type = OperandType::INT32,
2217             .dimensions = {},
2218             .numberOfConsumers = 1,
2219             .scale = 0.0f,
2220             .zeroPoint = 0,
2221             .lifetime = OperandLifeTime::CONSTANT_COPY,
2222             .location = {.poolIndex = 0, .offset = 12, .length = 4},
2223         },
2224         {
2225             .type = OperandType::FLOAT32,
2226             .dimensions = {},
2227             .numberOfConsumers = 1,
2228             .scale = 0.0f,
2229             .zeroPoint = 0,
2230             .lifetime = OperandLifeTime::CONSTANT_COPY,
2231             .location = {.poolIndex = 0, .offset = 16, .length = 4},
2232         },
2233         {
2234             .type = OperandType::FLOAT32,
2235             .dimensions = {},
2236             .numberOfConsumers = 1,
2237             .scale = 0.0f,
2238             .zeroPoint = 0,
2239             .lifetime = OperandLifeTime::CONSTANT_COPY,
2240             .location = {.poolIndex = 0, .offset = 20, .length = 4},
2241         },
2242         {
2243             .type = OperandType::BOOL,
2244             .dimensions = {},
2245             .numberOfConsumers = 2,
2246             .scale = 0.0f,
2247             .zeroPoint = 0,
2248             .lifetime = OperandLifeTime::CONSTANT_COPY,
2249             .location = {.poolIndex = 0, .offset = 24, .length = 1},
2250         },
2251         {
2252             .type = OperandType::TENSOR_FLOAT32,
2253             .dimensions = {0},
2254             .numberOfConsumers = 0,
2255             .scale = 0.0f,
2256             .zeroPoint = 0,
2257             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2258             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2259         },
2260         {
2261             .type = OperandType::TENSOR_FLOAT32,
2262             .dimensions = {0, 4},
2263             .numberOfConsumers = 2,
2264             .scale = 0.0f,
2265             .zeroPoint = 0,
2266             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2267             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2268         },
2269         {
2270             .type = OperandType::TENSOR_INT32,
2271             .dimensions = {0},
2272             .numberOfConsumers = 3,
2273             .scale = 0.0f,
2274             .zeroPoint = 0,
2275             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2276             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2277         },
2278         {
2279             .type = OperandType::TENSOR_FLOAT32,
2280             .dimensions = {1, 1, 1, 1},
2281             .numberOfConsumers = 1,
2282             .scale = 0.0f,
2283             .zeroPoint = 0,
2284             .lifetime = OperandLifeTime::MODEL_INPUT,
2285             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2286         },
2287         {
2288             .type = OperandType::INT32,
2289             .dimensions = {},
2290             .numberOfConsumers = 1,
2291             .scale = 0.0f,
2292             .zeroPoint = 0,
2293             .lifetime = OperandLifeTime::CONSTANT_COPY,
2294             .location = {.poolIndex = 0, .offset = 25, .length = 4},
2295         },
2296         {
2297             .type = OperandType::INT32,
2298             .dimensions = {},
2299             .numberOfConsumers = 1,
2300             .scale = 0.0f,
2301             .zeroPoint = 0,
2302             .lifetime = OperandLifeTime::CONSTANT_COPY,
2303             .location = {.poolIndex = 0, .offset = 29, .length = 4},
2304         },
2305         {
2306             .type = OperandType::FLOAT32,
2307             .dimensions = {},
2308             .numberOfConsumers = 1,
2309             .scale = 0.0f,
2310             .zeroPoint = 0,
2311             .lifetime = OperandLifeTime::CONSTANT_COPY,
2312             .location = {.poolIndex = 0, .offset = 33, .length = 4},
2313         },
2314         {
2315             .type = OperandType::FLOAT32,
2316             .dimensions = {},
2317             .numberOfConsumers = 1,
2318             .scale = 0.0f,
2319             .zeroPoint = 0,
2320             .lifetime = OperandLifeTime::CONSTANT_COPY,
2321             .location = {.poolIndex = 0, .offset = 37, .length = 4},
2322         },
2323         {
2324             .type = OperandType::INT32,
2325             .dimensions = {},
2326             .numberOfConsumers = 1,
2327             .scale = 0.0f,
2328             .zeroPoint = 0,
2329             .lifetime = OperandLifeTime::CONSTANT_COPY,
2330             .location = {.poolIndex = 0, .offset = 41, .length = 4},
2331         },
2332         {
2333             .type = OperandType::INT32,
2334             .dimensions = {},
2335             .numberOfConsumers = 1,
2336             .scale = 0.0f,
2337             .zeroPoint = 0,
2338             .lifetime = OperandLifeTime::CONSTANT_COPY,
2339             .location = {.poolIndex = 0, .offset = 45, .length = 4},
2340         },
2341         {
2342             .type = OperandType::TENSOR_FLOAT32,
2343             .dimensions = {0, 2, 2, 1},
2344             .numberOfConsumers = 2,
2345             .scale = 0.0f,
2346             .zeroPoint = 0,
2347             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2348             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2349         },
2350         {
2351             .type = OperandType::TENSOR_FLOAT32,
2352             .dimensions = {8, 4},
2353             .numberOfConsumers = 1,
2354             .scale = 0.0f,
2355             .zeroPoint = 0,
2356             .lifetime = OperandLifeTime::CONSTANT_COPY,
2357             .location = {.poolIndex = 0, .offset = 49, .length = 128},
2358         },
2359         {
2360             .type = OperandType::TENSOR_FLOAT32,
2361             .dimensions = {8},
2362             .numberOfConsumers = 1,
2363             .scale = 0.0f,
2364             .zeroPoint = 0,
2365             .lifetime = OperandLifeTime::CONSTANT_COPY,
2366             .location = {.poolIndex = 0, .offset = 177, .length = 32},
2367         },
2368         {
2369             .type = OperandType::INT32,
2370             .dimensions = {},
2371             .numberOfConsumers = 1,
2372             .scale = 0.0f,
2373             .zeroPoint = 0,
2374             .lifetime = OperandLifeTime::CONSTANT_COPY,
2375             .location = {.poolIndex = 0, .offset = 209, .length = 4},
2376         },
2377         {
2378             .type = OperandType::TENSOR_FLOAT32,
2379             .dimensions = {0, 8},
2380             .numberOfConsumers = 1,
2381             .scale = 0.0f,
2382             .zeroPoint = 0,
2383             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2384             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2385         },
2386         {
2387             .type = OperandType::TENSOR_FLOAT32,
2388             .dimensions = {2, 4},
2389             .numberOfConsumers = 1,
2390             .scale = 0.0f,
2391             .zeroPoint = 0,
2392             .lifetime = OperandLifeTime::CONSTANT_COPY,
2393             .location = {.poolIndex = 0, .offset = 213, .length = 32},
2394         },
2395         {
2396             .type = OperandType::TENSOR_FLOAT32,
2397             .dimensions = {2},
2398             .numberOfConsumers = 1,
2399             .scale = 0.0f,
2400             .zeroPoint = 0,
2401             .lifetime = OperandLifeTime::CONSTANT_COPY,
2402             .location = {.poolIndex = 0, .offset = 245, .length = 8},
2403         },
2404         {
2405             .type = OperandType::INT32,
2406             .dimensions = {},
2407             .numberOfConsumers = 1,
2408             .scale = 0.0f,
2409             .zeroPoint = 0,
2410             .lifetime = OperandLifeTime::CONSTANT_COPY,
2411             .location = {.poolIndex = 0, .offset = 253, .length = 4},
2412         },
2413         {
2414             .type = OperandType::TENSOR_FLOAT32,
2415             .dimensions = {0, 2},
2416             .numberOfConsumers = 1,
2417             .scale = 0.0f,
2418             .zeroPoint = 0,
2419             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2420             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2421         },
2422         {
2423             .type = OperandType::TENSOR_FLOAT32,
2424             .dimensions = {0, 8},
2425             .numberOfConsumers = 1,
2426             .scale = 0.0f,
2427             .zeroPoint = 0,
2428             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2429             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2430         },
2431         {
2432             .type = OperandType::FLOAT32,
2433             .dimensions = {},
2434             .numberOfConsumers = 1,
2435             .scale = 0.0f,
2436             .zeroPoint = 0,
2437             .lifetime = OperandLifeTime::CONSTANT_COPY,
2438             .location = {.poolIndex = 0, .offset = 257, .length = 4},
2439         },
2440         {
2441             .type = OperandType::INT32,
2442             .dimensions = {},
2443             .numberOfConsumers = 1,
2444             .scale = 0.0f,
2445             .zeroPoint = 0,
2446             .lifetime = OperandLifeTime::CONSTANT_COPY,
2447             .location = {.poolIndex = 0, .offset = 261, .length = 4},
2448         },
2449         {
2450             .type = OperandType::INT32,
2451             .dimensions = {},
2452             .numberOfConsumers = 1,
2453             .scale = 0.0f,
2454             .zeroPoint = 0,
2455             .lifetime = OperandLifeTime::CONSTANT_COPY,
2456             .location = {.poolIndex = 0, .offset = 265, .length = 4},
2457         },
2458         {
2459             .type = OperandType::FLOAT32,
2460             .dimensions = {},
2461             .numberOfConsumers = 1,
2462             .scale = 0.0f,
2463             .zeroPoint = 0,
2464             .lifetime = OperandLifeTime::CONSTANT_COPY,
2465             .location = {.poolIndex = 0, .offset = 269, .length = 4},
2466         },
2467         {
2468             .type = OperandType::FLOAT32,
2469             .dimensions = {},
2470             .numberOfConsumers = 1,
2471             .scale = 0.0f,
2472             .zeroPoint = 0,
2473             .lifetime = OperandLifeTime::CONSTANT_COPY,
2474             .location = {.poolIndex = 0, .offset = 273, .length = 4},
2475         },
2476         {
2477             .type = OperandType::FLOAT32,
2478             .dimensions = {},
2479             .numberOfConsumers = 1,
2480             .scale = 0.0f,
2481             .zeroPoint = 0,
2482             .lifetime = OperandLifeTime::CONSTANT_COPY,
2483             .location = {.poolIndex = 0, .offset = 277, .length = 4},
2484         },
2485         {
2486             .type = OperandType::TENSOR_FLOAT32,
2487             .dimensions = {0},
2488             .numberOfConsumers = 0,
2489             .scale = 0.0f,
2490             .zeroPoint = 0,
2491             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2492             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2493         },
2494         {
2495             .type = OperandType::TENSOR_FLOAT32,
2496             .dimensions = {0, 0},
2497             .numberOfConsumers = 0,
2498             .scale = 0.0f,
2499             .zeroPoint = 0,
2500             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2501             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2502         },
2503         {
2504             .type = OperandType::TENSOR_INT32,
2505             .dimensions = {0},
2506             .numberOfConsumers = 0,
2507             .scale = 0.0f,
2508             .zeroPoint = 0,
2509             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2510             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2511         },
2512         {
2513             .type = OperandType::TENSOR_INT32,
2514             .dimensions = {0},
2515             .numberOfConsumers = 0,
2516             .scale = 0.0f,
2517             .zeroPoint = 0,
2518             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2519             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2520         }
2521     };
2522 
2523     const std::vector<Operation> operations = {
2524         {
2525             .type = OperationType::GENERATE_PROPOSALS,
2526             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
2527             .outputs = {11, 12, 13},
2528         },
2529         {
2530             .type = OperationType::ROI_ALIGN,
2531             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
2532             .outputs = {21},
2533         },
2534         {
2535             .type = OperationType::FULLY_CONNECTED,
2536             .inputs = {21, 22, 23, 24},
2537             .outputs = {25},
2538         },
2539         {
2540             .type = OperationType::FULLY_CONNECTED,
2541             .inputs = {21, 26, 27, 28},
2542             .outputs = {29},
2543         },
2544         {
2545             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
2546             .inputs = {12, 25, 13, 3},
2547             .outputs = {30},
2548         },
2549         {
2550             .type = OperationType::BOX_WITH_NMS_LIMIT,
2551             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
2552             .outputs = {37, 38, 39, 40},
2553         }
2554     };
2555 
2556     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
2557     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
2558     std::vector<uint8_t> operandValues = {
2559       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
2560     };
2561     const std::vector<hidl_memory> pools = {};
2562 
2563     return {
2564         .operands = operands,
2565         .operations = operations,
2566         .inputIndexes = inputIndexes,
2567         .outputIndexes = outputIndexes,
2568         .operandValues = operandValues,
2569         .pools = pools,
2570         .relaxComputationFloat32toFloat16 = true,
2571     };
2572 }
2573 
is_ignored_zero_sized_dynamic_output_shape_relaxed(int i)2574 inline bool is_ignored_zero_sized_dynamic_output_shape_relaxed(int i) {
2575   static std::set<int> ignore = {};
2576   return ignore.find(i) != ignore.end();
2577 }
2578 
2579 // Create the model
createTestModel_zero_sized_dynamic_output_shape_float16()2580 Model createTestModel_zero_sized_dynamic_output_shape_float16() {
2581     const std::vector<Operand> operands = {
2582         {
2583             .type = OperandType::TENSOR_FLOAT16,
2584             .dimensions = {1, 1, 1, 1},
2585             .numberOfConsumers = 1,
2586             .scale = 0.0f,
2587             .zeroPoint = 0,
2588             .lifetime = OperandLifeTime::MODEL_INPUT,
2589             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2590         },
2591         {
2592             .type = OperandType::TENSOR_FLOAT16,
2593             .dimensions = {1, 1, 1, 4},
2594             .numberOfConsumers = 1,
2595             .scale = 0.0f,
2596             .zeroPoint = 0,
2597             .lifetime = OperandLifeTime::MODEL_INPUT,
2598             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2599         },
2600         {
2601             .type = OperandType::TENSOR_FLOAT16,
2602             .dimensions = {1, 4},
2603             .numberOfConsumers = 1,
2604             .scale = 0.0f,
2605             .zeroPoint = 0,
2606             .lifetime = OperandLifeTime::MODEL_INPUT,
2607             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2608         },
2609         {
2610             .type = OperandType::TENSOR_FLOAT16,
2611             .dimensions = {1, 2},
2612             .numberOfConsumers = 2,
2613             .scale = 0.0f,
2614             .zeroPoint = 0,
2615             .lifetime = OperandLifeTime::MODEL_INPUT,
2616             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2617         },
2618         {
2619             .type = OperandType::FLOAT16,
2620             .dimensions = {},
2621             .numberOfConsumers = 1,
2622             .scale = 0.0f,
2623             .zeroPoint = 0,
2624             .lifetime = OperandLifeTime::CONSTANT_COPY,
2625             .location = {.poolIndex = 0, .offset = 0, .length = 2},
2626         },
2627         {
2628             .type = OperandType::FLOAT16,
2629             .dimensions = {},
2630             .numberOfConsumers = 1,
2631             .scale = 0.0f,
2632             .zeroPoint = 0,
2633             .lifetime = OperandLifeTime::CONSTANT_COPY,
2634             .location = {.poolIndex = 0, .offset = 2, .length = 2},
2635         },
2636         {
2637             .type = OperandType::INT32,
2638             .dimensions = {},
2639             .numberOfConsumers = 1,
2640             .scale = 0.0f,
2641             .zeroPoint = 0,
2642             .lifetime = OperandLifeTime::CONSTANT_COPY,
2643             .location = {.poolIndex = 0, .offset = 4, .length = 4},
2644         },
2645         {
2646             .type = OperandType::INT32,
2647             .dimensions = {},
2648             .numberOfConsumers = 1,
2649             .scale = 0.0f,
2650             .zeroPoint = 0,
2651             .lifetime = OperandLifeTime::CONSTANT_COPY,
2652             .location = {.poolIndex = 0, .offset = 8, .length = 4},
2653         },
2654         {
2655             .type = OperandType::FLOAT16,
2656             .dimensions = {},
2657             .numberOfConsumers = 1,
2658             .scale = 0.0f,
2659             .zeroPoint = 0,
2660             .lifetime = OperandLifeTime::CONSTANT_COPY,
2661             .location = {.poolIndex = 0, .offset = 12, .length = 2},
2662         },
2663         {
2664             .type = OperandType::FLOAT16,
2665             .dimensions = {},
2666             .numberOfConsumers = 1,
2667             .scale = 0.0f,
2668             .zeroPoint = 0,
2669             .lifetime = OperandLifeTime::CONSTANT_COPY,
2670             .location = {.poolIndex = 0, .offset = 14, .length = 2},
2671         },
2672         {
2673             .type = OperandType::BOOL,
2674             .dimensions = {},
2675             .numberOfConsumers = 2,
2676             .scale = 0.0f,
2677             .zeroPoint = 0,
2678             .lifetime = OperandLifeTime::CONSTANT_COPY,
2679             .location = {.poolIndex = 0, .offset = 16, .length = 1},
2680         },
2681         {
2682             .type = OperandType::TENSOR_FLOAT16,
2683             .dimensions = {0},
2684             .numberOfConsumers = 0,
2685             .scale = 0.0f,
2686             .zeroPoint = 0,
2687             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2688             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2689         },
2690         {
2691             .type = OperandType::TENSOR_FLOAT16,
2692             .dimensions = {0, 4},
2693             .numberOfConsumers = 2,
2694             .scale = 0.0f,
2695             .zeroPoint = 0,
2696             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2697             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2698         },
2699         {
2700             .type = OperandType::TENSOR_INT32,
2701             .dimensions = {0},
2702             .numberOfConsumers = 3,
2703             .scale = 0.0f,
2704             .zeroPoint = 0,
2705             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2706             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2707         },
2708         {
2709             .type = OperandType::TENSOR_FLOAT16,
2710             .dimensions = {1, 1, 1, 1},
2711             .numberOfConsumers = 1,
2712             .scale = 0.0f,
2713             .zeroPoint = 0,
2714             .lifetime = OperandLifeTime::MODEL_INPUT,
2715             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2716         },
2717         {
2718             .type = OperandType::INT32,
2719             .dimensions = {},
2720             .numberOfConsumers = 1,
2721             .scale = 0.0f,
2722             .zeroPoint = 0,
2723             .lifetime = OperandLifeTime::CONSTANT_COPY,
2724             .location = {.poolIndex = 0, .offset = 17, .length = 4},
2725         },
2726         {
2727             .type = OperandType::INT32,
2728             .dimensions = {},
2729             .numberOfConsumers = 1,
2730             .scale = 0.0f,
2731             .zeroPoint = 0,
2732             .lifetime = OperandLifeTime::CONSTANT_COPY,
2733             .location = {.poolIndex = 0, .offset = 21, .length = 4},
2734         },
2735         {
2736             .type = OperandType::FLOAT16,
2737             .dimensions = {},
2738             .numberOfConsumers = 1,
2739             .scale = 0.0f,
2740             .zeroPoint = 0,
2741             .lifetime = OperandLifeTime::CONSTANT_COPY,
2742             .location = {.poolIndex = 0, .offset = 25, .length = 2},
2743         },
2744         {
2745             .type = OperandType::FLOAT16,
2746             .dimensions = {},
2747             .numberOfConsumers = 1,
2748             .scale = 0.0f,
2749             .zeroPoint = 0,
2750             .lifetime = OperandLifeTime::CONSTANT_COPY,
2751             .location = {.poolIndex = 0, .offset = 27, .length = 2},
2752         },
2753         {
2754             .type = OperandType::INT32,
2755             .dimensions = {},
2756             .numberOfConsumers = 1,
2757             .scale = 0.0f,
2758             .zeroPoint = 0,
2759             .lifetime = OperandLifeTime::CONSTANT_COPY,
2760             .location = {.poolIndex = 0, .offset = 29, .length = 4},
2761         },
2762         {
2763             .type = OperandType::INT32,
2764             .dimensions = {},
2765             .numberOfConsumers = 1,
2766             .scale = 0.0f,
2767             .zeroPoint = 0,
2768             .lifetime = OperandLifeTime::CONSTANT_COPY,
2769             .location = {.poolIndex = 0, .offset = 33, .length = 4},
2770         },
2771         {
2772             .type = OperandType::TENSOR_FLOAT16,
2773             .dimensions = {0, 2, 2, 1},
2774             .numberOfConsumers = 2,
2775             .scale = 0.0f,
2776             .zeroPoint = 0,
2777             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2778             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2779         },
2780         {
2781             .type = OperandType::TENSOR_FLOAT16,
2782             .dimensions = {8, 4},
2783             .numberOfConsumers = 1,
2784             .scale = 0.0f,
2785             .zeroPoint = 0,
2786             .lifetime = OperandLifeTime::CONSTANT_COPY,
2787             .location = {.poolIndex = 0, .offset = 37, .length = 64},
2788         },
2789         {
2790             .type = OperandType::TENSOR_FLOAT16,
2791             .dimensions = {8},
2792             .numberOfConsumers = 1,
2793             .scale = 0.0f,
2794             .zeroPoint = 0,
2795             .lifetime = OperandLifeTime::CONSTANT_COPY,
2796             .location = {.poolIndex = 0, .offset = 101, .length = 16},
2797         },
2798         {
2799             .type = OperandType::INT32,
2800             .dimensions = {},
2801             .numberOfConsumers = 1,
2802             .scale = 0.0f,
2803             .zeroPoint = 0,
2804             .lifetime = OperandLifeTime::CONSTANT_COPY,
2805             .location = {.poolIndex = 0, .offset = 117, .length = 4},
2806         },
2807         {
2808             .type = OperandType::TENSOR_FLOAT16,
2809             .dimensions = {0, 8},
2810             .numberOfConsumers = 1,
2811             .scale = 0.0f,
2812             .zeroPoint = 0,
2813             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2814             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2815         },
2816         {
2817             .type = OperandType::TENSOR_FLOAT16,
2818             .dimensions = {2, 4},
2819             .numberOfConsumers = 1,
2820             .scale = 0.0f,
2821             .zeroPoint = 0,
2822             .lifetime = OperandLifeTime::CONSTANT_COPY,
2823             .location = {.poolIndex = 0, .offset = 121, .length = 16},
2824         },
2825         {
2826             .type = OperandType::TENSOR_FLOAT16,
2827             .dimensions = {2},
2828             .numberOfConsumers = 1,
2829             .scale = 0.0f,
2830             .zeroPoint = 0,
2831             .lifetime = OperandLifeTime::CONSTANT_COPY,
2832             .location = {.poolIndex = 0, .offset = 137, .length = 4},
2833         },
2834         {
2835             .type = OperandType::INT32,
2836             .dimensions = {},
2837             .numberOfConsumers = 1,
2838             .scale = 0.0f,
2839             .zeroPoint = 0,
2840             .lifetime = OperandLifeTime::CONSTANT_COPY,
2841             .location = {.poolIndex = 0, .offset = 141, .length = 4},
2842         },
2843         {
2844             .type = OperandType::TENSOR_FLOAT16,
2845             .dimensions = {0, 2},
2846             .numberOfConsumers = 1,
2847             .scale = 0.0f,
2848             .zeroPoint = 0,
2849             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2850             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2851         },
2852         {
2853             .type = OperandType::TENSOR_FLOAT16,
2854             .dimensions = {0, 8},
2855             .numberOfConsumers = 1,
2856             .scale = 0.0f,
2857             .zeroPoint = 0,
2858             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
2859             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2860         },
2861         {
2862             .type = OperandType::FLOAT16,
2863             .dimensions = {},
2864             .numberOfConsumers = 1,
2865             .scale = 0.0f,
2866             .zeroPoint = 0,
2867             .lifetime = OperandLifeTime::CONSTANT_COPY,
2868             .location = {.poolIndex = 0, .offset = 145, .length = 2},
2869         },
2870         {
2871             .type = OperandType::INT32,
2872             .dimensions = {},
2873             .numberOfConsumers = 1,
2874             .scale = 0.0f,
2875             .zeroPoint = 0,
2876             .lifetime = OperandLifeTime::CONSTANT_COPY,
2877             .location = {.poolIndex = 0, .offset = 147, .length = 4},
2878         },
2879         {
2880             .type = OperandType::INT32,
2881             .dimensions = {},
2882             .numberOfConsumers = 1,
2883             .scale = 0.0f,
2884             .zeroPoint = 0,
2885             .lifetime = OperandLifeTime::CONSTANT_COPY,
2886             .location = {.poolIndex = 0, .offset = 151, .length = 4},
2887         },
2888         {
2889             .type = OperandType::FLOAT16,
2890             .dimensions = {},
2891             .numberOfConsumers = 1,
2892             .scale = 0.0f,
2893             .zeroPoint = 0,
2894             .lifetime = OperandLifeTime::CONSTANT_COPY,
2895             .location = {.poolIndex = 0, .offset = 155, .length = 2},
2896         },
2897         {
2898             .type = OperandType::FLOAT16,
2899             .dimensions = {},
2900             .numberOfConsumers = 1,
2901             .scale = 0.0f,
2902             .zeroPoint = 0,
2903             .lifetime = OperandLifeTime::CONSTANT_COPY,
2904             .location = {.poolIndex = 0, .offset = 157, .length = 2},
2905         },
2906         {
2907             .type = OperandType::FLOAT16,
2908             .dimensions = {},
2909             .numberOfConsumers = 1,
2910             .scale = 0.0f,
2911             .zeroPoint = 0,
2912             .lifetime = OperandLifeTime::CONSTANT_COPY,
2913             .location = {.poolIndex = 0, .offset = 159, .length = 2},
2914         },
2915         {
2916             .type = OperandType::TENSOR_FLOAT16,
2917             .dimensions = {0},
2918             .numberOfConsumers = 0,
2919             .scale = 0.0f,
2920             .zeroPoint = 0,
2921             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2922             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2923         },
2924         {
2925             .type = OperandType::TENSOR_FLOAT16,
2926             .dimensions = {0, 0},
2927             .numberOfConsumers = 0,
2928             .scale = 0.0f,
2929             .zeroPoint = 0,
2930             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2931             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2932         },
2933         {
2934             .type = OperandType::TENSOR_INT32,
2935             .dimensions = {0},
2936             .numberOfConsumers = 0,
2937             .scale = 0.0f,
2938             .zeroPoint = 0,
2939             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2940             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2941         },
2942         {
2943             .type = OperandType::TENSOR_INT32,
2944             .dimensions = {0},
2945             .numberOfConsumers = 0,
2946             .scale = 0.0f,
2947             .zeroPoint = 0,
2948             .lifetime = OperandLifeTime::MODEL_OUTPUT,
2949             .location = {.poolIndex = 0, .offset = 0, .length = 0},
2950         }
2951     };
2952 
2953     const std::vector<Operation> operations = {
2954         {
2955             .type = OperationType::GENERATE_PROPOSALS,
2956             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
2957             .outputs = {11, 12, 13},
2958         },
2959         {
2960             .type = OperationType::ROI_ALIGN,
2961             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
2962             .outputs = {21},
2963         },
2964         {
2965             .type = OperationType::FULLY_CONNECTED,
2966             .inputs = {21, 22, 23, 24},
2967             .outputs = {25},
2968         },
2969         {
2970             .type = OperationType::FULLY_CONNECTED,
2971             .inputs = {21, 26, 27, 28},
2972             .outputs = {29},
2973         },
2974         {
2975             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
2976             .inputs = {12, 25, 13, 3},
2977             .outputs = {30},
2978         },
2979         {
2980             .type = OperationType::BOX_WITH_NMS_LIMIT,
2981             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
2982             .outputs = {37, 38, 39, 40},
2983         }
2984     };
2985 
2986     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
2987     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
2988     std::vector<uint8_t> operandValues = {
2989       0, 60, 0, 60, 255, 255, 255, 255, 255, 255, 255, 255, 205, 52, 0, 73, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 60, 0, 60, 4, 0, 0, 0, 4, 0, 0, 0, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 0, 0, 0, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 60, 0, 0, 0, 0, 102, 46, 255, 255, 255, 255, 0, 0, 0, 0, 205, 52, 0, 60, 102, 46
2990     };
2991     const std::vector<hidl_memory> pools = {};
2992 
2993     return {
2994         .operands = operands,
2995         .operations = operations,
2996         .inputIndexes = inputIndexes,
2997         .outputIndexes = outputIndexes,
2998         .operandValues = operandValues,
2999         .pools = pools,
3000     };
3001 }
3002 
is_ignored_zero_sized_dynamic_output_shape_float16(int i)3003 inline bool is_ignored_zero_sized_dynamic_output_shape_float16(int i) {
3004   static std::set<int> ignore = {};
3005   return ignore.find(i) != ignore.end();
3006 }
3007 
3008 // Create the model
createTestModel_zero_sized_dynamic_output_shape_quant8()3009 Model createTestModel_zero_sized_dynamic_output_shape_quant8() {
3010     const std::vector<Operand> operands = {
3011         {
3012             .type = OperandType::TENSOR_QUANT8_ASYMM,
3013             .dimensions = {1, 1, 1, 1},
3014             .numberOfConsumers = 1,
3015             .scale = 0.1f,
3016             .zeroPoint = 128,
3017             .lifetime = OperandLifeTime::MODEL_INPUT,
3018             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3019         },
3020         {
3021             .type = OperandType::TENSOR_QUANT8_ASYMM,
3022             .dimensions = {1, 1, 1, 4},
3023             .numberOfConsumers = 1,
3024             .scale = 0.1f,
3025             .zeroPoint = 128,
3026             .lifetime = OperandLifeTime::MODEL_INPUT,
3027             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3028         },
3029         {
3030             .type = OperandType::TENSOR_QUANT16_SYMM,
3031             .dimensions = {1, 4},
3032             .numberOfConsumers = 1,
3033             .scale = 0.125f,
3034             .zeroPoint = 0,
3035             .lifetime = OperandLifeTime::MODEL_INPUT,
3036             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3037         },
3038         {
3039             .type = OperandType::TENSOR_QUANT16_ASYMM,
3040             .dimensions = {1, 2},
3041             .numberOfConsumers = 2,
3042             .scale = 0.125f,
3043             .zeroPoint = 0,
3044             .lifetime = OperandLifeTime::MODEL_INPUT,
3045             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3046         },
3047         {
3048             .type = OperandType::FLOAT32,
3049             .dimensions = {},
3050             .numberOfConsumers = 1,
3051             .scale = 0.0f,
3052             .zeroPoint = 0,
3053             .lifetime = OperandLifeTime::CONSTANT_COPY,
3054             .location = {.poolIndex = 0, .offset = 0, .length = 4},
3055         },
3056         {
3057             .type = OperandType::FLOAT32,
3058             .dimensions = {},
3059             .numberOfConsumers = 1,
3060             .scale = 0.0f,
3061             .zeroPoint = 0,
3062             .lifetime = OperandLifeTime::CONSTANT_COPY,
3063             .location = {.poolIndex = 0, .offset = 4, .length = 4},
3064         },
3065         {
3066             .type = OperandType::INT32,
3067             .dimensions = {},
3068             .numberOfConsumers = 1,
3069             .scale = 0.0f,
3070             .zeroPoint = 0,
3071             .lifetime = OperandLifeTime::CONSTANT_COPY,
3072             .location = {.poolIndex = 0, .offset = 8, .length = 4},
3073         },
3074         {
3075             .type = OperandType::INT32,
3076             .dimensions = {},
3077             .numberOfConsumers = 1,
3078             .scale = 0.0f,
3079             .zeroPoint = 0,
3080             .lifetime = OperandLifeTime::CONSTANT_COPY,
3081             .location = {.poolIndex = 0, .offset = 12, .length = 4},
3082         },
3083         {
3084             .type = OperandType::FLOAT32,
3085             .dimensions = {},
3086             .numberOfConsumers = 1,
3087             .scale = 0.0f,
3088             .zeroPoint = 0,
3089             .lifetime = OperandLifeTime::CONSTANT_COPY,
3090             .location = {.poolIndex = 0, .offset = 16, .length = 4},
3091         },
3092         {
3093             .type = OperandType::FLOAT32,
3094             .dimensions = {},
3095             .numberOfConsumers = 1,
3096             .scale = 0.0f,
3097             .zeroPoint = 0,
3098             .lifetime = OperandLifeTime::CONSTANT_COPY,
3099             .location = {.poolIndex = 0, .offset = 20, .length = 4},
3100         },
3101         {
3102             .type = OperandType::BOOL,
3103             .dimensions = {},
3104             .numberOfConsumers = 2,
3105             .scale = 0.0f,
3106             .zeroPoint = 0,
3107             .lifetime = OperandLifeTime::CONSTANT_COPY,
3108             .location = {.poolIndex = 0, .offset = 24, .length = 1},
3109         },
3110         {
3111             .type = OperandType::TENSOR_QUANT8_ASYMM,
3112             .dimensions = {0},
3113             .numberOfConsumers = 0,
3114             .scale = 0.1f,
3115             .zeroPoint = 128,
3116             .lifetime = OperandLifeTime::MODEL_OUTPUT,
3117             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3118         },
3119         {
3120             .type = OperandType::TENSOR_QUANT16_ASYMM,
3121             .dimensions = {0, 4},
3122             .numberOfConsumers = 2,
3123             .scale = 0.125f,
3124             .zeroPoint = 0,
3125             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3126             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3127         },
3128         {
3129             .type = OperandType::TENSOR_INT32,
3130             .dimensions = {0},
3131             .numberOfConsumers = 3,
3132             .scale = 0.0f,
3133             .zeroPoint = 0,
3134             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3135             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3136         },
3137         {
3138             .type = OperandType::TENSOR_QUANT8_ASYMM,
3139             .dimensions = {1, 1, 1, 1},
3140             .numberOfConsumers = 1,
3141             .scale = 0.1f,
3142             .zeroPoint = 128,
3143             .lifetime = OperandLifeTime::MODEL_INPUT,
3144             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3145         },
3146         {
3147             .type = OperandType::INT32,
3148             .dimensions = {},
3149             .numberOfConsumers = 1,
3150             .scale = 0.0f,
3151             .zeroPoint = 0,
3152             .lifetime = OperandLifeTime::CONSTANT_COPY,
3153             .location = {.poolIndex = 0, .offset = 25, .length = 4},
3154         },
3155         {
3156             .type = OperandType::INT32,
3157             .dimensions = {},
3158             .numberOfConsumers = 1,
3159             .scale = 0.0f,
3160             .zeroPoint = 0,
3161             .lifetime = OperandLifeTime::CONSTANT_COPY,
3162             .location = {.poolIndex = 0, .offset = 29, .length = 4},
3163         },
3164         {
3165             .type = OperandType::FLOAT32,
3166             .dimensions = {},
3167             .numberOfConsumers = 1,
3168             .scale = 0.0f,
3169             .zeroPoint = 0,
3170             .lifetime = OperandLifeTime::CONSTANT_COPY,
3171             .location = {.poolIndex = 0, .offset = 33, .length = 4},
3172         },
3173         {
3174             .type = OperandType::FLOAT32,
3175             .dimensions = {},
3176             .numberOfConsumers = 1,
3177             .scale = 0.0f,
3178             .zeroPoint = 0,
3179             .lifetime = OperandLifeTime::CONSTANT_COPY,
3180             .location = {.poolIndex = 0, .offset = 37, .length = 4},
3181         },
3182         {
3183             .type = OperandType::INT32,
3184             .dimensions = {},
3185             .numberOfConsumers = 1,
3186             .scale = 0.0f,
3187             .zeroPoint = 0,
3188             .lifetime = OperandLifeTime::CONSTANT_COPY,
3189             .location = {.poolIndex = 0, .offset = 41, .length = 4},
3190         },
3191         {
3192             .type = OperandType::INT32,
3193             .dimensions = {},
3194             .numberOfConsumers = 1,
3195             .scale = 0.0f,
3196             .zeroPoint = 0,
3197             .lifetime = OperandLifeTime::CONSTANT_COPY,
3198             .location = {.poolIndex = 0, .offset = 45, .length = 4},
3199         },
3200         {
3201             .type = OperandType::TENSOR_QUANT8_ASYMM,
3202             .dimensions = {0, 2, 2, 1},
3203             .numberOfConsumers = 2,
3204             .scale = 0.1f,
3205             .zeroPoint = 128,
3206             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3207             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3208         },
3209         {
3210             .type = OperandType::TENSOR_QUANT8_ASYMM,
3211             .dimensions = {8, 4},
3212             .numberOfConsumers = 1,
3213             .scale = 0.1f,
3214             .zeroPoint = 128,
3215             .lifetime = OperandLifeTime::CONSTANT_COPY,
3216             .location = {.poolIndex = 0, .offset = 49, .length = 32},
3217         },
3218         {
3219             .type = OperandType::TENSOR_INT32,
3220             .dimensions = {8},
3221             .numberOfConsumers = 1,
3222             .scale = 0.01f,
3223             .zeroPoint = 0,
3224             .lifetime = OperandLifeTime::CONSTANT_COPY,
3225             .location = {.poolIndex = 0, .offset = 81, .length = 32},
3226         },
3227         {
3228             .type = OperandType::INT32,
3229             .dimensions = {},
3230             .numberOfConsumers = 1,
3231             .scale = 0.0f,
3232             .zeroPoint = 0,
3233             .lifetime = OperandLifeTime::CONSTANT_COPY,
3234             .location = {.poolIndex = 0, .offset = 113, .length = 4},
3235         },
3236         {
3237             .type = OperandType::TENSOR_QUANT8_ASYMM,
3238             .dimensions = {0, 8},
3239             .numberOfConsumers = 1,
3240             .scale = 0.1f,
3241             .zeroPoint = 128,
3242             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3243             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3244         },
3245         {
3246             .type = OperandType::TENSOR_QUANT8_ASYMM,
3247             .dimensions = {2, 4},
3248             .numberOfConsumers = 1,
3249             .scale = 0.1f,
3250             .zeroPoint = 128,
3251             .lifetime = OperandLifeTime::CONSTANT_COPY,
3252             .location = {.poolIndex = 0, .offset = 117, .length = 8},
3253         },
3254         {
3255             .type = OperandType::TENSOR_INT32,
3256             .dimensions = {2},
3257             .numberOfConsumers = 1,
3258             .scale = 0.01f,
3259             .zeroPoint = 0,
3260             .lifetime = OperandLifeTime::CONSTANT_COPY,
3261             .location = {.poolIndex = 0, .offset = 125, .length = 8},
3262         },
3263         {
3264             .type = OperandType::INT32,
3265             .dimensions = {},
3266             .numberOfConsumers = 1,
3267             .scale = 0.0f,
3268             .zeroPoint = 0,
3269             .lifetime = OperandLifeTime::CONSTANT_COPY,
3270             .location = {.poolIndex = 0, .offset = 133, .length = 4},
3271         },
3272         {
3273             .type = OperandType::TENSOR_QUANT8_ASYMM,
3274             .dimensions = {0, 2},
3275             .numberOfConsumers = 1,
3276             .scale = 0.1f,
3277             .zeroPoint = 128,
3278             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3279             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3280         },
3281         {
3282             .type = OperandType::TENSOR_QUANT16_ASYMM,
3283             .dimensions = {0, 8},
3284             .numberOfConsumers = 1,
3285             .scale = 0.125f,
3286             .zeroPoint = 0,
3287             .lifetime = OperandLifeTime::TEMPORARY_VARIABLE,
3288             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3289         },
3290         {
3291             .type = OperandType::FLOAT32,
3292             .dimensions = {},
3293             .numberOfConsumers = 1,
3294             .scale = 0.0f,
3295             .zeroPoint = 0,
3296             .lifetime = OperandLifeTime::CONSTANT_COPY,
3297             .location = {.poolIndex = 0, .offset = 137, .length = 4},
3298         },
3299         {
3300             .type = OperandType::INT32,
3301             .dimensions = {},
3302             .numberOfConsumers = 1,
3303             .scale = 0.0f,
3304             .zeroPoint = 0,
3305             .lifetime = OperandLifeTime::CONSTANT_COPY,
3306             .location = {.poolIndex = 0, .offset = 141, .length = 4},
3307         },
3308         {
3309             .type = OperandType::INT32,
3310             .dimensions = {},
3311             .numberOfConsumers = 1,
3312             .scale = 0.0f,
3313             .zeroPoint = 0,
3314             .lifetime = OperandLifeTime::CONSTANT_COPY,
3315             .location = {.poolIndex = 0, .offset = 145, .length = 4},
3316         },
3317         {
3318             .type = OperandType::FLOAT32,
3319             .dimensions = {},
3320             .numberOfConsumers = 1,
3321             .scale = 0.0f,
3322             .zeroPoint = 0,
3323             .lifetime = OperandLifeTime::CONSTANT_COPY,
3324             .location = {.poolIndex = 0, .offset = 149, .length = 4},
3325         },
3326         {
3327             .type = OperandType::FLOAT32,
3328             .dimensions = {},
3329             .numberOfConsumers = 1,
3330             .scale = 0.0f,
3331             .zeroPoint = 0,
3332             .lifetime = OperandLifeTime::CONSTANT_COPY,
3333             .location = {.poolIndex = 0, .offset = 153, .length = 4},
3334         },
3335         {
3336             .type = OperandType::FLOAT32,
3337             .dimensions = {},
3338             .numberOfConsumers = 1,
3339             .scale = 0.0f,
3340             .zeroPoint = 0,
3341             .lifetime = OperandLifeTime::CONSTANT_COPY,
3342             .location = {.poolIndex = 0, .offset = 157, .length = 4},
3343         },
3344         {
3345             .type = OperandType::TENSOR_QUANT8_ASYMM,
3346             .dimensions = {0},
3347             .numberOfConsumers = 0,
3348             .scale = 0.1f,
3349             .zeroPoint = 128,
3350             .lifetime = OperandLifeTime::MODEL_OUTPUT,
3351             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3352         },
3353         {
3354             .type = OperandType::TENSOR_QUANT16_ASYMM,
3355             .dimensions = {0, 0},
3356             .numberOfConsumers = 0,
3357             .scale = 0.125f,
3358             .zeroPoint = 0,
3359             .lifetime = OperandLifeTime::MODEL_OUTPUT,
3360             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3361         },
3362         {
3363             .type = OperandType::TENSOR_INT32,
3364             .dimensions = {0},
3365             .numberOfConsumers = 0,
3366             .scale = 0.0f,
3367             .zeroPoint = 0,
3368             .lifetime = OperandLifeTime::MODEL_OUTPUT,
3369             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3370         },
3371         {
3372             .type = OperandType::TENSOR_INT32,
3373             .dimensions = {0},
3374             .numberOfConsumers = 0,
3375             .scale = 0.0f,
3376             .zeroPoint = 0,
3377             .lifetime = OperandLifeTime::MODEL_OUTPUT,
3378             .location = {.poolIndex = 0, .offset = 0, .length = 0},
3379         }
3380     };
3381 
3382     const std::vector<Operation> operations = {
3383         {
3384             .type = OperationType::GENERATE_PROPOSALS,
3385             .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
3386             .outputs = {11, 12, 13},
3387         },
3388         {
3389             .type = OperationType::ROI_ALIGN,
3390             .inputs = {14, 12, 13, 15, 16, 17, 18, 19, 20, 10},
3391             .outputs = {21},
3392         },
3393         {
3394             .type = OperationType::FULLY_CONNECTED,
3395             .inputs = {21, 22, 23, 24},
3396             .outputs = {25},
3397         },
3398         {
3399             .type = OperationType::FULLY_CONNECTED,
3400             .inputs = {21, 26, 27, 28},
3401             .outputs = {29},
3402         },
3403         {
3404             .type = OperationType::AXIS_ALIGNED_BBOX_TRANSFORM,
3405             .inputs = {12, 25, 13, 3},
3406             .outputs = {30},
3407         },
3408         {
3409             .type = OperationType::BOX_WITH_NMS_LIMIT,
3410             .inputs = {29, 30, 13, 31, 32, 33, 34, 35, 36},
3411             .outputs = {37, 38, 39, 40},
3412         }
3413     };
3414 
3415     const std::vector<uint32_t> inputIndexes = {0, 1, 2, 3, 14};
3416     const std::vector<uint32_t> outputIndexes = {11, 37, 38, 39, 40};
3417     std::vector<uint8_t> operandValues = {
3418       0, 0, 128, 63, 0, 0, 128, 63, 255, 255, 255, 255, 255, 255, 255, 255, 154, 153, 153, 62, 0, 0, 32, 65, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, 4, 0, 0, 0, 4, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 100, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 205, 204, 204, 61, 255, 255, 255, 255, 0, 0, 0, 0, 154, 153, 153, 62, 0, 0, 128, 63, 205, 204, 204, 61
3419     };
3420     const std::vector<hidl_memory> pools = {};
3421 
3422     return {
3423         .operands = operands,
3424         .operations = operations,
3425         .inputIndexes = inputIndexes,
3426         .outputIndexes = outputIndexes,
3427         .operandValues = operandValues,
3428         .pools = pools,
3429     };
3430 }
3431 
is_ignored_zero_sized_dynamic_output_shape_quant8(int i)3432 inline bool is_ignored_zero_sized_dynamic_output_shape_quant8(int i) {
3433   static std::set<int> ignore = {};
3434   return ignore.find(i) != ignore.end();
3435 }
3436 
3437