class_docstr: Windows generated 'dyadically'.
  
  These are successive windows of increasing fineness. The windows are as
  follows:
      Depth 1: The global window over the full data.
      Depth 2: The windows of the first and second halves of the dataset.
      Depth 3: The dataset is split into quarters, and we take the windows of
          each quarter.
      ...
      Depth n: For a dataset of length L, we generate windows
          [0:L/(2^n), L/(2^n):(2L)/(2^n), ..., (2^(n-1))L/2^n:L].
  Each depth also contains all previous depths.
  
  Note: Ensure the depth, n, is chosen such that L/(2^n) >= 1, else it will
      be too high for the dataset.
  
  Parameters
  ----------
  depth: int, The depth of the dyadic window, explained in the class
      description.
code: def __call__(self, length):
      max_depth = int(np.floor(np.log2(length)))
      if self.depth > max_depth:
          raise ValueError(
              "Chosen dyadic depth is too high for the data length. "
              "We require depth <= {} for length {}. "
              "Depth given is: {}.".format(
                  max_depth, length, self.depth
              )
          )
      return self.call(float(length))
  
imports: import collections
  import numpy
label_desc: Use image node_id 2 for calling the _Dyadic obj's underlying member method code with example usage: obj.__call__(length) and returns: self