text: from __future__ import print_function
  import os
  import sys
  import time
  import logging
  import torch
  import torch.nn.functional as F
  from torch.autograd import Variable
  
  
  term_width = int(2)
  TOTAL_BAR_LENGTH = 40.
  last_time = time.time()
  begin_time = last_time
  
  
  def progress_bar(current, total, msg=None):
      global last_time, begin_time
      if current == 0:
          begin_time = time.time()  # Reset for new bar.
  
      cur_len = int(TOTAL_BAR_LENGTH * current / total)
      rest_len = int(TOTAL_BAR_LENGTH - cur_len) - 1
  
      sys.stdout.write(' [')
      for i in range(cur_len):
          sys.stdout.write('=')
      sys.stdout.write('>')
      for i in range(rest_len):
          sys.stdout.write('.')
      sys.stdout.write(']')
  
      cur_time = time.time()
      step_time = cur_time - last_time
      last_time = cur_time
      tot_time = cur_time - begin_time
  
      L = []
      L.append('  Step: %s' % format_time(step_time))
      L.append(' | Tot: %s' % format_time(tot_time))
      if msg:
          L.append(' | ' + msg)
  
      msg = ''.join(L)
      sys.stdout.write(msg)
      for i in range(term_width - int(TOTAL_BAR_LENGTH) - len(msg) - 3):
          sys.stdout.write(' ')
  
      # Go back to the center of the bar.
      for i in range(term_width - int(TOTAL_BAR_LENGTH / 2)):
          sys.stdout.write('\b')
      sys.stdout.write(' %d/%d ' % (current + 1, total))
  
      if current < total - 1:
          sys.stdout.write('\r')
      else:
          sys.stdout.write('\n')
      sys.stdout.flush()
  
  
  def format_time(seconds):
      days = int(seconds / 3600 / 24)
      seconds = seconds - days * 3600 * 24
      hours = int(seconds / 3600)
      seconds = seconds - hours * 3600
      minutes = int(seconds / 60)
      seconds = seconds - minutes * 60
      secondsf = int(seconds)
      seconds = seconds - secondsf
      millis = int(seconds * 1000)
  
      f = ''
      i = 1
      if days > 0:
          f += str(days) + 'D'
          i += 1
      if hours > 0 and i <= 2:
          f += str(hours) + 'h'
          i += 1
      if minutes > 0 and i <= 2:
          f += str(minutes) + 'm'
          i += 1
      if secondsf > 0 and i <= 2:
          f += str(secondsf) + 's'
          i += 1
      if millis > 0 and i <= 2:
          f += str(millis) + 'ms'
          i += 1
      if f == '':
          f = '0ms'
      return f
  
  
  def init_log(output_dir):
      logging.basicConfig(level=logging.DEBUG,
                          format='%(asctime)s %(message)s',
                          datefmt='%Y%m%d-%H:%M:%S',
                          filename=os.path.join(output_dir, 'log.log'),
                          filemode='w')
      console = logging.StreamHandler()
      console.setLevel(logging.INFO)
      logging.getLogger('').addHandler(console)
      return logging
  
  
  def list_loss(logits, targets):
      temp = F.log_softmax(logits, -1)
      loss = [-temp[i][targets[i].item()] for i in range(logits.size(0))]
      return torch.stack(loss)
  
  
  def ranking_loss(score, targets, proposal_num):
      loss = Variable(torch.zeros(1).cuda())
      batch_size = score.size(0)
      for i in range(proposal_num):
          targets_p = (targets > targets[:, i].unsqueeze(1)).type(torch.cuda.FloatTensor)
          pivot = score[:, i].unsqueeze(1)
          loss_p = (1 - pivot + score) * targets_p
          loss_p = torch.sum(F.relu(loss_p))
          loss += loss_p
      return loss / batch_size
  
  
  if __name__ == '__main__':
      pass
  