class_docstr: Parent class for every axis update op's class
  
  An axis update op is an op that can be updated, such that it can allow a transpose layer to "pass" through it.
  That is,
  
  op(transpose(x)) == transpose(op_updated(x))
  
  where
  "op" : original op,
  "op_updated": op after being updated.
  
  Example:
  
  if x is a tensor of rank 2, and transpose has perm=[1,0],
  then
  
  reduce_mean[axis=1](transpose(x)) == transpose(reduce_mean[axis=0](x))
  
  here reduce_mean op with axis=1 can be updated to a reduce_mean op with axis=0,
  to allow the transpose to "pass" through it, i.e. get applied after it.
docstr: A method that updates some attribute of the axis op,
  based on the transpose axes value.
  This method only gets called if "can_transpose_pass" returns True.
  
  Update the op such that the output %i2 should be equal to %o2
  
  Before:
  %i_1 = transpose_op(%i_0, perm=transpose_axes)
  %i2 = op(%i1)
  
  After:
  %o1 = op_updated(%i0)
  %o2 = transpose_op(%o1, perm=transpose_axes)
  
  :return: None
docstr_tok: ["A","method","that","updates","some","attribute","of","the","axis","op",",","based","on","the","transpose","axes","value",".","This","method","only","gets","called","if","``","can_transpose_pass","''","returns","True",".","Update","the","op","such","that","the","output","%","i2","should","be","equal","to","%","o2","Before",":","%","i_1","=","transpose_op","(","%","i_0",",","perm=transpose_axes",")","%","i2","=","op","(","%","i1",")","After",":","%","o1","=","op_updated","(","%","i0",")","%","o2","=","transpose_op","(","%","o1",",","perm=transpose_axes",")",":","return",":","None"]
code: def update(self):
      """
      A method that updates some attribute of the axis op,
      based on the transpose axes value.
      This method only gets called if "can_transpose_pass" returns True.
  
      Update the op such that the output %i2 should be equal to %o2
  
      Before:
      %i_1 = transpose_op(%i_0, perm=transpose_axes)
      %i2 = op(%i1)
  
      After:
      %o1 = op_updated(%i0)
      %o2 = transpose_op(%o1, perm=transpose_axes)
  
      :return: None
      """
      raise NotImplementedError(
          "This function must be implemented by each op"
      )
  
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  from coremltools.converters.mil.mil.passes.pass_registry import register_pass
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil.var import Var
  import logging
  import numpy
  import copy
  from collections import defaultdict
label_desc: Use image node_id 3 for calling the transform_axis_update_ops obj's underlying member method code with example usage: obj.update() without return types