def CreateAnnotatedDropInputs(  # pylint: disable=invalid-name
    dataset_path=None,
    train=True,
    single_file=True,
    unique=False,
    total_number_of_samples=None,
    percentile=1.):
  r"""Prepares annotated Drop inputs.

  Example of an annotated input which can be used with this interface:

  {
    'passage': 'The Armenian Prelature of Cyprus was established in 973 by
    Catholicos Khatchig I. Historically, the Prelature has been under the
    jurisdiction of the Catholicosate of the Great House of Cilicia, while today
    it is the oldest theme that falls under its jurisdiction. Since 2014 the
    Prelate, a Catholicosal Vicar General, has been Archbishop Nareg Alemezian.
    The parish priest in Nicosia is Fr. Momik Habeshian, while the parish priest
    in Larnaca and Limassol is Fr. Mashdots Ashkarian. For centuries, the
    Prelature building was located within the Armenian compound in Victoria
    street in walled Nicosia; when that area was taken over by Turkish-Cypriot
    extremists in 1963-1964, the Prelature was temporarily housed in Aram
    Ouzounian street and, later on, in Kyriakos Matsis street in Ayios
    Dhometios. Thanks to the efforts of Bishop Zareh Aznavorian and with
    financial aid from the Evangelical Church of Westphalia, the new Prelature
    building was erected in 1983, next to the Virgin Mary church and the Nareg
    school in Nicosia, by architects Athos Dikaios & Alkis Dikaios; it was
    officially inaugurated on 4 March 1984, during the pastoral visit of
    Catholicos Karekin II. By initiative of Archbishop Varoujan Hergelian, in
    1998 the basement of the building was renovated and the "Vahram Utidjian"
    Hall was formed; previously a store room, it became a reality from the
    proceeds of the auction in 1994 of the art collection that Vahram Utidjian
    had donated to the Prelature in 1954. It was inaugurated on 3 February 1999
    by Catholicos Aram I; numerous charity, communal and cultural events take
    place there. The Prelature\'s consistory houses a collection of
    ecclesiastical relics, some of which were previously in the old Virgin Mary
    church or the Magaravank.',
    'question': 'How many years after the Vahram Utidjian was donated to the
    Prelature was it sold at an auction?',
    'answer': 40,
    'calculation': 'subtract(n8,n9)'
  }

  In this example the calculation is formulated using the notation from the
  MathQA dataset, but this is not required. subtract(n8,n9) means that the
  answer 40 can be obtained through the substraction of the 9th and and the 10th
  number in the input. The input consists of the passage concatened with the
  question. The annotations can be generated using, for example, a method
  from the paper https://arxiv.org/abs/1909.00109.

  Args:
    dataset_path: a path with the Aqua dataset.
    train: if True, then generate training examples, otherwhise generate
      validation examples (the dataset has also a test set).
    single_file: if True, then look just for one file. If False, read all
      json files in a given directory and assume that each file contains one
      example. Applied only to training data.
    unique: if set to True, then the generator will provide at most one question
      per passage.
    total_number_of_samples: if set to a positive integer, then the total number
      of unique samples will be bounded total_number_of_samples.
    percentile: the percentile of the train dataset used for training; default
      set to 1., though setting to a lower value can be interesting when
      combined train is combined with another source of data.

  Returns:
    drop_annotated_yield_examples: a generator of annotated Drop examples;
    the generator yields non-tokenized examples - they can be further processed
    using for example the tokenize function from this module.
  """
  if train:
    if single_file:
      dataset_path = os.path.join(dataset_path, 'train_annotated.json')
  else:
    dataset_path = os.path.join(dataset_path, 'dev_annotated.json')

  def load_dataset():
    dataset = []
    if single_file:
      # Opening with GFile allows to use remotely stored files, e.g.
      # in a gs bucket.
      dataset_handle = tf.io.gfile.GFile(dataset_path, 'r')
      for line in dataset_handle:
        dataset.append(json.loads(line))
    else:
      all_files = tf.io.gfile.listdir(dataset_path)
      for filename in all_files:
        if 'json' in filename:
          print('Loading data from file {}'.format(filename))
          with tf.io.gfile.GFile(os.path.join(dataset_path, filename)) as f:
            for line in f:
              dataset.append(json.loads(line))
    print('The total size of the dataset {}'.format(len(dataset)))
    return dataset[:int(len(dataset) * percentile)]

  def drop_annotated_yield_examples(generator=None):
    del generator
    while True:
      passages = set()
      unique_examples = set()
      # Notice that below we enable a poor man RL loop
      # aka the DAgger algorithm: https://arxiv.org/pdf/1011.0686.pdf
      # tl;dr: after parsing all examples we re-load the dataset - this
      # may become handy if a prediction service generates new examples.
      dataset = load_dataset()
      for example in dataset:
        # If total_number_of_samples is not None and we have reached this
        # number of samples, then we re-load the dataset.
        if total_number_of_samples:
          if len(unique_examples) >= total_number_of_samples:
            break
        # Do we have a pre-calculated input in the example?
        if 'input' in example.keys():
          question = example['input']
          # Remove the old prompt
          question = question[question.find(':') + 2:]
        else:
          # If input is not present, then we expect that this is an
          # original drop example.
          if unique and example['passage'] in passages:
            continue
          passages.add(example['passage'])
          question = example['passage'] + ' ' + example['question']
          list_num = [
              float(num.replace(',', '').rstrip('.').lstrip('.'))  # pylint: disable=g-complex-comprehension
              for num in re.findall(
                  r'[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?',
                  question)
          ]
          for i in range(len(list_num)):
            question += ' n{} = {}'.format(i, list_num[i])
        input_values = 'drop annotated question: ' + question
        target_values = example['calculation']
        unique_examples.add((input_values, target_values))
        yield input_values, target_values, np.array(
            [1] * len(target_values), dtype=np.int32)

  return drop_annotated_yield_examples
Prepares annotated Drop inputs.

  Example of an annotated input which can be used with this interface:

  {
    'passage': 'The Armenian Prelature of Cyprus was established in 973 by
    Catholicos Khatchig I. Historically, the Prelature has been under the
    jurisdiction of the Catholicosate of the Great House of Cilicia, while today
    it is the oldest theme that falls under its jurisdiction. Since 2014 the
    Prelate, a Catholicosal Vicar General, has been Archbishop Nareg Alemezian.
    The parish priest in Nicosia is Fr. Momik Habeshian, while the parish priest
    in Larnaca and Limassol is Fr. Mashdots Ashkarian. For centuries, the
    Prelature building was located within the Armenian compound in Victoria
    street in walled Nicosia; when that area was taken over by Turkish-Cypriot
    extremists in 1963-1964, the Prelature was temporarily housed in Aram
    Ouzounian street and, later on, in Kyriakos Matsis street in Ayios
    Dhometios. Thanks to the efforts of Bishop Zareh Aznavorian and with
    financial aid from the Evangelical Church of Westphalia, the new Prelature
    building was erected in 1983, next to the Virgin Mary church and the Nareg
    school in Nicosia, by architects Athos Dikaios & Alkis Dikaios; it was
    officially inaugurated on 4 March 1984, during the pastoral visit of
    Catholicos Karekin II. By initiative of Archbishop Varoujan Hergelian, in
    1998 the basement of the building was renovated and the "Vahram Utidjian"
    Hall was formed; previously a store room, it became a reality from the
    proceeds of the auction in 1994 of the art collection that Vahram Utidjian
    had donated to the Prelature in 1954. It was inaugurated on 3 February 1999
    by Catholicos Aram I; numerous charity, communal and cultural events take
    place there. The Prelature\'s consistory houses a collection of
    ecclesiastical relics, some of which were previously in the old Virgin Mary
    church or the Magaravank.',
    'question': 'How many years after the Vahram Utidjian was donated to the
    Prelature was it sold at an auction?',
    'answer': 40,
    'calculation': 'subtract(n8,n9)'
  }

  In this example the calculation is formulated using the notation from the
  MathQA dataset, but this is not required. subtract(n8,n9) means that the
  answer 40 can be obtained through the substraction of the 9th and and the 10th
  number in the input. The input consists of the passage concatened with the
  question. The annotations can be generated using, for example, a method
  from the paper https://arxiv.org/abs/1909.00109.

  Args:
    dataset_path: a path with the Aqua dataset.
    train: if True, then generate training examples, otherwhise generate
      validation examples (the dataset has also a test set).
    single_file: if True, then look just for one file. If False, read all
      json files in a given directory and assume that each file contains one
      example. Applied only to training data.
    unique: if set to True, then the generator will provide at most one question
      per passage.
    total_number_of_samples: if set to a positive integer, then the total number
      of unique samples will be bounded total_number_of_samples.
    percentile: the percentile of the train dataset used for training; default
      set to 1., though setting to a lower value can be interesting when
      combined train is combined with another source of data.

  Returns:
    drop_annotated_yield_examples: a generator of annotated Drop examples;
    the generator yields non-tokenized examples - they can be further processed
    using for example the tokenize function from this module.
  
trax/data/tf_inputs.py