def test_agent_manager_stats(): policy = mock.Mock() stats_reporter = StatsReporter("FakeCategory") writer = mock.Mock() stats_reporter.add_writer(writer) manager = AgentManager(policy, "MyBehavior", stats_reporter) all_env_stats = [ { "averaged": [(1.0, StatsAggregationMethod.AVERAGE)], "most_recent": [(2.0, StatsAggregationMethod.MOST_RECENT)], }, { "averaged": [(3.0, StatsAggregationMethod.AVERAGE)], "most_recent": [(4.0, StatsAggregationMethod.MOST_RECENT)], }, ] for env_stats in all_env_stats: manager.record_environment_stats(env_stats, worker_id=0) expected_stats = { "averaged": StatsSummary(mean=2.0, std=mock.ANY, num=2), "most_recent": StatsSummary(mean=4.0, std=0.0, num=1), } stats_reporter.write_stats(123) writer.write_stats.assert_any_call("FakeCategory", expected_stats, 123) # clean up our Mock from the global list StatsReporter.writers.remove(writer)
def test_console_writer(self): # Test write_stats with self.assertLogs("mlagents.trainers", level="INFO") as cm: category = "category1" console_writer = ConsoleWriter() statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) console_writer.write_stats( category, { "Environment/Cumulative Reward": statssummary1, "Is Training": statssummary1, }, 10, ) statssummary2 = StatsSummary(mean=0.0, std=0.0, num=1) console_writer.write_stats( category, { "Environment/Cumulative Reward": statssummary1, "Is Training": statssummary2, }, 10, ) # Test hyperparameter writing console_writer.add_property( "category1", StatsPropertyType.HYPERPARAMETERS, {"example": 1.0} ) self.assertIn( "Mean Reward: 1.000. Std of Reward: 1.000. Training.", cm.output[0] ) self.assertIn("Not Training.", cm.output[1]) self.assertIn("Hyperparameters for behavior name", cm.output[2]) self.assertIn("example:\t1.0", cm.output[2])
def test_selfplay_console_writer(self): with self.assertLogs("mlagents.trainers", level="INFO") as cm: category = "category1" console_writer = ConsoleWriter() console_writer.add_property(category, StatsPropertyType.SELF_PLAY, True) console_writer.add_property(category, StatsPropertyType.SELF_PLAY_TEAM, 1) statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) console_writer.write_stats( category, { "Environment/Cumulative Reward": statssummary1, "Is Training": statssummary1, "Self-play/ELO": statssummary1, "Self-play/Mean Opponent ELO": statssummary1, "Self-play/Std Opponent ELO": statssummary1, }, 10, ) self.assertIn("Mean Reward: 1.000. Std of Reward: 1.000. Training.", cm.output[0]) self.assertIn( "category1 Team 1: ELO: 1.000. Mean Opponent ELO: 1.000. Std Opponent ELO: 1.000.", cm.output[1], )
def test_tensorboard_writer(mock_filewriter, mock_summary): # Test write_stats category = "category1" with tempfile.TemporaryDirectory(prefix="unittest-") as base_dir: tb_writer = TensorboardWriter(base_dir, clear_past_data=False) statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) # Test that the filewriter has been created and the directory has been created. filewriter_dir = "{basedir}/{category}".format(basedir=base_dir, category=category) assert os.path.exists(filewriter_dir) mock_filewriter.assert_called_once_with(filewriter_dir) # Test that the filewriter was written to and the summary was added. mock_summary.return_value.value.add.assert_called_once_with( tag="key1", simple_value=1.0) mock_filewriter.return_value.add_summary.assert_called_once_with( mock_summary.return_value, 10) mock_filewriter.return_value.flush.assert_called_once() # Test hyperparameter writing - no good way to parse the TB string though. tb_writer.add_property("category1", StatsPropertyType.HYPERPARAMETERS, {"example": 1.0}) assert mock_filewriter.return_value.add_summary.call_count > 1
def test_selfplay_console_writer(self): with self.assertLogs("mlagents.trainers", level="INFO") as cm: category = "category1" console_writer = ConsoleWriter() console_writer.add_property(category, StatsPropertyType.SELF_PLAY, True) statssummary1 = StatsSummary( mean=1.0, std=1.0, num=1, sum=1.0, aggregation_method=StatsAggregationMethod.AVERAGE, ) console_writer.write_stats( category, { "Environment/Cumulative Reward": statssummary1, "Is Training": statssummary1, "Self-play/ELO": statssummary1, }, 10, ) self.assertIn("Mean Reward: 1.000. Std of Reward: 1.000. Training.", cm.output[0])
def test_tensorboard_writer_clear(tmp_path): tb_writer = TensorboardWriter(tmp_path, clear_past_data=False) statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) # TB has some sort of timeout before making a new file time.sleep(1.0) assert len(os.listdir(os.path.join(tmp_path, "category1"))) > 0 # See if creating a new one doesn't delete it tb_writer = TensorboardWriter(tmp_path, clear_past_data=False) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) assert len(os.listdir(os.path.join(tmp_path, "category1"))) > 1 time.sleep(1.0) # See if creating a new one deletes old ones tb_writer = TensorboardWriter(tmp_path, clear_past_data=True) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) assert len(os.listdir(os.path.join(tmp_path, "category1"))) == 1
def test_tensorboard_writer_clear(tmp_path): tb_writer = TensorboardWriter(tmp_path, clear_past_data=False) statssummary1 = StatsSummary( full_dist=[1.0], aggregation_method=StatsAggregationMethod.AVERAGE) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) # TB has some sort of timeout before making a new file time.sleep(1.0) assert len(os.listdir(os.path.join(tmp_path, "category1"))) > 0 # See if creating a new one doesn't delete it tb_writer = TensorboardWriter(tmp_path, clear_past_data=False) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) assert len(os.listdir(os.path.join(tmp_path, "category1"))) > 1 time.sleep(1.0) # See if creating a new one deletes old ones tb_writer = TensorboardWriter(tmp_path, clear_past_data=True) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) assert len(os.listdir(os.path.join(tmp_path, "category1"))) == 1
def test_tensorboard_writer(mock_filewriter, mock_summary): # Test write_stats category = "category1" with tempfile.TemporaryDirectory(prefix="unittest-") as base_dir: tb_writer = TensorboardWriter(base_dir) statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) tb_writer.write_stats("category1", {"key1": statssummary1}, 10) # Test that the filewriter has been created and the directory has been created. filewriter_dir = "{basedir}/{category}".format(basedir=base_dir, category=category) assert os.path.exists(filewriter_dir) mock_filewriter.assert_called_once_with(filewriter_dir) # Test that the filewriter was written to and the summary was added. mock_summary.return_value.value.add.assert_called_once_with( tag="key1", simple_value=1.0) mock_filewriter.return_value.add_summary.assert_called_once_with( mock_summary.return_value, 10) mock_filewriter.return_value.flush.assert_called_once()
def test_csv_writer(): # Test write_stats category = "category1" with tempfile.TemporaryDirectory(prefix="unittest-") as base_dir: csv_writer = CSVWriter(base_dir, required_fields=["key1", "key2"]) statssummary1 = StatsSummary(mean=1.0, std=1.0, num=1) csv_writer.write_stats("category1", {"key1": statssummary1}, 10) # Test that the filewriter has been created and the directory has been created. filewriter_dir = "{basedir}/{category}.csv".format(basedir=base_dir, category=category) # The required keys weren't in the stats assert not os.path.exists(filewriter_dir) csv_writer.write_stats("category1", { "key1": statssummary1, "key2": statssummary1 }, 10) csv_writer.write_stats("category1", { "key1": statssummary1, "key2": statssummary1 }, 20) # The required keys were in the stats assert os.path.exists(filewriter_dir) with open(filewriter_dir) as csv_file: csv_reader = csv.reader(csv_file, delimiter=",") line_count = 0 for row in csv_reader: if line_count == 0: assert "key1" in row assert "key2" in row assert "Steps" in row line_count += 1 else: assert len(row) == 3 line_count += 1 assert line_count == 3
def test_tensorboard_writer_hidden_keys(mock_summary): # Test write_stats category = "category1" with tempfile.TemporaryDirectory(prefix="unittest-") as base_dir: tb_writer = TensorboardWriter( base_dir, clear_past_data=False, hidden_keys="hiddenKey" ) statssummary1 = StatsSummary( full_dist=[1.0], aggregation_method=StatsAggregationMethod.AVERAGE ) tb_writer.write_stats("category1", {"hiddenKey": statssummary1}, 10) # Test that the filewriter has been created and the directory has been created. filewriter_dir = "{basedir}/{category}".format( basedir=base_dir, category=category ) assert os.path.exists(filewriter_dir) mock_summary.assert_called_once_with(filewriter_dir) # Test that the filewriter was not written to since we used the hidden key. mock_summary.return_value.add_scalar.assert_not_called() mock_summary.return_value.flush.assert_not_called()