code: def ion_equals(a, b, timestamps_instants_only=False):
      
      if timestamps_instants_only:
          return _ion_equals_timestamps_instants(a, b)
      return _ion_equals_timestamps_data_model(a, b)
docs: Tests two objects for equivalence under the Ion data model.
  
      There are three important cases:
          * When neither operand specifies its `ion_type` or `annotations`, this method will only return True when the
            values of both operands are equivalent under the Ion data model.
          * When only one of the operands specifies its `ion_type` and `annotations`, this method will only return True
            when that operand has no annotations and has a value equivalent to the other operand under the Ion data model.
          * When both operands specify `ion_type` and `annotations`, this method will only return True when the ion_type
            and annotations of both are the same and their values are equivalent under the Ion data model.
  
      Note that the order of the operands does not matter.
  
      Args:
          a (object): The first operand.
          b (object): The second operand.
          timestamps_instants_only (Optional[bool]): False if timestamp objects (datetime and its subclasses) should be
              compared according to the Ion data model (where the instant, precision, and offset must be equal); True
              if these objects should be considered equivalent if they simply represent the same instant.