backend_opset_version = {
    'Abs': [1, 6],
    'Acos': [7],
    'Acosh': [9],
    'Adagrad': [],
    'Adam': [],
    'Add': [1, 6, 7],
    'And': [1, 7],
    'ArgMax': [1, 11, 12],
    'ArgMin': [1, 11, 12],
    'ArrayFeatureExtractor': [],
    'Asin': [7],
    'Asinh': [9],
    'Atan': [7],
    'Atanh': [9],
    'AveragePool': [1, 7, 10, 11],
    'BatchNormalization': [1, 6, 7, 9],
    'Binarizer': [],
    'BitShift': [11],
    'Cast': [1, 6, 9],
    'CastMap': [],
    'CategoryMapper': [],
    'Ceil': [1, 6],
    'Celu': [],
    'Clip': [1, 6, 11, 12],
    'Compress': [9, 11],
    'Concat': [1, 4, 11],
    'ConcatFromSequence': [],
    'Constant': [1, 9, 11, 12],
    'ConstantFill': [1],
    'ConstantOfShape': [9],
    'Conv': [1, 11],
    'ConvInteger': [10],
    'ConvTranspose': [1, 11],
    'Cos': [7],
    'Cosh': [9],
    'CumSum': [11],
    'DepthToSpace': [1, 11],
    'DequantizeLinear': [10],
    'Det': [11],
    'DictVectorizer': [],
    'Div': [1, 6, 7],
    'Dropout': [1, 6, 7, 10],
    'DynamicQuantizeLinear': [11],
    'Einsum': [],
    'Elu': [1, 6],
    'Equal': [1, 7, 11],
    'Erf': [9],
    'Exp': [1, 6],
    'Expand': [8],
    'EyeLike': [9],
    'FeatureVectorizer': [],
    'Flatten': [1, 9, 11],
    'Floor': [1, 6],
    'GRU': [1, 3, 7],
    'Gather': [1, 11],
    'GatherElements': [11],
    'GatherND': [11],
    'Gemm': [1, 6, 7, 9, 11],
    'GlobalAveragePool': [1],
    'GlobalLpPool': [1, 2],
    'GlobalMaxPool': [1],
    'Gradient': [],
    'GraphCall': [],
    'Greater': [1, 7, 9],
    'GreaterOrEqual': [],
    'HardSigmoid': [1, 6],
    'Hardmax': [1, 11],
    'Identity': [1],
    'If': [1, 11],
    'ImageScaler': [1],
    'Imputer': [],
    'InstanceNormalization': [1, 6],
    'IsInf': [10],
    'IsNaN': [9],
    'LRN': [1],
    'LSTM': [1, 7],
    'LabelEncoder': [],
    'LeakyRelu': [1, 6],
    'Less': [1, 7, 9],
    'LessOrEqual': [],
    'LinearClassifier': [],
    'LinearRegressor': [],
    'Log': [1, 6],
    'LogSoftmax': [1, 11],
    'Loop': [1, 11],
    'LpNormalization': [1],
    'LpPool': [1, 2, 11],
    'MatMul': [1, 9],
    'MatMulInteger': [10],
    'Max': [1, 6, 8],
    'MaxPool': [1, 8, 10, 11, 12],
    'MaxRoiPool': [],
    'MaxUnpool': [9, 11],
    'Mean': [1, 6, 8],
    'MeanVarianceNormalization': [1, 9],
    'Min': [1, 6, 8],
    'Mod': [10],
    'Momentum': [],
    'Mul': [1, 6, 7],
    'Multinomial': [],
    'Neg': [1, 6],
    'NegativeLogLikelihoodLoss': [],
    'NonMaxSuppression': [10, 11],
    'NonZero': [9],
    'Normalizer': [],
    'Not': [1],
    'OneHot': [9, 11],
    'OneHotEncoder': [],
    'Or': [1, 7],
    'PRelu': [1, 6, 7, 9],
    'Pad': [1, 2, 11],
    'Pow': [1, 7],
    'QLinearConv': [10],
    'QLinearMatMul': [10],
    'QuantizeLinear': [10],
    'RNN': [1, 7],
    'RandomNormal': [1],
    'RandomNormalLike': [1],
    'RandomUniform': [1],
    'RandomUniformLike': [1],
    'Range': [11],
    'Reciprocal': [1, 6],
    'ReduceL1': [1, 11],
    'ReduceL2': [1, 11],
    'ReduceLogSum': [1, 11],
    'ReduceLogSumExp': [1, 11],
    'ReduceMax': [1, 11, 12],
    'ReduceMean': [1, 11],
    'ReduceMin': [1, 11, 12],
    'ReduceProd': [1, 11],
    'ReduceSum': [1, 11],
    'ReduceSumSquare': [1, 11],
    'Relu': [1, 6],
    'Reshape': [1, 5],
    'Resize': [10, 11],
    'ReverseSequence': [10],
    'RoiAlign': [],
    'Round': [11],
    'SVMClassifier': [],
    'SVMRegressor': [],
    'Scaler': [],
    'Scan': [8, 9, 11],
    'Scatter': [9],
    'ScatterElements': [11],
    'ScatterND': [11],
    'Selu': [1, 6],
    'SequenceAt': [11],
    'SequenceConstruct': [11],
    'SequenceEmpty': [11],
    'SequenceErase': [11],
    'SequenceInsert': [11],
    'SequenceLength': [11],
    'Shape': [1],
    'Shrink': [9],
    'Sigmoid': [1, 6],
    'Sign': [9],
    'Sin': [7],
    'Sinh': [9],
    'Size': [1],
    'Slice': [1, 10, 11],
    'Softmax': [1, 11],
    'SoftmaxCrossEntropyLoss': [],
    'Softplus': [1],
    'Softsign': [1],
    'SpaceToDepth': [1],
    'Split': [1, 2, 11],
    'SplitToSequence': [],
    'Sqrt': [1, 6],
    'Squeeze': [1, 11],
    'StringNormalizer': [],
    'Sub': [1, 6, 7],
    'Sum': [1, 6, 8],
    'Tan': [7],
    'Tanh': [1, 6],
    'TfIdfVectorizer': [9],
    'ThresholdedRelu': [1, 10],
    'Tile': [1, 6],
    'TopK': [1, 10, 11],
    'Transpose': [1],
    'TreeEnsembleClassifier': [],
    'TreeEnsembleRegressor': [],
    'Unique': [],
    'Unsqueeze': [1, 11],
    'Upsample': [7, 9],
    'Where': [9],
    'Xor': [1, 7],
    'ZipMap': []
}

backend_partial_support = {
    'Cast': 'Cast string to float32/float64/int32/int64 are not supported in '
            'Tensorflow.',
    'Clip': 'Clip input in uint64 is not supported in Tensorflow.',
    'ConvTranspose': 'ConvTranspose with dilations != 1, or transposed '
                     'convolution for 4D or higher are not supported in '
                     'Tensorflow.',
    'CumSum': 'CumSum inputs in uint32/uint64 are not supported in Tensorflow.',
    'Equal': 'Equal inputs in uint16/uint32/uint64 are not supported in '
             'Tensorflow.',
    'GRU': 'GRU with clip or GRU with linear_before_reset, or GRU not using '
           'sigmoid for z and r, or GRU using Elu as the activation function '
           'with alpha != 1, or GRU using HardSigmoid as the activation '
           'function with alpha != 0.2 or beta != 0.5 are not supported in '
           'TensorFlow.',
    'LSTM': 'LSTM not using sigmoid for `f`, or LSTM not using the same '
            'activation for `g` and `h` are not supported in Tensorflow.',
    'MaxPool': 'MaxPoolWithArgmax with pad is None or incompatible mode, or '
               'MaxPoolWithArgmax with 4D or higher input, orMaxPoolWithArgmax '
               'with column major are not supported in Tensorflow.',
    'Mod': 'Mod Dividend or Divisor in int8/int16/uint8/uint16/uint32/uint64 '
           'are not supported in Tensorflow.',
    'OneHot': 'OneHot indices in '
              'uint16/uint32/uint64/int8/int16/float16/float/double, or OneHot '
              'depth in '
              'uint8/uint16/uint32/uint64/int8/int16/int64/float16/float/double '
              'are not supported in Tensorflow.',
    'RNN': 'RNN with clip is not supported in Tensorflow.',
    'Resize': 'Resize required 4D input in Tensorflow. For opset 11, only the '
              'following attributes and inputs conbination are supported in '
              'Tensorflow:\n'
              '\t1. mode=nearest, '
              'coordinate_transformation_mode=align_corners, '
              'nearest_mode=round_prefer_ceil, can use scales(*) or sizes.\n'
              '\t2. mode=nearest, coordinate_transformation_mode=asymmetric, '
              'nearest_mode=floor, can use scales(*) or sizes.\n'
              '\t3. mode=nearest, '
              'coordinate_transformation_mode=tf_half_pixel_for_nn, '
              'nearest_mode=floor, can use scales(*) or sizes.\n'
              '\t4. mode=linear, coordinate_transformation_mode=align_corners, '
              'can use scales(*) or sizes.\n'
              '\t5. mode=linear, coordinate_transformation_mode=asymmetric, '
              'can use scales(*) or sizes.\n'
              '\t6. mode=linear, coordinate_transformation_mode=half_pixel, '
              'can use scales(*) or sizes.\n'
              '\t7. mode=cubic, coordinate_transformation_mode=align_corners, '
              'cubic_coeff_a=-0.5, exclude_outside=1, can use scales(*) or '
              'sizes.\n'
              '\t8. mode=cubic, coordinate_transformation_mode=asymmetric, '
              'cubic_coeff_a=-0.5, exclude_outside=1, can use scales(*) or '
              'sizes.\n'
              '\t9. mode=cubic, coordinate_transformation_mode=half_pixel, '
              'cubic_coeff_a=-0.5, exclude_outside=1, can use scales(*) or '
              'sizes.\n'
              '\t10. mode=nearest, '
              'coordinate_transformation_mode=tf_crop_and_resize, '
              'extrapolation_value=any_float_value, '
              'nearest_mode=round_prefer_ceil, can use scales or sizes.\n'
              '\t11. mode=linear, '
              'coordinate_transformation_mode=tf_crop_and_resize, '
              'extrapolation_value=any_float_value, can use scales or sizes.\n'
              '\t- Note (*): The accuracy of your model will go down, if the '
              'height and the width of the new sizes(scales * origial sizes) '
              'are not in whole numbers.',
    'Upsample': 'Upsample required 4D input in Tensorflow.'
}
