docstr: This function will gradually grow to cover more cases.
  Need to be careful of false negatives. There are some cases that seemingly
  are not supported on CoreML, which the graph transformer optimizes and converts to
  a graph that can be converted to CoreML.
  
  1. Check whether the layers for which CoreML expects constant weights are in
     the list of initializers in the onnx graph
  2. unsupported ops like "And", "Or" etc
docstr_tok: ["This","function","will","gradually","grow","to","cover","more","cases",".","Need","to","be","careful","of","false","negatives",".","There","are","some","cases","that","seemingly","are","not","supported","on","CoreML",",","which","the","graph","transformer","optimizes","and","converts","to","a","graph","that","can","be","converted","to","CoreML",".","1",".","Check","whether","the","layers","for","which","CoreML","expects","constant","weights","are","in","the","list","of","initializers","in","the","onnx","graph","2.","unsupported","ops","like","``","And","''",",","``","Or","''","etc"]
code: def is_compatible(
      cls,
      model,  # type: ModelProto
      device="CPU",  # type: Text
      **kwargs,  # type: Any
  ):  # type: (...) -> bool
      # Return whether the model is compatible with CoreML.
      """
      This function will gradually grow to cover more cases.
      Need to be careful of false negatives. There are some cases that seemingly
      are not supported on CoreML, which the graph transformer optimizes and converts to
      a graph that can be converted to CoreML.
  
      1. Check whether the layers for which CoreML expects constant weights are in
         the list of initializers in the onnx graph
      2. unsupported ops like "And", "Or" etc
  
      """
  
      node_set = set()
      initializer_set = set()
      graph = model.graph
      for t in graph.initializer:
          initializer_set.add(t.name)
      for node in graph.node:
          if node.op_type in [
              "ConvTranspose",
              "Conv",
              "BatchNormalization",
              "InstanceNormalization",
              "PRelu",
          ]:
              if (
                  len(node.input) > 1
                  and node.input[1] not in initializer_set
              ):
                  return False
          node_set.add(node.op_type)
  
      # unsupported ops remove
      for node in graph.node:
          if node.op_type in [
              "Cast",
              "And",
              "Or",
              "Xor",
              "Not",
              "Less",
              "Greater",
              "Equal",
              "Ceil",
              "Floor",
          ]:
              return False
  
      return True
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from __future__ import unicode_literals
  from typing import Any, Text, Dict, Tuple
  from onnx import ModelProto
  from onnx.backend.base import Backend
  from six import string_types
  from ._backend_rep import CoreMLRep
  from ._converter import convert
  import onnx
  from ._graph import _input_from_onnx_input, EdgeInfo
label_desc: Use image node_id 2 for calling the CoreMLBackend obj's underlying member method code with example usage: obj.is_compatible(cls, model, device) and returns: True, False, False