def run_experiment(self):
        # initialize velocity and population
        # we need anther class that holds current population, velocity, current transformed matrix,
        # a reference for population row, population iteration, current generation
        # loop thru all population rows and generate fitness
        for iteration in range(1, VariableSetting.Iteration + 1):
            print("iteration loop",iteration)
            self.current_alpha = VariableSetting.Initial_alpha + self.alpha_scaling_factor
            #we can put population initialization here
            for generation in range(1, VariableSetting.Generation + 1):
                print("generation loop", generation)
                self.current_alpha = self.current_alpha - self.alpha_scaling_factor
                self.population_r2_values = np.zeros((VariableSetting.Population_Size, 3))
                self.feature_selector.fitness_matrix = []

                for population_idx in range(0, VariableSetting.Population_Size):
                    #Test area for single model row [24- 188- 274- 302- 330- 344- 362]

                    self.feature_selector.population_matrix[0] = np.zeros(VariableSetting.No_of_Descriptors)
                    self.feature_selector.population_matrix[0][24] = 1
                    self.feature_selector.population_matrix[0][188] = 1
                    self.feature_selector.population_matrix[0][274] = 1
                    self.feature_selector.population_matrix[0][302] = 1
                    self.feature_selector.population_matrix[0][330] = 1
                    self.feature_selector.population_matrix[0][344] = 1
                    self.feature_selector.population_matrix[0][362] = 1
                    self.feature_selector.current_population_index = population_idx
                    if self.feature_selector is None:
                        data_inputs = self.data_manager.inputs
                    else:
                        self.run_feature_selection()
                        data_inputs = self.data_manager.transformed_input
                    self.fit_and_evaluate_model(data_inputs)
                    #print("Row", population_idx, "Descriptor", self.feature_selector.sel_descriptors_for_curr_population, "Test r2 value ", self.population_r2_values[population_idx][2])
                    if(self.population_r2_values[population_idx][2] >= VariableSetting.Required_r2_Test
                        and self.population_r2_values[population_idx][1] >= VariableSetting.Required_r2_Valid and
                        self.population_r2_values[population_idx][0] >= VariableSetting.Required_r2_Train):
                        FileManager.write_model_in_file(self.output_filename
                                                        , self.feature_selector.sel_descriptors_for_curr_population
                                                        , self.feature_selector.fitness_matrix[population_idx]
                                                        , self.population_r2_values[population_idx][0]
                                                        , self.population_r2_values[population_idx][1]
                                                        , self.population_r2_values[population_idx][2]
                                                    )

                    #Test area for single model row
                    exit(0)
                self.feature_selector.local_best_matrix = self.feature_selector.get_local_best_matrix()
                if generation == 1:
                    self.feature_selector.initialize_local_best_fitness_for_first_generation()
                self.feature_selector.global_best_row = self.feature_selector.get_global_row()
                #self.print_ones_in_array(self.feature_selector.global_best_row)
                self.feature_selector.find_next_velocity()
                self.feature_selector.generate_population_matrix(self.current_alpha)
                self.feature_selector.current_population_index = 0

                #print("lowest fitness index", np.min(self.feature_selector.fitness_matrix), np.argmin(self.feature_selector.fitness_matrix))
                print("Global Row fitness", self.feature_selector.global_best_row_fitness )
    def run_experiment(self):
        # initialize velocity and population
        # we need anther class that holds current population, velocity, current transformed matrix,
        # a reference for population row, population iteration, current generation
        # loop thru all population rows and generate fitness
        for iteration in range(1, VariableSetting.Iteration + 1):
            print("iteration loop", iteration)
            self.current_alpha = VariableSetting.Initial_alpha + self.alpha_scaling_factor
            #we can put population initialization here
            for generation in range(1, VariableSetting.Generation + 1):
                print("generation loop", generation)
                self.current_alpha = self.current_alpha - self.alpha_scaling_factor
                self.population_r2_values = np.zeros(
                    (VariableSetting.Population_Size, 3))
                self.feature_selector.fitness_matrix = []

                for population_idx in range(0,
                                            VariableSetting.Population_Size):
                    self.feature_selector.current_population_index = population_idx
                    if self.feature_selector is None:
                        data_inputs = self.data_manager.inputs
                    else:
                        self.run_feature_selection()
                        data_inputs = self.data_manager.transformed_input
                    self.fit_and_evaluate_model(data_inputs)
                    #print("Row", population_idx, "Descriptor", self.feature_selector.sel_descriptors_for_curr_population, "Test r2 value ", self.population_r2_values[population_idx][2])
                    FileManager.write_model_in_file(
                        self.output_filename, self.feature_selector.
                        sel_descriptors_for_curr_population,
                        self.feature_selector.fitness_matrix[population_idx],
                        type(self.model),
                        self.population_r2_values[population_idx][0],
                        self.population_r2_values[population_idx][1],
                        self.population_r2_values[population_idx][2])

                self.feature_selector.local_best_matrix = self.feature_selector.get_local_best_matrix(
                )
                if generation == 1:
                    self.feature_selector.initialize_local_best_fitness_for_first_generation(
                    )
                self.feature_selector.global_best_row = self.feature_selector.get_global_row(
                )
                #self.print_ones_in_array(self.feature_selector.global_best_row)
                self.feature_selector.find_next_velocity()
                self.feature_selector.generate_population_matrix(
                    self.current_alpha)
                self.feature_selector.current_population_index = 0

                #print("lowest fitness index", np.min(self.feature_selector.fitness_matrix), np.argmin(self.feature_selector.fitness_matrix))
                print("Global Row fitness",
                      self.feature_selector.global_best_row_fitness)