<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def inferObjects(self, bodyPlacement, maxTouches=2):
 """ Touch each object with multiple sensors twice. :returns: dict mapping the number of touches required to the number of objects that took that many touches to be uniquely inferred. The 'None' key is reserved for objects not recognized after `maxTouches` touches """

    for monitor in self.monitors.itervalues():
      monitor.afterBodyWorldLocationChanged(bodyPlacement)

    numTouchesRequired = collections.defaultdict(int)
    for objectName, objectFeatures in self.objects.iteritems():
      self.reset()

      objectPlacement = self.objectPlacements[objectName]

      featureIndexByColumnIterator = (
        greedySensorPositions(self.numCorticalColumns, len(objectFeatures)))

      for touch in xrange(maxTouches):
        # Choose where to place each sensor.
        featureIndexByColumn = featureIndexByColumnIterator.next()
        sensedFeatures = [objectFeatures[i] for i in featureIndexByColumn]
        featureSDRByColumn = [self.features[(iCol, feature["name"])]
                              for iCol, feature in enumerate(sensedFeatures)]
        worldLocationByColumn = np.array([
          [objectPlacement[0] + feature["top"] + feature["height"]/2,
           objectPlacement[1] + feature["left"] + feature["width"]/2]
          for feature in sensedFeatures])

        for monitor in self.monitors.itervalues():
          monitor.afterSensorWorldLocationChanged(worldLocationByColumn)

        egocentricLocationByColumn = worldLocationByColumn - bodyPlacement

        prevCellActivity = None

        for t in xrange(self.maxSettlingTime):
          for monitor in self.monitors.itervalues():
            monitor.beforeCompute(egocentricLocationByColumn, featureSDRByColumn,
                                  isRepeat=(t > 0))
          self.compute(egocentricLocationByColumn, featureSDRByColumn, learn=False)

          cellActivity = (
            tuple(c.getAllCellActivity()
                  for c in self.corticalColumns),
            tuple(set(module.activeCells)
                  for module in self.bodyToSpecificObjectModules))

          if cellActivity == prevCellActivity:
            # It settled. Cancel logging this timestep.
            for monitor in self.monitors.itervalues():
              monitor.clearUnflushedData()
            break
          else:
            prevCellActivity = cellActivity
            for monitor in self.monitors.itervalues():
              monitor.flush()

        # Check if the object is narrowed down
        if self.isObjectClassified(objectName):
          numTouchesRequired[touch + 1] += 1
          break
      else:
        numTouchesRequired[None] += 1

    return numTouchesRequired