def test_new_cells_with_same_representation_only_best_returned_on_sample( self): worse_cell = total_cell.Cell( representation_info=self.TestRepresentationInfo(0), prioritizing_info=self.TestPrioritizingInfo(compare_value=0)) better_cell = total_cell.Cell( representation_info=self.TestRepresentationInfo(0), prioritizing_info=self.TestPrioritizingInfo(compare_value=100)) self.archive.update(worse_cell) self.archive.update(better_cell) sample = self.archive.sample(batch_size=1) self.assertEqual(next(sample), better_cell)
def test_sample_cells_returns_values_according_to_utilities_as_softmax( self): probabilities = [0.1, 0.7, 0.2] total_trials = 10**5 cells = [ total_cell.Cell( representation_info=self.TestRepresentationInfo(i), utility_info=self.TestUtilityInfo( # Log for softmax (e^utility is used for scaling) np.log(prob))) for i, prob in enumerate(probabilities) ] for cell in cells: self.archive.update(cell) sampled_cells = self.archive.sample(batch_size=total_trials) successes = [0] * len(probabilities) for cell in sampled_cells: successes[cell.representation_info.for_hashing] += 1 for desired_prob, success_count in zip(probabilities, successes): got_prob = float(success_count) / total_trials abs_difference = np.abs(got_prob - desired_prob) max_difference = 9 * np.sqrt(desired_prob * (1 - desired_prob) / total_trials) # Probability of failing here is ~1e-15 # (if the implementation is valid). self.assertLess(abs_difference, max_difference)
def setUp(self): self.archive = in_memory_archive.InMemoryArchive() self.cells_100_different = [ total_cell.Cell( prioritizing_info=self.TestPrioritizingInfo(compare_value=i), representation_info=self.TestRepresentationInfo(for_hashing=i), utility_info=self.TestUtilityInfo(ret_utility=i)) for i in range(100) ]
def test_new_cell_gets_sampled_in_archive(self): cell = total_cell.Cell() self.archive.update(cell) sampled_cells = self.archive.sample(batch_size=1) self.assertEqual(next(sampled_cells), cell) with self.assertRaises( StopIteration, msg='Expected that there is only one element in ' 'the returned cells batch.'): next(sampled_cells)
def test_same_representation_better_priority_utility_stays_same(self): worse_cell = total_cell.Cell( representation_info=self.TestRepresentationInfo(0), prioritizing_info=self.TestPrioritizingInfo(compare_value=0), utility_info=self.TestUtilityInfo(ret_utility=100)) better_cell = total_cell.Cell( representation_info=self.TestRepresentationInfo(0), prioritizing_info=self.TestPrioritizingInfo(compare_value=100), utility_info=self.TestUtilityInfo(ret_utility=10)) self.archive.update(worse_cell) self.archive.update(better_cell) sample = next(self.archive.sample(batch_size=1)) self.assertEqual( sample.utility_info.ret_utility, 100, msg='Expected that when a cell is replaced with ' 'a better one, utility for sampling stays the same.')