code: def filter_gene_list(stmts_in, gene_list, policy, allow_families=False,
                       **kwargs):
      invert = kwargs.get('invert', False)
      remove_bound = kwargs.get('remove_bound', False)
      if policy not in ('one', 'all'):
          logger.error('Policy %s is invalid, not applying filter.' % policy)
      else:
          genes_str = ', '.join(gene_list)
          inv_str = 'not ' if invert else ''
          logger.info(('Filtering %d statements for ones %scontaining "%s" of: '
                       '%s...') % (len(stmts_in), inv_str, policy, genes_str))
      filter_list = copy(gene_list)
      if allow_families:
          for hgnc_name in gene_list:
              gene_uri = hierarchies['entity'].get_uri('HGNC', hgnc_name)
              parents = hierarchies['entity'].get_parents(gene_uri)
              for par_uri in parents:
                  ns, id = hierarchies['entity'].ns_id_from_uri(par_uri)
                  filter_list.append(id)
      stmts_out = []
      if remove_bound:
          if not invert:
              keep_criterion = lambda a: a.name in filter_list
          else:
              keep_criterion = lambda a: a.name not in filter_list
          for st in stmts_in:
              for agent in st.agent_list():
                  _remove_bound_conditions(agent, keep_criterion)
      if policy == 'one':
          for st in stmts_in:
              found_gene = False
              if not remove_bound:
                  agent_list = st.agent_list_with_bound_condition_agents()
              else:
                  agent_list = st.agent_list()
              for agent in agent_list:
                  if agent is not None:
                      if agent.name in filter_list:
                          found_gene = True
                          break
              if (found_gene and not invert) or (not found_gene and invert):
                  stmts_out.append(st)
      elif policy == 'all':
          for st in stmts_in:
              found_genes = True
              if not remove_bound:
                  agent_list = st.agent_list_with_bound_condition_agents()
              else:
                  agent_list = st.agent_list()
              for agent in agent_list:
                  if agent is not None:
                      if agent.name not in filter_list:
                          found_genes = False
                          break
              if (found_genes and not invert) or (not found_genes and invert):
                  stmts_out.append(st)
      else:
          stmts_out = stmts_in
      logger.info('%d statements after filter...' % len(stmts_out))
      dump_pkl = kwargs.get('save')
      if dump_pkl:
          dump_statements(stmts_out, dump_pkl)
      return stmts_out