var $root = flatbuffers.get('ort');

$root.onnxruntime = $root.onnxruntime || {};

$root.onnxruntime.fbs = $root.onnxruntime.fbs || {};

$root.onnxruntime.fbs.AttributeType = {
    UNDEFINED: 0,
    FLOAT: 1,
    INT: 2,
    STRING: 3,
    TENSOR: 4,
    GRAPH: 5,
    FLOATS: 6,
    INTS: 7,
    STRINGS: 8,
    TENSORS: 9,
    GRAPHS: 10,
    SPARSE_TENSOR: 11,
    SPARSE_TENSORS: 12
};

$root.onnxruntime.fbs.Shape = class Shape {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Shape();
        $.dim = reader.tableArray(position, 4, $root.onnxruntime.fbs.Dimension.decode);
        return $;
    }
};

$root.onnxruntime.fbs.Dimension = class Dimension {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Dimension();
        $.value = reader.table(position, 4, $root.onnxruntime.fbs.DimensionValue.decode);
        $.denotation = reader.string_(position, 6, null);
        return $;
    }
};

$root.onnxruntime.fbs.DimensionValueType = {
    UNKNOWN: 0,
    VALUE: 1,
    PARAM: 2
};

$root.onnxruntime.fbs.DimensionValue = class DimensionValue {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.DimensionValue();
        $.dim_type = reader.int8_(position, 4, 0);
        $.dim_value = reader.int64_(position, 6, 0);
        $.dim_param = reader.string_(position, 8, null);
        return $;
    }
};

$root.onnxruntime.fbs.TensorDataType = {
    UNDEFINED: 0,
    FLOAT: 1,
    UINT8: 2,
    INT8: 3,
    UINT16: 4,
    INT16: 5,
    INT32: 6,
    INT64: 7,
    STRING: 8,
    BOOL: 9,
    FLOAT16: 10,
    DOUBLE: 11,
    UINT32: 12,
    UINT64: 13,
    COMPLEX64: 14,
    COMPLEX128: 15,
    BFLOAT16: 16
};

$root.onnxruntime.fbs.TensorTypeAndShape = class TensorTypeAndShape {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.TensorTypeAndShape();
        $.elem_type = reader.int32_(position, 4, 0);
        $.shape = reader.table(position, 6, $root.onnxruntime.fbs.Shape.decode);
        return $;
    }
};

$root.onnxruntime.fbs.MapType = class MapType {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.MapType();
        $.key_type = reader.int32_(position, 4, 0);
        $.value_type = reader.table(position, 6, $root.onnxruntime.fbs.TypeInfo.decode);
        return $;
    }
};

$root.onnxruntime.fbs.SequenceType = class SequenceType {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.SequenceType();
        $.elem_type = reader.table(position, 4, $root.onnxruntime.fbs.TypeInfo.decode);
        return $;
    }
};

$root.onnxruntime.fbs.NodeType = {
    Primitive: 0,
    Fused: 1
};

$root.onnxruntime.fbs.EdgeEnd = class EdgeEnd {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.EdgeEnd();
        $.node_index = reader.uint32(position + 0);
        $.src_arg_index = reader.int32(position + 4);
        $.dst_arg_index = reader.int32(position + 8);
        return $;
    }
};

$root.onnxruntime.fbs.NodeEdge = class NodeEdge {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.NodeEdge();
        $.node_index = reader.uint32_(position, 4, 0);
        $.input_edges = reader.structArray(position, 6, undefined,$root.onnxruntime.fbs.EdgeEnd.decode);
        $.output_edges = reader.structArray(position, 8, undefined,$root.onnxruntime.fbs.EdgeEnd.decode);
        return $;
    }
};

$root.onnxruntime.fbs.Node = class Node {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Node();
        $.name = reader.string_(position, 4, null);
        $.doc_string = reader.string_(position, 6, null);
        $.domain = reader.string_(position, 8, null);
        $.since_version = reader.int32_(position, 10, 0);
        $.index = reader.uint32_(position, 12, 0);
        $.op_type = reader.string_(position, 14, null);
        $.type = reader.int32_(position, 16, 0);
        $.execution_provider_type = reader.string_(position, 18, null);
        $.inputs = reader.strings_(position, 20);
        $.outputs = reader.strings_(position, 22);
        $.attributes = reader.tableArray(position, 24, $root.onnxruntime.fbs.Attribute.decode);
        $.input_arg_counts = reader.typedArray(position, 26, Int32Array);
        $.implicit_inputs = reader.strings_(position, 28);
        return $;
    }
};

$root.onnxruntime.fbs.ValueInfo = class ValueInfo {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.ValueInfo();
        $.name = reader.string_(position, 4, null);
        $.doc_string = reader.string_(position, 6, null);
        $.type = reader.table(position, 8, $root.onnxruntime.fbs.TypeInfo.decode);
        return $;
    }
};

$root.onnxruntime.fbs.TypeInfoValue = class {

    static decode(reader, position, type) {
        switch (type) {
            case 1: return $root.onnxruntime.fbs.TensorTypeAndShape.decode(reader, position);
            case 2: return $root.onnxruntime.fbs.SequenceType.decode(reader, position);
            case 3: return $root.onnxruntime.fbs.MapType.decode(reader, position);
        }
        return undefined;
    }

    static decodeText(reader, json, type) {
        switch (type) {
            case 'TensorTypeAndShape': return $root.onnxruntime.fbs.TensorTypeAndShape.decodeText(reader, json);
            case 'SequenceType': return $root.onnxruntime.fbs.SequenceType.decodeText(reader, json);
            case 'MapType': return $root.onnxruntime.fbs.MapType.decodeText(reader, json);
        }
        return undefined;
    }
};

$root.onnxruntime.fbs.TypeInfo = class TypeInfo {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.TypeInfo();
        $.denotation = reader.string_(position, 4, null);
        $.value = reader.union(position, 6, $root.onnxruntime.fbs.TypeInfoValue.decode);
        return $;
    }
};

$root.onnxruntime.fbs.OperatorSetId = class OperatorSetId {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.OperatorSetId();
        $.domain = reader.string_(position, 4, null);
        $.version = reader.int64_(position, 6, 0);
        return $;
    }
};

$root.onnxruntime.fbs.Tensor = class Tensor {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Tensor();
        $.name = reader.string_(position, 4, null);
        $.doc_string = reader.string_(position, 6, null);
        $.dims = reader.int64s_(position, 8);
        $.data_type = reader.int32_(position, 10, 0);
        $.raw_data = reader.typedArray(position, 12, Uint8Array);
        $.string_data = reader.strings_(position, 14);
        return $;
    }
};

$root.onnxruntime.fbs.SparseTensor = class SparseTensor {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.SparseTensor();
        $.values = reader.table(position, 4, $root.onnxruntime.fbs.Tensor.decode);
        $.indices = reader.table(position, 6, $root.onnxruntime.fbs.Tensor.decode);
        $.dims = reader.int64s_(position, 8);
        return $;
    }
};

$root.onnxruntime.fbs.Attribute = class Attribute {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Attribute();
        $.name = reader.string_(position, 4, null);
        $.doc_string = reader.string_(position, 6, null);
        $.type = reader.int32_(position, 8, 0);
        $.f = reader.float32_(position, 10, 0);
        $.i = reader.int64_(position, 12, 0);
        $.s = reader.string_(position, 14, null);
        $.t = reader.table(position, 16, $root.onnxruntime.fbs.Tensor.decode);
        $.g = reader.table(position, 18, $root.onnxruntime.fbs.Graph.decode);
        $.floats = reader.typedArray(position, 20, Float32Array);
        $.ints = reader.int64s_(position, 22);
        $.strings = reader.strings_(position, 24);
        $.tensors = reader.tableArray(position, 26, $root.onnxruntime.fbs.Tensor.decode);
        $.graphs = reader.tableArray(position, 28, $root.onnxruntime.fbs.Graph.decode);
        return $;
    }
};

$root.onnxruntime.fbs.NodesToOptimizeIndices = class NodesToOptimizeIndices {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.NodesToOptimizeIndices();
        $.node_indices = reader.typedArray(position, 4, Uint32Array);
        $.num_inputs = reader.uint32_(position, 6, 0);
        $.num_outputs = reader.uint32_(position, 8, 0);
        $.has_variadic_input = reader.bool_(position, 10, false);
        $.has_variadic_output = reader.bool_(position, 12, false);
        $.num_variadic_inputs = reader.uint32_(position, 14, 0);
        $.num_variadic_outputs = reader.uint32_(position, 16, 0);
        return $;
    }
};

$root.onnxruntime.fbs.NodeIndexAndKernelDefHash = class NodeIndexAndKernelDefHash {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.NodeIndexAndKernelDefHash();
        $.node_index = reader.uint32_(position, 4, 0);
        $.kernel_def_hash = reader.uint64_(position, 6, 0);
        return $;
    }
};

$root.onnxruntime.fbs.RuntimeOptimizationRecord = class RuntimeOptimizationRecord {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.RuntimeOptimizationRecord();
        $.action_id = reader.string_(position, 4, null);
        $.nodes_to_optimize_indices = reader.table(position, 6, $root.onnxruntime.fbs.NodesToOptimizeIndices.decode);
        $.produced_nodes = reader.tableArray(position, 8, $root.onnxruntime.fbs.NodeIndexAndKernelDefHash.decode);
        return $;
    }
};

$root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry = class RuntimeOptimizationRecordContainerEntry {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry();
        $.optimizer_name = reader.string_(position, 4, null);
        $.runtime_optimization_records = reader.tableArray(position, 6, $root.onnxruntime.fbs.RuntimeOptimizationRecord.decode);
        return $;
    }
};

$root.onnxruntime.fbs.RuntimeOptimizations = class RuntimeOptimizations {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.RuntimeOptimizations();
        $.records = reader.tableArray(position, 4, $root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry.decode);
        return $;
    }
};

$root.onnxruntime.fbs.Graph = class Graph {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Graph();
        $.initializers = reader.tableArray(position, 4, $root.onnxruntime.fbs.Tensor.decode);
        $.node_args = reader.tableArray(position, 6, $root.onnxruntime.fbs.ValueInfo.decode);
        $.nodes = reader.tableArray(position, 8, $root.onnxruntime.fbs.Node.decode);
        $.max_node_index = reader.uint32_(position, 10, 0);
        $.node_edges = reader.tableArray(position, 12, $root.onnxruntime.fbs.NodeEdge.decode);
        $.inputs = reader.strings_(position, 14);
        $.outputs = reader.strings_(position, 16);
        $.sparse_initializers = reader.tableArray(position, 18, $root.onnxruntime.fbs.SparseTensor.decode);
        $.runtime_optimizations = reader.table(position, 20, $root.onnxruntime.fbs.RuntimeOptimizations.decode);
        return $;
    }
};

$root.onnxruntime.fbs.StringStringEntry = class StringStringEntry {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.StringStringEntry();
        $.key = reader.string_(position, 4, null);
        $.value = reader.string_(position, 6, null);
        return $;
    }
};

$root.onnxruntime.fbs.Model = class Model {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.Model();
        $.ir_version = reader.int64_(position, 4, 0);
        $.opset_import = reader.tableArray(position, 6, $root.onnxruntime.fbs.OperatorSetId.decode);
        $.producer_name = reader.string_(position, 8, null);
        $.producer_version = reader.string_(position, 10, null);
        $.domain = reader.string_(position, 12, null);
        $.model_version = reader.int64_(position, 14, 0);
        $.doc_string = reader.string_(position, 16, null);
        $.graph = reader.table(position, 18, $root.onnxruntime.fbs.Graph.decode);
        $.graph_doc_string = reader.string_(position, 20, null);
        $.metadata_props = reader.tableArray(position, 22, $root.onnxruntime.fbs.StringStringEntry.decode);
        return $;
    }
};

$root.onnxruntime.fbs.KernelCreateInfos = class KernelCreateInfos {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.KernelCreateInfos();
        $.node_indices = reader.typedArray(position, 4, Uint32Array);
        $.kernel_def_hashes = reader.uint64s_(position, 6);
        return $;
    }
};

$root.onnxruntime.fbs.SubGraphSessionState = class SubGraphSessionState {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.SubGraphSessionState();
        $.graph_id = reader.string_(position, 4, null);
        $.session_state = reader.table(position, 6, $root.onnxruntime.fbs.SessionState.decode);
        return $;
    }
};

$root.onnxruntime.fbs.SessionState = class SessionState {

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.SessionState();
        $.kernels = reader.table(position, 4, $root.onnxruntime.fbs.KernelCreateInfos.decode);
        $.sub_graph_session_states = reader.tableArray(position, 6, $root.onnxruntime.fbs.SubGraphSessionState.decode);
        return $;
    }
};

$root.onnxruntime.fbs.InferenceSession = class InferenceSession {

    static identifier(reader) {
        return reader.identifier === 'ORTM';
    }

    static create(reader) {
        return $root.onnxruntime.fbs.InferenceSession.decode(reader, reader.root);
    }

    static decode(reader, position) {
        const $ = new $root.onnxruntime.fbs.InferenceSession();
        $.ort_version = reader.string_(position, 4, null);
        $.model = reader.table(position, 6, $root.onnxruntime.fbs.Model.decode);
        $.session_state = reader.table(position, 8, $root.onnxruntime.fbs.SessionState.decode);
        return $;
    }
};
