def monitormutation(): food_total = 10 reac_total = 70 metabolites = 80 food = 8 reac = 20 targets = 1 p = 0.2 rate = 0.0 if targets + food > metabolites: print 'Tem numero errado...' react_list = [x + metabolites for x in range(reac_total)] food_list = sorted(rndm.sample(range(food_total), food)) genes_list = food_list #+ sorted(rndm.sample(react_list, reac)) primeira_geracao = Control(food_total, metabolites, genes_list, p, reac_total, inicial = True) dnap = primeira_geracao.export_code() dna = deepcopy(dnap) for j in range(50): print 'etapa' + str(j) gerac_um = Control(food_total, metabolites, [], 0, reac_total, DNA = dna) dna = mutate_DNA(dna, rate) time.sleep(0.5) dnamutante = crossover_DNA(dna, dnap, 2) gerac_mutante = Control(food_total, metabolites, [], 0, reac_total, DNA = dnamutante)
class Organism(nx.DiGraph): def __init__(self, MetNet, inicial = False, control = None, ES = None): self.age = 0 self.record = 'a' self.fitness = 0 self.mother_record = 'a' self.species = 'a' food_list = range(Constants.food) if inicial: #verifica se a populacao eh inicial #talvez fosse util ter um dicionario que redireciona pra funcoes #dependendo do tipo de inicializacao - inicial ou mutacao - e #encapsular uma serie de coisas que por enquanto estao no __init__. self.chemistry = deepcopy(MetNet) self.control = Control(inicial) # cria um controle inicial -> genes ligados por acaso e independentemente self.change_environment_org(ES) #agora seta a comida do controle e da quimica self.chemistry.update_reactions(self.control.switch_dict) #manda sinal dos genes ligados para a rede metabolica self.biomass = Constants.division_threshold/2.0 #aqui eh a biomassa do organismo inicial. else: #caso a populacao seja gerada de uma mutacao... self.chemistry = deepcopy(MetNet) self.control = control self.change_environment_org(ES) #informa os recem-nascidos da situacao de comida... self.chemistry.update_reactions(self.control.switch_dict) self.biomass = Constants.division_threshold/2.0 #aqui deve ser a biomassa do organismo filho mutado. def change_environment_org(self, food_list): self.control.change_environment(food_list) self.chemistry.update_food(self.control.food_dict) def mutate(self, rate, MetNet, ES): DNAp = self.control.export_code() DNAm = mutate_DNA(DNAp, rate) control_son = Control(DNA = DNAm, mother = self.control) return Organism(MetNet, False, control_son, ES) def eval_fitness(self, futurelist): pass
class Organism(nx.DiGraph): def __init__(self, MetNet, met, reac, number_food, targets, gen, p, inicial = False, control = None): #quais sao as caracteristicas em comum entre um organismo gerado from scratch #e um organismo proveninente de uma mutacao? Isso tem que estar no __init__ #self.chemistry = MetNet self.age = 0 self.record = 'a' self.mother_record = 'a' self.number_targets = targets food_list = range(number_food) if inicial: #verifica se a populacao eh inicial react_list = [x + met for x in range(MetNet.number_reactions)] if gen > len(react_list): raise GeneNumberException('There are more genes than reactions to be controlled!') genes_list = food_list + sorted(rndm.sample(react_list, gen)) #talvez fosse util ter um dicionario que redireciona pra funcoes #dependendo do tipo de inicializacao - inicial ou mutacao - e #encapsular uma serie de coisas que por enquanto estao no __init__. self.chemistry = self.clean_met_net(MetNet, genes_list, food_list) ## print 'o dicionario inicial de chemis:' ## print self.chemistry.node self.control = Control(number_food, met, genes_list, p, reac, inicial) ## print 'dicionario inicial:' ## print self.control.switch_dict self.biomass = self.chemistry.update_reactions(self.control.switch_dict) ## print 'biomass_init' ## print self.biomass else: #caso a populacao seja gerada de uma mutacao... self.control = control self.chemistry = self.clean_met_net(MetNet, control.genes_list, food_list) self.biomass = self.chemistry.update_reactions(self.control.switch_dict) def clean_met_net(self, MetNet, genes_list, food_list): #Verificar com mais calma se a delecao de targets nao afeta nada... chemis = deepcopy(MetNet) #sera que esse objeto vai receber as funcoes da classe MetabolicNetwork? for r in [x for x in MetNet.nodes() if MetNet.node[x]['Type'] == 'R']: if r not in [reac for reac in genes_list if reac not in food_list]: chemis.remove_node(r) #Alguns targets podem ser deletados nesse passo: chemis.remove_nodes_from([isol for isol in nx.isolates(chemis) if isol not in food_list]) #chemis.remove_nodes_from([n for n in nx.isolates(chemis) if n not in food_list])???? #Talvez tenha que verificar se food ou target molecules foram removidos? return chemis def change_environment_org(self, food_list): self.control.change_environment(food_list) self.chemistry.update_food(self.control.food_dict) def mutate(self, rate, MetNet): DNAp = self.control.export_code() DNAm = mutate_DNA(DNAp, rate) control_son = Control(MetNet.number_food, MetNet.number_metabolites, [], 0, MetNet.number_reactions, DNA = DNAm, mother = self.control) return Organism(MetNet, MetNet.number_metabolites, MetNet.number_reactions, MetNet.number_food, MetNet.number_targets, 0, 0, inicial = False, control = control_son)
class Organism(nx.DiGraph): def __init__(self, MetNet, inicial = False, control = None, EnvironmentSituation = None): self.age = 0 self.record = 'a' self.mother_record = 'a' self.species = 'a' self.metabolites = Constants.metabolites self.number_targets = Constants.targets food_list = range(Constants.food) if inicial: #verifica se a populacao eh inicial react_list = [x + self.metabolites for x in range(Constants.reactions)] if Constants.genes > len(react_list): raise GeneNumberException('There are more genes than reactions to be controlled!') genes_list = food_list + sorted(rndm.sample(react_list, Constants.genes)) #talvez fosse util ter um dicionario que redireciona pra funcoes #dependendo do tipo de inicializacao - inicial ou mutacao - e #encapsular uma serie de coisas que por enquanto estao no __init__. self.chemistry = self.clean_met_net(MetNet, genes_list, food_list, EnvironmentSituation) ## print 'o dicionario inicial de chemis:' ## print self.chemistry.node self.control = Control(genes_list, inicial) ## print 'dicionario inicial:' ## print self.control.switch_dict self.chemistry.update_reactions(self.control.switch_dict) self.biomass = Constants.division_threshold/2.0 #aqui eh a biomassa do organismo inicial. ## print 'biomass_init' ## print self.biomass else: #caso a populacao seja gerada de uma mutacao... self.control = control self.chemistry = self.clean_met_net(MetNet, control.genes_list, food_list, EnvironmentSituation) self.chemistry.update_reactions(self.control.switch_dict) self.biomass = Constants.division_threshold/2.0 #aqui deve ser a biomassa do organismo filho mutado. def clean_met_net(self, MetNet, genes_list, food_list, EnvironmentSituation): #Verificar com mais calma se a delecao de targets nao afeta nada... chemis = deepcopy(MetNet) #sera que esse objeto vai receber as funcoes da classe MetabolicNetwork? for r in [x for x in MetNet.nodes() if MetNet.node[x]['Type'] == 'R']: if r not in [reac for reac in genes_list if reac not in food_list]: chemis.remove_node(r) #Alguns targets podem ser deletados nesse passo: chemis.remove_nodes_from([isol for isol in nx.isolates(chemis) if isol not in food_list]) if EnvironmentSituation is not None: for f in range(Constants.food): chemis.node[f]['Flowing'] = EnvironmentSituation[f] #chemis.remove_nodes_from([n for n in nx.isolates(chemis) if n not in food_list])???? #Talvez tenha que verificar se food ou target molecules foram removidos? return chemis def change_environment_org(self, food_list): self.control.change_environment(food_list) #print 'compare a lista e o dicionario:' #print food_list #print self.control.food_dict self.chemistry.update_food(self.control.food_dict) def mutate(self, rate, MetNet, EnvironmentSituation): DNAp = self.control.export_code() DNAm = mutate_DNA(DNAp, rate) control_son = Control(DNA = DNAm, mother = self.control) return Organism(MetNet, False, control_son, EnvironmentSituation)