def reset(self, params, repetition):
    """
    Take the steps necessary to reset the experiment before each repetition:
      - Make sure random seed is different for each repetition
      - Create the L2-L4-L6a network
      - Generate objects used by the experiment
      - Learn all objects used by the experiment
    """
    print params["name"], ":", repetition

    self.debug = params.get("debug", False)

    L2Params = json.loads('{' + params["l2_params"] + '}')
    L4Params = json.loads('{' + params["l4_params"] + '}')
    L6aParams = json.loads('{' + params["l6a_params"] + '}')

    # Make sure random seed is different for each repetition
    seed = params.get("seed", 42)
    np.random.seed(seed + repetition)
    random.seed(seed + repetition)
    L2Params["seed"] = seed + repetition
    L4Params["seed"] = seed + repetition
    L6aParams["seed"] = seed + repetition

    # Configure L6a params
    numModules = params["num_modules"]
    L6aParams["scale"] = [params["scale"]] * numModules
    angle = params["angle"] / numModules
    orientation = range(angle / 2, angle * numModules, angle)
    L6aParams["orientation"] = np.radians(orientation).tolist()

    # Create multi-column L2-L4-L6a network
    self.numColumns = params["num_cortical_columns"]
    network = Network()
    network = createMultipleL246aLocationColumn(network=network,
                                                numberOfColumns=self.numColumns,
                                                L2Params=L2Params,
                                                L4Params=L4Params,
                                                L6aParams=L6aParams)
    network.initialize()

    self.network = network
    self.sensorInput = []
    self.motorInput = []
    self.L2Regions = []
    self.L4Regions = []
    self.L6aRegions = []
    for i in xrange(self.numColumns):
      col = str(i)
      self.sensorInput.append(network.regions["sensorInput_" + col].getSelf())
      self.motorInput.append(network.regions["motorInput_" + col].getSelf())
      self.L2Regions.append(network.regions["L2_" + col])
      self.L4Regions.append(network.regions["L4_" + col])
      self.L6aRegions.append(network.regions["L6a_" + col])

    # Use the number of iterations as the number of objects. This will allow us
    # to execute one iteration per object and use the "iteration" parameter as
    # the object index
    numObjects = params["iterations"]

    # Generate feature SDRs
    numFeatures = params["num_features"]
    numOfMinicolumns = L4Params["columnCount"]
    numOfActiveMinicolumns = params["num_active_minicolumns"]
    self.featureSDR = [{
      str(f): sorted(np.random.choice(numOfMinicolumns, numOfActiveMinicolumns))
      for f in xrange(numFeatures)
    } for _ in xrange(self.numColumns)]

    # Generate objects used in the experiment
    self.objects = generateObjects(numObjects=numObjects,
                                   featuresPerObject=params["features_per_object"],
                                   objectWidth=params["object_width"],
                                   numFeatures=numFeatures,
                                   distribution=params["feature_distribution"])

    # Make sure the objects are unique
    uniqueObjs = np.unique([{"features": obj["features"]}
                            for obj in self.objects])
    assert len(uniqueObjs) == len(self.objects)

    self.sdrSize = L2Params["sdrSize"]

    # Learn objects
    self.numLearningPoints = params["num_learning_points"]
    self.numOfSensations = params["num_sensations"]
    self.learnedObjects = {}
    self.learn()
Take the steps necessary to reset the experiment before each repetition:
      - Make sure random seed is different for each repetition
      - Create the L2-L4-L6a network
      - Generate objects used by the experiment
      - Learn all objects used by the experiment