From e88185602bb68982817e4fa1bab2b50355dd0f85 Mon Sep 17 00:00:00 2001 From: Isadora White Date: Fri, 2 May 2025 12:01:10 -0700 Subject: [PATCH] fix human evaluations for construction --- .../blueprint_visualizer.py | 76 + .../church_three_agents.pdf | Bin 0 -> 56886 bytes .../custom/church_one_agent.json | 2348 +++++++++++++++++ .../human_ai_tasks/1_agent_1_human.json | 435 +++ .../human_ai_tasks/2_agent_1_human.json | 435 +++ .../human_ai_tasks/3_agent_1_human.json | 435 +++ .../human_ai_tasks/4_agent_1_human.json | 435 +++ tasks/cooking_tasks/human_tasks/1_human.json | 44 + tasks/cooking_tasks/human_tasks/2_humans.json | 48 + tasks/cooking_tasks/human_tasks/3_humans.json | 48 + tasks/cooking_tasks/human_tasks/4_humans.json | 40 + tasks/cooking_tasks/human_tasks/5_humans.json | 49 + tasks/human_evaluation.js | 68 +- 13 files changed, 4447 insertions(+), 14 deletions(-) create mode 100644 tasks/construction_tasks/blueprint_visualizer.py create mode 100644 tasks/construction_tasks/church_three_agents.pdf create mode 100644 tasks/construction_tasks/custom/church_one_agent.json create mode 100644 tasks/cooking_tasks/human_ai_tasks/1_agent_1_human.json create mode 100644 tasks/cooking_tasks/human_ai_tasks/2_agent_1_human.json create mode 100644 tasks/cooking_tasks/human_ai_tasks/3_agent_1_human.json create mode 100644 tasks/cooking_tasks/human_ai_tasks/4_agent_1_human.json create mode 100644 tasks/cooking_tasks/human_tasks/1_human.json create mode 100644 tasks/cooking_tasks/human_tasks/2_humans.json create mode 100644 tasks/cooking_tasks/human_tasks/3_humans.json create mode 100644 tasks/cooking_tasks/human_tasks/4_humans.json create mode 100644 tasks/cooking_tasks/human_tasks/5_humans.json diff --git a/tasks/construction_tasks/blueprint_visualizer.py b/tasks/construction_tasks/blueprint_visualizer.py new file mode 100644 index 0000000..f19866d --- /dev/null +++ b/tasks/construction_tasks/blueprint_visualizer.py @@ -0,0 +1,76 @@ +import json +import matplotlib.pyplot as plt +import numpy as np + +def display_3d_blocks(data): + """Displays a 3D array of blocks with different types in a single figure with subplots for each level, + including block coordinates. Dynamically adjusts the height of the figure. + + Args: + data: A dictionary containing the block data, structured like the JSON example. + """ + + block_types = { + "air": "white", + "oak_planks": "brown", + "stone_bricks": "gray", + "oak_door": "brown", + "oak_stairs": "brown", + "quartz_block": "white", + "glass_pane": "lightblue", + "torch": "orange" + } + + # Extract data from the JSON + levels = data["levels"] + num_levels = len(levels) + + # Create a figure and subplots grid + fig, axes = plt.subplots(num_levels, 1, figsize=(10, 5 * num_levels)) # One column, dynamic height + axes[0].legend(handles=[plt.Rectangle((0, 0), 1, 1, color=color) for color in block_types.values()], + labels=block_types.keys(), loc='upper right') + starting_coords = levels[0]["coordinates"] + + # Iterate over each level and corresponding subplot + for i, level in enumerate(levels): + ax = axes[i] + ax.set_title(f"Level {level['level']}") + placement = level["placement"] + + # Convert placement data to NumPy array + block_array = np.array([ + [block_types.get(block, 'gray') for block in row] for row in placement + ]) + + # Iterate over each block in the level + for x in range(block_array.shape[1]): + for y in range(block_array.shape[0]): + block_type = block_array[y, x] + + # Plot the block as a rectangle + rect = plt.Rectangle((x, y), 1, 1, color=block_type) + ax.add_patch(rect) + + # Add coordinate text to the center of the block + real_x = x + starting_coords[0] + real_y = level['level'] + starting_coords[1] + real_z = y + starting_coords[2] + ax.text(x + 0.5, y + 0.5, f"({real_x},{real_y},{real_z})", ha='center', va='center', fontsize=8) + + # Set axis limits and labels + ax.set_xlim([0, block_array.shape[1]]) + ax.set_ylim([0, block_array.shape[0]]) + ax.set_xlabel("X") + ax.set_ylabel("Y") + + + plt.tight_layout() # Adjust spacing between subplots + # plt.show() + plt.savefig("construction_tasks/church_three_agents.pdf", bbox_inches='tight') + +# Example usage: +with open("construction_tasks/custom/church_three_agents.json", "r") as f: + data = json.load(f) + data = data["church_three_agents"]["blueprint"] + +display_3d_blocks(data) \ No newline at end of file diff --git a/tasks/construction_tasks/church_three_agents.pdf b/tasks/construction_tasks/church_three_agents.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c9ae7e6f944b4f8808e1cff834645bfc78d113f8 GIT binary patch literal 56886 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 { + await new Promise(resolve => setTimeout(resolve, 5000)); console.log("Bot spawned. Starting task..."); + // initiate the world according to the construction or cooking world const usernames = args.usernames; - const task = taskData[selectedTaskId]; - const inventory = task.initial_inventory; + bot.chat(`/tp andy ${usernames[0]}`); + await new Promise(resolve => setTimeout(resolve, 5000)); + console.log(taskData); + console.log(task_id); + const task = taskData[task_id]; + console.log(task); // give the items to the users for (let i = 0; i < usernames.length; i++) { const user = usernames[i]; - const userInventory = inventory[i]; + bot.chat(`/clear ${user}`); + let userInventory = null; + if (task.initial_inventory) { + userInventory = task.initial_inventory[i]; + } if (userInventory) { for (const item in userInventory) { @@ -64,28 +81,51 @@ bot.on('spawn', async () => { } else { console.log(`No inventory found for user: ${user}`); } + let validator = null; if (task.type === "techtree" ) { bot.chat(`/tell ${user} You have the goal to ${task.goal}`); } if (task.type === "construction") { + console.log(task.blueprint); + const blueprint = new Blueprint(task.blueprint); + console.log(blueprint); + const result = blueprint.autoDelete(); + const commands = result.commands; + for (const command of commands) { + bot.chat(command); + } + bot.chat(`/tp @a ${task.blueprint.levels[0].coordinates[0]} ${task.blueprint.levels[0].coordinates[1]} ${task.blueprint.levels[0].coordinates[2]}`); bot.chat(`/tell ${user} You have the goal to ${task.goal}`); //todo: some sort of blueprint visualizer } if (task.type === "cooking") { + if (i === 0) { + const cooking_initiator = new CookingTaskInitiator(task, bot); + cooking_initiator.init(); + console.log("Cooking task initiated"); + } + await new Promise(resolve => setTimeout(resolve, 20000)); const user_goal = task.goal[i]; - bot.chat(`/tell ${user} You have the goal to ${user_goal}`); + bot.chat(`You have the goal to ${user_goal}`); } - } const timeout = task.timeout; - // wait timeout seconds and then crash the task - setTimeout(() => { - bot.chat(`/tell ${usernames} Time is up!`); - bot.quit(); - }, timeout * 1000); + console.log(`Timeout set to ${timeout} seconds`); + await new Promise(resolve => setTimeout(resolve, timeout * 1000)); + if (task.type === "construction") { + const blueprint = new Blueprint(task.blueprint); + const check = blueprint.explainBlueprintDifference(bot); + console.log(check); + const agent = new Agent(bot); + const validator = new ConstructionTaskValidator(task, agent); + const result = validator.validate(); + console.log(result); + bot.chat(`Score is ${result.score}`); + } + bot.chat(`Time is up!`); }); // give required information to the users in some way // do some automatic timer sort of thing to give the users time to do the task