/**
 * Copyright 2019 Huawei Technologies Co., Ltd
 *
 * 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.
 */

include "op.fbs";

namespace mindspore.predict;

enum DataType : int {
  DT_FLOAT = 0,
  DT_FLOAT16 = 1,
  DT_INT8 = 2,
  DT_INT32 = 3,
  DT_UINT8 = 4,
  DT_UINT32 = 8,
  DT_UNDEFINED = 16
}

enum Format : int {
    NCHW = 0,
    NHWC,
    NC4HW4 = 100,
    NUM_OF_FORMAT
}

enum MSConst: int {
    WEIGHT_REFCOUNT = 999
}

table QuantizationDef {
    // Quantized value q, corresponding float value r:
    // r = scale * (q - zero_point), where scale = (rmax - rmin) / (qmax - qmin)
    min: [float];
    max: [float];
    scale: [float];
    zero_point: [long];

    // Tensor shape of the specifies dimension.
    dimension: int;
}

table TensorDef {
    // data type
    dataType: DataType;
    // shape
    dims: [int];
    format: Format;
    refCount: int;
    offset: int;
    data: [ubyte];
    quantization: QuantizationDef;
}

union OpT {
    Concat,
    SoftMax,
    Activation,
    Conv2D,
    FusedBatchNorm,
    CaffeBatchNorm,
    Squeeze,
    BiasAdd,
    Pooling,
    DepthwiseConv2D,
    DeDepthwiseConv2D,
    Resize,
    DetectionPostProcess,
    FullConnection,
    Mean,
    DeConv2D,
    Scale,
    Reshape,
    Eltwise,
    NetOutput,
    Add,
    MatMul,
    StridedSlice,
    Power,
    Slice,
    Stack,
    Mul,
    Pad,
    Maximum,
    CaffePReLU,
    ArgMax,
    Exp,
    CaffeCrop,
    Range,
    ExpandDims,
    Tile,
    Cast
//    Split
}

enum QuantType: int {
    QUANT_NONE,
    QUANT_INT8
}

table OpDef {
    name: string;
    attr: OpT;
    inputIndex: [uint];
    outputIndex: [uint];
    isLastConv: bool;
    quantType: QuantType = QUANT_NONE;
}


enum FmkType: int {
    TF,
    CAFFE
}

table NodeDef {
    fmkType: FmkType;
    opDef: OpDef;
}


table SubGraphDef {
    name: string;
    inputIndex: [uint];
    outputIndex: [uint];
    mempoolSize: uint;
    nodes: [NodeDef];
    allTensors: [TensorDef]; // weight + input + output
}

table MempoolCfg {
    size: uint;
    shiftFactor: uint;
}

table GraphDef {
    name: string;
    mempoolCfg: MempoolCfg;
    subgraphs: [SubGraphDef];
}

root_type GraphDef;
