docs: def best_model(self):
          """Rebuilds the top scoring model from an optimisation.
  
          Returns
          -------
          model: AMPAL
              Returns an AMPAL model of the top scoring parameters.
  
          Raises
          ------
          AttributeError
              Raises a name error if the optimiser has not been run.
          """
          if not hasattr(self, 'halloffame'):
              raise AttributeError(
                  'No best model found, have you ran the optimiser?')
          model = self.build_fn(
              (self.specification,
               self.sequences,
               self.parse_individual(self.halloffame[0])
              ))
          return model