code: def matmul_adjoint_0(B, G, A_meta, B_ndim):
      if anp.ndim(G) == 0:  # A_ndim == B_ndim == 1
          return unbroadcast(G * B, A_meta)
      _, A_ndim, _, _ = A_meta
      if A_ndim == 1:
          G = anp.expand_dims(G, anp.ndim(G) - 1)
      if B_ndim == 1:  # The result we need is an outer product
          B = anp.expand_dims(B, 0)
          G = anp.expand_dims(G, anp.ndim(G))
      else:  # We need to swap the last two axes of B
          B = anp.swapaxes(B, B_ndim - 2, B_ndim - 1)
      result = anp.matmul(G, B)
      return unbroadcast(result, A_meta)
  
imports: from __future__ import absolute_import
  from six import string_types
  from functools import partial
  import numpy
  from ..util import func
  from .None import numpy_wrapper
  from .numpy_boxes import ArrayBox
  from autograd.extend import primitive, vspace, defvjp, defvjp_argnum, SparseObject, VJPNode, register_notrace
label_desc: Use image node_id 19 for calling a global function with example usage: matmul_adjoint_0(B, G, A_meta, B_ndim) and returns: unbroadcast, unbroadcast