docs: def getLimits(locations, current, sortResults=True, verbose=False):
      """
          Find the projections for each delta in the list of locations, relative to the current location.
          Return only the dimensions that are relevant for current.
      """
      limit = {}
      for l in locations:
          a, b = current.common(l)
          if a is None:
              continue
          for name, value in b.items():
              f = a[name]
              if name not in limit:
                  limit[name] = {}
                  limit[name]['<'] = {}
                  limit[name]['='] = {}
                  limit[name]['>'] = {}
                  if f > 0:
                      limit[name]['>'] = {0: [Location()]}
                  elif f<0:
                      limit[name]['<'] = {0: [Location()]}
                  else:
                      limit[name]['='] = {0: [Location()]}
              if current[name] < value - _EPSILON:
                  if value not in limit[name]["<"]:
                      limit[name]["<"][value] = []
                  limit[name]["<"][value].append(l)
              elif current[name] > value + _EPSILON:
                  if value not in limit[name][">"]:
                      limit[name][">"][value] = []
                  limit[name][">"][value].append(l)
              else:
                  if value not in limit[name]["="]:
                      limit[name]["="][value] = []
                  limit[name]["="][value].append(l)
      if not sortResults:
          return limit
      # now we have all the data, let's sort to the relevant values
      l = {}
      for name, lims in  limit.items():
          less = []
          more = []
          if lims[">"].keys():
              less = sorted(lims[">"].keys())
              lim_min = less[-1]
          else:
              lim_min = None
          if lims["<"].keys():
              more = sorted(lims["<"].keys())
              lim_max = more[0]
          else:
              lim_max = None
          if lim_min is None and lim_max is not None:
              # extrapolation < min
              if len(limit[name]['='])>0:
                  l[name] = (None, list(limit[name]['='].keys())[0], None)
              elif len(more) > 1 and len(limit[name]['='])==0:
                  # extrapolation
                  l[name] = (None,  more[0], more[1])
          elif lim_min is not None and lim_max is None:
              # extrapolation < max
              if len(limit[name]['='])>0:
                  # less > 0, M > 0, more = None
                  # -> end of a limit
                  l[name] = (None, limit[name]['='], None)
              elif len(less) > 1 and len(limit[name]['='])==0:
                  # less > 0, M = None, more = None
                  # extrapolation
                  l[name] = (less[-2], less[-1], None)
          else:
              if len(limit[name]['=']) > 0:
                  l[name] = (None, list(limit[name]['='].keys())[0], None)
              else:
                  l[name] = (lim_min,  None, lim_max)
      return l