'append some logging data from `CMAEvolutionStrategy` class instance `es`,
if ``number_of_times_called % modulo`` equals to zero, never if ``modulo==0``.
The sequence ``more_data`` must always have the same length.'

def add(self, fitness_values, es=None, more_data=[], modulo=None):

    self.counter += 1
    fitness_values = np.sort(fitness_values)
    if (fitness_values[0] < self.best_fitness):
        self.best_fitness = fitness_values[0]
    mod = (modulo if (modulo is not None) else self.modulo)
    if ((mod == 0) or ((self.counter > 3) and (self.counter % mod))):
        return
    if (es is None):
        try:
            es = self.es
        except AttributeError:
            raise _Error('call    register()    before    add()    or    add(es)')
    elif (not self.registered):
        self.register(es)
    if (11 < 3):
        try:
            xrecent = es.best.last.x
        except:
            if (self.counter == 2):
                print(("WARNING:    es.out['recent_x']    not    found    in    CMADataLogger.add,    count=" + str(self.counter)))
    try:
        if (es.update_count > 0):
            fn = (self.name_prefix + 'fit.dat')
            with open(fn, 'a') as f:
                f.write((((((((((((((((((str(es.update_count) + '    ') + str((es.update_count * es.lambda_))) + '    ') + str(es.sigma)) + '    ') + str((es.diagD[(-1)] / es.diagD[0]))) + '    ') + str(self.best_fitness)) + '    ') + ('%.16e' % fitness_values[0])) + '    ') + str(fitness_values[(es.lambda_ // 2)])) + '    ') + str(fitness_values[(-1)])) + '    ') + '    '.join((str(i) for i in more_data))) + '\n'))
        fn = (self.name_prefix + 'axlen.dat')
        with open(fn, 'a') as f:
            f.write((((((((((((str(es.update_count) + '    ') + str((es.update_count * es.lambda_))) + '    ') + str(es.sigma)) + '    ') + str(es.diagD[(-1)])) + '    ') + str(es.diagD[0])) + '    ') + '    '.join(map(str, es.diagD))) + '\n'))
        fn = (self.name_prefix + 'stddev.dat')
        with open(fn, 'a') as f:
            f.write(((((((((str(es.update_count) + '    ') + str((es.update_count * es.lambda_))) + '    ') + str(es.sigma)) + '    ') + '0    0    ') + '    '.join(map(str, (es.sigma * np.sqrt([es.C[i][i] for i in xrange(es.dim)]))))) + '\n'))
        fn = (self.name_prefix + 'xmean.dat')
        with open(fn, 'a') as f:
            if (es.update_count < 1):
                f.write((('0    0    0    0    0    ' + '    '.join(map(str, es.mean))) + '\n'))
            else:
                f.write(((((((str(es.update_count) + '    ') + str((es.update_count * es.lambda_))) + '    ') + '0    0    0    ') + '    '.join(map(str, es.centroid))) + '\n'))
        if (11 < 3):
            fn = (self.name_prefix + 'xrecentbest.dat')
            if ((es.countiter > 0) and (xrecent is not None)):
                with open(fn, 'a') as f:
                    f.write(((((((((((str(es.countiter) + '    ') + str(es.countevals)) + '    ') + str(es.sigma)) + '    ') + '0    ') + str(es.fit.fit[0])) + '    ') + '    '.join(map(str, xrecent))) + '\n'))
    except (IOError, OSError):
        if (es.countiter == 1):
            print('could    not    open/write    file')
