code: def op_with_scalar_cast(a, b, f):
    
  
    try:
      return f(a, b)
    except (TypeError, ValueError):
      pass
  
    def is_scalar(x):
      """Return True if `x` is a scalar"""
      if hasattr(x, "get_shape"):
        shape = x.get_shape()
        return shape.ndims == 0
      if hasattr(x, "ndim"):
        return x.ndim == 0
      assert isinstance(x, (int, float))
      return True
  
    a_scalar = is_scalar(a)
    b_scalar = is_scalar(b)
  
    if a_scalar and b_scalar:
      raise TypeError("Trying to apply " + str(f) + " with mixed types")
  
    if a_scalar and not b_scalar:
      a = tf.cast(a, b.dtype)
  
    if b_scalar and not a_scalar:
      b = tf.cast(b, a.dtype)
  
    return f(a, b)
docs: Builds the graph to compute f(a, b).
    If only one of the two arguments is a scalar and the operation would
    cause a type error without casting, casts the scalar to match the
    tensor.
    :param a: a tf-compatible array or scalar
    :param b: a tf-compatible array or scalar