docstr: Check whether `other` is equal to `self`
  
  The two are considered equal if `other` has the following attributes and their values
  are equal to those of `self`: :attr:`name`, :attr:`f`, :attr:`params`, :attr:`stage`, and
  :attr:`do_validate`. The values of all the aforementioned attributes will have been set on
  initialization (either explicitly or by inference), and they should never be altered
  
  Parameters
  ----------
  other: EngineerStep, dict, str
      Object to compare to `self`. If dict, the critical attributes mentioned above are
      regarded as keys of `other`, and `other` should be of the form returned by
      :meth:`EngineerStep.get_comparison_attrs`. If str, `other` will be compared to the
      result of `self`'s :meth:`EngineerStep.stringify`
  
  Returns
  -------
  Boolean
      True if `other` is equal to `self`, else False
  
  Examples
  --------
  >>> def dummy_f(train_inputs, non_train_inputs):
  ...     return train_inputs, non_train_inputs
  >>> es_0 = EngineerStep(dummy_f)
  >>> assert es_0 == EngineerStep(dummy_f)
  >>> assert es_0 == EngineerStep.get_comparison_attrs(es_0)
  >>> assert es_0 == es_0.stringify()
code: def __eq__(self, other):
      """Check whether `other` is equal to `self`
  
      The two are considered equal if `other` has the following attributes and their values
      are equal to those of `self`: :attr:`name`, :attr:`f`, :attr:`params`, :attr:`stage`, and
      :attr:`do_validate`. The values of all the aforementioned attributes will have been set on
      initialization (either explicitly or by inference), and they should never be altered
  
      Parameters
      ----------
      other: EngineerStep, dict, str
          Object to compare to `self`. If dict, the critical attributes mentioned above are
          regarded as keys of `other`, and `other` should be of the form returned by
          :meth:`EngineerStep.get_comparison_attrs`. If str, `other` will be compared to the
          result of `self`'s :meth:`EngineerStep.stringify`
  
      Returns
      -------
      Boolean
          True if `other` is equal to `self`, else False
  
      Examples
      --------
      >>> def dummy_f(train_inputs, non_train_inputs):
      ...     return train_inputs, non_train_inputs
      >>> es_0 = EngineerStep(dummy_f)
      >>> assert es_0 == EngineerStep(dummy_f)
      >>> assert es_0 == EngineerStep.get_comparison_attrs(es_0)
      >>> assert es_0 == es_0.stringify()
      """
      if isinstance(other, str):
          return self.stringify() == other
      elif isinstance(other, (dict, EngineerStep)):
          # Collect dicts of attributes for comparison
          other_attrs = self.get_comparison_attrs(other)
          own_attrs = self.get_comparison_attrs(self)
          # If `other_attrs["f"]` is str, should be SHA256 - Use hash of `self.f` to compare
          if isinstance(other_attrs["f"], str):
              own_attrs["f"] = make_hash_sha256(own_attrs["f"])
  
          return own_attrs == other_attrs
  
      return False
  
imports: from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.space.dimensions import Categorical, RejectedOptional
  from hyperparameter_hunter.utils.boltons_utils import remap, default_visit, default_enter
  from hyperparameter_hunter.utils.general_utils import subdict
  import ast
  from contextlib import suppress
  from inspect import getsource
  import numpy
  import pandas
  from typing import List, Callable, Dict, Union, Tuple
label_desc: Use image node_id 12 for calling the EngineerStep obj's underlying member method code with example usage: obj.__eq__(other) and returns: False, unknown, unknown