class_docstr: Class to manage potential duplicates in the suggested candidates.
  
  :param space: object managing all the logic related the domain of the optimization
  :param zipped_X: matrix of evaluated configurations
  :param pending_zipped_X: matrix of configurations in the pending state
  :param ignored_zipped_X: matrix of configurations that the user desires to ignore (e.g., because they may have led to failures)
code: def __init__(
      self,
      space,
      zipped_X,
      pending_zipped_X=None,
      ignored_zipped_X=None,
  ):
      self.space = space
  
      self.unique_points = set()
      self.unique_points.update(tuple(x.flatten()) for x in zipped_X)
  
      if np.any(pending_zipped_X):
          self.unique_points.update(
              tuple(x.flatten()) for x in pending_zipped_X
          )
  
      if np.any(ignored_zipped_X):
          self.unique_points.update(
              tuple(x.flatten()) for x in ignored_zipped_X
          )
  
imports: import numpy
  from ..core.task.space import Design_space
label_desc: Use image node_id 1 to create a new DuplicateManager object from inherited base classes: object with example: obj = DuplicateManager(space, zipped_X, pending_zipped_X, ignored_zipped_X)