text: from __future__ import print_function
  from contextlib import contextmanager
  import numpy as np
  import time
  import shlex
  import subprocess
  
  
  # ================================================================
  # Misc
  # ================================================================
  
  def fmt_row(width, row, header=False):
      out = " | ".join(fmt_item(x, width) for x in row)
      if header: out = out + "\n" + "-" * len(out)
      return out
  
  
  def fmt_item(x, l):
      if isinstance(x, np.ndarray):
          assert x.ndim == 0
          x = x.item()
      if isinstance(x, (float, np.float32, np.float64)):
          v = abs(x)
          if (v < 1e-4 or v > 1e+4) and v > 0:
              rep = "%7.2e" % x
          else:
              rep = "%7.5f" % x
      else:
          rep = str(x)
      return " " * (l - len(rep)) + rep
  
  
  color2num = dict(
      gray=30,
      red=31,
      green=32,
      yellow=33,
      blue=34,
      magenta=35,
      cyan=36,
      white=37,
      crimson=38
  )
  
  
  def colorize(string, color='green', bold=False, highlight=False):
      attr = []
      num = color2num[color]
      if highlight: num += 10
      attr.append(str(num))
      if bold: attr.append('1')
      return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), string)
  
  
  def print_cmd(cmd, dry=False):
      if isinstance(cmd, str):  # for shell=True
          pass
      else:
          cmd = ' '.join(shlex.quote(arg) for arg in cmd)
      print(colorize(('CMD: ' if not dry else 'DRY: ') + cmd))
  
  
  def get_git_commit(cwd=None):
      return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], cwd=cwd).decode('utf8')
  
  
  def ccap(cmd, dry=False, env=None, **kwargs):
      print_cmd(cmd, dry)
      if not dry:
          subprocess.check_call(cmd, env=env, **kwargs)
  
  
  MESSAGE_DEPTH = 0
  
  
  @contextmanager
  def timed(msg):
      global MESSAGE_DEPTH  # pylint: disable=W0603
      print(colorize('\t' * MESSAGE_DEPTH + '=: ' + msg, color='magenta'))
      tstart = time.time()
      MESSAGE_DEPTH += 1
      yield
      MESSAGE_DEPTH -= 1
      print(colorize('\t' * MESSAGE_DEPTH + "done in %.3f seconds" % (time.time() - tstart), color='magenta'))
  