class_docstr: Find duplicates using hashing algorithms and/or generate hashes given a single image or a directory of images.
  
  The module can be used for 2 purposes: Encoding generation and duplicate detection.
  - Encoding generation:
  To generate hashes using specific hashing method. The generated hashes can be used at a later time for
  deduplication. Using the method 'encode_image' from the specific hashing method object, the hash for a
  single image can be obtained while the 'encode_images' method can be used to get hashes for all images in a
  directory.
  
  - Duplicate detection:
  Find duplicates either using the encoding mapping generated previously using 'encode_images' or using a Path to the
  directory that contains the images that need to be deduplicated. 'find_duplicates' and 'find_duplicates_to_remove'
  methods are provided to accomplish these tasks.
docstr: Take in dictionary {filename: encoded image}, detects duplicates below the given hamming distance threshold
  and returns a dictionary containing key as filename and value as a list of duplicate filenames. Optionally,
  the hamming distances could be returned instead of just duplicate filenames for each query file.
  
  Args:
      encoding_map: Dictionary with keys as file names and values as encoded images (hashes).
      max_distance_threshold: Hamming distance between two images below which retrieved duplicates are valid.
      scores: Boolean indicating whether hamming distance scores are to be returned along with retrieved
      duplicates.
      outfile: Optional, name of the file to save the results. Default is None.
      search_method: Algorithm used to retrieve duplicates. Default is brute_force_cython for Unix else bktree.
      num_dist_workers: Optional, number of cpu cores to use for multiprocessing distance computation, set to number of CPUs in the system by default. 0 disables multiprocessing.
  
  Returns:
      if scores is True, then a dictionary of the form {'image1.jpg': [('image1_duplicate1.jpg',
      score), ('image1_duplicate2.jpg', score)], 'image2.jpg': [] ..}
      if scores is False, then a dictionary of the form {'image1.jpg': ['image1_duplicate1.jpg',
      'image1_duplicate2.jpg'], 'image2.jpg':['image1_duplicate1.jpg',..], ..}
docstr_tok: ["Take","in","dictionary","{","filename",":","encoded","image","}",",","detects","duplicates","below","the","given","hamming","distance","threshold","and","returns","a","dictionary","containing","key","as","filename","and","value","as","a","list","of","duplicate","filenames",".","Optionally",",","the","hamming","distances","could","be","returned","instead","of","just","duplicate","filenames","for","each","query","file",".","Args",":","encoding_map",":","Dictionary","with","keys","as","file","names","and","values","as","encoded","images","(","hashes",")",".","max_distance_threshold",":","Hamming","distance","between","two","images","below","which","retrieved","duplicates","are","valid",".","scores",":","Boolean","indicating","whether","hamming","distance","scores","are","to","be","returned","along","with","retrieved","duplicates",".","outfile",":","Optional",",","name","of","the","file","to","save","the","results",".","Default","is","None",".","search_method",":","Algorithm","used","to","retrieve","duplicates",".","Default","is","brute_force_cython","for","Unix","else","bktree",".","num_dist_workers",":","Optional",",","number","of","cpu","cores","to","use","for","multiprocessing","distance","computation",",","set","to","number","of","CPUs","in","the","system","by","default",".","0","disables","multiprocessing",".","Returns",":","if","scores","is","True",",","then","a","dictionary","of","the","form","{","'image1.jpg","'",":","[","(","'image1_duplicate1.jpg","'",",","score",")",",","(","'image1_duplicate2.jpg","'",",","score",")","]",",","'image2.jpg","'",":","[","]","..","}","if","scores","is","False",",","then","a","dictionary","of","the","form","{","'image1.jpg","'",":","[","'image1_duplicate1.jpg","'",",","'image1_duplicate2.jpg","'","]",",","'image2.jpg","'",":","[","'image1_duplicate1.jpg","'",",","..","]",",","..","}"]
code: def _find_duplicates_dict(
      self,
      encoding_map: Dict[str, str],
      max_distance_threshold: int = 10,
      scores: bool = False,
      outfile: Optional[str] = None,
      search_method: str = "brute_force_cython"
      if not sys.platform == "win32"
      else "bktree",
      num_dist_workers: int = cpu_count(),
  ) -> Dict:
      """
      Take in dictionary {filename: encoded image}, detects duplicates below the given hamming distance threshold
      and returns a dictionary containing key as filename and value as a list of duplicate filenames. Optionally,
      the hamming distances could be returned instead of just duplicate filenames for each query file.
  
      Args:
          encoding_map: Dictionary with keys as file names and values as encoded images (hashes).
          max_distance_threshold: Hamming distance between two images below which retrieved duplicates are valid.
          scores: Boolean indicating whether hamming distance scores are to be returned along with retrieved
          duplicates.
          outfile: Optional, name of the file to save the results. Default is None.
          search_method: Algorithm used to retrieve duplicates. Default is brute_force_cython for Unix else bktree.
          num_dist_workers: Optional, number of cpu cores to use for multiprocessing distance computation, set to number of CPUs in the system by default. 0 disables multiprocessing.
  
      Returns:
          if scores is True, then a dictionary of the form {'image1.jpg': [('image1_duplicate1.jpg',
          score), ('image1_duplicate2.jpg', score)], 'image2.jpg': [] ..}
          if scores is False, then a dictionary of the form {'image1.jpg': ['image1_duplicate1.jpg',
          'image1_duplicate2.jpg'], 'image2.jpg':['image1_duplicate1.jpg',..], ..}
      """
      logger.info(
          "Start: Evaluating hamming distances for getting duplicates"
      )
  
      result_set = HashEval(
          test=encoding_map,
          queries=encoding_map,
          distance_function=self.hamming_distance,
          verbose=self.verbose,
          threshold=max_distance_threshold,
          search_method=search_method,
          num_dist_workers=num_dist_workers,
      )
  
      logger.info(
          "End: Evaluating hamming distances for getting duplicates"
      )
  
      self.results = result_set.retrieve_results(scores=scores)
      if outfile:
          save_json(self.results, outfile)
      return self.results
  
imports: import os
  import sys
  import warnings
  from pathlib import PurePath, Path
  from typing import Dict, List, Optional
  from multiprocessing import cpu_count
  import numpy
  import pywt
  from scipy.fftpack import dct
  from imagededup.handlers.search.retrieval import HashEval
  from imagededup.utils.general_utils import get_files_to_remove, save_json, parallelise, generate_files, generate_relative_names
  from imagededup.utils.image_utils import load_image, preprocess_image, check_image_array_hash
  from imagededup.utils.logger import return_logger
label_desc: Use image node_id 9 for calling the Hashing obj's underlying member method code with example usage: obj._find_duplicates_dict(encoding_map, max_distance_threshold, scores, outfile, search_method, num_dist_workers) and returns: self