code: def search_variants(
              self, variant_set_id, start=None, end=None, reference_name=None,
              call_set_ids=None):
          
          request = protocol.SearchVariantsRequest()
          request.reference_name = pb.string(reference_name)
          request.start = pb.int(start)
          request.end = pb.int(end)
          request.variant_set_id = variant_set_id
          request.call_set_ids.extend(pb.string(call_set_ids))
          request.page_size = pb.int(self._page_size)
          return self._run_search_request(
              request, "variants", protocol.SearchVariantsResponse)
docs: Returns an iterator over the Variants fulfilling the specified
          conditions from the specified VariantSet.
  
          :param str variant_set_id: The ID of the
              :class:`ga4gh.protocol.VariantSet` of interest.
          :param int start: Required. The beginning of the window (0-based,
              inclusive) for which overlapping variants should be returned.
              Genomic positions are non-negative integers less than reference
              length. Requests spanning the join of circular genomes are
              represented as two requests one on each side of the join
              (position 0).
          :param int end: Required. The end of the window (0-based, exclusive)
              for which overlapping variants should be returned.
          :param str reference_name: The name of the
              :class:`ga4gh.protocol.Reference` we wish to return variants from.
          :param list call_set_ids: Only return variant calls which belong to
              call sets with these IDs. If an empty array, returns variants
              without any call objects. If null, returns all variant calls.
  
          :return: An iterator over the :class:`ga4gh.protocol.Variant` objects
              defined by the query parameters.
          :rtype: iter