npc_engine_utils/
graphs.rs

1/*
2 *  SPDX-License-Identifier: Apache-2.0 OR MIT
3 *  © 2020-2022 ETH Zurich and other contributors, see AUTHORS.txt for details
4 */
5
6use npc_engine_core::{debug_name_to_filename_safe, graphviz, ActiveTask, Domain, MCTS};
7use std::fs;
8
9/// Plots the MCTS tree using graphviz's dot format.
10pub fn plot_tree_in_tmp<D: Domain>(
11    mcts: &MCTS<D>,
12    base_dir_name: &str,
13    file_name: &str,
14) -> std::io::Result<()> {
15    let temp_dir = std::env::temp_dir().display().to_string();
16    let path = format!("{temp_dir}/{base_dir_name}/");
17    fs::create_dir_all(&path)?;
18    let mut file = fs::OpenOptions::new()
19        .create(true)
20        .write(true)
21        .truncate(true)
22        .open(format!("{path}{file_name}.dot"))?;
23    graphviz::plot_mcts_tree(mcts, &mut file)
24}
25
26/// Plots the MCTS tree using graphviz's dot format, with a filename derived from an active task.
27pub fn plot_tree_in_tmp_with_task_name<D: Domain>(
28    mcts: &MCTS<D>,
29    base_dir_name: &str,
30    last_active_task: &ActiveTask<D>,
31) -> std::io::Result<()> {
32    let time_text = format!("T{}", mcts.start_tick());
33    let agent_id_text = format!("A{}", mcts.agent().0);
34    let last_task_name = format!("{:?}", last_active_task.task);
35    let last_task_name = debug_name_to_filename_safe(&last_task_name);
36    plot_tree_in_tmp(
37        mcts,
38        base_dir_name,
39        &format!("{agent_id_text}-{time_text}-{last_task_name}"),
40    )
41}