def nfi_phase(self, prev_position, prev_fitness): new_position_list = [] xichma_v = 1 xichma_u = ((gamma(1 + 1.5) * np.sin(np.pi * 1.5 / 2)) / (gamma( (1 + 1.5) / 2) * 1.5 * 2**((1.5 - 1) / 2)))**(1.0 / 1.5) self.levy_b = (np.random.normal(0, xichma_u**2)) / (np.sqrt( np.abs(np.random.normal(0, xichma_v**2)))**(1.0 / 1.5)) # NFi phase Pb = np.random.uniform() Pfi = np.random.uniform() self.alpha = 0.01 for i in range(self.pop_size): # Calculate neutron vector Nei by Eq. (2) # Random 1 more index to select neutron temp1 = list(set(range(self.pop_size)) - {i}) i1 = np.random.choice(temp1, replace=False) Nei = (prev_position[i] + prev_position[i1]) / 2 # Update population of fission products according to Eq.(3), (6) or (9); if np.random.uniform() <= Pfi: # Update based on Eq. 3 if np.random.uniform() <= Pb: xichma1 = (loge(self.current_epoch + 1) * 1.0 / (self.current_epoch + 1)) * np.abs( np.subtract(prev_position[i], self.g_best_pos)) gauss = np.array([ np.random.normal(self.g_best_pos[j], xichma1[j]) for j in range(self.problem_size) ]) Xi = (gauss + np.random.uniform() * self.g_best_pos - np.round(np.random.rand() + 1) * Nei) # Update based on Eq. 6 else: i2 = np.random.choice(temp1, replace=False) xichma2 = (loge(self.current_epoch + 1) * 1.0 / (self.current_epoch + 1)) * np.abs( np.subtract(prev_position[i2], self.g_best_pos)) gauss = np.array([ np.random.normal(prev_position[i][j], xichma2[j]) for j in range(self.problem_size) ]) Xi = (gauss + np.random.uniform() * self.g_best_pos - np.round(np.random.rand() + 2) * Nei) # Update based on Eq. 9 else: i3 = np.random.choice(temp1, replace=False) xichma2 = (loge(self.current_epoch + 1) * 1.0 / (self.current_epoch + 1)) * np.abs( np.subtract(prev_position[i3], self.g_best_pos)) Xi = np.array([ np.random.normal(prev_position[i][j], xichma2[j]) for j in range(self.problem_size) ]) new_position_list.append(Xi) return new_position_list
vodata['_r'] == n.min(vodata['_r']))[0]]['Seq'][0] src_logL = -99 src_logLs = [src_logL] else: try: #Use the flux maximum likelihood method to choose the optimal match d src_logLs = [] for seq in seqs: spec = n.sort(vodata[n.where(vodata['Seq'] == seq)[0]], order='nu').squeeze() src_logL = -(log10(src.jys)-P[seq](log10(src.mfreq)))**2/\ (2*((log10(src.e_S_nu+src.jys)-log10(src.jys))**2+e_P[seq](src.mfreq)**2)) +\ -n.max(spec['_r'])**2/(2*sres**2) src_logLs.append(src_logL) log.debug('calculated %d likelihoods' % len(src_logLs)) src_logLs = n.array(src_logLs) src_logLs -= loge(sum(exp(src_logLs))) src_logL = n.max(src_logLs) seq = seqs[n.where(src_logLs == src_logL)[0]] except (AttributeError): # print "This catalog does not have flux errors" src_logL = -99 #if not enough flux info, use the nearest position only seq = vodata[n.where( vodata['_r'] == n.min(vodata['_r']))[0]]['Seq'][0] #put in the data for the matched source for seq in seqs: VO.data['logL_cat'][n.where( VO.data['Seq'] == seq)[0]] = src_logLs VO.data['S_sf'][n.where( VO.data['Seq'] == seq)[0]] = 10**P[seq](log10(src.mfreq))
def train(self): pop = [ self.create_solution(minmax=self.ID_MIN_PROB) for _ in range(self.pop_size) ] g_best = self.get_global_best_solution(pop, self.ID_FIT, self.ID_MIN_PROB) for epoch in range(self.epoch): xichma_v = 1 xichma_u = ((gamma(1 + 1.5) * sin(pi * 1.5 / 2)) / (gamma( (1 + 1.5) / 2) * 1.5 * 2**((1.5 - 1) / 2)))**(1.0 / 1.5) levy_b = (normal(0, xichma_u**2)) / (sqrt( abs(normal(0, xichma_v**2)))**(1.0 / 1.5)) # NFi phase Pb = uniform() Pfi = uniform() freq = 0.05 alpha = 0.01 for i in range(self.pop_size): ## Calculate neutron vector Nei by Eq. (2) ## Random 1 more index to select neutron temp1 = list(set(range(0, self.pop_size)) - {i}) i1 = choice(temp1, replace=False) Nei = (pop[i][self.ID_POS] + pop[i1][self.ID_POS]) / 2 ## Update population of fission products according to Eq.(3), (6) or (9); if uniform() <= Pfi: ### Update based on Eq. 3 if uniform() <= Pb: xichma1 = (loge(epoch + 1) * 1.0 / (epoch + 1)) * abs( subtract(pop[i][self.ID_POS], g_best[self.ID_POS])) gauss = array([ normal(g_best[self.ID_POS][j], xichma1[j]) for j in range(self.problem_size) ]) Xi = gauss + uniform() * g_best[self.ID_POS] - round( rand() + 1) * Nei ### Update based on Eq. 6 else: i2 = choice(temp1, replace=False) xichma2 = (loge(epoch + 1) * 1.0 / (epoch + 1)) * abs( subtract(pop[i2][self.ID_POS], g_best[self.ID_POS])) gauss = array([ normal(pop[i][self.ID_POS][j], xichma2[j]) for j in range(self.problem_size) ]) Xi = gauss + uniform() * g_best[self.ID_POS] - round( rand() + 2) * Nei ## Update based on Eq. 9 else: i3 = choice(temp1, replace=False) xichma2 = (loge(epoch + 1) * 1.0 / (epoch + 1)) * abs( subtract(pop[i3][self.ID_POS], g_best[self.ID_POS])) Xi = array([ normal(pop[i][self.ID_POS][j], xichma2[j]) for j in range(self.problem_size) ]) ## Check the boundary and evaluate the fitness function Xi = self.amend_position_random_faster(Xi) fit = self.get_fitness_position(Xi, self.ID_MIN_PROB) if fit < pop[i][self.ID_FIT]: pop[i] = [Xi, fit] if fit < g_best[self.ID_FIT]: g_best = [Xi, fit] # NFu phase ## Ionization stage ## Calculate the Pa through Eq. (10); ranked_pop = rankdata( [pop[i][self.ID_FIT] for i in range(self.pop_size)]) for i in range(self.pop_size): X_ion = deepcopy(pop[i][self.ID_POS]) if (ranked_pop[i] * 1.0 / self.pop_size) < uniform(): i1, i2 = choice(list(set(range(0, self.pop_size)) - {i}), 2, replace=False) for j in range(self.problem_size): #### Levy flight strategy is described as Eq. 18 if pop[i2][self.ID_POS][j] == pop[i][self.ID_POS][j]: X_ion[j] = pop[i][self.ID_POS][ j] + alpha * levy_b * (pop[i][self.ID_POS][j] - g_best[self.ID_POS][j]) #### If not, based on Eq. 11, 12 else: if uniform() <= 0.5: X_ion[j] = pop[i1][self.ID_POS][j] + uniform( ) * (pop[i2][self.ID_POS][j] - pop[i][self.ID_POS][j]) else: X_ion[j] = pop[i1][self.ID_POS][j] - uniform( ) * (pop[i2][self.ID_POS][j] - pop[i][self.ID_POS][j]) else: #### Levy flight strategy is described as Eq. 21 X_worst = self.get_global_best_solution( pop, self.ID_FIT, self.ID_MAX_PROB) for j in range(self.problem_size): ##### Based on Eq. 21 if X_worst[self.ID_POS][j] == g_best[self.ID_POS][j]: X_ion[j] = pop[i][self.ID_POS][ j] + alpha * levy_b * (self.ub[j] - self.lb[j]) ##### Based on Eq. 13 else: X_ion[j] = pop[i][self.ID_POS][j] + round(uniform( )) * uniform() * (X_worst[self.ID_POS][j] - g_best[self.ID_POS][j]) ## Check the boundary and evaluate the fitness function for X_ion X_ion = self.amend_position_random_faster(X_ion) fit = self.get_fitness_position(X_ion, self.ID_MIN_PROB) if fit < pop[i][self.ID_FIT]: pop[i] = [X_ion, fit] if fit < g_best[self.ID_FIT]: g_best = [X_ion, fit] ## Fusion Stage ### all ions obtained from ionization are ranked based on (14) - Calculate the Pc through Eq. (14) ranked_pop = rankdata( [pop[i][self.ID_FIT] for i in range(self.pop_size)]) for i in range(self.pop_size): i1, i2 = choice(list(set(range(0, self.pop_size)) - {i}), 2, replace=False) #### Generate fusion nucleus if (ranked_pop[i] * 1.0 / self.pop_size) < uniform(): t1 = uniform() * (pop[i1][self.ID_POS] - g_best[self.ID_POS]) t2 = uniform() * (pop[i2][self.ID_POS] - g_best[self.ID_POS]) temp2 = pop[i1][self.ID_POS] - pop[i2][self.ID_POS] X_fu = pop[i][ self.ID_POS] + t1 + t2 - exp(-norm(temp2)) * temp2 #### Else else: ##### Based on Eq. 22 check_equal = ( pop[i1][self.ID_POS] == pop[i2][self.ID_POS]) if check_equal.all(): X_fu = pop[i][self.ID_POS] + alpha * levy_b * ( pop[i][self.ID_POS] - g_best[self.ID_POS]) ##### Based on Eq. 16, 17 else: if uniform() > 0.5: X_fu = pop[i][self.ID_POS] - 0.5 * ( sin(2 * pi * freq * epoch + pi) * (self.epoch - epoch) / self.epoch + 1 ) * (pop[i1][self.ID_POS] - pop[i2][self.ID_POS]) else: X_fu = pop[i][self.ID_POS] - 0.5 * ( sin(2 * pi * freq * epoch + pi) * epoch / self.epoch + 1) * (pop[i1][self.ID_POS] - pop[i2][self.ID_POS]) X_fu = self.amend_position_random_faster(X_fu) fit = self.get_fitness_position(X_fu, self.ID_MIN_PROB) if fit < pop[i][self.ID_FIT]: pop[i] = [X_fu, fit] if fit < g_best[self.ID_FIT]: g_best = [X_fu, fit] self.loss_train.append(g_best[self.ID_FIT]) if self.verbose: print(">Epoch: {}, Best fit: {}".format( epoch + 1, g_best[self.ID_FIT])) self.solution = g_best return g_best[self.ID_POS], g_best[self.ID_FIT], self.loss_train
if len(seqs)<2:#if we only found one source, the IDing is easy seq = vodata[n.where(vodata['_r']==n.min(vodata['_r']))[0]]['Seq'][0] src_logL = -99 src_logLs = [src_logL] else: try: #Use the flux maximum likelihood method to choose the optimal match d src_logLs = [] for seq in seqs: spec = n.sort(vodata[n.where(vodata['Seq']==seq)[0]],order='nu').squeeze() src_logL = -(log10(src.jys)-P[seq](log10(src.mfreq)))**2/\ (2*((log10(src.e_S_nu+src.jys)-log10(src.jys))**2+e_P[seq](src.mfreq)**2)) +\ -n.max(spec['_r'])**2/(2*sres**2) src_logLs.append(src_logL) log.debug('calculated %d likelihoods'%len(src_logLs)) src_logLs =n.array(src_logLs) src_logLs -= loge(sum(exp(src_logLs))) src_logL = n.max(src_logLs) seq = seqs[n.where(src_logLs==src_logL)[0]] except(AttributeError): # print "This catalog does not have flux errors" src_logL = -99 #if not enough flux info, use the nearest position only seq = vodata[n.where(vodata['_r']==n.min(vodata['_r']))[0]]['Seq'][0] #put in the data for the matched source for seq in seqs: VO.data['logL_cat'][n.where(VO.data['Seq']==seq)[0]] = src_logLs VO.data['S_sf'][n.where(VO.data['Seq']==seq)[0]]=10**P[seq](log10(src.mfreq)) VO.data['e_S_sf'][n.where(VO.data['Seq']==seq)[0]]=\ 10**(P[seq](log10(src.mfreq))+res[seq]) -\ 10**P[seq](log10(src.mfreq))