def provideObjectToInfer(self, inferenceConfig):
    """
    Returns the sensations in a canonical format to be sent to an experiment.

    The input inferenceConfig should be a dict with the following form:
    {
      "numSteps": 2  # number of sensations for each column
      "pairs": {
        0: [(1, 2), (2, 2)]  # sensations for cortical column 0
        1: [(2, 2), (1, 1)]  # sensations for cortical column 1
      }

      # The following are optional
      "noiseLevel": 0.05            # noise to add to feature sensations
      "locationNoise": 0.23         # noise to add to location signal
      "includeRandomLocation": True # Swap in a random location SDR
      "numAmbiguousLocations": 2    # Number of additional random locations to
                                    # union together in location input
    }

    The pairs of indices can be modified for custom inference:
      - a tuple instead of an index indicates that the union of designated
      patterns are being sensed (either in location or feature)
      - -1 as an index indicates that the input is empty for a feature, and
      is random for a location (since an empty location makes the layer 4
      burst for now)

    The returned format is a a lists of sensations, each sensation being a
    mapping from cortical column index to a pair of SDR's (one location and
    one feature).

    Parameters:
    ----------------------------
    @param   inferenceConfig (dict)
             Inference spec for experiment (cf above for format)

    """
    numSteps = inferenceConfig.get("numSteps",
                                   len(inferenceConfig["pairs"][0]))

    # some checks
    if numSteps == 0:
      raise ValueError("No inference steps were provided")
    for col in xrange(self.numColumns):
      if len(inferenceConfig["pairs"][col]) != numSteps:
        raise ValueError("Incompatible numSteps and actual inference steps")

    sensationSteps = []
    for step in xrange(numSteps):
      pairs = [
        inferenceConfig["pairs"][col][step] for col in xrange(self.numColumns)
      ]
      sdrPairs = self._getSDRPairs(
        pairs,
        noise=inferenceConfig.get("noiseLevel", None),
        locationNoise=inferenceConfig.get("locationNoise", None),
        includeRandomLocation=inferenceConfig.get("includeRandomLocation",
                                                  False),
        numAmbiguousLocations=inferenceConfig.get("numAmbiguousLocations", 0))
      sensationSteps.append(sdrPairs)

    self._checkObjectToInfer(sensationSteps)
    return sensationSteps