text: import functools
  import os, shutil
  import torch
  
  
  def batchify(data, bsz, args):
      # Work out how cleanly we can divide the dataset into bsz parts.
      nbatch = data.size(0) // bsz
      # Trim off any extra elements that wouldn't cleanly fit (remainders).
      data = data.narrow(0, 0, nbatch * bsz)
      # Evenly divide the data across the bsz batches.
      data = data.view(bsz, -1).t().contiguous()
      if args.cuda:
          data = data.cuda()
      return data
  
  
  def get_batch(source, i, args, seq_len=None, ext_len=None):
      seq_len = min(seq_len if seq_len else args.bptt, len(source) - 1 - i)
      ext_len = args.ext_len if ext_len is None else ext_len
      data = source[max(0, i-ext_len):i+seq_len]
      target = source[i+1:i+1+seq_len]
      return data, target
  
  
  def logging(s, log_path, print_=True, log_=True):
      if print_:
          print(s)
      if log_:
          with open(log_path, 'a+') as f_log:
              f_log.write(s + '\n')
  
  
  def get_logger(log_path, **kwargs):
      return functools.partial(logging, log_path=log_path, **kwargs)
  
  
  def create_exp_dir(dir_path, scripts_to_save=None, debug=False):
      if debug:
          print('Debug Mode : no experiment dir created')
          return functools.partial(logging, log_path=None, log_=False)
  
      if not os.path.exists(dir_path):
          os.makedirs(dir_path)
  
      print('Experiment dir : {}'.format(dir_path))
      if scripts_to_save is not None:
          script_path = os.path.join(dir_path, 'scripts')
          if not os.path.exists(script_path):
              os.makedirs(script_path)
          for script in scripts_to_save:
              dst_file = os.path.join(dir_path, 'scripts', os.path.basename(script))
              shutil.copyfile(script, dst_file)
  
      return get_logger(log_path=os.path.join(dir_path, 'log.txt'))
  
  