code: def _compute_biclique_sizes(self, recompute=False):
          
          if recompute or not self._biclique_size_computed:
              self._biclique_size = {}
              self._biclique_size_to_length = defaultdict(dict)
              self._biclique_length_to_size = defaultdict(dict)
          else:
              return
          M, N = self.M, self.N
          for xmax in range(M):
              for xmin in range(xmax + 1):
                  for ymax in range(N):
                      for ymin in range(ymax + 1):
                          ab = self.biclique_size(xmin, xmax, ymin, ymax)
                          wh = xmax - xmin + 1, ymax - ymin + 1
                          self._biclique_size_to_length[ab][
                              wh] = (xmin, xmax, ymin, ymax)
                          self._biclique_length_to_size[wh][
                              ab] = (xmin, xmax, ymin, ymax)
  
          self._biclique_size_computed = True
docs: Calls ``self.biclique_size(...)`` for every rectangle contained in this
          processor, to fill the biclique size cache.
  
          INPUTS:
              recompute: if ``True``, then we dump the existing cache and compute
                  all biclique sizes from scratch.  (default: ``False``)