code: def mul(op, input, other):
      # If one of the multiplicands is a scalar, just multiply the scale
      if is_scalar(input):
          return QTensor(other._data, input * other._scale)
      if is_scalar(other):
          return QTensor(input._data, other * input._scale)
      if not isinstance(input, QTensor) or not isinstance(
          other, QTensor
      ):
          return qfallback(op, input, other)
      # Cast int8 data to int32 and do the operation
      out_data = op(
          input._data.to(torch.int32), other._data.to(torch.int32)
      )
      out_scale = input._scale * other._scale
      return QTensor(out_data, out_scale)
  
imports: import numbers
  from dataclasses import dataclass, field
  from functools import partial
  from typing import Any, Callable, List, Optional
  import torch
  from .None import QTensor, dtype_info, qfallback
label_desc: Use image node_id 20 for calling a global function with example usage: mul(op, input, other) and returns: QTensor, QTensor, QTensor, qfallback