class_docstr: Layer selector object that allows users to select matrix multiplication layers
  with one of the matrices being constant, based on some criterions like total
  numbers of parameters/weights, number of input or output channels and/or layer
  names. If any of the criterion is not valid, the corresponding layer is not
  selected.
class_docstr_tok: ["Layer","selector","object","that","allows","users","to","select","matrix","multiplication","layers","with","one","of","the","matrices","being","constant",",","based","on","some","criterions","like","total","numbers","of","parameters\/weights",",","number","of","input","or","output","channels","and\/or","layer","names",".","If","any","of","the","criterion","is","not","valid",",","the","corresponding","layer","is","not","selected","."]
docstr: weight_param - should be name of the WeightParam field
          
code: def do_quantize(self, layer, weight_param=None):
      """weight_param - should be name of the WeightParam field"""
      ret = super(MatrixMultiplyLayerSelector, self).do_quantize(layer)
      if not ret:
          return False
  
      layer_type = layer.WhichOneof("layer")
  
      if layer_type in ["innerProduct", "batchedMatmul"]:
          if weight_param == "bias":
              return True
          elif weight_param is None or weight_param == "weights":
              if layer_type == "innerProduct":
                  ic = layer.innerProduct.inputChannels
                  oc = layer.innerProduct.outputChannels
              else:
                  ic = layer.batchedMatmul.weightMatrixFirstDimension
                  oc = layer.batchedMatmul.weightMatrixSecondDimension
  
              wc = ic * oc
  
              if wc < self.minimum_weight_count:
                  return False
              if ic < self.minimum_input_channels:
                  return False
              if oc < self.minimum_output_channels:
                  return False
              if (
                  self.maximum_input_channels
                  and ic > self.maximum_input_channels
              ):
                  return False
              if (
                  self.maximum_output_channels
                  and oc > self.maximum_output_channels
              ):
                  return False
              if (
                  self.include_layers_with_names
                  and layer.name not in self.include_layers_with_names
              ):
                  return False
  
              return True
          else:
              raise ValueError(
                  "Unrecognized quantization weight field {}".format(
                      weight_param
                  )
              )
  
      elif layer_type in ["loop", "branch"]:
          return True
  
      return False
  
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  import numpy
  from sys import stdout
  from os import listdir
  from six import string_types
  from .optimization_utils import _optimize_nn
  from coremltools.models import _SUPPORTED_QUANTIZATION_MODES, _QUANTIZATION_MODE_DEQUANTIZE, _QUANTIZATION_MODE_LOOKUP_TABLE_LINEAR, _QUANTIZATION_MODE_LOOKUP_TABLE_KMEANS, _QUANTIZATION_MODE_CUSTOM_LOOKUP_TABLE, _QUANTIZATION_MODE_LINEAR_QUANTIZATION, _QUANTIZATION_MODE_LINEAR_SYMMETRIC, _LUT_BASED_QUANTIZATION
  from ..utils import _get_nn_layers, _wp_to_fp16wp, _get_model, _macos_version
  from ..._deps import _HAS_SKLEARN
  from ...None import _MINIMUM_QUANTIZED_MODEL_SPEC_VERSION, _MINIMUM_FP16_SPEC_VERSION, _SPECIFICATION_VERSION_IOS_14
label_desc: Use image node_id 2 for calling the MatrixMultiplyLayerSelector obj's underlying member method code with example usage: obj.do_quantize(layer, weight_param) and returns: False, False, True, True, True, False, False, False, False, False, False