class_docstr: Locations must have the base master at the origin (ie. 0).
  
  If the extrapolate argument is set to True, then values are extrapolated
  outside the axis range.
  
    >>> from pprint import pprint
    >>> locations = [       {'wght':100},       {'wght':-100},       {'wght':-180},       {'wdth':+.3},       {'wght':+120,'wdth':.3},       {'wght':+120,'wdth':.2},       {},       {'wght':+180,'wdth':.3},       {'wght':+180},       ]
    >>> model = VariationModel(locations, axisOrder=['wght'])
    >>> pprint(model.locations)
    [{},
     {'wght': -100},
     {'wght': -180},
     {'wght': 100},
     {'wght': 180},
     {'wdth': 0.3},
     {'wdth': 0.3, 'wght': 180},
     {'wdth': 0.3, 'wght': 120},
     {'wdth': 0.2, 'wght': 120}]
    >>> pprint(model.deltaWeights)
    [{},
     {0: 1.0},
     {0: 1.0},
     {0: 1.0},
     {0: 1.0},
     {0: 1.0},
     {0: 1.0, 4: 1.0, 5: 1.0},
     {0: 1.0, 3: 0.75, 4: 0.25, 5: 1.0, 6: 0.6666666666666666},
     {0: 1.0,
      3: 0.75,
      4: 0.25,
      5: 0.6666666666666667,
      6: 0.4444444444444445,
      7: 0.6666666666666667}]
code: def _computeMasterSupports(self):
      self.supports = []
      regions = self._locationsToRegions()
      for i, region in enumerate(regions):
          locAxes = set(region.keys())
          # Walk over previous masters now
          for prev_region in regions[:i]:
              # Master with extra axes do not participte
              if set(prev_region.keys()) != locAxes:
                  continue
              # If it's NOT in the current box, it does not participate
              relevant = True
              for axis, (lower, peak, upper) in region.items():
                  if not (
                      prev_region[axis][1] == peak
                      or lower < prev_region[axis][1] < upper
                  ):
                      relevant = False
                      break
              if not relevant:
                  continue
  
              # Split the box for new master; split in whatever direction
              # that has largest range ratio.
              #
              # For symmetry, we actually cut across multiple axes
              # if they have the largest, equal, ratio.
              # https://github.com/fonttools/fonttools/commit/7ee81c8821671157968b097f3e55309a1faa511e#commitcomment-31054804
  
              bestAxes = {}
              bestRatio = -1
              for axis in prev_region.keys():
                  val = prev_region[axis][1]
                  assert axis in region
                  lower, locV, upper = region[axis]
                  newLower, newUpper = lower, upper
                  if val < locV:
                      newLower = val
                      ratio = (val - locV) / (lower - locV)
                  elif locV < val:
                      newUpper = val
                      ratio = (val - locV) / (upper - locV)
                  else:  # val == locV
                      # Can't split box in this direction.
                      continue
                  if ratio > bestRatio:
                      bestAxes = {}
                      bestRatio = ratio
                  if ratio == bestRatio:
                      bestAxes[axis] = (newLower, locV, newUpper)
  
              for axis, triple in bestAxes.items():
                  region[axis] = triple
          self.supports.append(region)
      self._computeDeltaWeights()
  
imports: from fontTools.misc.roundTools import noRound
  from .errors import VariationModelError
label_desc: Use image node_id 6 for calling the VariationModel obj's underlying member method code with example usage: obj._computeMasterSupports() without return types