code: def __call__(self, X, Y=None):
      X, Y = self.check_pairwise_arrays(X, Y)
      if self._y is None:
          self._y = Y
  
      if X.shape[1] != 2 or Y.shape[1] != 2:
          raise ValueError(
              "Haversine distance only valid in 2 dimensions"
          )
      if X.issparse() or Y.issparse():
          raise TypeError("Haversine distance requires inputs dense")
  
      return self.new_tensor(
          [X, Y],
          shape=(X.shape[0], Y.shape[0]),
          order=TensorOrder.C_ORDER,
      )
  
file_path: mars/mars/learn/metrics/pairwise/haversine.py
imports: import numpy
  from ....None import opcodes
  from ....core import recursive_tile
  from ....serialization.serializables import KeyField, BoolField
  from ....tensor.core import TensorOrder
  from ....tensor.indexing import fill_diagonal
  from ....tensor.array_utils import as_same_device, device
  from .core import PairwiseDistances
label_desc: Use image node_id 6 for calling the HaversineDistances obj's underlying member method code with example usage: obj.__call__(X, Y) and returns: self