code: def doPointsExperiment(cellDimensions, cellCoordinateOffsets):
    
    if not os.path.exists("traces"):
      os.makedirs("traces")
  
    locationConfigs = []
    for i in xrange(5):
      scale = 10.0 * (math.sqrt(2) ** i)
  
      for _ in xrange(4):
        orientation = np.radians(random.gauss(7.5, 7.5))
        orientation = random.choice([orientation, -orientation])
  
        locationConfigs.append({
          "cellsPerAxis": cellDimensions[0],
          "scale": scale,
          "orientation": orientation,
          "activationThreshold": 8,
          "initialPermanence": 1.0,
          "connectedPermanence": 0.5,
          "learningThreshold": 8,
          "sampleSize": 10,
          "permanenceIncrement": 0.1,
          "permanenceDecrement": 0.0,
          "cellCoordinateOffsets": cellCoordinateOffsets,
        })
  
    L4Overrides = {
      "activationThreshold": 15,
      "minThreshold": 15,
      "initialPermanence": 1.0,
    }
  
    column = PIUNCorticalColumn(locationConfigs, L4Overrides, bumpType="square")
    exp = PIUNExperiment(column, featureNames=("A", "B"))
  
    for objectDescription in OBJECTS:
      exp.learnObject(objectDescription)
  
    filename = "traces/{}-points-{}-cells.html".format(
      len(cellCoordinateOffsets)**2, np.prod(cellDimensions))
  
    with io.open(filename, "w", encoding="utf8") as fileOut:
      with trace(fileOut, exp, includeSynapses=True):
        print "Logging to", filename
        for objectDescription in OBJECTS:
          succeeded = exp.inferObjectWithRandomMovements(objectDescription)
          if not succeeded:
            print 'Failed to infer object "{}"'.format(objectDescription["name"])
docs: Learn a set of objects. Then try to recognize each object. Output an
    interactive visualization.
  
    @param cellDimensions (pair)
    The cell dimensions of each module
  
    @param cellCoordinateOffsets (sequence)
    The "cellCoordinateOffsets" parameter for each module