Perform the number of repetitions we want. The results returned
        will be a list of the results dicts generated by the repeated experiments.
        The metedata for each experiment will include an entry
        :attr:`RepeatedExperiment.REPETITIONS` for the number of
        repetitions that occurred (which will be the length of this list) and
        an entry :attr:`RepeatedExperiment.I` for the index of the result in that
        sequence.

        :param params: the parameters to the experiment
        :returns: a list of result dicts

def do( self, params ):
        """Perform the number of repetitions we want. The results returned
        will be a list of the results dicts generated by the repeated experiments.
        The metedata for each experiment will include an entry
        :attr:`RepeatedExperiment.REPETITIONS` for the number of
        repetitions that occurred (which will be the length of this list) and
        an entry :attr:`RepeatedExperiment.I` for the index of the result in that
        sequence.

        :param params: the parameters to the experiment
        :returns: a list of result dicts"""
        N = self.repetitions()
        e = self.experiment()
        results = []
        for i in range(N):
            res = e.run()

            # make sure we have a list to traverse
            if not isinstance(res, list):
                res = [ res ]

            # add repetition metadata to each result
            for r in res:
                r[Experiment.METADATA][self.I] = i 
                r[Experiment.METADATA][self.REPETITIONS] = N

            # add the results to ours
            results.extend(res)
        return results