class_docstr: Framewise evaluator.
  
  Evaluates pianorolls one frame at a time. That is, the model is judged for its
  prediction of entire frames at a time, conditioning on its own samples rather
  than the ground truth of other instruments/pitches in the same frame.
  
  The frames are evaluated in random order, and within each frame the
  instruments/pitches are evaluated in random order.
code: def draw_ordering(self, tt, dd):
      o = np.arange(tt, dtype=np.int32)
      if not self.chronological:
          np.random.shuffle(o)
      # random variable orderings within each time step
      o = o[:, None] * dd + np.arange(dd, dtype=np.int32)[None, :]
      for t in range(tt):
          np.random.shuffle(o[t])
      o = o.reshape([tt * dd])
      ts, ds = np.unravel_index(o.T, shape=(tt, dd))
      return ts, ds
  
imports: import time
  from magenta.models.coconet import lib_tfutil
  from magenta.models.coconet import lib_util
  import numpy
  from scipy.misc import logsumexp
  import tensorflow.compat.v1
label_desc: Use image node_id 2 for calling the FrameEvaluator obj's underlying member method code with example usage: obj.draw_ordering(tt, dd) and returns: ts,  ds