code: def search(
              self,
              id_list: List[str],
              negated_ids: Optional[List] = None,
              limit: Optional[int] = 100,
              taxon_filter: Optional[int]= None,
              category_filter: Optional[str]= None,
              method: Optional[SimAlgorithm] = SimAlgorithm.PHENODIGM
      ) -> SimResult:
          
  
          if negated_ids is None: negated_ids = []
  
          if method not in self.sim_api.matchers():
              raise NotImplementedError("Sim method not implemented "
                                        "in {}".format(str(self.sim_api)))
  
          # Determine if entity is a phenotype or individual containing
          # a pheno profile (gene, disease, case, etc)
          pheno_list = PhenoSimEngine._resolve_nodes_to_phenotypes(id_list)
  
          if taxon_filter is not None or category_filter is not None:
              if not isinstance(self.sim_api, FilteredSearchable):
                  raise NotImplementedError("filtered search not implemented "
                                            "in {}".format(str(self.sim_api)))
              search_result = self.sim_api.filtered_search(
                  pheno_list, negated_ids, limit, taxon_filter, category_filter, method
              )
          else:
              search_result = self.sim_api.search(pheno_list, negated_ids, limit, method)
  
          return search_result
docs: Execute a search using sim_api, resolving non-phenotype ids to
          phenotype lists then adding them to the profile (eg genes, diseases)
  
          :raises NotImplementedError:
              - If sim method or filters are not supported