text: import numpy as np
  from scipy.stats import pearsonr, spearmanr
  from sklearn.metrics import f1_score, matthews_corrcoef
  from tqdm import auto as tqdm_lib
  from . common import HFTask, simple_accuracy_metric, yesno
  
  class Winogrande(HFTask):
      DATASET_PATH = "winogrande"
      DATASET_NAME = "winogrande_xl"
  
      def has_training_docs(self):
          return True
  
      def has_validation_docs(self):
          return True
  
      def has_test_docs(self):
          return True
  
      def training_docs(self):
          if self.has_training_docs():
              return self.data["train"]
  
      def validation_docs(self):
          if self.has_validation_docs():
              return self.data["validation"]
  
      def test_docs(self):
          if self.has_test_docs():
              return self.data["test"]
  
      def fewshot_description(self):
          # TODO: redo description
          return "Winograd schema sentence including a either a ___ blank with a missing word, making the pronoun ambiguous, or the same with the word filled in."
  
      def doc_to_text(self, doc):
          return doc['sentence']
  
      def doc_to_target(self, doc):
          text = doc['sentence']
          answer_n = doc['answer']
          if answer_n == '1':
              answer = doc['option1']
          elif answer_n == '2':
              answer = doc['option2']
          else:
              raise ValueError("Winogrande from HF datasets contained an invalid answer key")
          return text.replace("_", answer)
  
      def construct_requests(self, doc, ctx):
          """ Uses RequestFactory to construct Requests and returns an iterable of 
          Requests which will be sent to the LM.
  
          :param doc:
              The document as returned from training_docs, validation_docs, or test_docs.
          :param ctx: str
              The context string, generated by fewshot_context. This includes the natural 
              language description, as well as the few shot examples, and the question
              part of the document for `doc`. 
          """
          # TODO: implement evaluation.
          raise NotImplementedError('Evaluation not implemented')
      
      def process_results(self, doc, results):
          """Take a single document and the LM results and evaluates, returning a 
          dict where keys are the names of submetrics and values are the values of 
          the metric for that one document
  
          :param doc:
              The document as returned from training_docs, validation_docs, or test_docs.
          :param results:
              The results of the requests created in construct_requests.
          """
          # TODO: implement evaluation.
          raise NotImplementedError('Evaluation not implemented')
  
      def aggregation(self):
          """
          :returns: {str: [float] -> float}
              A dictionary where keys are the names of submetrics and values are 
              functions that aggregate a list of metrics
          """
          # TODO: implement evaluation.
          raise NotImplementedError('Evaluation not implemented')
  
      def higher_is_better(self):
          """
          :returns: {str: bool}
              A dictionary where keys are the names of submetrics and values are 
              whether a higher value of the submetric is better
          """
          # TODO: implement evaluation.
          raise NotImplementedError('Evaluation not implemented')