def replace(self, worst): """ Replace the worst particle. """ # Threshold threshold = self.distances[worst] # Copy a survivor if self.num_particles > 1: while True: copy = rng.randint(self.num_particles) if copy != worst: break self.particles[worst] = deepcopy(self.particles[copy]) # Do mcmc for i in range(0, self.mcmc_steps): # Generate proposal proposal = deepcopy(self.particles[worst]) logA = proposal.perturb() proposal_distance = distance(self.reference_particle, proposal) if logA > 0.0: logA = 0.0 # Acceptance if proposal_distance < threshold and rng.rand() <= np.exp(logA): self.particles[worst] = proposal self.distances[worst] = proposal_distance
def compute_distances(self): """ Compute the distance from the reference particle to each comparison particle. """ self.distances = [ distance(self.reference_particle, p) for p in self.particles ] self.distances = np.array(self.distances)