def tryOneParameter(self, key, fitnessFunctionName, args=(), nbIndividuals=30):         #only makes one parameters vary for a range of value
        
        firstValue = self.initialIndividual.inputParametersVariable[key]['value']*(1-self.initialIndividual.inputParametersVariable[key]['variation']/100)
        lastValue = self.initialIndividual.inputParametersVariable[key]['value']*(1+self.initialIndividual.inputParametersVariable[key]['variation']/100)
        step = (lastValue - firstValue)/nbIndividuals
        
        xaxis = [firstValue]*nbIndividuals
        yaxis = [None]*nbIndividuals
        
        newIndiv = copy.deepcopy(self.initialIndividual)
        newIndiv.inputParametersVariable[key]['value'] = firstValue
        
        
        with Timer.LoggerTimer("{} {} | Fitness : {} | Computation Time ".format(newIndiv.inputParametersVariable[key]['name'], newIndiv.inputParametersVariable[key]['value'], newIndiv.fitness)):         #bug, la fitness affichée est la fitness d'avant le calcul
            newIndiv.calc(getattr(newIndiv, fitnessFunctionName), args)
            
        yaxis[0] = newIndiv.fitness
        
        for i in range(nbIndividuals - 1):
            newIndiv.inputParametersVariable[key]['value'] = newIndiv.inputParametersVariable[key]['value'] + step            
            with Timer.LoggerTimer("{} {} | Fitness : {} | Computation Time ".format(newIndiv.inputParametersVariable[key]['name'], newIndiv.inputParametersVariable[key]['value'], newIndiv.fitness)):
                newIndiv.calc(getattr(newIndiv, fitnessFunctionName), args)
            
            xaxis[i+1] = newIndiv.inputParametersVariable[key]['value']
            yaxis[i+1] = newIndiv.fitness
            
            if (newIndiv.fitness < self.bestIndividual.fitness):
                self.bestIndividual = newIndiv

        return (xaxis, yaxis)
def testBetaBetaX(population, testName, fitnessFunctionName, args = (), testSize = 41):
    nbFigures = -1
    
    beta_x_first = population.initialIndividual.inputParametersVariable['beta_x']['value'] - population.initialIndividual.inputParametersVariable['beta_x']['value']*population.initialIndividual.inputParametersVariable['beta_x']['variation']/100
    beta_x_last = population.initialIndividual.inputParametersVariable['beta_x']['value'] + population.initialIndividual.inputParametersVariable['beta_x']['value']*population.initialIndividual.inputParametersVariable['beta_x']['variation']/100
    beta_x_step = (beta_x_last - beta_x_first)/10      #10 = nbValues of beta_x we want to try
    
    beta_x_first = beta_x_first + beta_x_step
    
    print("{} {} {}".format(beta_x_first, beta_x_last, beta_x_step))

    
    beta_init_first = population.initialIndividual.inputParametersVariable['beta']['value'] - population.initialIndividual.inputParametersVariable['beta']['value']*population.initialIndividual.inputParametersVariable['beta']['variation']/100
    
    
    xaxis = [beta_init_first]*(testSize+1)
    yaxis = [None]*(testSize+1)
    
    newIndiv = copy.deepcopy(population.initialIndividual)

    pathName = "../Results/VariationTests/" + testName
    os.makedirs(pathName, exist_ok=True)
    
    while(beta_x_first <= beta_x_last):
        
        i=0
        fileNameEnd = testName + "__{}_{}".format('beta_x', round(beta_x_first,2))
        newIndiv.inputParametersVariable['beta_x']['value'] = round(beta_x_first,2)
        newIndiv.inputParametersVariable['beta']['value'] = round(beta_init_first,2)
        beta_first = beta_init_first
        beta_last = beta_x_first
        beta_step = (beta_last - beta_first) / testSize
        
        while(i<testSize+1 and beta_first <= beta_x_first): # and beta_first <= beta_x_first ?
            
            
            with Timer.LoggerTimer("{} {} | {} {} | Fitness : {} | Computation Time ".format(newIndiv.inputParametersVariable['beta_x']['name'], newIndiv.inputParametersVariable['beta_x']['value'],  newIndiv.inputParametersVariable['beta']['name'], newIndiv.inputParametersVariable['beta']['value'], newIndiv.fitness)):
                newIndiv.calc(getattr(newIndiv, fitnessFunctionName), args)
            
            xaxis[i] = newIndiv.inputParametersVariable['beta']['value']
            yaxis[i] = newIndiv.fitness
            
            beta_first = round(beta_first + beta_step, 2)
            newIndiv.inputParametersVariable['beta']['value'] = beta_first
            i = i+1
            
        nbFigures = nbFigures + 1
        plt.figure(nbFigures)
        #plt.subplot(2,1,nbFigures+1)
        plt.plot(xaxis, yaxis, "r+", marker="+")
        plt.xlabel(population.initialIndividual.inputParametersVariable['beta']['name'])
        plt.ylabel(fileNameEnd)
        plt.grid(True)                
        fileName = "{}_variationTest_{}_{}.png".format('beta', fileNameEnd, testSize)
        plt.figure(nbFigures).savefig(pathName + '/' + fileName)
        
        beta_x_first = beta_x_first + beta_x_step
def testDeadriseE(population, testName, fitnessFunctionName, args = (), testSize = 25):
    #nbFigures = -1
    nbFigures = 0
    deadrise = 5
    E = 2
    stepE = (6-2)/testSize

    pathName = "../Results/VariationTests/" + testName
    os.makedirs(pathName, exist_ok=True)

    xaxis = [E]*(testSize+1)
    yaxis_effectivePower = [None]*(testSize+1)
    yaxis_stability = [None]*(testSize+1)
    
    i=0
    fileNameEnd = 'EffectivePowerAndStability'
    while(E <= 6):
    
        population.initialIndividual.inputParametersVariable['e']['value']= E
        
        with Timer.LoggerTimer("E : {} | FitnessEffectivePower : {} | FitnessStability : {}| Computation Time ".format(
population.initialIndividual.inputParametersVariable['e']['value'],
population.initialIndividual.fitnessEffectivePower, population.initialIndividual.fitnessStability)):
            population.initialIndividual.calc(getattr(population.initialIndividual, fitnessFunctionName), args)
        
        xaxis[i] = population.initialIndividual.inputParametersVariable['e']['value']
        yaxis_effectivePower[i] = population.initialIndividual.fitnessEffectivePower
        yaxis_stability[i] = population.initialIndividual.fitnessStability
        
        E = E + stepE
        i = i+1
            
    #nbFigures = nbFigures + 1
    fig = plt.figure(nbFigures)
    
    ax1 = plt.subplot()
    color = 'tab:red'
    # color = "r+"
    ax1.set_xlabel("{}".format(population.initialIndividual.inputParametersVariable['e']['name']))
    ax1.set_ylabel("EffectivePower", color = color)
    ax1.tick_params(axis='y', labelcolor=color)
    ax1.plot(xaxis, yaxis_effectivePower, color, marker="+")
    
    ax2 = ax1.twinx()
    color = 'tab:blue'
    # color = "b+"
    ax2.set_ylabel("Stability", color = color)
    ax2.tick_params(axis='y', labelcolor=color)
    ax2.plot(xaxis, yaxis_stability, color, marker="+")
    
    fig.tight_layout()
    
    plt.grid(True)                
    fileName = "{}_variationTest_{}_{}.png".format('e', fileNameEnd, testSize)
    plt.figure(nbFigures).savefig(pathName + '/' + fileName)
    plt.close()
 def geneticAlgorithm(self, selectionFunction, selectionFunctionArgs = ()):
 
     for i in range(self.nbMaxGeneration):
         print("\n\nGen n° {}".format(i+1))
         with Timer.LoggerTimer('Next Generation '):
             self.nextGeneration(selectionFunction, selectionFunctionArgs)
             print(self.bestIndividual)
 
     for i in range(self.populationSize):
         print(self.population[i])
 
     self.bestIndividual = self.population[self.populationSize-1]
     print(self.bestIndividual)
def testDeadriseLCG(population, testName, fitnessFunctionName, args = (), testSize = 41):
    #nbFigures = -1
    nbFigures = 0
    deadrise = 5
    LCG = 24
    stepLCG = (30-24)/testSize

    pathName = "../Results/VariationTests/" + testName
    os.makedirs(pathName, exist_ok=True)

    xaxis = [LCG]*(testSize+1)
    yaxis_effectivePower = [None]*(testSize+1)
    yaxis_stability = [None]*(testSize+1)
    

    while (deadrise <= 25):
        i=0
        LCG = 24
        population.initialIndividual.inputParametersVariable['beta']['value'] = deadrise
        population.initialIndividual.inputParametersVariable['beta_x']['value'] = deadrise
        fileNameEnd = testName + "__{}_{}".format('Deadrise', deadrise)
        while(LCG <= 30):
        
            population.initialIndividual.inputParametersVariable['LCG']['value']= LCG
            
            with Timer.LoggerTimer("{} {} |{} {} | {} | FitnessEffectivePower : {} | FitnessStability : {}| Computation Time ".format(population.initialIndividual.inputParametersVariable['beta_x']['name'], population.initialIndividual.inputParametersVariable['beta_x']['value'],  population.initialIndividual.inputParametersVariable['beta']['name'], population.initialIndividual.inputParametersVariable['beta']['value'],
population.initialIndividual.inputParametersVariable['LCG']['value'],
population.initialIndividual.fitnessEffectivePower, population.initialIndividual.fitnessStability)):
                population.initialIndividual.calc(getattr(population.initialIndividual, fitnessFunctionName), args)
            
            xaxis[i] = population.initialIndividual.inputParametersVariable['LCG']['value']
            yaxis_effectivePower[i] = population.initialIndividual.fitnessEffectivePower
            yaxis_stability[i] = population.initialIndividual.fitnessStability
            
            LCG = LCG + stepLCG
            i = i+1
            
        #nbFigures = nbFigures + 1
        fig = plt.figure(nbFigures)
        
        ax1 = plt.subplot()
        color = 'tab:red'
        # color = "r+"
        ax1.set_xlabel("LCG with set Deadrise Angle of {}°".format(deadrise))
        ax1.set_ylabel("EffectivePower", color = color)
        ax1.tick_params(axis='y', labelcolor=color)
        ax1.plot(xaxis, yaxis_effectivePower, color, marker="+")
        
        ax2 = ax1.twinx()
        color = 'tab:blue'
        # color = "b+"
        ax2.set_ylabel("Stability", color = color)
        ax2.tick_params(axis='y', labelcolor=color)
        ax2.plot(xaxis, yaxis_stability, color, marker="+")
        
        fig.tight_layout()
        
        plt.grid(True)                
        fileName = "{}_variationTest_{}_{}.png".format('beta', fileNameEnd, testSize)
        plt.figure(nbFigures).savefig(pathName + '/' + fileName)
        plt.close()

        deadrise = deadrise + 1
 #      population.tryOneParameter('LCG')
 
 
 
 # with Timer.LoggerTimer('\nVariation Test Stability '):
 #     # variationTestMultiple(population, ["Drag"], ["calcFitnessDrag"])
 #     for key in ['e']:
 #         variationTest(population, "EffectivePower", "calcFitnessEffectivePower", (), key)
 
 
 
 
 # with Timer.LoggerTimer('\nVariation Test Stability '):
 #     variationTest(population, "Stability", "calcFitnessStability", (), 'LCG', 25)
 #     
 with Timer.LoggerTimer('\nVariation Test Stability '):
     variationTest(population, "Stability", "calcFitnessStability", (), 'VCG', 25)
 
 
 with Timer.LoggerTimer('\nVariation Test Stability '):
     variationTest(population, "Stability", "calcFitnessStability", (), 'e', 25)
 
 
 
 
 # with Timer.LoggerTimer('\nTest e'):
 #     testDeadriseE(population, 'EffectivePowerAndStability', 'calcFitnessEffectivePower', ())
 # 
 # 
 # with Timer.LoggerTimer('\nTest VCG'):
 #     testDeadriseVCG(population, 'EffectivePowerAndStability', 'calcFitnessEffectivePower', ())