code: def biclique_size(self, xmin, xmax, ymin, ymax):
          
          try:
              return self._biclique_size[xmin, xmax, ymin, ymax]
          except KeyError:
              hscore = self.hline_score(ymin, xmin, xmax)
              vscore = self.vline_score(xmin, ymin, ymax)
              if ymin < ymax:
                  hscore += self.biclique_size(xmin, xmax, ymin + 1, ymax)[0]
              if xmin < xmax:
                  vscore += self.biclique_size(xmin + 1, xmax, ymin, ymax)[1]
              self._biclique_size[xmin, xmax, ymin, ymax] = hscore, vscore
              return hscore, vscore
docs: Returns the size parameters ``(m,n)`` of the complete bipartite graph
          :math:`K_{m,n}` comprised of ``m`` unbroken chains of horizontally-aligned qubits
          and ``n`` unbroken chains of vertically-aligned qubits (known as line
          bundles)
  
          INPUTS:
              xmin,xmax,ymin,ymax: integers defining the bounds of a rectangle
              where we look for unbroken chains.  These ranges include both
              endpoints.
  
          OUTPUTS:
              m,n: integers corresponding to the number of horizontal and
                  vertical line bundles contained in this rectangle.