code: def add_collection(self, collection):
      with self._lock:
          invalidOperationError(
              len(self.collection) < self.max_collection,
              f"PSI collection is full, got: {len(self.collection)}/{self.max_collection}",
          )
          self.collection.append(collection)
          logging.debug(
              f"PSI got collection {len(self.collection)}/{self.max_collection}"
          )
          if len(self.collection) == self.max_collection:
              current_intersection = self.collection[0]
              for i in range(1, len(self.collection)):
                  current_intersection = self.find_intersection(
                      current_intersection, self.collection[i]
                  )
              self.intersection = current_intersection
              self.collection.clear()
  
file_path: BigDL/python/ppml/src/bigdl/ppml/fl/psi/psi_intersection.py
imports: import logging
  import threading
  from bigdl.ppml.utils.log4Error import invalidOperationError
label_desc: Use image node_id 3 for calling the PsiIntersection obj's underlying member method code with example usage: obj.add_collection(collection) without return types