#
# Copyright (C) 2019 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# TEST 1: BOX_WITH_NMS_LIMIT, score_threshold = 0.3, nms_threshold = 0.4, max_detections = -1
i1 = Input("scores", "TENSOR_FLOAT32", "{19, 3}") # scores
i2 = Input("roi", "TENSOR_FLOAT32", "{19, 12}") # roi
i3 = Input("batchSplit", "TENSOR_INT32", "{19}") # batchSplit

o1 = Output("scoresOut", "TENSOR_FLOAT32", "{16}") # scores out
o2 = Output("roiOut", "TENSOR_FLOAT32", "{16, 4}") # roi out
o3 = Output("classesOut", "TENSOR_INT32", "{16}") # classes out
o4 = Output("batchSplitOut", "TENSOR_INT32", "{16}") # batch split out
model = Model().Operation("BOX_WITH_NMS_LIMIT", i1, i2, i3, 0.3, -1, 1, 0.4, 1.0, 0.3).To(o1, o2, o3, o4)

quant8 = DataTypeConverter().Identify({
    i1: ("TENSOR_QUANT8_ASYMM", 0.01, 0),
    i2: ("TENSOR_QUANT16_ASYMM", 0.125, 0),
    o1: ("TENSOR_QUANT8_ASYMM", 0.01, 0),
    o2: ("TENSOR_QUANT16_ASYMM", 0.125, 0)
})

input0 = {
    i1: [   # scores
        0.90, 0.95, 0.75,
        0.80, 0.70, 0.85,
        0.60, 0.90, 0.95,
        0.90, 0.65, 0.90,
        0.80, 0.85, 0.80,
        0.60, 0.60, 0.20,
        0.60, 0.80, 0.40,
        0.90, 0.55, 0.60,
        0.90, 0.75, 0.70,
        0.80, 0.70, 0.85,
        0.90, 0.95, 0.75,
        0.80, 0.85, 0.80,
        0.60, 0.90, 0.95,
        0.60, 0.60, 0.20,
        0.50, 0.90, 0.80,
        0.90, 0.75, 0.70,
        0.90, 0.65, 0.90,
        0.90, 0.55, 0.60,
        0.60, 0.80, 0.40
    ],
    i2: [   # roi
        1, 1, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10,
        2, 2, 11, 11, 1, 1, 11, 11, 1, 1, 11, 11,
        3, 3, 12, 12, 2, 2, 12, 12, 2, 2, 12, 12,
        4, 4, 13, 13, 3, 3, 13, 13, 3, 3, 13, 13,
        5, 5, 14, 14, 4, 4, 14, 14, 4, 4, 14, 14,
        6, 6, 15, 15, 5, 5, 15, 15, 5, 5, 15, 15,
        7, 7, 16, 16, 6, 6, 16, 16, 6, 6, 16, 16,
        8, 8, 17, 17, 7, 7, 17, 17, 7, 7, 17, 17,
        9, 9, 18, 18, 8, 8, 18, 18, 8, 8, 18, 18,
        2, 2, 11, 11, 2, 2, 12, 12, 2, 2, 12, 12,
        1, 1, 10, 10, 1, 1, 11, 11, 1, 1, 11, 11,
        5, 5, 14, 14, 5, 5, 15, 15, 5, 5, 15, 15,
        3, 3, 12, 12, 3, 3, 13, 13, 3, 3, 13, 13,
        6, 6, 15, 15, 6, 6, 16, 16, 6, 6, 16, 16,
        0, 0, 1,  1,  0, 0, 2,  2,  0, 0, 2,  2,
        9, 9, 18, 18, 9, 9, 19, 19, 9, 9, 19, 19,
        4, 4, 13, 13, 4, 4, 14, 14, 4, 4, 14, 14,
        8, 8, 17, 17, 8, 8, 18, 18, 8, 8, 18, 18,
        7, 7, 16, 16, 7, 7, 17, 17, 7, 7, 17, 17
    ],
    i3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]  # batch split
}

output0 = {
    o1: [
        0.95, 0.85, 0.75, 0.95, 0.7, 0.42352945, 0.39705884,
        0.95, 0.9, 0.85, 0.75, 0.95, 0.8, 0.7, 0.42352945, 0.39705884
    ],
    o2: [
        0, 0, 10, 10,
        4, 4, 14, 14,
        8, 8, 18, 18,
        2, 2, 12, 12,
        8, 8, 18, 18,
        4, 4, 14, 14,
        0, 0, 10, 10,
        1, 1, 11, 11,
        0, 0,  2,  2,
        5, 5, 15, 15,
        9, 9, 19, 19,
        3, 3, 13, 13,
        0, 0,  2,  2,
        9, 9, 19, 19,
        5, 5, 15, 15,
        1, 1, 11, 11
    ],
    o3: [1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2],
    o4: [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
}

Example((input0, output0)).AddVariations("relaxed", "float16", quant8)


# TEST 2: BOX_WITH_NMS_LIMIT, score_threshold = 0.3, nms_threshold = 0.4, max_detections = 5
i1 = Input("scores", "TENSOR_FLOAT32", "{19, 3}") # scores
i2 = Input("roi", "TENSOR_FLOAT32", "{19, 12}") # roi
i3 = Input("batchSplit", "TENSOR_INT32", "{19}") # batchSplit

o1 = Output("scoresOut", "TENSOR_FLOAT32", "{15}") # scores out
o2 = Output("roiOut", "TENSOR_FLOAT32", "{15, 4}") # roi out
o3 = Output("classesOut", "TENSOR_INT32", "{15}") # classes out
o4 = Output("batchSplitOut", "TENSOR_INT32", "{15}") # batch split out
model = Model().Operation("BOX_WITH_NMS_LIMIT", i1, i2, i3, 0.3, 8, 1, 0.4, 0.5, 0.3).To(o1, o2, o3, o4)

quant8 = DataTypeConverter().Identify({
    i1: ("TENSOR_QUANT8_ASYMM", 0.01, 128),
    i2: ("TENSOR_QUANT16_ASYMM", 0.125, 0),
    o1: ("TENSOR_QUANT8_ASYMM", 0.01, 128),
    o2: ("TENSOR_QUANT16_ASYMM", 0.125, 0)
})

input0 = {
    i1: [   # scores
        0.90, 0.95, 0.75,
        0.80, 0.70, 0.85,
        0.60, 0.90, 0.95,
        0.90, 0.65, 0.90,
        0.80, 0.85, 0.80,
        0.60, 0.60, 0.20,
        0.60, 0.80, 0.40,
        0.90, 0.55, 0.60,
        0.90, 0.75, 0.70,
        0.80, 0.70, 0.85,
        0.90, 0.95, 0.75,
        0.80, 0.85, 0.80,
        0.60, 0.90, 0.95,
        0.60, 0.60, 0.20,
        0.50, 0.90, 0.80,
        0.90, 0.75, 0.70,
        0.90, 0.65, 0.90,
        0.90, 0.55, 0.60,
        0.60, 0.80, 0.40
    ],
    i2: [   # roi
        1, 1, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10,
        2, 2, 11, 11, 1, 1, 11, 11, 1, 1, 11, 11,
        3, 3, 12, 12, 2, 2, 12, 12, 2, 2, 12, 12,
        4, 4, 13, 13, 3, 3, 13, 13, 3, 3, 13, 13,
        5, 5, 14, 14, 4, 4, 14, 14, 4, 4, 14, 14,
        6, 6, 15, 15, 5, 5, 15, 15, 5, 5, 15, 15,
        7, 7, 16, 16, 6, 6, 16, 16, 6, 6, 16, 16,
        8, 8, 17, 17, 7, 7, 17, 17, 7, 7, 17, 17,
        9, 9, 18, 18, 8, 8, 18, 18, 8, 8, 18, 18,
        2, 2, 11, 11, 2, 2, 12, 12, 2, 2, 12, 12,
        1, 1, 10, 10, 1, 1, 11, 11, 1, 1, 11, 11,
        5, 5, 14, 14, 5, 5, 15, 15, 5, 5, 15, 15,
        3, 3, 12, 12, 3, 3, 13, 13, 3, 3, 13, 13,
        6, 6, 15, 15, 6, 6, 16, 16, 6, 6, 16, 16,
        0, 0, 1,  1,  0, 0, 2,  2,  0, 0, 2,  2,
        9, 9, 18, 18, 9, 9, 19, 19, 9, 9, 19, 19,
        4, 4, 13, 13, 4, 4, 14, 14, 4, 4, 14, 14,
        8, 8, 17, 17, 8, 8, 18, 18, 8, 8, 18, 18,
        7, 7, 16, 16, 7, 7, 17, 17, 7, 7, 17, 17
    ],
    i3: [1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]  # batch split
}

output0 = {
    o1: [
        0.95, 0.85, 0.75, 0.95, 0.7, 0.42352945, 0.39705884,
        0.95, 0.9, 0.85, 0.75, 0.95, 0.8, 0.7, 0.42352945
    ],
    o2: [
        0, 0, 10, 10,
        4, 4, 14, 14,
        8, 8, 18, 18,
        2, 2, 12, 12,
        8, 8, 18, 18,
        4, 4, 14, 14,
        0, 0, 10, 10,
        1, 1, 11, 11,
        0, 0,  2,  2,
        5, 5, 15, 15,
        9, 9, 19, 19,
        3, 3, 13, 13,
        0, 0,  2,  2,
        9, 9, 19, 19,
        5, 5, 15, 15
    ],
    o3: [1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2],
    o4: [1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3],
}

Example((input0, output0)).AddVariations("relaxed", "float16", quant8)
