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
#completar com os estados on = [False, True, False, False, False, False, False, False, False, True, False] fl = [on[j] for j in range(food)] env_list = [[True, True], [True, False], [False, False], [False, True]] period = len(env_list) index = (env_list.index(fl) + 1)%period mae = nx.Graph() for i in range(len(listadenos)): mae.add_node(listadenos[i], {'on': on[i]}) control = Control(DNA = D, mother = mae) for i in range(50): draw_BN(control, control.pos, listadenos) #control.genes_list nao inclui os intermediarios e eles ficam sem o involucro do no control.change_state() time.sleep(1) if i%4 == 3: control.change_environment(env_list[index]) #mudar aqui o metodo de atualizacao de comidas index = (index+1)%period #rndm.randint(0,period - 1)
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)
nx.draw_networkx_nodes(graph,positions, nodelist = listadenos, node_color=graph.colors,node_size=150) nx.draw_networkx_edges(graph,positions,alpha=0.3) plt.draw() #completar com os estados on = [True, True, False, True, True, True, False, False, True, False, False, False, False] fl = [on[j] for j in range(food)] env_list = [[True, True], [False, True], [True, True], [True, False], [True, True], [False, False]] period = len(env_list) index = (env_list.index(fl) + 1)%period mae = nx.Graph() for i in range(len(listadenos)): mae.add_node(listadenos[i], {'on': on[i]}) control = Control(DNA = D, mother = mae) for i in range(50): draw_BN(control, control.pos, control.genes_list) control.change_state() time.sleep(1) if i%5 == 4: control.change_environment(env_list[index]) index = (index+1)%period
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)