From f40301cac94c5d4ace8b2ca8573bfe0b60669e19 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Tue, 19 Mar 2024 16:49:01 -0700 Subject: [PATCH] delete gym-wordle, fix some issues in letter_guess gym, add wandb integration --- .gitignore | 4 +- dqn_letter_gssr.ipynb | 2951 ++++- gym_wordle/__init__.py | 7 - gym_wordle/dictionary/guess_list.csv | 12972 ---------------------- gym_wordle/dictionary/guess_list.npy | Bin 519008 -> 0 bytes gym_wordle/dictionary/solution_list.csv | 2315 ---- gym_wordle/dictionary/solution_list.npy | Bin 92728 -> 0 bytes gym_wordle/utils.py | 93 - gym_wordle/wordle.py | 353 - letter_guess.py | 39 +- 10 files changed, 2957 insertions(+), 15777 deletions(-) delete mode 100644 gym_wordle/__init__.py delete mode 100644 gym_wordle/dictionary/guess_list.csv delete mode 100644 gym_wordle/dictionary/guess_list.npy delete mode 100644 gym_wordle/dictionary/solution_list.csv delete mode 100644 gym_wordle/dictionary/solution_list.npy delete mode 100644 gym_wordle/utils.py delete mode 100644 gym_wordle/wordle.py diff --git a/.gitignore b/.gitignore index 3d6ff5e..5bd8281 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ **/data/* **/*.zip **/__pycache__ -/env \ No newline at end of file +/env +**/runs/* +**/wandb/* \ No newline at end of file diff --git a/dqn_letter_gssr.ipynb b/dqn_letter_gssr.ipynb index fd92d10..1039266 100644 --- a/dqn_letter_gssr.ipynb +++ b/dqn_letter_gssr.ipynb @@ -25,31 +25,2890 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "LetterGuessingEnv.__init__() missing 1 required positional argument: 'seed'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[2], line 5\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mstable_baselines3\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcommon\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01menv_checker\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m check_env\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mletter_guess\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m LetterGuessingEnv\n\u001b[1;32m----> 5\u001b[0m env \u001b[38;5;241m=\u001b[39m \u001b[43mLetterGuessingEnv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalid_words\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mload_valid_words\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Make sure to load your valid words\u001b[39;00m\n\u001b[0;32m 6\u001b[0m check_env(env) \u001b[38;5;66;03m# Optional: Verify the environment is compatible with SB3\u001b[39;00m\n\u001b[0;32m 8\u001b[0m model \u001b[38;5;241m=\u001b[39m PPO(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMlpPolicy\u001b[39m\u001b[38;5;124m\"\u001b[39m, env, verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n", - "\u001b[1;31mTypeError\u001b[0m: LetterGuessingEnv.__init__() missing 1 required positional argument: 'seed'" - ] - } - ], + "outputs": [], "source": [ "from stable_baselines3 import PPO # Or any other suitable RL algorithm\n", "from stable_baselines3.common.env_checker import check_env\n", "from letter_guess import LetterGuessingEnv\n", - "\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ "env = LetterGuessingEnv(valid_words=load_valid_words()) # Make sure to load your valid words\n", - "check_env(env) # Optional: Verify the environment is compatible with SB3\n", - "\n", - "model = PPO(\"MlpPolicy\", env, verbose=1)\n", + "check_env(env) # Optional: Verify the environment is compatible with SB3" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import wandb\n", + "from wandb.integration.sb3 import WandbCallback" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mltcptgeneral\u001b[0m (\u001b[33mfulltime\u001b[0m). Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n" + ] + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.16.4" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /home/art/cse151b-final-project/wandb/run-20240319_162920-ot2i0b8h" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run confused-meadow-3 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/fulltime/wordle" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/fulltime/wordle/runs/ot2i0b8h" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "config = {\n", + " \"policy_type\": \"MlpPolicy\",\n", + " \"total_timesteps\": 200_000\n", + "}\n", + "run = wandb.init(\n", + " project=\"wordle\",\n", + " config=config,\n", + " sync_tensorboard=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using cuda device\n", + "Wrapping the env with a `Monitor` wrapper\n", + "Wrapping the env in a DummyVecEnv.\n", + "Logging to runs/ot2i0b8h/PPO_1\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "585e7545478a485aa91c487b8630840f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 2.48 |\n", + "| ep_rew_mean | -3.7 |\n", + "| time/ | |\n", + "| fps | 465 |\n", + "| iterations | 1 |\n", + "| time_elapsed | 4 |\n", + "| total_timesteps | 2048 |\n", + "---------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 2.49 |\n", + "| ep_rew_mean | -3.65 |\n", + "| time/ | |\n", + "| fps | 395 |\n", + "| iterations | 2 |\n", + "| time_elapsed | 10 |\n", + "| total_timesteps | 4096 |\n", + "| train/ | |\n", + "| approx_kl | 0.04501068 |\n", + "| clip_fraction | 0.427 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -3.23 |\n", + "| explained_variance | 0.189 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.205 |\n", + "| n_updates | 10 |\n", + "| policy_gradient_loss | -0.0667 |\n", + "| value_loss | 0.997 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 2.84 |\n", + "| ep_rew_mean | -3.4 |\n", + "| time/ | |\n", + "| fps | 381 |\n", + "| iterations | 3 |\n", + "| time_elapsed | 16 |\n", + "| total_timesteps | 6144 |\n", + "| train/ | |\n", + "| approx_kl | 0.01765968 |\n", + "| clip_fraction | 0.319 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -3.17 |\n", + "| explained_variance | 0.481 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.123 |\n", + "| n_updates | 20 |\n", + "| policy_gradient_loss | -0.0525 |\n", + "| value_loss | 0.383 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 2.98 |\n", + "| ep_rew_mean | -3.28 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 4 |\n", + "| time_elapsed | 21 |\n", + "| total_timesteps | 8192 |\n", + "| train/ | |\n", + "| approx_kl | 0.018652592 |\n", + "| clip_fraction | 0.368 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -3.11 |\n", + "| explained_variance | 0.428 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.181 |\n", + "| n_updates | 30 |\n", + "| policy_gradient_loss | -0.0572 |\n", + "| value_loss | 0.51 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.1 |\n", + "| ep_rew_mean | -3.24 |\n", + "| time/ | |\n", + "| fps | 369 |\n", + "| iterations | 5 |\n", + "| time_elapsed | 27 |\n", + "| total_timesteps | 10240 |\n", + "| train/ | |\n", + "| approx_kl | 0.023806999 |\n", + "| clip_fraction | 0.365 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -3.04 |\n", + "| explained_variance | 0.46 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.118 |\n", + "| n_updates | 40 |\n", + "| policy_gradient_loss | -0.0609 |\n", + "| value_loss | 0.499 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.15 |\n", + "| ep_rew_mean | -3.09 |\n", + "| time/ | |\n", + "| fps | 366 |\n", + "| iterations | 6 |\n", + "| time_elapsed | 33 |\n", + "| total_timesteps | 12288 |\n", + "| train/ | |\n", + "| approx_kl | 0.024716537 |\n", + "| clip_fraction | 0.372 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.94 |\n", + "| explained_variance | 0.495 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.266 |\n", + "| n_updates | 50 |\n", + "| policy_gradient_loss | -0.0578 |\n", + "| value_loss | 0.503 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.46 |\n", + "| ep_rew_mean | -2.8 |\n", + "| time/ | |\n", + "| fps | 365 |\n", + "| iterations | 7 |\n", + "| time_elapsed | 39 |\n", + "| total_timesteps | 14336 |\n", + "| train/ | |\n", + "| approx_kl | 0.023435738 |\n", + "| clip_fraction | 0.357 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.82 |\n", + "| explained_variance | 0.556 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.105 |\n", + "| n_updates | 60 |\n", + "| policy_gradient_loss | -0.0537 |\n", + "| value_loss | 0.491 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.54 |\n", + "| ep_rew_mean | -2.74 |\n", + "| time/ | |\n", + "| fps | 363 |\n", + "| iterations | 8 |\n", + "| time_elapsed | 45 |\n", + "| total_timesteps | 16384 |\n", + "| train/ | |\n", + "| approx_kl | 0.02574392 |\n", + "| clip_fraction | 0.29 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.71 |\n", + "| explained_variance | 0.608 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.125 |\n", + "| n_updates | 70 |\n", + "| policy_gradient_loss | -0.0445 |\n", + "| value_loss | 0.464 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.71 |\n", + "| ep_rew_mean | -2.63 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 9 |\n", + "| time_elapsed | 50 |\n", + "| total_timesteps | 18432 |\n", + "| train/ | |\n", + "| approx_kl | 0.021754535 |\n", + "| clip_fraction | 0.251 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.56 |\n", + "| explained_variance | 0.673 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.152 |\n", + "| n_updates | 80 |\n", + "| policy_gradient_loss | -0.0385 |\n", + "| value_loss | 0.4 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.8 |\n", + "| ep_rew_mean | -2.5 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 10 |\n", + "| time_elapsed | 56 |\n", + "| total_timesteps | 20480 |\n", + "| train/ | |\n", + "| approx_kl | 0.018548178 |\n", + "| clip_fraction | 0.239 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.46 |\n", + "| explained_variance | 0.702 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.218 |\n", + "| n_updates | 90 |\n", + "| policy_gradient_loss | -0.0361 |\n", + "| value_loss | 0.396 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.8 |\n", + "| ep_rew_mean | -2.34 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 11 |\n", + "| time_elapsed | 62 |\n", + "| total_timesteps | 22528 |\n", + "| train/ | |\n", + "| approx_kl | 0.016667131 |\n", + "| clip_fraction | 0.24 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.36 |\n", + "| explained_variance | 0.698 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.226 |\n", + "| n_updates | 100 |\n", + "| policy_gradient_loss | -0.037 |\n", + "| value_loss | 0.411 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 3.95 |\n", + "| ep_rew_mean | -2.31 |\n", + "| time/ | |\n", + "| fps | 361 |\n", + "| iterations | 12 |\n", + "| time_elapsed | 67 |\n", + "| total_timesteps | 24576 |\n", + "| train/ | |\n", + "| approx_kl | 0.020023255 |\n", + "| clip_fraction | 0.257 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.24 |\n", + "| explained_variance | 0.712 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0958 |\n", + "| n_updates | 110 |\n", + "| policy_gradient_loss | -0.0381 |\n", + "| value_loss | 0.406 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.19 |\n", + "| ep_rew_mean | -2.03 |\n", + "| time/ | |\n", + "| fps | 360 |\n", + "| iterations | 13 |\n", + "| time_elapsed | 73 |\n", + "| total_timesteps | 26624 |\n", + "| train/ | |\n", + "| approx_kl | 0.019943349 |\n", + "| clip_fraction | 0.266 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -2.13 |\n", + "| explained_variance | 0.712 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0974 |\n", + "| n_updates | 120 |\n", + "| policy_gradient_loss | -0.0387 |\n", + "| value_loss | 0.444 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.24 |\n", + "| ep_rew_mean | -1.96 |\n", + "| time/ | |\n", + "| fps | 360 |\n", + "| iterations | 14 |\n", + "| time_elapsed | 79 |\n", + "| total_timesteps | 28672 |\n", + "| train/ | |\n", + "| approx_kl | 0.022638176 |\n", + "| clip_fraction | 0.298 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.98 |\n", + "| explained_variance | 0.697 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.145 |\n", + "| n_updates | 130 |\n", + "| policy_gradient_loss | -0.0433 |\n", + "| value_loss | 0.486 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.45 |\n", + "| ep_rew_mean | -1.89 |\n", + "| time/ | |\n", + "| fps | 361 |\n", + "| iterations | 15 |\n", + "| time_elapsed | 84 |\n", + "| total_timesteps | 30720 |\n", + "| train/ | |\n", + "| approx_kl | 0.02262218 |\n", + "| clip_fraction | 0.354 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.77 |\n", + "| explained_variance | 0.727 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0807 |\n", + "| n_updates | 140 |\n", + "| policy_gradient_loss | -0.0439 |\n", + "| value_loss | 0.454 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.91 |\n", + "| ep_rew_mean | -1.65 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 16 |\n", + "| time_elapsed | 90 |\n", + "| total_timesteps | 32768 |\n", + "| train/ | |\n", + "| approx_kl | 0.023807548 |\n", + "| clip_fraction | 0.251 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.62 |\n", + "| explained_variance | 0.654 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.171 |\n", + "| n_updates | 150 |\n", + "| policy_gradient_loss | -0.0355 |\n", + "| value_loss | 0.686 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.86 |\n", + "| ep_rew_mean | -1.42 |\n", + "| time/ | |\n", + "| fps | 361 |\n", + "| iterations | 17 |\n", + "| time_elapsed | 96 |\n", + "| total_timesteps | 34816 |\n", + "| train/ | |\n", + "| approx_kl | 0.018085614 |\n", + "| clip_fraction | 0.198 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.49 |\n", + "| explained_variance | 0.699 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.339 |\n", + "| n_updates | 160 |\n", + "| policy_gradient_loss | -0.0297 |\n", + "| value_loss | 0.674 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 5.4 |\n", + "| ep_rew_mean | -1.88 |\n", + "| time/ | |\n", + "| fps | 361 |\n", + "| iterations | 18 |\n", + "| time_elapsed | 102 |\n", + "| total_timesteps | 36864 |\n", + "| train/ | |\n", + "| approx_kl | 0.015559142 |\n", + "| clip_fraction | 0.222 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.35 |\n", + "| explained_variance | 0.719 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.354 |\n", + "| n_updates | 170 |\n", + "| policy_gradient_loss | -0.0349 |\n", + "| value_loss | 0.629 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 5.54 |\n", + "| ep_rew_mean | -1.22 |\n", + "| time/ | |\n", + "| fps | 360 |\n", + "| iterations | 19 |\n", + "| time_elapsed | 108 |\n", + "| total_timesteps | 38912 |\n", + "| train/ | |\n", + "| approx_kl | 0.014995611 |\n", + "| clip_fraction | 0.17 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.32 |\n", + "| explained_variance | 0.436 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.33 |\n", + "| n_updates | 180 |\n", + "| policy_gradient_loss | -0.031 |\n", + "| value_loss | 2.79 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 5.28 |\n", + "| ep_rew_mean | -1.2 |\n", + "| time/ | |\n", + "| fps | 360 |\n", + "| iterations | 20 |\n", + "| time_elapsed | 113 |\n", + "| total_timesteps | 40960 |\n", + "| train/ | |\n", + "| approx_kl | 0.018023107 |\n", + "| clip_fraction | 0.169 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.23 |\n", + "| explained_variance | 0.559 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.743 |\n", + "| n_updates | 190 |\n", + "| policy_gradient_loss | -0.0327 |\n", + "| value_loss | 1.24 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 6.22 |\n", + "| ep_rew_mean | -0.38 |\n", + "| time/ | |\n", + "| fps | 361 |\n", + "| iterations | 21 |\n", + "| time_elapsed | 119 |\n", + "| total_timesteps | 43008 |\n", + "| train/ | |\n", + "| approx_kl | 0.023376558 |\n", + "| clip_fraction | 0.29 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.07 |\n", + "| explained_variance | 0.628 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.502 |\n", + "| n_updates | 200 |\n", + "| policy_gradient_loss | -0.0451 |\n", + "| value_loss | 1.11 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 7.06 |\n", + "| ep_rew_mean | 0.26 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 22 |\n", + "| time_elapsed | 124 |\n", + "| total_timesteps | 45056 |\n", + "| train/ | |\n", + "| approx_kl | 0.023838695 |\n", + "| clip_fraction | 0.269 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -1.01 |\n", + "| explained_variance | 0.566 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.925 |\n", + "| n_updates | 210 |\n", + "| policy_gradient_loss | -0.0463 |\n", + "| value_loss | 1.71 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 7.93 |\n", + "| ep_rew_mean | 1.19 |\n", + "| time/ | |\n", + "| fps | 362 |\n", + "| iterations | 23 |\n", + "| time_elapsed | 129 |\n", + "| total_timesteps | 47104 |\n", + "| train/ | |\n", + "| approx_kl | 0.021363221 |\n", + "| clip_fraction | 0.229 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.906 |\n", + "| explained_variance | 0.594 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.819 |\n", + "| n_updates | 220 |\n", + "| policy_gradient_loss | -0.0426 |\n", + "| value_loss | 1.94 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.52 |\n", + "| ep_rew_mean | 1.98 |\n", + "| time/ | |\n", + "| fps | 363 |\n", + "| iterations | 24 |\n", + "| time_elapsed | 135 |\n", + "| total_timesteps | 49152 |\n", + "| train/ | |\n", + "| approx_kl | 0.022241611 |\n", + "| clip_fraction | 0.167 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.882 |\n", + "| explained_variance | 0.667 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.838 |\n", + "| n_updates | 230 |\n", + "| policy_gradient_loss | -0.0343 |\n", + "| value_loss | 1.73 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.9 |\n", + "| ep_rew_mean | 1.8 |\n", + "| time/ | |\n", + "| fps | 364 |\n", + "| iterations | 25 |\n", + "| time_elapsed | 140 |\n", + "| total_timesteps | 51200 |\n", + "| train/ | |\n", + "| approx_kl | 0.011297604 |\n", + "| clip_fraction | 0.111 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.859 |\n", + "| explained_variance | 0.763 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.5 |\n", + "| n_updates | 240 |\n", + "| policy_gradient_loss | -0.024 |\n", + "| value_loss | 1.35 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.01 |\n", + "| ep_rew_mean | 2.23 |\n", + "| time/ | |\n", + "| fps | 364 |\n", + "| iterations | 26 |\n", + "| time_elapsed | 145 |\n", + "| total_timesteps | 53248 |\n", + "| train/ | |\n", + "| approx_kl | 0.010706454 |\n", + "| clip_fraction | 0.0958 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.84 |\n", + "| explained_variance | 0.486 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.872 |\n", + "| n_updates | 250 |\n", + "| policy_gradient_loss | -0.0237 |\n", + "| value_loss | 2.77 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.75 |\n", + "| ep_rew_mean | 1.81 |\n", + "| time/ | |\n", + "| fps | 365 |\n", + "| iterations | 27 |\n", + "| time_elapsed | 151 |\n", + "| total_timesteps | 55296 |\n", + "| train/ | |\n", + "| approx_kl | 0.011905432 |\n", + "| clip_fraction | 0.12 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.785 |\n", + "| explained_variance | 0.838 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.121 |\n", + "| n_updates | 260 |\n", + "| policy_gradient_loss | -0.0206 |\n", + "| value_loss | 0.851 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.07 |\n", + "| ep_rew_mean | 2.13 |\n", + "| time/ | |\n", + "| fps | 365 |\n", + "| iterations | 28 |\n", + "| time_elapsed | 156 |\n", + "| total_timesteps | 57344 |\n", + "| train/ | |\n", + "| approx_kl | 0.009603689 |\n", + "| clip_fraction | 0.0931 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.808 |\n", + "| explained_variance | 0.684 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.391 |\n", + "| n_updates | 270 |\n", + "| policy_gradient_loss | -0.0184 |\n", + "| value_loss | 1.63 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.87 |\n", + "| ep_rew_mean | 2.51 |\n", + "| time/ | |\n", + "| fps | 366 |\n", + "| iterations | 29 |\n", + "| time_elapsed | 162 |\n", + "| total_timesteps | 59392 |\n", + "| train/ | |\n", + "| approx_kl | 0.0071417904 |\n", + "| clip_fraction | 0.0738 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.736 |\n", + "| explained_variance | 0.826 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.83 |\n", + "| n_updates | 280 |\n", + "| policy_gradient_loss | -0.0131 |\n", + "| value_loss | 1.72 |\n", + "------------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.02 |\n", + "| ep_rew_mean | 2.74 |\n", + "| time/ | |\n", + "| fps | 366 |\n", + "| iterations | 30 |\n", + "| time_elapsed | 167 |\n", + "| total_timesteps | 61440 |\n", + "| train/ | |\n", + "| approx_kl | 0.009269893 |\n", + "| clip_fraction | 0.0918 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.686 |\n", + "| explained_variance | 0.912 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.163 |\n", + "| n_updates | 290 |\n", + "| policy_gradient_loss | -0.0166 |\n", + "| value_loss | 0.537 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.51 |\n", + "| ep_rew_mean | 2.29 |\n", + "| time/ | |\n", + "| fps | 367 |\n", + "| iterations | 31 |\n", + "| time_elapsed | 172 |\n", + "| total_timesteps | 63488 |\n", + "| train/ | |\n", + "| approx_kl | 0.010982089 |\n", + "| clip_fraction | 0.0863 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.657 |\n", + "| explained_variance | 0.946 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.339 |\n", + "| n_updates | 300 |\n", + "| policy_gradient_loss | -0.0149 |\n", + "| value_loss | 0.341 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.94 |\n", + "| ep_rew_mean | 2.7 |\n", + "| time/ | |\n", + "| fps | 368 |\n", + "| iterations | 32 |\n", + "| time_elapsed | 177 |\n", + "| total_timesteps | 65536 |\n", + "| train/ | |\n", + "| approx_kl | 0.01880536 |\n", + "| clip_fraction | 0.0622 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.667 |\n", + "| explained_variance | 0.778 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.13 |\n", + "| n_updates | 310 |\n", + "| policy_gradient_loss | -0.0107 |\n", + "| value_loss | 2.3 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.82 |\n", + "| ep_rew_mean | 2.6 |\n", + "| time/ | |\n", + "| fps | 369 |\n", + "| iterations | 33 |\n", + "| time_elapsed | 182 |\n", + "| total_timesteps | 67584 |\n", + "| train/ | |\n", + "| approx_kl | 0.013803964 |\n", + "| clip_fraction | 0.1 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.644 |\n", + "| explained_variance | 0.952 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0438 |\n", + "| n_updates | 320 |\n", + "| policy_gradient_loss | -0.0186 |\n", + "| value_loss | 0.31 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9 |\n", + "| ep_rew_mean | 2.9 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 34 |\n", + "| time_elapsed | 188 |\n", + "| total_timesteps | 69632 |\n", + "| train/ | |\n", + "| approx_kl | 0.011061303 |\n", + "| clip_fraction | 0.0942 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.597 |\n", + "| explained_variance | 0.905 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.293 |\n", + "| n_updates | 330 |\n", + "| policy_gradient_loss | -0.0158 |\n", + "| value_loss | 0.61 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.96 |\n", + "| ep_rew_mean | 2.6 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 35 |\n", + "| time_elapsed | 193 |\n", + "| total_timesteps | 71680 |\n", + "| train/ | |\n", + "| approx_kl | 0.016911192 |\n", + "| clip_fraction | 0.165 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.551 |\n", + "| explained_variance | 0.926 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.229 |\n", + "| n_updates | 340 |\n", + "| policy_gradient_loss | -0.0229 |\n", + "| value_loss | 0.519 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.5 |\n", + "| ep_rew_mean | 3.32 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 36 |\n", + "| time_elapsed | 198 |\n", + "| total_timesteps | 73728 |\n", + "| train/ | |\n", + "| approx_kl | 0.012311206 |\n", + "| clip_fraction | 0.119 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.595 |\n", + "| explained_variance | 0.709 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.68 |\n", + "| n_updates | 350 |\n", + "| policy_gradient_loss | -0.0275 |\n", + "| value_loss | 1.95 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.6 |\n", + "| ep_rew_mean | 3.3 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 37 |\n", + "| time_elapsed | 204 |\n", + "| total_timesteps | 75776 |\n", + "| train/ | |\n", + "| approx_kl | 0.059752032 |\n", + "| clip_fraction | 0.154 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.534 |\n", + "| explained_variance | 0.785 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.835 |\n", + "| n_updates | 360 |\n", + "| policy_gradient_loss | -0.0234 |\n", + "| value_loss | 1.46 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.8 |\n", + "| ep_rew_mean | 2.7 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 38 |\n", + "| time_elapsed | 209 |\n", + "| total_timesteps | 77824 |\n", + "| train/ | |\n", + "| approx_kl | 0.01475055 |\n", + "| clip_fraction | 0.0968 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.455 |\n", + "| explained_variance | 0.917 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.153 |\n", + "| n_updates | 370 |\n", + "| policy_gradient_loss | -0.019 |\n", + "| value_loss | 0.428 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.01 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 39 |\n", + "| time_elapsed | 215 |\n", + "| total_timesteps | 79872 |\n", + "| train/ | |\n", + "| approx_kl | 0.012021113 |\n", + "| clip_fraction | 0.0851 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.558 |\n", + "| explained_variance | 0.702 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.8 |\n", + "| n_updates | 380 |\n", + "| policy_gradient_loss | -0.0284 |\n", + "| value_loss | 4.45 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.83 |\n", + "| ep_rew_mean | 3.57 |\n", + "| time/ | |\n", + "| fps | 370 |\n", + "| iterations | 40 |\n", + "| time_elapsed | 220 |\n", + "| total_timesteps | 81920 |\n", + "| train/ | |\n", + "| approx_kl | 0.010166377 |\n", + "| clip_fraction | 0.0623 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.454 |\n", + "| explained_variance | 0.728 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.43 |\n", + "| n_updates | 390 |\n", + "| policy_gradient_loss | -0.0201 |\n", + "| value_loss | 2.21 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.3 |\n", + "| ep_rew_mean | 3.14 |\n", + "| time/ | |\n", + "| fps | 371 |\n", + "| iterations | 41 |\n", + "| time_elapsed | 226 |\n", + "| total_timesteps | 83968 |\n", + "| train/ | |\n", + "| approx_kl | 0.017603599 |\n", + "| clip_fraction | 0.0748 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.384 |\n", + "| explained_variance | 0.957 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.152 |\n", + "| n_updates | 400 |\n", + "| policy_gradient_loss | -0.0122 |\n", + "| value_loss | 0.286 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.95 |\n", + "| ep_rew_mean | 3.81 |\n", + "| time/ | |\n", + "| fps | 371 |\n", + "| iterations | 42 |\n", + "| time_elapsed | 231 |\n", + "| total_timesteps | 86016 |\n", + "| train/ | |\n", + "| approx_kl | 0.028185518 |\n", + "| clip_fraction | 0.0954 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.383 |\n", + "| explained_variance | 0.811 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.412 |\n", + "| n_updates | 410 |\n", + "| policy_gradient_loss | -0.0224 |\n", + "| value_loss | 2.05 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.5 |\n", + "| ep_rew_mean | 3.57 |\n", + "| time/ | |\n", + "| fps | 371 |\n", + "| iterations | 43 |\n", + "| time_elapsed | 236 |\n", + "| total_timesteps | 88064 |\n", + "| train/ | |\n", + "| approx_kl | 0.02107103 |\n", + "| clip_fraction | 0.0702 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.375 |\n", + "| explained_variance | 0.732 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.156 |\n", + "| n_updates | 420 |\n", + "| policy_gradient_loss | -0.0342 |\n", + "| value_loss | 1.54 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.76 |\n", + "| ep_rew_mean | 3.7 |\n", + "| time/ | |\n", + "| fps | 371 |\n", + "| iterations | 44 |\n", + "| time_elapsed | 242 |\n", + "| total_timesteps | 90112 |\n", + "| train/ | |\n", + "| approx_kl | 0.007913441 |\n", + "| clip_fraction | 0.0349 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.346 |\n", + "| explained_variance | 0.827 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 2.92 |\n", + "| n_updates | 430 |\n", + "| policy_gradient_loss | -0.00355 |\n", + "| value_loss | 2.2 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 25.8 |\n", + "| ep_rew_mean | -12.4 |\n", + "| time/ | |\n", + "| fps | 371 |\n", + "| iterations | 45 |\n", + "| time_elapsed | 247 |\n", + "| total_timesteps | 92160 |\n", + "| train/ | |\n", + "| approx_kl | 0.5432366 |\n", + "| clip_fraction | 0.109 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.316 |\n", + "| explained_variance | 0.958 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.231 |\n", + "| n_updates | 440 |\n", + "| policy_gradient_loss | -0.0068 |\n", + "| value_loss | 0.313 |\n", + "---------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 45.9 |\n", + "| ep_rew_mean | -32.4 |\n", + "| time/ | |\n", + "| fps | 372 |\n", + "| iterations | 46 |\n", + "| time_elapsed | 252 |\n", + "| total_timesteps | 94208 |\n", + "| train/ | |\n", + "| approx_kl | 0.008981178 |\n", + "| clip_fraction | 0.0144 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.11 |\n", + "| explained_variance | -0.0603 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.91 |\n", + "| n_updates | 450 |\n", + "| policy_gradient_loss | -0.00156 |\n", + "| value_loss | 17.2 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 62.7 |\n", + "| ep_rew_mean | -49.3 |\n", + "| time/ | |\n", + "| fps | 373 |\n", + "| iterations | 47 |\n", + "| time_elapsed | 257 |\n", + "| total_timesteps | 96256 |\n", + "| train/ | |\n", + "| approx_kl | 0.0025778997 |\n", + "| clip_fraction | 0.0184 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.165 |\n", + "| explained_variance | 0.396 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 19.1 |\n", + "| n_updates | 460 |\n", + "| policy_gradient_loss | -0.00601 |\n", + "| value_loss | 45.6 |\n", + "------------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 49.3 |\n", + "| ep_rew_mean | -35.6 |\n", + "| time/ | |\n", + "| fps | 373 |\n", + "| iterations | 48 |\n", + "| time_elapsed | 262 |\n", + "| total_timesteps | 98304 |\n", + "| train/ | |\n", + "| approx_kl | 0.014914533 |\n", + "| clip_fraction | 0.0816 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.272 |\n", + "| explained_variance | 0.394 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 33.5 |\n", + "| n_updates | 470 |\n", + "| policy_gradient_loss | -0.0164 |\n", + "| value_loss | 74.1 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 39.9 |\n", + "| ep_rew_mean | -26.3 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 49 |\n", + "| time_elapsed | 268 |\n", + "| total_timesteps | 100352 |\n", + "| train/ | |\n", + "| approx_kl | 0.0012997694 |\n", + "| clip_fraction | 0.026 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.24 |\n", + "| explained_variance | 0.465 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 44.5 |\n", + "| n_updates | 480 |\n", + "| policy_gradient_loss | -0.00881 |\n", + "| value_loss | 76.6 |\n", + "------------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "------------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 27 |\n", + "| ep_rew_mean | -13.3 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 50 |\n", + "| time_elapsed | 273 |\n", + "| total_timesteps | 102400 |\n", + "| train/ | |\n", + "| approx_kl | 0.0014951692 |\n", + "| clip_fraction | 0.037 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.25 |\n", + "| explained_variance | 0.594 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 30.2 |\n", + "| n_updates | 490 |\n", + "| policy_gradient_loss | -0.00958 |\n", + "| value_loss | 77.4 |\n", + "------------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 17.4 |\n", + "| ep_rew_mean | -3.57 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 51 |\n", + "| time_elapsed | 279 |\n", + "| total_timesteps | 104448 |\n", + "| train/ | |\n", + "| approx_kl | 0.0443189 |\n", + "| clip_fraction | 0.176 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.457 |\n", + "| explained_variance | 0.338 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 44.4 |\n", + "| n_updates | 500 |\n", + "| policy_gradient_loss | -0.0247 |\n", + "| value_loss | 70.8 |\n", + "---------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 13.3 |\n", + "| ep_rew_mean | 0.45 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 52 |\n", + "| time_elapsed | 284 |\n", + "| total_timesteps | 106496 |\n", + "| train/ | |\n", + "| approx_kl | 0.005663138 |\n", + "| clip_fraction | 0.069 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.463 |\n", + "| explained_variance | 0.558 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 14.7 |\n", + "| n_updates | 510 |\n", + "| policy_gradient_loss | -0.0117 |\n", + "| value_loss | 36.8 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 19.8 |\n", + "| ep_rew_mean | -5.92 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 53 |\n", + "| time_elapsed | 289 |\n", + "| total_timesteps | 108544 |\n", + "| train/ | |\n", + "| approx_kl | 0.020181399 |\n", + "| clip_fraction | 0.176 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.499 |\n", + "| explained_variance | 0.182 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 3.45 |\n", + "| n_updates | 520 |\n", + "| policy_gradient_loss | -0.0254 |\n", + "| value_loss | 9.2 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 11.4 |\n", + "| ep_rew_mean | 2.26 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 54 |\n", + "| time_elapsed | 295 |\n", + "| total_timesteps | 110592 |\n", + "| train/ | |\n", + "| approx_kl | 0.009738399 |\n", + "| clip_fraction | 0.108 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.538 |\n", + "| explained_variance | 0.891 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.88 |\n", + "| n_updates | 530 |\n", + "| policy_gradient_loss | -0.00573 |\n", + "| value_loss | 22 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.4 |\n", + "| ep_rew_mean | 3.06 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 55 |\n", + "| time_elapsed | 300 |\n", + "| total_timesteps | 112640 |\n", + "| train/ | |\n", + "| approx_kl | 0.01536967 |\n", + "| clip_fraction | 0.191 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.49 |\n", + "| explained_variance | 0.315 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.971 |\n", + "| n_updates | 540 |\n", + "| policy_gradient_loss | -0.0219 |\n", + "| value_loss | 6.46 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.8 |\n", + "| ep_rew_mean | 1.63 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 56 |\n", + "| time_elapsed | 305 |\n", + "| total_timesteps | 114688 |\n", + "| train/ | |\n", + "| approx_kl | 0.0688808 |\n", + "| clip_fraction | 0.264 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.496 |\n", + "| explained_variance | 0.838 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.205 |\n", + "| n_updates | 550 |\n", + "| policy_gradient_loss | -0.0406 |\n", + "| value_loss | 0.836 |\n", + "---------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.3 |\n", + "| ep_rew_mean | 2.98 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 57 |\n", + "| time_elapsed | 311 |\n", + "| total_timesteps | 116736 |\n", + "| train/ | |\n", + "| approx_kl | 0.04210388 |\n", + "| clip_fraction | 0.326 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.534 |\n", + "| explained_variance | 0.734 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.907 |\n", + "| n_updates | 560 |\n", + "| policy_gradient_loss | -0.0421 |\n", + "| value_loss | 1.91 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.3 |\n", + "| ep_rew_mean | 3.28 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 58 |\n", + "| time_elapsed | 316 |\n", + "| total_timesteps | 118784 |\n", + "| train/ | |\n", + "| approx_kl | 0.051502623 |\n", + "| clip_fraction | 0.224 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.434 |\n", + "| explained_variance | 0.875 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.404 |\n", + "| n_updates | 570 |\n", + "| policy_gradient_loss | -0.0345 |\n", + "| value_loss | 0.827 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.78 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 59 |\n", + "| time_elapsed | 322 |\n", + "| total_timesteps | 120832 |\n", + "| train/ | |\n", + "| approx_kl | 0.07014565 |\n", + "| clip_fraction | 0.165 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.391 |\n", + "| explained_variance | 0.903 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.145 |\n", + "| n_updates | 580 |\n", + "| policy_gradient_loss | -0.0254 |\n", + "| value_loss | 0.681 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 16.4 |\n", + "| ep_rew_mean | -3.11 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 60 |\n", + "| time_elapsed | 327 |\n", + "| total_timesteps | 122880 |\n", + "| train/ | |\n", + "| approx_kl | 0.118292876 |\n", + "| clip_fraction | 0.151 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.466 |\n", + "| explained_variance | 0.952 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0778 |\n", + "| n_updates | 590 |\n", + "| policy_gradient_loss | -0.0214 |\n", + "| value_loss | 0.316 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 12.5 |\n", + "| ep_rew_mean | 1.05 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 61 |\n", + "| time_elapsed | 333 |\n", + "| total_timesteps | 124928 |\n", + "| train/ | |\n", + "| approx_kl | 0.061776154 |\n", + "| clip_fraction | 0.321 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.665 |\n", + "| explained_variance | 0.401 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 9.22 |\n", + "| n_updates | 600 |\n", + "| policy_gradient_loss | -0.0454 |\n", + "| value_loss | 17 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.8 |\n", + "| ep_rew_mean | 2.8 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 62 |\n", + "| time_elapsed | 338 |\n", + "| total_timesteps | 126976 |\n", + "| train/ | |\n", + "| approx_kl | 0.01477613 |\n", + "| clip_fraction | 0.153 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.579 |\n", + "| explained_variance | 0.682 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 6.12 |\n", + "| n_updates | 610 |\n", + "| policy_gradient_loss | -0.027 |\n", + "| value_loss | 10.5 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 11.4 |\n", + "| ep_rew_mean | 2.68 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 63 |\n", + "| time_elapsed | 344 |\n", + "| total_timesteps | 129024 |\n", + "| train/ | |\n", + "| approx_kl | 0.015770137 |\n", + "| clip_fraction | 0.128 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.507 |\n", + "| explained_variance | 0.869 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 2.13 |\n", + "| n_updates | 620 |\n", + "| policy_gradient_loss | -0.0253 |\n", + "| value_loss | 5.99 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.48 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 64 |\n", + "| time_elapsed | 349 |\n", + "| total_timesteps | 131072 |\n", + "| train/ | |\n", + "| approx_kl | 0.007838536 |\n", + "| clip_fraction | 0.0755 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.446 |\n", + "| explained_variance | 0.749 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 11.9 |\n", + "| n_updates | 630 |\n", + "| policy_gradient_loss | -0.0106 |\n", + "| value_loss | 9.21 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10 |\n", + "| ep_rew_mean | 3.8 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 65 |\n", + "| time_elapsed | 354 |\n", + "| total_timesteps | 133120 |\n", + "| train/ | |\n", + "| approx_kl | 0.035350725 |\n", + "| clip_fraction | 0.101 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.368 |\n", + "| explained_variance | 0.867 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.388 |\n", + "| n_updates | 640 |\n", + "| policy_gradient_loss | -0.0213 |\n", + "| value_loss | 1.11 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 14.6 |\n", + "| ep_rew_mean | -0.59 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 66 |\n", + "| time_elapsed | 360 |\n", + "| total_timesteps | 135168 |\n", + "| train/ | |\n", + "| approx_kl | 0.042963736 |\n", + "| clip_fraction | 0.0817 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.321 |\n", + "| explained_variance | 0.941 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.00919 |\n", + "| n_updates | 650 |\n", + "| policy_gradient_loss | -0.0127 |\n", + "| value_loss | 0.325 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.3 |\n", + "| ep_rew_mean | 3.64 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 67 |\n", + "| time_elapsed | 366 |\n", + "| total_timesteps | 137216 |\n", + "| train/ | |\n", + "| approx_kl | 0.08396668 |\n", + "| clip_fraction | 0.184 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.409 |\n", + "| explained_variance | 0.803 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 2.09 |\n", + "| n_updates | 660 |\n", + "| policy_gradient_loss | -0.0203 |\n", + "| value_loss | 8.99 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 19.8 |\n", + "| ep_rew_mean | -9.15 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 68 |\n", + "| time_elapsed | 371 |\n", + "| total_timesteps | 139264 |\n", + "| train/ | |\n", + "| approx_kl | 0.15326424 |\n", + "| clip_fraction | 0.199 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.39 |\n", + "| explained_variance | 0.894 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.122 |\n", + "| n_updates | 670 |\n", + "| policy_gradient_loss | -0.0201 |\n", + "| value_loss | 0.415 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.38 |\n", + "| ep_rew_mean | 3.18 |\n", + "| time/ | |\n", + "| fps | 374 |\n", + "| iterations | 69 |\n", + "| time_elapsed | 376 |\n", + "| total_timesteps | 141312 |\n", + "| train/ | |\n", + "| approx_kl | 0.21504487 |\n", + "| clip_fraction | 0.411 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.483 |\n", + "| explained_variance | 0.408 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 6.24 |\n", + "| n_updates | 680 |\n", + "| policy_gradient_loss | -0.0591 |\n", + "| value_loss | 18.4 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.98 |\n", + "| ep_rew_mean | 3.8 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 70 |\n", + "| time_elapsed | 382 |\n", + "| total_timesteps | 143360 |\n", + "| train/ | |\n", + "| approx_kl | 0.050312966 |\n", + "| clip_fraction | 0.0584 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.341 |\n", + "| explained_variance | 0.707 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0602 |\n", + "| n_updates | 690 |\n", + "| policy_gradient_loss | -0.00661 |\n", + "| value_loss | 0.845 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 11.7 |\n", + "| ep_rew_mean | 2.07 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 71 |\n", + "| time_elapsed | 387 |\n", + "| total_timesteps | 145408 |\n", + "| train/ | |\n", + "| approx_kl | 0.018565401 |\n", + "| clip_fraction | 0.0643 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.322 |\n", + "| explained_variance | 0.977 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.348 |\n", + "| n_updates | 700 |\n", + "| policy_gradient_loss | -0.0112 |\n", + "| value_loss | 0.175 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.47 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 72 |\n", + "| time_elapsed | 392 |\n", + "| total_timesteps | 147456 |\n", + "| train/ | |\n", + "| approx_kl | 0.10186449 |\n", + "| clip_fraction | 0.19 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.395 |\n", + "| explained_variance | 0.47 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.66 |\n", + "| n_updates | 710 |\n", + "| policy_gradient_loss | -0.0419 |\n", + "| value_loss | 4.71 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.72 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 73 |\n", + "| time_elapsed | 398 |\n", + "| total_timesteps | 149504 |\n", + "| train/ | |\n", + "| approx_kl | 0.01903234 |\n", + "| clip_fraction | 0.0737 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.333 |\n", + "| explained_variance | 0.723 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 2.71 |\n", + "| n_updates | 720 |\n", + "| policy_gradient_loss | -0.022 |\n", + "| value_loss | 2.97 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.94 |\n", + "| ep_rew_mean | 3.92 |\n", + "| time/ | |\n", + "| fps | 375 |\n", + "| iterations | 74 |\n", + "| time_elapsed | 403 |\n", + "| total_timesteps | 151552 |\n", + "| train/ | |\n", + "| approx_kl | 0.026403807 |\n", + "| clip_fraction | 0.065 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.322 |\n", + "| explained_variance | 0.934 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.24 |\n", + "| n_updates | 730 |\n", + "| policy_gradient_loss | -0.00481 |\n", + "| value_loss | 0.481 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.81 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 75 |\n", + "| time_elapsed | 408 |\n", + "| total_timesteps | 153600 |\n", + "| train/ | |\n", + "| approx_kl | 0.011051587 |\n", + "| clip_fraction | 0.0593 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.324 |\n", + "| explained_variance | 0.984 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.00908 |\n", + "| n_updates | 740 |\n", + "| policy_gradient_loss | -0.00591 |\n", + "| value_loss | 0.113 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 3.63 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 76 |\n", + "| time_elapsed | 413 |\n", + "| total_timesteps | 155648 |\n", + "| train/ | |\n", + "| approx_kl | 0.00972967 |\n", + "| clip_fraction | 0.0544 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.339 |\n", + "| explained_variance | 0.922 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0226 |\n", + "| n_updates | 750 |\n", + "| policy_gradient_loss | -0.00438 |\n", + "| value_loss | 0.758 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.92 |\n", + "| ep_rew_mean | 3.86 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 77 |\n", + "| time_elapsed | 418 |\n", + "| total_timesteps | 157696 |\n", + "| train/ | |\n", + "| approx_kl | 0.013084366 |\n", + "| clip_fraction | 0.0481 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.348 |\n", + "| explained_variance | 0.812 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.0736 |\n", + "| n_updates | 760 |\n", + "| policy_gradient_loss | -0.0157 |\n", + "| value_loss | 1.47 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 5.05 |\n", + "| ep_rew_mean | -2.29 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 78 |\n", + "| time_elapsed | 424 |\n", + "| total_timesteps | 159744 |\n", + "| train/ | |\n", + "| approx_kl | 0.42402273 |\n", + "| clip_fraction | 0.215 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.49 |\n", + "| explained_variance | 0.983 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.00926 |\n", + "| n_updates | 770 |\n", + "| policy_gradient_loss | -0.0284 |\n", + "| value_loss | 0.109 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.53 |\n", + "| ep_rew_mean | -2.17 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 79 |\n", + "| time_elapsed | 429 |\n", + "| total_timesteps | 161792 |\n", + "| train/ | |\n", + "| approx_kl | 0.27915305 |\n", + "| clip_fraction | 0.138 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.376 |\n", + "| explained_variance | 0.503 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.373 |\n", + "| n_updates | 780 |\n", + "| policy_gradient_loss | -0.00444 |\n", + "| value_loss | 5.03 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.38 |\n", + "| ep_rew_mean | -1.74 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 80 |\n", + "| time_elapsed | 435 |\n", + "| total_timesteps | 163840 |\n", + "| train/ | |\n", + "| approx_kl | 0.019562341 |\n", + "| clip_fraction | 0.0921 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.457 |\n", + "| explained_variance | 0.562 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.638 |\n", + "| n_updates | 790 |\n", + "| policy_gradient_loss | -0.0128 |\n", + "| value_loss | 0.895 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 4.34 |\n", + "| ep_rew_mean | -1.7 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 81 |\n", + "| time_elapsed | 440 |\n", + "| total_timesteps | 165888 |\n", + "| train/ | |\n", + "| approx_kl | 0.18844175 |\n", + "| clip_fraction | 0.147 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.279 |\n", + "| explained_variance | 0.102 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.03 |\n", + "| n_updates | 800 |\n", + "| policy_gradient_loss | 0.013 |\n", + "| value_loss | 11.4 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 5.54 |\n", + "| ep_rew_mean | -0.66 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 82 |\n", + "| time_elapsed | 445 |\n", + "| total_timesteps | 167936 |\n", + "| train/ | |\n", + "| approx_kl | 0.06374202 |\n", + "| clip_fraction | 0.21 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.398 |\n", + "| explained_variance | 0.566 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.599 |\n", + "| n_updates | 810 |\n", + "| policy_gradient_loss | -0.0207 |\n", + "| value_loss | 1.59 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 7.65 |\n", + "| ep_rew_mean | 1.61 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 83 |\n", + "| time_elapsed | 451 |\n", + "| total_timesteps | 169984 |\n", + "| train/ | |\n", + "| approx_kl | 0.06125373 |\n", + "| clip_fraction | 0.251 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.434 |\n", + "| explained_variance | 0.299 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.27 |\n", + "| n_updates | 820 |\n", + "| policy_gradient_loss | -0.0399 |\n", + "| value_loss | 3.7 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.86 |\n", + "| ep_rew_mean | 2.46 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 84 |\n", + "| time_elapsed | 457 |\n", + "| total_timesteps | 172032 |\n", + "| train/ | |\n", + "| approx_kl | 0.047695376 |\n", + "| clip_fraction | 0.171 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.387 |\n", + "| explained_variance | 0.336 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.72 |\n", + "| n_updates | 830 |\n", + "| policy_gradient_loss | -0.0407 |\n", + "| value_loss | 3.91 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.84 |\n", + "| ep_rew_mean | 3.66 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 85 |\n", + "| time_elapsed | 462 |\n", + "| total_timesteps | 174080 |\n", + "| train/ | |\n", + "| approx_kl | 0.13684572 |\n", + "| clip_fraction | 0.133 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.346 |\n", + "| explained_variance | 0.625 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.13 |\n", + "| n_updates | 840 |\n", + "| policy_gradient_loss | -0.0231 |\n", + "| value_loss | 2.36 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 25.5 |\n", + "| ep_rew_mean | -12.2 |\n", + "| time/ | |\n", + "| fps | 376 |\n", + "| iterations | 86 |\n", + "| time_elapsed | 467 |\n", + "| total_timesteps | 176128 |\n", + "| train/ | |\n", + "| approx_kl | 0.36170986 |\n", + "| clip_fraction | 0.332 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.473 |\n", + "| explained_variance | 0.919 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.364 |\n", + "| n_updates | 850 |\n", + "| policy_gradient_loss | -0.0374 |\n", + "| value_loss | 0.278 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 17.2 |\n", + "| ep_rew_mean | -4.45 |\n", + "| time/ | |\n", + "| fps | 377 |\n", + "| iterations | 87 |\n", + "| time_elapsed | 472 |\n", + "| total_timesteps | 178176 |\n", + "| train/ | |\n", + "| approx_kl | 0.102079734 |\n", + "| clip_fraction | 0.34 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.613 |\n", + "| explained_variance | 0.0593 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 5.95 |\n", + "| n_updates | 860 |\n", + "| policy_gradient_loss | -0.04 |\n", + "| value_loss | 20.6 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 14.5 |\n", + "| ep_rew_mean | -2.36 |\n", + "| time/ | |\n", + "| fps | 378 |\n", + "| iterations | 88 |\n", + "| time_elapsed | 476 |\n", + "| total_timesteps | 180224 |\n", + "| train/ | |\n", + "| approx_kl | 0.042367905 |\n", + "| clip_fraction | 0.264 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.799 |\n", + "| explained_variance | 0.69 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 4.22 |\n", + "| n_updates | 870 |\n", + "| policy_gradient_loss | -0.0265 |\n", + "| value_loss | 16.7 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 12.3 |\n", + "| ep_rew_mean | 0.46 |\n", + "| time/ | |\n", + "| fps | 379 |\n", + "| iterations | 89 |\n", + "| time_elapsed | 480 |\n", + "| total_timesteps | 182272 |\n", + "| train/ | |\n", + "| approx_kl | 0.02418825 |\n", + "| clip_fraction | 0.262 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.744 |\n", + "| explained_variance | 0.75 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 3.08 |\n", + "| n_updates | 880 |\n", + "| policy_gradient_loss | -0.026 |\n", + "| value_loss | 16.2 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 11 |\n", + "| ep_rew_mean | 2.19 |\n", + "| time/ | |\n", + "| fps | 380 |\n", + "| iterations | 90 |\n", + "| time_elapsed | 484 |\n", + "| total_timesteps | 184320 |\n", + "| train/ | |\n", + "| approx_kl | 0.024347484 |\n", + "| clip_fraction | 0.271 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.669 |\n", + "| explained_variance | 0.675 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 4.76 |\n", + "| n_updates | 890 |\n", + "| policy_gradient_loss | -0.0243 |\n", + "| value_loss | 10.1 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 12.1 |\n", + "| ep_rew_mean | 1.35 |\n", + "| time/ | |\n", + "| fps | 381 |\n", + "| iterations | 91 |\n", + "| time_elapsed | 488 |\n", + "| total_timesteps | 186368 |\n", + "| train/ | |\n", + "| approx_kl | 0.02668532 |\n", + "| clip_fraction | 0.256 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.576 |\n", + "| explained_variance | 0.706 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.797 |\n", + "| n_updates | 900 |\n", + "| policy_gradient_loss | -0.0378 |\n", + "| value_loss | 1.6 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 11 |\n", + "| ep_rew_mean | 2.55 |\n", + "| time/ | |\n", + "| fps | 382 |\n", + "| iterations | 92 |\n", + "| time_elapsed | 492 |\n", + "| total_timesteps | 188416 |\n", + "| train/ | |\n", + "| approx_kl | 0.017341316 |\n", + "| clip_fraction | 0.0919 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.681 |\n", + "| explained_variance | 0.865 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 9.01 |\n", + "| n_updates | 910 |\n", + "| policy_gradient_loss | -0.0076 |\n", + "| value_loss | 25.5 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 10.2 |\n", + "| ep_rew_mean | 2.27 |\n", + "| time/ | |\n", + "| fps | 383 |\n", + "| iterations | 93 |\n", + "| time_elapsed | 496 |\n", + "| total_timesteps | 190464 |\n", + "| train/ | |\n", + "| approx_kl | 0.070169866 |\n", + "| clip_fraction | 0.224 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.476 |\n", + "| explained_variance | 0.791 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 13 |\n", + "| n_updates | 920 |\n", + "| policy_gradient_loss | -0.0203 |\n", + "| value_loss | 5.41 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.33 |\n", + "| ep_rew_mean | 3.17 |\n", + "| time/ | |\n", + "| fps | 384 |\n", + "| iterations | 94 |\n", + "| time_elapsed | 500 |\n", + "| total_timesteps | 192512 |\n", + "| train/ | |\n", + "| approx_kl | 0.062242664 |\n", + "| clip_fraction | 0.184 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.504 |\n", + "| explained_variance | 0.426 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.94 |\n", + "| n_updates | 930 |\n", + "| policy_gradient_loss | -0.0392 |\n", + "| value_loss | 6.22 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.85 |\n", + "| ep_rew_mean | 3.79 |\n", + "| time/ | |\n", + "| fps | 385 |\n", + "| iterations | 95 |\n", + "| time_elapsed | 504 |\n", + "| total_timesteps | 194560 |\n", + "| train/ | |\n", + "| approx_kl | 0.042221397 |\n", + "| clip_fraction | 0.0712 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.328 |\n", + "| explained_variance | 0.893 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.236 |\n", + "| n_updates | 940 |\n", + "| policy_gradient_loss | -0.0162 |\n", + "| value_loss | 0.692 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 8.17 |\n", + "| ep_rew_mean | 2.09 |\n", + "| time/ | |\n", + "| fps | 387 |\n", + "| iterations | 96 |\n", + "| time_elapsed | 507 |\n", + "| total_timesteps | 196608 |\n", + "| train/ | |\n", + "| approx_kl | 0.036962293 |\n", + "| clip_fraction | 0.154 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.374 |\n", + "| explained_variance | 0.981 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | -0.0447 |\n", + "| n_updates | 950 |\n", + "| policy_gradient_loss | -0.0142 |\n", + "| value_loss | 0.151 |\n", + "-----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 9.38 |\n", + "| ep_rew_mean | 3.36 |\n", + "| time/ | |\n", + "| fps | 387 |\n", + "| iterations | 97 |\n", + "| time_elapsed | 512 |\n", + "| total_timesteps | 198656 |\n", + "| train/ | |\n", + "| approx_kl | 0.06385146 |\n", + "| clip_fraction | 0.245 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.366 |\n", + "| explained_variance | 0.553 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 1.4 |\n", + "| n_updates | 960 |\n", + "| policy_gradient_loss | -0.0399 |\n", + "| value_loss | 2.79 |\n", + "----------------------------------------\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "----------------------------------------\n", + "| rollout/ | |\n", + "| ep_len_mean | 24.8 |\n", + "| ep_rew_mean | -11.4 |\n", + "| time/ | |\n", + "| fps | 389 |\n", + "| iterations | 98 |\n", + "| time_elapsed | 515 |\n", + "| total_timesteps | 200704 |\n", + "| train/ | |\n", + "| approx_kl | 0.26313344 |\n", + "| clip_fraction | 0.178 |\n", + "| clip_range | 0.2 |\n", + "| entropy_loss | -0.363 |\n", + "| explained_variance | 0.898 |\n", + "| learning_rate | 0.0003 |\n", + "| loss | 0.247 |\n", + "| n_updates | 970 |\n", + "| policy_gradient_loss | -0.0285 |\n", + "| value_loss | 0.521 |\n", + "----------------------------------------\n" + ] + }, + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n",
+       "
\n" + ], + "text/plain": [ + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "528f9bb0103a402d83eb31e85dd97caf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Label(value='0.438 MB of 0.438 MB uploaded\\r'), FloatProgress(value=1.0, max=1.0)))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "wandb: WARNING Source type is set to 'repo' but some required information is missing from the environment. A job will not be created from this run. See https://docs.wandb.ai/guides/launch/create-job\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "

Run history:


global_step▁▁▁▂▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███
rollout/ep_len_mean▁▁▁▁▁▁▁▁▁▂▂▂▂▂▂▂▂▂▄█▅▄▂▂▃▂▂▄▂▂▂▁▁▂▂▃▂▂▂▄
rollout/ep_rew_mean▇▇▇▇▇▇▇▇▇█████████▅▁▅▆██▇██▆███▇▇██▇███▅
time/fps█▂▂▁▁▁▁▁▁▁▁▁▁▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▃▃▃
train/approx_kl▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▂▂▂▁▂▃▂▁▁█▁▂▃▂▁▂▂▅
train/clip_fraction█▇▇▅▅▆▅▄▆▄▂▂▂▂▃▂▂▂▁▂▄▄▅▅▆▃▂▄▂▂▂▄▂▅▃▅▅▅▂▄
train/clip_range▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
train/entropy_loss▁▁▂▃▃▄▅▅▆▆▆▇▇▇▇▇▇▇██▇▇▇▇▇▇█▇▇▇█▇▇▇▇▆▇▇█▇
train/explained_variance▃▄▅▆▆▆▆▄▆▆▅▇█▇▆██▆▁▄▄▃▇▇▄▇█▇▆▆██▅▃▆▆▆▇▇▇
train/learning_rate▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
train/loss▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆█▂▁▁▂▁▁▁▁▁▁▁▁▁▁▂▂▃▁▁
train/policy_gradient_loss▁▂▂▄▄▄▄▅▃▄▆▇▇▆▅▆▇▄█▆▆▅▄▄▃▅▇▆▇▆█▅▇▄▆▅▆▆▆▅
train/value_loss▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▃██▂▁▁▃▂▁▁▁▁▁▁▁▁▁▃▂▂▁▁

Run summary:


global_step200704
rollout/ep_len_mean24.77
rollout/ep_rew_mean-11.45
time/fps389.0
train/approx_kl0.26313
train/clip_fraction0.17793
train/clip_range0.2
train/entropy_loss-0.36315
train/explained_variance0.89819
train/learning_rate0.0003
train/loss0.24744
train/policy_gradient_loss-0.02851
train/value_loss0.52073

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run confused-meadow-3 at: https://wandb.ai/fulltime/wordle/runs/ot2i0b8h
Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 2 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20240319_162920-ot2i0b8h/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model = PPO(config[\"policy_type\"], env=env, verbose=0, tensorboard_log=f\"runs/{run.id}\")\n", "\n", "# Train for a certain number of timesteps\n", - "model.learn(total_timesteps=100000)\n", + "model.learn(\n", + " total_timesteps=config[\"total_timesteps\"],\n", + " callback=WandbCallback(\n", + " model_save_path=f\"models/{run.id}\",\n", + " verbose=2,\n", + " ),\n", + "\tprogress_bar=True\n", + ")\n", + "\n", + "run.finish()\n", "\n", "# Save the model\n", "model.save(\"wordle_ppo_model\")" @@ -57,10 +2916,60 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "model.save(\"wordle_ppo_model\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = PPO.load(\"wordle_ppo_model\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 1000/1000 [00:20<00:00, 49.06it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-6.703\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "rewards = 0\n", + "for i in tqdm(range(1000)):\n", + " obs, _ = env.reset()\n", + " done = False\n", + " while not done:\n", + " action, _ = model.predict(obs)\n", + " obs, reward, done, _, info = env.step(action)\n", + " rewards += reward\n", + "print(rewards / 1000)" + ] } ], "metadata": { @@ -79,7 +2988,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/gym_wordle/__init__.py b/gym_wordle/__init__.py deleted file mode 100644 index 9efa1cd..0000000 --- a/gym_wordle/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from gym.envs.registration import register -from .wordle import WordleEnv - -register( - id='Wordle-v0', - entry_point='gym_wordle.wordle:WordleEnv' -) diff --git a/gym_wordle/dictionary/guess_list.csv b/gym_wordle/dictionary/guess_list.csv deleted file mode 100644 index 670b1bb..0000000 --- a/gym_wordle/dictionary/guess_list.csv +++ /dev/null @@ -1,12972 +0,0 @@ -aahed -aalii -aargh -aarti -abaca -abaci -aback -abacs -abaft -abaka -abamp -aband -abase -abash -abask -abate -abaya -abbas -abbed -abbes -abbey -abbot -abcee -abeam -abear -abele -abers -abets -abhor -abide -abies -abled -abler -ables -ablet -ablow -abmho -abode -abohm -aboil -aboma -aboon -abord -abore -abort -about -above -abram -abray -abrim -abrin -abris -absey -absit -abuna -abune -abuse -abuts -abuzz -abyes -abysm -abyss -acais -acari -accas -accoy -acerb -acers -aceta -achar -ached -aches -achoo -acids -acidy -acing -acini -ackee -acker -acmes -acmic -acned -acnes -acock -acold -acorn -acred -acres -acrid -acros -acted -actin -acton -actor -acute -acyls -adage -adapt -adaws -adays -adbot -addax -added -adder -addio -addle -adeem -adept -adhan -adieu -adios -adits -adman -admen -admin -admit -admix -adobe -adobo -adopt -adore -adorn -adown -adoze -adrad -adred -adsum -aduki -adult -adunc -adust -advew -adyta -adzed -adzes -aecia -aedes -aegis -aeons -aerie -aeros -aesir -afald -afara -afars -afear -affix -afire -aflaj -afoot -afore -afoul -afrit -afros -after -again -agama -agami -agape -agars -agast -agate -agave -agaze -agene -agent -agers -agger -aggie -aggri -aggro -aggry -aghas -agila -agile -aging -agios -agism -agist -agita -aglee -aglet -agley -agloo -aglow -aglus -agmas -agoge -agone -agons -agony -agood -agora -agree -agria -agrin -agros -agued -agues -aguna -aguti -ahead -aheap -ahent -ahigh -ahind -ahing -ahint -ahold -ahull -ahuru -aidas -aided -aider -aides -aidoi -aidos -aiery -aigas -aight -ailed -aimed -aimer -ainee -ainga -aioli -aired -airer -airns -airth -airts -aisle -aitch -aitus -aiver -aiyee -aizle -ajies -ajiva -ajuga -ajwan -akees -akela -akene -aking -akita -akkas -alaap -alack -alamo -aland -alane -alang -alans -alant -alapa -alaps -alarm -alary -alate -alays -albas -albee -album -alcid -alcos -aldea -alder -aldol -aleck -alecs -alefs -aleft -aleph -alert -alews -aleye -alfas -algae -algal -algas -algid -algin -algor -algum -alias -alibi -alien -alifs -align -alike -aline -alist -alive -aliya -alkie -alkos -alkyd -alkyl -allay -allee -allel -alley -allis -allod -allot -allow -alloy -allyl -almah -almas -almeh -almes -almud -almug -alods -aloed -aloes -aloft -aloha -aloin -alone -along -aloof -aloos -aloud -alowe -alpha -altar -alter -altho -altos -alula -alums -alure -alvar -alway -amahs -amain -amass -amate -amaut -amaze -amban -amber -ambit -amble -ambos -ambry -ameba -ameer -amend -amene -amens -ament -amias -amice -amici -amide -amido -amids -amies -amiga -amigo -amine -amino -amins -amirs -amiss -amity -amlas -amman -ammon -ammos -amnia -amnic -amnio -amoks -amole -among -amort -amour -amove -amowt -amped -ample -amply -ampul -amrit -amuck -amuse -amyls -anana -anata -ancho -ancle -ancon -andro -anear -anele -anent -angas -angel -anger -angle -anglo -angry -angst -anigh -anile -anils -anima -anime -animi -anion -anise -anker -ankhs -ankle -ankus -anlas -annal -annas -annat -annex -annoy -annul -anoas -anode -anole -anomy -ansae -antae -antar -antas -anted -antes -antic -antis -antra -antre -antsy -anura -anvil -anyon -aorta -apace -apage -apaid -apart -apayd -apays -apeak -apeek -apers -apert -apery -apgar -aphid -aphis -apian -aping -apiol -apish -apism -apnea -apode -apods -apoop -aport -appal -appay -appel -apple -apply -appro -appui -appuy -apres -apron -apses -apsis -apsos -apted -apter -aptly -aquae -aquas -araba -araks -arame -arars -arbas -arbor -arced -archi -arcos -arcus -ardeb -ardor -ardri -aread -areae -areal -arear -areas -areca -aredd -arede -arefy -areic -arena -arene -arepa -arere -arete -arets -arett -argal -argan -argil -argle -argol -argon -argot -argue -argus -arhat -arias -ariel -ariki -arils -ariot -arise -arish -arked -arled -arles -armed -armer -armet -armil -armor -arnas -arnut -aroba -aroha -aroid -aroma -arose -arpas -arpen -arrah -arras -array -arret -arris -arrow -arroz -arsed -arses -arsey -arsis -arson -artal -artel -artic -artis -artsy -aruhe -arums -arval -arvee -arvos -aryls -asana -ascon -ascot -ascus -asdic -ashed -ashen -ashes -ashet -aside -asked -asker -askew -askoi -askos -aspen -asper -aspic -aspie -aspis -aspro -assai -assam -assay -asses -asset -assez -assot -aster -astir -astun -asura -asway -aswim -asyla -ataps -ataxy -atigi -atilt -atimy -atlas -atman -atmas -atmos -atocs -atoke -atoks -atoll -atoms -atomy -atone -atony -atopy -atria -atrip -attap -attar -attic -atuas -audad -audio -audit -auger -aught -augur -aulas -aulic -auloi -aulos -aumil -aunes -aunts -aunty -aurae -aural -aurar -auras -aurei -aures -auric -auris -aurum -autos -auxin -avail -avale -avant -avast -avels -avens -avers -avert -avgas -avian -avine -avion -avise -aviso -avize -avoid -avows -avyze -await -awake -award -aware -awarn -awash -awato -awave -aways -awdls -aweel -aweto -awful -awing -awmry -awned -awner -awoke -awols -awork -axels -axial -axile -axils -axing -axiom -axion -axite -axled -axles -axman -axmen -axoid -axone -axons -ayahs -ayaya -ayelp -aygre -ayins -ayont -ayres -ayrie -azans -azide -azido -azine -azlon -azoic -azole -azons -azote -azoth -azuki -azure -azurn -azury -azygy -azyme -azyms -baaed -baals -babas -babel -babes -babka -baboo -babul -babus -bacca -bacco -baccy -bacha -bachs -backs -bacon -baddy -badge -badly -baels -baffs -baffy -bafts -bagel -baggy -baghs -bagie -bahts -bahus -bahut -bails -bairn -baisa -baith -baits -baiza -baize -bajan -bajra -bajri -bajus -baked -baken -baker -bakes -bakra -balas -balds -baldy -baled -baler -bales -balks -balky -balls -bally -balms -balmy -baloo -balsa -balti -balun -balus -bambi -banak -banal -banco -bancs -banda -bandh -bands -bandy -baned -banes -bangs -bania -banjo -banks -banns -bants -bantu -banty -banya -bapus -barbe -barbs -barby -barca -barde -bardo -bards -bardy -bared -barer -bares -barfi -barfs -barge -baric -barks -barky -barms -barmy -barns -barny -baron -barps -barra -barre -barro -barry -barye -basal -basan -based -basen -baser -bases -basho -basic -basij -basil -basin -basis -basks -bason -basse -bassi -basso -bassy -basta -baste -basti -basto -basts -batch -bated -bates -bathe -baths -batik -baton -batta -batts -battu -batty -bauds -bauks -baulk -baurs -bavin -bawds -bawdy -bawks -bawls -bawns -bawrs -bawty -bayed -bayer -bayes -bayle -bayou -bayts -bazar -bazoo -beach -beads -beady -beaks -beaky -beals -beams -beamy -beano -beans -beany -beard -beare -bears -beast -beath -beats -beaty -beaus -beaut -beaux -bebop -becap -becke -becks -bedad -bedel -bedes -bedew -bedim -bedye -beech -beedi -beefs -beefy -beeps -beers -beery -beets -befit -befog -begad -began -begar -begat -begem -beget -begin -begot -begum -begun -beige -beigy -being -beins -bekah -belah -belar -belay -belch -belee -belga -belie -belle -bells -belly -belon -below -belts -bemad -bemas -bemix -bemud -bench -bends -bendy -benes -benet -benga -benis -benne -benni -benny -bento -bents -benty -bepat -beray -beres -beret -bergs -berko -berks -berme -berms -berob -berry -berth -beryl -besat -besaw -besee -beses -beset -besit -besom -besot -besti -bests -betas -beted -betel -betes -beths -betid -beton -betta -betty -bevel -bever -bevor -bevue -bevvy -bewet -bewig -bezel -bezes -bezil -bezzy -bhais -bhaji -bhang -bhats -bhels -bhoot -bhuna -bhuts -biach -biali -bialy -bibbs -bibes -bible -biccy -bicep -bices -biddy -bided -bider -bides -bidet -bidis -bidon -bield -biers -biffo -biffs -biffy -bifid -bigae -biggs -biggy -bigha -bight -bigly -bigos -bigot -bijou -biked -biker -bikes -bikie -bilbo -bilby -biled -biles -bilge -bilgy -bilks -bills -billy -bimah -bimas -bimbo -binal -bindi -binds -biner -bines -binge -bingo -bings -bingy -binit -binks -bints -biogs -biome -biont -biota -biped -bipod -birch -birds -birks -birle -birls -biros -birrs -birse -birsy -birth -bises -bisks -bisom -bison -bitch -biter -bites -bitos -bitou -bitsy -bitte -bitts -bitty -bivia -bivvy -bizes -bizzo -bizzy -blabs -black -blade -blads -blady -blaer -blaes -blaff -blags -blahs -blain -blame -blams -bland -blank -blare -blart -blase -blash -blast -blate -blats -blatt -blaud -blawn -blaws -blays -blaze -bleak -blear -bleat -blebs -blech -bleed -bleep -blees -blend -blent -blert -bless -blest -blets -bleys -blimp -blimy -blind -bling -blini -blink -blins -bliny -blips -bliss -blist -blite -blits -blitz -blive -bloat -blobs -block -blocs -blogs -bloke -blond -blood -blook -bloom -bloop -blore -blots -blown -blows -blowy -blubs -blude -bluds -bludy -blued -bluer -blues -bluet -bluey -bluff -bluid -blume -blunk -blunt -blurb -blurs -blurt -blush -blype -boabs -boaks -board -boars -boart -boast -boats -bobac -bobak -bobas -bobby -bobol -bobos -bocca -bocce -bocci -boche -bocks -boded -bodes -bodge -bodhi -bodle -boeps -boets -boeuf -boffo -boffs -bogan -bogey -boggy -bogie -bogle -bogue -bogus -bohea -bohos -boils -boing -boink -boite -boked -bokeh -bokes -bokos -bolar -bolas -bolds -boles -bolix -bolls -bolos -bolts -bolus -bomas -bombe -bombo -bombs -bonce -bonds -boned -boner -bones -boney -bongo -bongs -bonie -bonks -bonne -bonny -bonus -bonza -bonze -booai -booay -boobs -booby -boody -booed -boofy -boogy -boohs -books -booky -bools -booms -boomy -boong -boons -boord -boors -boose -boost -booth -boots -booty -booze -boozy -boppy -borak -boral -boras -borax -borde -bords -bored -boree -borel -borer -bores -borgo -boric -borks -borms -borna -borne -boron -borts -borty -bortz -bosie -bosks -bosky -bosom -boson -bossy -bosun -botas -botch -botel -botes -bothy -botte -botts -botty -bouge -bough -bouks -boule -boult -bound -bouns -bourd -bourg -bourn -bouse -bousy -bouts -bovid -bowat -bowed -bowel -bower -bowes -bowet -bowie -bowls -bowne -bowrs -bowse -boxed -boxen -boxer -boxes -boxla -boxty -boyar -boyau -boyed -boyfs -boygs -boyla -boyos -boysy -bozos -braai -brace -brach -brack -bract -brads -braes -brags -braid -brail -brain -brake -braks -braky -brame -brand -brane -brank -brans -brant -brash -brass -brast -brats -brava -brave -bravi -bravo -brawl -brawn -braws -braxy -brays -braza -braze -bread -break -bream -brede -breds -breed -breem -breer -brees -breid -breis -breme -brens -brent -brere -brers -breve -brews -breys -briar -bribe -brick -bride -brief -brier -bries -brigs -briki -briks -brill -brims -brine -bring -brink -brins -briny -brios -brise -brisk -briss -brith -brits -britt -brize -broad -broch -brock -brods -brogh -brogs -broil -broke -brome -bromo -bronc -brond -brood -brook -brool -broom -broos -brose -brosy -broth -brown -brows -brugh -bruin -bruit -brule -brume -brung -brunt -brush -brusk -brust -brute -bruts -buats -buaze -bubal -bubas -bubba -bubbe -bubby -bubus -buchu -bucko -bucks -bucku -budas -buddy -budge -budis -budos -buffa -buffe -buffi -buffo -buffs -buffy -bufos -bufty -buggy -bugle -buhls -buhrs -buiks -build -built -buist -bukes -bulbs -bulge -bulgy -bulks -bulky -bulla -bulls -bully -bulse -bumbo -bumfs -bumph -bumps -bumpy -bunas -bunce -bunch -bunco -bunde -bundh -bunds -bundt -bundu -bundy -bungs -bungy -bunia -bunje -bunjy -bunko -bunks -bunns -bunny -bunts -bunty -bunya -buoys -buppy -buran -buras -burbs -burds -buret -burfi -burgh -burgs -burin -burka -burke -burks -burls -burly -burns -burnt -buroo -burps -burqa -burro -burrs -burry -bursa -burse -burst -busby -bused -buses -bushy -busks -busky -bussu -busti -busts -busty -butch -buteo -butes -butle -butoh -butte -butts -butty -butut -butyl -buxom -buyer -buzzy -bwana -bwazi -byded -bydes -byked -bykes -bylaw -byres -byrls -byssi -bytes -byway -caaed -cabal -cabas -cabby -caber -cabin -cable -cabob -caboc -cabre -cacao -cacas -cache -cacks -cacky -cacti -caddy -cadee -cades -cadet -cadge -cadgy -cadie -cadis -cadre -caeca -caese -cafes -caffs -caged -cager -cages -cagey -cagot -cahow -caids -cains -caird -cairn -cajon -cajun -caked -cakes -cakey -calfs -calid -calif -calix -calks -calla -calls -calms -calmy -calos -calpa -calps -calve -calyx -caman -camas -camel -cameo -cames -camis -camos -campi -campo -camps -campy -camus -canal -candy -caned -caneh -caner -canes -cangs -canid -canna -canns -canny -canoe -canon -canso -canst -canto -cants -canty -capas -caped -caper -capes -capex -caphs -capiz -caple -capon -capos -capot -capri -capul -caput -carap -carat -carbo -carbs -carby -cardi -cards -cardy -cared -carer -cares -caret -carex -cargo -carks -carle -carls -carns -carny -carob -carol -carom -caron -carpi -carps -carrs -carry -carse -carta -carte -carts -carve -carvy -casas -casco -cased -cases -casks -casky -caste -casts -casus -catch -cater -cates -catty -cauda -cauks -cauld -caulk -cauls -caums -caups -cauri -causa -cause -cavas -caved -cavel -caver -caves -cavie -cavil -cawed -cawks -caxon -cease -ceaze -cebid -cecal -cecum -cedar -ceded -ceder -cedes -cedis -ceiba -ceili -ceils -celeb -cella -celli -cello -cells -celom -celts -cense -cento -cents -centu -ceorl -cepes -cerci -cered -ceres -cerge -ceria -ceric -cerne -ceroc -ceros -certs -certy -cesse -cesta -cesti -cetes -cetyl -cezve -chace -chack -chaco -chado -chads -chafe -chaff -chaft -chain -chair -chais -chalk -chals -champ -chams -chana -chang -chank -chant -chaos -chape -chaps -chapt -chara -chard -chare -chark -charm -charr -chars -chart -chary -chase -chasm -chats -chave -chavs -chawk -chaws -chaya -chays -cheap -cheat -check -cheek -cheep -cheer -chefs -cheka -chela -chelp -chemo -chems -chere -chert -chess -chest -cheth -chevy -chews -chewy -chiao -chias -chibs -chica -chich -chick -chico -chics -chide -chief -chiel -chiks -child -chile -chili -chill -chimb -chime -chimo -chimp -china -chine -ching -chink -chino -chins -chips -chirk -chirl -chirm -chiro -chirp -chirr -chirt -chiru -chits -chive -chivs -chivy -chizz -chock -choco -chocs -chode -chogs -choil -choir -choke -choko -choky -chola -choli -cholo -chomp -chons -choof -chook -choom -choon -chops -chord -chore -chose -chota -chott -chout -choux -chowk -chows -chubs -chuck -chufa -chuff -chugs -chump -chums -chunk -churl -churn -churr -chuse -chute -chuts -chyle -chyme -chynd -cibol -cided -cider -cides -ciels -cigar -ciggy -cilia -cills -cimar -cimex -cinch -cinct -cines -cinqs -cions -cippi -circa -circs -cires -cirls -cirri -cisco -cissy -cists -cital -cited -citer -cites -cives -civet -civic -civie -civil -civvy -clach -clack -clade -clads -claes -clags -claim -clame -clamp -clams -clang -clank -clans -claps -clapt -claro -clart -clary -clash -clasp -class -clast -clats -claut -clave -clavi -claws -clays -clean -clear -cleat -cleck -cleek -cleep -clefs -cleft -clegs -cleik -clems -clepe -clept -clerk -cleve -clews -click -clied -clies -cliff -clift -climb -clime -cline -cling -clink -clint -clipe -clips -clipt -clits -cloak -cloam -clock -clods -cloff -clogs -cloke -clomb -clomp -clone -clonk -clons -cloop -cloot -clops -close -clote -cloth -clots -cloud -clour -clous -clout -clove -clown -clows -cloye -cloys -cloze -clubs -cluck -clued -clues -cluey -clump -clung -clunk -clype -cnida -coach -coact -coady -coala -coals -coaly -coapt -coarb -coast -coate -coati -coats -cobbs -cobby -cobia -coble -cobra -cobza -cocas -cocci -cocco -cocks -cocky -cocoa -cocos -codas -codec -coded -coden -coder -codes -codex -codon -coeds -coffs -cogie -cogon -cogue -cohab -cohen -cohoe -cohog -cohos -coifs -coign -coils -coins -coirs -coits -coked -cokes -colas -colby -colds -coled -coles -coley -colic -colin -colls -colly -colog -colon -color -colts -colza -comae -comal -comas -combe -combi -combo -combs -comby -comer -comes -comet -comfy -comic -comix -comma -commo -comms -commy -compo -comps -compt -comte -comus -conch -condo -coned -cones -coney -confs -conga -conge -congo -conia -conic -conin -conks -conky -conne -conns -conte -conto -conus -convo -cooch -cooed -cooee -cooer -cooey -coofs -cooks -cooky -cools -cooly -coomb -cooms -coomy -coons -coops -coopt -coost -coots -cooze -copal -copay -coped -copen -coper -copes -coppy -copra -copse -copsy -coqui -coral -coram -corbe -corby -cords -cored -corer -cores -corey -corgi -coria -corks -corky -corms -corni -corno -corns -cornu -corny -corps -corse -corso -cosec -cosed -coses -coset -cosey -cosie -costa -coste -costs -cotan -coted -cotes -coths -cotta -cotts -couch -coude -cough -could -count -coupe -coups -courb -courd -coure -cours -court -couta -couth -coved -coven -cover -coves -covet -covey -covin -cowal -cowan -cowed -cower -cowks -cowls -cowps -cowry -coxae -coxal -coxed -coxes -coxib -coyau -coyed -coyer -coyly -coypu -cozed -cozen -cozes -cozey -cozie -craal -crabs -crack -craft -crags -craic -craig -crake -crame -cramp -crams -crane -crank -crans -crape -craps -crapy -crare -crash -crass -crate -crave -crawl -craws -crays -craze -crazy -creak -cream -credo -creds -creed -creek -creel -creep -crees -creme -crems -crena -crepe -creps -crept -crepy -cress -crest -crewe -crews -crias -cribs -crick -cried -crier -cries -crime -crimp -crims -crine -crios -cripe -crips -crise -crisp -crith -crits -croak -croci -crock -crocs -croft -crogs -cromb -crome -crone -cronk -crons -crony -crook -crool -croon -crops -crore -cross -crost -croup -crout -crowd -crown -crows -croze -cruck -crude -crudo -cruds -crudy -cruel -crues -cruet -cruft -crumb -crump -crunk -cruor -crura -cruse -crush -crust -crusy -cruve -crwth -cryer -crypt -ctene -cubby -cubeb -cubed -cuber -cubes -cubic -cubit -cuddy -cuffo -cuffs -cuifs -cuing -cuish -cuits -cukes -culch -culet -culex -culls -cully -culms -culpa -culti -cults -culty -cumec -cumin -cundy -cunei -cunit -cunts -cupel -cupid -cuppa -cuppy -curat -curbs -curch -curds -curdy -cured -curer -cures -curet -curfs -curia -curie -curio -curli -curls -curly -curns -curny -currs -curry -curse -cursi -curst -curve -curvy -cusec -cushy -cusks -cusps -cuspy -cusso -cusum -cutch -cuter -cutes -cutey -cutie -cutin -cutis -cutto -cutty -cutup -cuvee -cuzes -cwtch -cyano -cyans -cyber -cycad -cycas -cycle -cyclo -cyder -cylix -cymae -cymar -cymas -cymes -cymol -cynic -cysts -cytes -cyton -czars -daals -dabba -daces -dacha -dacks -dadah -dadas -daddy -dados -daffs -daffy -dagga -daggy -dagos -dahls -daiko -daily -daine -daint -dairy -daisy -daker -daled -dales -dalis -dalle -dally -dalts -daman -damar -dames -damme -damns -damps -dampy -dance -dancy -dandy -dangs -danio -danks -danny -dants -daraf -darbs -darcy -dared -darer -dares -darga -dargs -daric -daris -darks -darky -darns -darre -darts -darzi -dashi -dashy -datal -dated -dater -dates -datos -datto -datum -daube -daubs -dauby -dauds -dault -daunt -daurs -dauts -daven -davit -dawah -dawds -dawed -dawen -dawks -dawns -dawts -dayan -daych -daynt -dazed -dazer -dazes -deads -deair -deals -dealt -deans -deare -dearn -dears -deary -deash -death -deave -deaws -deawy -debag -debar -debby -debel -debes -debit -debts -debud -debug -debur -debus -debut -debye -decad -decaf -decal -decan -decay -decko -decks -decor -decos -decoy -decry -dedal -deeds -deedy -deely -deems -deens -deeps -deere -deers -deets -deeve -deevs -defat -defer -deffo -defis -defog -degas -degum -degus -deice -deids -deify -deign -deils -deism -deist -deity -deked -dekes -dekko -delay -deled -deles -delfs -delft -delis -dells -delly -delos -delph -delta -delts -delve -deman -demes -demic -demit -demob -demoi -demon -demos -dempt -demur -denar -denay -dench -denes -denet -denim -denis -dense -dents -deoxy -depot -depth -derat -deray -derby -dered -deres -derig -derma -derms -derns -derny -deros -derro -derry -derth -dervs -desex -deshi -desis -desks -desse -deter -detox -deuce -devas -devel -devil -devis -devon -devos -devot -dewan -dewar -dewax -dewed -dexes -dexie -dhaba -dhaks -dhals -dhikr -dhobi -dhole -dholl -dhols -dhoti -dhows -dhuti -diact -dials -diane -diary -diazo -dibbs -diced -dicer -dices -dicey -dicht -dicks -dicky -dicot -dicta -dicts -dicty -diddy -didie -didos -didst -diebs -diels -diene -diets -diffs -dight -digit -dikas -diked -diker -dikes -dikey -dildo -dilli -dills -dilly -dimbo -dimer -dimes -dimly -dimps -dinar -dined -diner -dines -dinge -dingo -dings -dingy -dinic -dinks -dinky -dinna -dinos -dints -diode -diols -diota -dippy -dipso -diram -direr -dirge -dirke -dirks -dirls -dirts -dirty -disas -disci -disco -discs -dishy -disks -disme -dital -ditas -ditch -dited -dites -ditsy -ditto -ditts -ditty -ditzy -divan -divas -dived -diver -dives -divis -divna -divos -divot -divvy -diwan -dixie -dixit -diyas -dizen -dizzy -djinn -djins -doabs -doats -dobby -dobes -dobie -dobla -dobra -dobro -docht -docks -docos -docus -doddy -dodge -dodgy -dodos -doeks -doers -doest -doeth -doffs -dogan -doges -dogey -doggo -doggy -dogie -dogma -dohyo -doilt -doily -doing -doits -dojos -dolce -dolci -doled -doles -dolia -dolls -dolly -dolma -dolor -dolos -dolts -domal -domed -domes -domic -donah -donas -donee -doner -donga -dongs -donko -donna -donne -donny -donor -donsy -donut -doobs -dooce -doody -dooks -doole -dools -dooly -dooms -doomy -doona -doorn -doors -doozy -dopas -doped -doper -dopes -dopey -dorad -dorba -dorbs -doree -dores -doric -doris -dorks -dorky -dorms -dormy -dorps -dorrs -dorsa -dorse -dorts -dorty -dosai -dosas -dosed -doseh -doser -doses -dosha -dotal -doted -doter -dotes -dotty -douar -doubt -douce -doucs -dough -douks -doula -douma -doums -doups -doura -douse -douts -doved -doven -dover -doves -dovie -dowar -dowds -dowdy -dowed -dowel -dower -dowie -dowle -dowls -dowly -downa -downs -downy -dowps -dowry -dowse -dowts -doxed -doxes -doxie -doyen -doyly -dozed -dozen -dozer -dozes -drabs -drack -draco -draff -draft -drags -drail -drain -drake -drama -drams -drank -drant -drape -draps -drats -drave -drawl -drawn -draws -drays -dread -dream -drear -dreck -dreed -dreer -drees -dregs -dreks -drent -drere -dress -drest -dreys -dribs -drice -dried -drier -dries -drift -drill -drily -drink -drips -dript -drive -droid -droil -droit -droke -drole -droll -drome -drone -drony -droob -droog -drook -drool -droop -drops -dropt -dross -drouk -drove -drown -drows -drubs -drugs -druid -drums -drunk -drupe -druse -drusy -druxy -dryad -dryas -dryer -dryly -dsobo -dsomo -duads -duals -duans -duars -dubbo -ducal -ducat -duces -duchy -ducks -ducky -ducts -duddy -duded -dudes -duels -duets -duett -duffs -dufus -duing -duits -dukas -duked -dukes -dukka -dulce -dules -dulia -dulls -dully -dulse -dumas -dumbo -dumbs -dumka -dumky -dummy -dumps -dumpy -dunam -dunce -dunch -dunes -dungs -dungy -dunks -dunno -dunny -dunsh -dunts -duomi -duomo -duped -duper -dupes -duple -duply -duppy -dural -duras -dured -dures -durgy -durns -duroc -duros -duroy -durra -durrs -durry -durst -durum -durzi -dusks -dusky -dusts -dusty -dutch -duvet -duxes -dwaal -dwale -dwalm -dwams -dwang -dwarf -dwaum -dweeb -dwell -dwelt -dwile -dwine -dyads -dyers -dying -dyked -dykes -dykey -dykon -dynel -dynes -dzhos -eager -eagle -eagre -ealed -eales -eaned -eards -eared -earls -early -earns -earnt -earst -earth -eased -easel -easer -eases -easle -easts -eaten -eater -eathe -eaved -eaves -ebbed -ebbet -ebons -ebony -ebook -ecads -eched -eches -echos -eclat -ecrus -edema -edged -edger -edges -edict -edify -edile -edits -educe -educt -eejit -eensy -eerie -eeven -eevns -effed -egads -egers -egest -eggar -egged -egger -egmas -egret -ehing -eider -eidos -eight -eigne -eiked -eikon -eilds -eisel -eject -ejido -eking -ekkas -elain -eland -elans -elate -elbow -elchi -elder -eldin -elect -elegy -elemi -elfed -elfin -eliad -elide -elint -elite -elmen -eloge -elogy -eloin -elope -elops -elpee -elsin -elude -elute -elvan -elven -elver -elves -emacs -email -embar -embay -embed -ember -embog -embow -embox -embus -emcee -emeer -emend -emerg -emery -emeus -emics -emirs -emits -emmas -emmer -emmet -emmew -emmys -emoji -emong -emote -emove -empts -empty -emule -emure -emyde -emyds -enact -enarm -enate -ended -ender -endew -endow -endue -enema -enemy -enews -enfix -eniac -enjoy -enlit -enmew -ennog -ennui -enoki -enols -enorm -enows -enrol -ensew -ensky -ensue -enter -entia -entry -enure -enurn -envoi -envoy -enzym -eorls -eosin -epact -epees -ephah -ephas -ephod -ephor -epics -epoch -epode -epopt -epoxy -epris -equal -eques -equid -equip -erase -erbia -erect -erevs -ergon -ergos -ergot -erhus -erica -erick -erics -ering -erned -ernes -erode -erose -erred -error -erses -eruct -erugo -erupt -eruvs -erven -ervil -escar -escot -esile -eskar -esker -esnes -essay -esses -ester -estoc -estop -estro -etage -etape -etats -etens -ethal -ether -ethic -ethne -ethos -ethyl -etics -etnas -ettin -ettle -etude -etuis -etwee -etyma -eughs -euked -eupad -euros -eusol -evade -evens -event -evert -every -evets -evhoe -evict -evils -evite -evohe -evoke -ewers -ewest -ewhow -ewked -exact -exalt -exams -excel -exeat -execs -exeem -exeme -exert -exfil -exies -exile -exine -exing -exist -exits -exode -exome -exons -expat -expel -expos -extol -extra -exude -exuls -exult -exurb -eyass -eyers -eying -eyots -eyras -eyres -eyrie -eyrir -ezine -fabby -fable -faced -facer -faces -facet -facia -facta -facts -faddy -faded -fader -fades -fadge -fados -faena -faery -faffs -faffy -faggy -fagin -fagot -faiks -fails -faine -fains -faint -fairs -fairy -faith -faked -faker -fakes -fakey -fakie -fakir -falaj -falls -false -famed -fames -fanal -fancy -fands -fanes -fanga -fango -fangs -fanks -fanny -fanon -fanos -fanum -faqir -farad -farce -farci -farcy -fards -fared -farer -fares -farle -farls -farms -faros -farro -farse -farts -fasci -fasti -fasts -fatal -fated -fates -fatly -fatso -fatty -fatwa -faugh -fauld -fault -fauna -fauns -faurd -fauts -fauve -favas -favel -faver -faves -favor -favus -fawns -fawny -faxed -faxes -fayed -fayer -fayne -fayre -fazed -fazes -feals -feare -fears -feart -fease -feast -feats -feaze -fecal -feces -fecht -fecit -fecks -fedex -feebs -feeds -feels -feens -feers -feese -feeze -fehme -feign -feint -feist -felch -felid -fella -fells -felly -felon -felts -felty -femal -femes -femme -femmy -femur -fence -fends -fendy -fenis -fenks -fenny -fents -feods -feoff -feral -ferer -feres -feria -ferly -fermi -ferms -ferns -ferny -ferry -fesse -festa -fests -festy -fetal -fetas -fetch -feted -fetes -fetid -fetor -fetta -fetts -fetus -fetwa -feuar -feuds -feued -fever -fewer -feyed -feyer -feyly -fezes -fezzy -fiars -fiats -fiber -fibre -fibro -fices -fiche -fichu -ficin -ficos -ficus -fides -fidge -fidos -fiefs -field -fiend -fient -fiere -fiers -fiery -fiest -fifed -fifer -fifes -fifis -fifth -fifty -figgy -fight -figos -fiked -fikes -filar -filch -filed -filer -files -filet -filii -filks -fille -fillo -fills -filly -filmi -films -filmy -filos -filth -filum -final -finca -finch -finds -fined -finer -fines -finis -finks -finny -finos -fiord -fiqhs -fique -fired -firer -fires -firie -firks -firms -firns -firry -first -firth -fiscs -fishy -fisks -fists -fisty -fitch -fitly -fitna -fitte -fitts -fiver -fives -fixed -fixer -fixes -fixit -fizzy -fjeld -fjord -flabs -flack -flaff -flags -flail -flair -flake -flaks -flaky -flame -flamm -flams -flamy -flane -flank -flans -flaps -flare -flary -flash -flask -flats -flava -flawn -flaws -flawy -flaxy -flays -fleam -fleas -fleck -fleek -fleer -flees -fleet -flegs -fleme -flesh -fleur -flews -flexi -flexo -fleys -flick -flics -flied -flier -flies -flimp -flims -fling -flint -flips -flirs -flirt -flisk -flite -flits -flitt -float -flobs -flock -flocs -floes -flogs -flong -flood -floor -flops -flora -flors -flory -flosh -floss -flota -flote -flour -flout -flown -flows -flubs -flued -flues -fluey -fluff -fluid -fluke -fluky -flume -flump -flung -flunk -fluor -flurr -flush -flute -fluty -fluyt -flyby -flyer -flype -flyte -foals -foams -foamy -focal -focus -foehn -fogey -foggy -fogie -fogle -fogou -fohns -foids -foils -foins -foist -folds -foley -folia -folic -folie -folio -folks -folky -folly -fomes -fonda -fonds -fondu -fones -fonly -fonts -foods -foody -fools -foots -footy -foram -foray -forbs -forby -force -fordo -fords -forel -fores -forex -forge -forgo -forks -forky -forme -forms -forte -forth -forts -forty -forum -forza -forze -fossa -fosse -fouat -fouds -fouer -fouet -foule -fouls -found -fount -fours -fouth -fovea -fowls -fowth -foxed -foxes -foxie -foyer -foyle -foyne -frabs -frack -fract -frags -frail -fraim -frame -franc -frank -frape -fraps -frass -frate -frati -frats -fraud -fraus -frays -freak -freed -freer -frees -freet -freit -fremd -frena -freon -frere -fresh -frets -friar -fribs -fried -frier -fries -frigs -frill -frise -frisk -frist -frith -frits -fritt -fritz -frize -frizz -frock -froes -frogs -frond -frons -front -frore -frorn -frory -frosh -frost -froth -frown -frows -frowy -froze -frugs -fruit -frump -frush -frust -fryer -fubar -fubby -fubsy -fucks -fucus -fuddy -fudge -fudgy -fuels -fuero -fuffs -fuffy -fugal -fuggy -fugie -fugio -fugle -fugly -fugue -fugus -fujis -fulls -fully -fumed -fumer -fumes -fumet -fundi -funds -fundy -fungi -fungo -fungs -funks -funky -funny -fural -furan -furca -furls -furol -furor -furrs -furry -furth -furze -furzy -fused -fusee -fusel -fuses -fusil -fusks -fussy -fusts -fusty -futon -fuzed -fuzee -fuzes -fuzil -fuzzy -fyces -fyked -fykes -fyles -fyrds -fytte -gabba -gabby -gable -gaddi -gades -gadge -gadid -gadis -gadje -gadjo -gadso -gaffe -gaffs -gaged -gager -gages -gaids -gaily -gains -gairs -gaita -gaits -gaitt -gajos -galah -galas -galax -galea -galed -gales -galls -gally -galop -galut -galvo -gamas -gamay -gamba -gambe -gambo -gambs -gamed -gamer -games -gamey -gamic -gamin -gamma -gamme -gammy -gamps -gamut -ganch -gandy -ganef -ganev -gangs -ganja -ganof -gants -gaols -gaped -gaper -gapes -gapos -gappy -garbe -garbo -garbs -garda -gares -garis -garms -garni -garre -garth -garum -gases -gasps -gaspy -gassy -gasts -gatch -gated -gater -gates -gaths -gator -gauch -gaucy -gauds -gaudy -gauge -gauje -gault -gaums -gaumy -gaunt -gaups -gaurs -gauss -gauze -gauzy -gavel -gavot -gawcy -gawds -gawks -gawky -gawps -gawsy -gayal -gayer -gayly -gazal -gazar -gazed -gazer -gazes -gazon -gazoo -geals -geans -geare -gears -geats -gebur -gecko -gecks -geeks -geeky -geeps -geese -geest -geist -geits -gelds -gelee -gelid -gelly -gelts -gemel -gemma -gemmy -gemot -genal -genas -genes -genet -genic -genie -genii -genip -genny -genoa -genom -genre -genro -gents -genty -genua -genus -geode -geoid -gerah -gerbe -geres -gerle -germs -germy -gerne -gesse -gesso -geste -gests -getas -getup -geums -geyan -geyer -ghast -ghats -ghaut -ghazi -ghees -ghest -ghost -ghoul -ghyll -giant -gibed -gibel -giber -gibes -gibli -gibus -giddy -gifts -gigas -gighe -gigot -gigue -gilas -gilds -gilet -gills -gilly -gilpy -gilts -gimel -gimme -gimps -gimpy -ginch -ginge -gings -ginks -ginny -ginzo -gipon -gippo -gippy -gipsy -girds -girls -girly -girns -giron -giros -girrs -girsh -girth -girts -gismo -gisms -gists -gitch -gites -giust -gived -given -giver -gives -gizmo -glace -glade -glads -glady -glaik -glair -glams -gland -glans -glare -glary -glass -glaum -glaur -glaze -glazy -gleam -glean -gleba -glebe -gleby -glede -gleds -gleed -gleek -glees -gleet -gleis -glens -glent -gleys -glial -glias -glibs -glide -gliff -glift -glike -glime -glims -glint -glisk -glits -glitz -gloam -gloat -globe -globi -globs -globy -glode -glogg -gloms -gloom -gloop -glops -glory -gloss -glost -glout -glove -glows -gloze -glued -gluer -glues -gluey -glugs -glume -glums -gluon -glute -gluts -glyph -gnarl -gnarr -gnars -gnash -gnats -gnawn -gnaws -gnome -gnows -goads -goafs -goals -goary -goats -goaty -goban -gobar -gobbi -gobbo -gobby -gobis -gobos -godet -godly -godso -goels -goers -goest -goeth -goety -gofer -goffs -gogga -gogos -goier -going -gojis -golds -goldy -golem -goles -golfs -golly -golpe -golps -gombo -gomer -gompa -gonad -gonch -gonef -goner -gongs -gonia -gonif -gonks -gonna -gonof -gonys -gonzo -gooby -goods -goody -gooey -goofs -goofy -googs -gooks -gooky -goold -gools -gooly -goons -goony -goops -goopy -goors -goory -goose -goosy -gopak -gopik -goral -goras -gored -gores -gorge -goris -gorms -gormy -gorps -gorse -gorsy -gosht -gosse -gotch -goths -gothy -gotta -gouch -gouge -gouks -goura -gourd -gouts -gouty -gowan -gowds -gowfs -gowks -gowls -gowns -goxes -goyim -goyle -graal -grabs -grace -grade -grads -graff -graft -grail -grain -graip -grama -grame -gramp -grams -grana -grand -grans -grant -grape -graph -grapy -grasp -grass -grate -grave -gravs -gravy -grays -graze -great -grebe -grebo -grece -greed -greek -green -grees -greet -grege -grego -grein -grens -grese -greve -grews -greys -grice -gride -grids -grief -griff -grift -grigs -grike -grill -grime -grimy -grind -grins -griot -gripe -grips -gript -gripy -grise -grist -grisy -grith -grits -grize -groan -groat -grody -grogs -groin -groks -groma -grone -groof -groom -grope -gross -grosz -grots -grouf -group -grout -grove -grovy -growl -grown -grows -grrls -grrrl -grubs -grued -gruel -grues -grufe -gruff -grume -grump -grund -grunt -gryce -gryde -gryke -grype -grypt -guaco -guana -guano -guans -guard -guars -guava -gucks -gucky -gudes -guess -guest -guffs -gugas -guide -guids -guild -guile -guilt -guimp -guiro -guise -gulag -gular -gulas -gulch -gules -gulet -gulfs -gulfy -gulls -gully -gulph -gulps -gulpy -gumbo -gumma -gummi -gummy -gumps -gundy -gunge -gungy -gunks -gunky -gunny -guppy -guqin -gurdy -gurge -gurls -gurly -gurns -gurry -gursh -gurus -gushy -gusla -gusle -gusli -gussy -gusto -gusts -gusty -gutsy -gutta -gutty -guyed -guyle -guyot -guyse -gwine -gyals -gyans -gybed -gybes -gyeld -gymps -gynae -gynie -gynny -gynos -gyoza -gypos -gyppo -gyppy -gypsy -gyral -gyred -gyres -gyron -gyros -gyrus -gytes -gyved -gyves -haafs -haars -habit -hable -habus -hacek -hacks -hadal -haded -hades -hadji -hadst -haems -haets -haffs -hafiz -hafts -haggs -hahas -haick -haika -haiks -haiku -hails -haily -hains -haint -hairs -hairy -haith -hajes -hajis -hajji -hakam -hakas -hakea -hakes -hakim -hakus -halal -haled -haler -hales -halfa -halfs -halid -hallo -halls -halma -halms -halon -halos -halse -halts -halva -halve -halwa -hamal -hamba -hamed -hames -hammy -hamza -hanap -hance -hanch -hands -handy -hangi -hangs -hanks -hanky -hansa -hanse -hants -haole -haoma -hapax -haply -happi -happy -hapus -haram -hards -hardy -hared -harem -hares -harim -harks -harls -harms -harns -haros -harps -harpy -harry -harsh -harts -hashy -hasks -hasps -hasta -haste -hasty -hatch -hated -hater -hates -hatha -hauds -haufs -haugh -hauld -haulm -hauls -hault -hauns -haunt -hause -haute -haven -haver -haves -havoc -hawed -hawks -hawms -hawse -hayed -hayer -hayey -hayle -hazan -hazed -hazel -hazer -hazes -heads -heady -heald -heals -heame -heaps -heapy -heard -heare -hears -heart -heast -heath -heats -heave -heavy -heben -hebes -hecht -hecks -heder -hedge -hedgy -heeds -heedy -heels -heeze -hefte -hefts -hefty -heids -heigh -heils -heirs -heist -hejab -hejra -heled -heles -helio -helix -hello -hells -helms -helos -helot -helps -helve -hemal -hemes -hemic -hemin -hemps -hempy -hence -hench -hends -henge -henna -henny -henry -hents -hepar -herbs -herby -herds -heres -herls -herma -herms -herns -heron -heros -herry -herse -hertz -herye -hesps -hests -hetes -heths -heuch -heugh -hevea -hewed -hewer -hewgh -hexad -hexed -hexer -hexes -hexyl -heyed -hiant -hicks -hided -hider -hides -hiems -highs -hight -hijab -hijra -hiked -hiker -hikes -hikoi -hilar -hilch -hillo -hills -hilly -hilts -hilum -hilus -himbo -hinau -hinds -hinge -hings -hinky -hinny -hints -hiois -hiply -hippo -hippy -hired -hiree -hirer -hires -hissy -hists -hitch -hithe -hived -hiver -hives -hizen -hoaed -hoagy -hoard -hoars -hoary -hoast -hobby -hobos -hocks -hocus -hodad -hodja -hoers -hogan -hogen -hoggs -hoghs -hohed -hoick -hoied -hoiks -hoing -hoise -hoist -hokas -hoked -hokes -hokey -hokis -hokku -hokum -holds -holed -holes -holey -holks -holla -hollo -holly -holme -holms -holon -holos -holts -homas -homed -homer -homes -homey -homie -homme -homos -honan -honda -honds -honed -honer -hones -honey -hongi -hongs -honks -honky -honor -hooch -hoods -hoody -hooey -hoofs -hooka -hooks -hooky -hooly -hoons -hoops -hoord -hoors -hoosh -hoots -hooty -hoove -hopak -hoped -hoper -hopes -hoppy -horah -horal -horas -horde -horis -horks -horme -horns -horny -horse -horst -horsy -hosed -hosel -hosen -hoser -hoses -hosey -hosta -hosts -hotch -hotel -hoten -hotly -hotty -houff -houfs -hough -hound -houri -hours -house -houts -hovea -hoved -hovel -hoven -hover -hoves -howbe -howdy -howes -howff -howfs -howks -howls -howre -howso -hoxed -hoxes -hoyas -hoyed -hoyle -hubby -hucks -hudna -hudud -huers -huffs -huffy -huger -huggy -huhus -huias -hulas -hules -hulks -hulky -hullo -hulls -hully -human -humas -humfs -humic -humid -humor -humph -humps -humpy -humus -hunch -hunks -hunky -hunts -hurds -hurls -hurly -hurra -hurry -hurst -hurts -hushy -husks -husky -husos -hussy -hutch -hutia -huzza -huzzy -hwyls -hydra -hydro -hyena -hyens -hygge -hying -hykes -hylas -hyleg -hyles -hylic -hymen -hymns -hynde -hyoid -hyped -hyper -hypes -hypha -hyphy -hypos -hyrax -hyson -hythe -iambi -iambs -ibrik -icers -iched -iches -ichor -icier -icily -icing -icker -ickle -icons -ictal -ictic -ictus -idant -ideal -ideas -idees -ident -idiom -idiot -idled -idler -idles -idola -idols -idyll -idyls -iftar -igapo -igged -igloo -iglus -ihram -ikans -ikats -ikons -ileac -ileal -ileum -ileus -iliac -iliad -ilial -ilium -iller -illth -image -imago -imams -imari -imaum -imbar -imbed -imbue -imide -imido -imids -imine -imino -immew -immit -immix -imped -impel -impis -imply -impot -impro -imshi -imshy -inane -inapt -inarm -inbox -inbye -incel -incle -incog -incur -incus -incut -indew -index -india -indie -indol -indow -indri -indue -inept -inerm -inert -infer -infix -infos -infra -ingan -ingle -ingot -inion -inked -inker -inkle -inlay -inlet -inned -inner -innit -inorb -input -inrun -inset -inspo -intel -inter -intil -intis -intra -intro -inula -inure -inurn -inust -invar -inwit -iodic -iodid -iodin -ionic -iotas -ippon -irade -irate -irids -iring -irked -iroko -irone -irons -irony -isbas -ishes -isled -isles -islet -isnae -issei -issue -istle -itchy -items -ither -ivied -ivies -ivory -ixias -ixnay -ixora -ixtle -izard -izars -izzat -jaaps -jabot -jacal -jacks -jacky -jaded -jades -jafas -jaffa -jagas -jager -jaggs -jaggy -jagir -jagra -jails -jaker -jakes -jakey -jalap -jalop -jambe -jambo -jambs -jambu -james -jammy -jamon -janes -janns -janny -janty -japan -japed -japer -japes -jarks -jarls -jarps -jarta -jarul -jasey -jaspe -jasps -jatos -jauks -jaunt -jaups -javas -javel -jawan -jawed -jaxie -jazzy -jeans -jeats -jebel -jedis -jeels -jeely -jeeps -jeers -jeeze -jefes -jeffs -jehad -jehus -jelab -jello -jells -jelly -jembe -jemmy -jenny -jeons -jerid -jerks -jerky -jerry -jesse -jests -jesus -jetes -jeton -jetty -jeune -jewed -jewel -jewie -jhala -jiaos -jibba -jibbs -jibed -jiber -jibes -jiffs -jiffy -jiggy -jigot -jihad -jills -jilts -jimmy -jimpy -jingo -jinks -jinne -jinni -jinns -jirds -jirga -jirre -jisms -jived -jiver -jives -jivey -jnana -jobed -jobes -jocko -jocks -jocky -jocos -jodel -joeys -johns -joins -joint -joist -joked -joker -jokes -jokey -jokol -joled -joles -jolls -jolly -jolts -jolty -jomon -jomos -jones -jongs -jonty -jooks -joram -jorum -jotas -jotty -jotun -joual -jougs -jouks -joule -jours -joust -jowar -jowed -jowls -jowly -joyed -jubas -jubes -jucos -judas -judge -judgy -judos -jugal -jugum -juice -juicy -jujus -juked -jukes -jukus -julep -jumar -jumbo -jumby -jumps -jumpy -junco -junks -junky -junta -junto -jupes -jupon -jural -jurat -jurel -jures -juror -justs -jutes -jutty -juves -juvie -kaama -kabab -kabar -kabob -kacha -kacks -kadai -kades -kadis -kafir -kagos -kagus -kahal -kaiak -kaids -kaies -kaifs -kaika -kaiks -kails -kaims -kaing -kains -kakas -kakis -kalam -kales -kalif -kalis -kalpa -kamas -kames -kamik -kamis -kamme -kanae -kanas -kandy -kaneh -kanes -kanga -kangs -kanji -kants -kanzu -kaons -kapas -kaphs -kapok -kapow -kappa -kapus -kaput -karas -karat -karks -karma -karns -karoo -karos -karri -karst -karsy -karts -karzy -kasha -kasme -katal -katas -katis -katti -kaugh -kauri -kauru -kaury -kaval -kavas -kawas -kawau -kawed -kayak -kayle -kayos -kazis -kazoo -kbars -kebab -kebar -kebob -kecks -kedge -kedgy -keech -keefs -keeks -keels -keema -keeno -keens -keeps -keets -keeve -kefir -kehua -keirs -kelep -kelim -kells -kelly -kelps -kelpy -kelts -kelty -kembo -kembs -kemps -kempt -kempy -kenaf -kench -kendo -kenos -kente -kents -kepis -kerbs -kerel -kerfs -kerky -kerma -kerne -kerns -keros -kerry -kerve -kesar -kests -ketas -ketch -ketes -ketol -kevel -kevil -kexes -keyed -keyer -khadi -khafs -khaki -khans -khaph -khats -khaya -khazi -kheda -kheth -khets -khoja -khors -khoum -khuds -kiaat -kiack -kiang -kibbe -kibbi -kibei -kibes -kibla -kicks -kicky -kiddo -kiddy -kidel -kidge -kiefs -kiers -kieve -kievs -kight -kikes -kikoi -kiley -kilim -kills -kilns -kilos -kilps -kilts -kilty -kimbo -kinas -kinda -kinds -kindy -kines -kings -kinin -kinks -kinky -kinos -kiore -kiosk -kipes -kippa -kipps -kirby -kirks -kirns -kirri -kisan -kissy -kists -kited -kiter -kites -kithe -kiths -kitty -kitul -kivas -kiwis -klang -klaps -klett -klick -klieg -kliks -klong -kloof -kluge -klutz -knack -knags -knaps -knarl -knars -knaur -knave -knawe -knead -kneed -kneel -knees -knell -knelt -knife -knish -knits -knive -knobs -knock -knoll -knops -knosp -knots -knout -knowe -known -knows -knubs -knurl -knurr -knurs -knuts -koala -koans -koaps -koban -kobos -koels -koffs -kofta -kogal -kohas -kohen -kohls -koine -kojis -kokam -kokas -koker -kokra -kokum -kolas -kolos -kombu -konbu -kondo -konks -kooks -kooky -koori -kopek -kophs -kopje -koppa -korai -koras -korat -kores -korma -koros -korun -korus -koses -kotch -kotos -kotow -koura -kraal -krabs -kraft -krais -krait -krang -krans -kranz -kraut -krays -kreep -kreng -krewe -krill -krona -krone -kroon -krubi -krunk -ksars -kubie -kudos -kudus -kudzu -kufis -kugel -kuias -kukri -kukus -kulak -kulan -kulas -kulfi -kumis -kumys -kuris -kurre -kurta -kurus -kusso -kutas -kutch -kutis -kutus -kuzus -kvass -kvell -kwela -kyack -kyaks -kyang -kyars -kyats -kybos -kydst -kyles -kylie -kylin -kylix -kyloe -kynde -kynds -kypes -kyrie -kytes -kythe -laari -labda -label -labia -labis -labor -labra -laced -lacer -laces -lacet -lacey -lacks -laddy -laded -laden -lader -lades -ladle -laers -laevo -lagan -lager -lahal -lahar -laich -laics -laids -laigh -laika -laiks -laird -lairs -lairy -laith -laity -laked -laker -lakes -lakhs -lakin -laksa -laldy -lalls -lamas -lambs -lamby -lamed -lamer -lames -lamia -lammy -lamps -lanai -lanas -lance -lanch -lande -lands -lanes -lanks -lanky -lants -lapel -lapin -lapis -lapje -lapse -larch -lards -lardy -laree -lares -large -largo -laris -larks -larky -larns -larnt -larum -larva -lased -laser -lases -lassi -lasso -lassu -lassy -lasts -latah -latch -lated -laten -later -latex -lathe -lathi -laths -lathy -latke -latte -latus -lauan -lauch -lauds -laufs -laugh -laund -laura -laval -lavas -laved -laver -laves -lavra -lavvy -lawed -lawer -lawin -lawks -lawns -lawny -laxed -laxer -laxes -laxly -layed -layer -layin -layup -lazar -lazed -lazes -lazos -lazzi -lazzo -leach -leads -leady -leafs -leafy -leaks -leaky -leams -leans -leant -leany -leaps -leapt -leare -learn -lears -leary -lease -leash -least -leats -leave -leavy -leaze -leben -leccy -ledes -ledge -ledgy -ledum -leear -leech -leeks -leeps -leers -leery -leese -leets -leeze -lefte -lefts -lefty -legal -leger -leges -legge -leggo -leggy -legit -lehrs -lehua -leirs -leish -leman -lemed -lemel -lemes -lemma -lemme -lemon -lemur -lends -lenes -lengs -lenis -lenos -lense -lenti -lento -leone -leper -lepid -lepra -lepta -lered -leres -lerps -lesbo -leses -lests -letch -lethe -letup -leuch -leuco -leuds -leugh -levas -levee -level -lever -leves -levin -levis -lewis -lexes -lexis -lezes -lezza -lezzy -liana -liane -liang -liard -liars -liart -libel -liber -libra -libri -lichi -licht -licit -licks -lidar -lidos -liefs -liege -liens -liers -lieus -lieve -lifer -lifes -lifts -ligan -liger -ligge -light -ligne -liked -liken -liker -likes -likin -lilac -lills -lilos -lilts -liman -limas -limax -limba -limbi -limbo -limbs -limby -limed -limen -limes -limey -limit -limma -limns -limos -limpa -limps -linac -linch -linds -lindy -lined -linen -liner -lines -liney -linga -lingo -lings -lingy -linin -links -linky -linns -linny -linos -lints -linty -linum -linux -lions -lipas -lipes -lipid -lipin -lipos -lippy -liras -lirks -lirot -lisks -lisle -lisps -lists -litai -litas -lited -liter -lites -lithe -litho -liths -litre -lived -liven -liver -lives -livid -livor -livre -llama -llano -loach -loads -loafs -loams -loamy -loans -loast -loath -loave -lobar -lobby -lobed -lobes -lobos -lobus -local -loche -lochs -locie -locis -locks -locos -locum -locus -loden -lodes -lodge -loess -lofts -lofty -logan -loges -loggy -logia -logic -logie -login -logoi -logon -logos -lohan -loids -loins -loipe -loirs -lokes -lolls -lolly -lolog -lomas -lomed -lomes -loner -longa -longe -longs -looby -looed -looey -loofa -loofs -looie -looks -looky -looms -loons -loony -loops -loopy -loord -loose -loots -loped -loper -lopes -loppy -loral -loran -lords -lordy -lorel -lores -loric -loris -lorry -losed -losel -losen -loser -loses -lossy -lotah -lotas -lotes -lotic -lotos -lotsa -lotta -lotte -lotto -lotus -loued -lough -louie -louis -louma -lound -louns -loupe -loups -loure -lours -loury -louse -lousy -louts -lovat -loved -lover -loves -lovey -lovie -lowan -lowed -lower -lowes -lowly -lownd -lowne -lowns -lowps -lowry -lowse -lowts -loxed -loxes -loyal -lozen -luach -luaus -lubed -lubes -lubra -luces -lucid -lucks -lucky -lucre -ludes -ludic -ludos -luffa -luffs -luged -luger -luges -lulls -lulus -lumas -lumbi -lumen -lumme -lummy -lumps -lumpy -lunar -lunas -lunch -lunes -lunet -lunge -lungi -lungs -lunks -lunts -lupin -lupus -lurch -lured -lurer -lures -lurex -lurgi -lurgy -lurid -lurks -lurry -lurve -luser -lushy -lusks -lusts -lusty -lusus -lutea -luted -luter -lutes -luvvy -luxed -luxer -luxes -lweis -lyams -lyard -lyart -lyase -lycea -lycee -lycra -lying -lymes -lymph -lynch -lynes -lyres -lyric -lysed -lyses -lysin -lysis -lysol -lyssa -lyted -lytes -lythe -lytic -lytta -maaed -maare -maars -mabes -macas -macaw -maced -macer -maces -mache -machi -macho -machs -macks -macle -macon -macro -madam -madge -madid -madly -madre -maerl -mafia -mafic -mages -maggs -magic -magma -magot -magus -mahoe -mahua -mahwa -maids -maiko -maiks -maile -maill -mails -maims -mains -maire -mairs -maise -maist -maize -major -makar -maker -makes -makis -makos -malam -malar -malas -malax -males -malic -malik -malis -malls -malms -malmy -malts -malty -malus -malva -malwa -mamas -mamba -mambo -mamee -mamey -mamie -mamma -mammy -manas -manat -mandi -maneb -maned -maneh -manes -manet -manga -mange -mango -mangs -mangy -mania -manic -manis -manky -manly -manna -manor -manos -manse -manta -manto -manty -manul -manus -mapau -maple -maqui -marae -marah -maras -march -marcs -mardy -mares -marge -margs -maria -marid -marka -marks -marle -marls -marly -marms -maron -maror -marra -marri -marry -marse -marsh -marts -marvy -masas -mased -maser -mases -mashy -masks -mason -massa -masse -massy -masts -masty -masus -matai -match -mated -mater -mates -matey -maths -matin -matlo -matte -matts -matza -matzo -mauby -mauds -mauls -maund -mauri -mausy -mauts -mauve -mauzy -maven -mavie -mavin -mavis -mawed -mawks -mawky -mawns -mawrs -maxed -maxes -maxim -maxis -mayan -mayas -maybe -mayed -mayor -mayos -mayst -mazed -mazer -mazes -mazey -mazut -mbira -meads -meals -mealy -meane -means -meant -meany -meare -mease -meath -meats -meaty -mebos -mecca -mechs -mecks -medal -media -medic -medii -medle -meeds -meers -meets -meffs -meins -meint -meiny -meith -mekka -melas -melba -melds -melee -melic -melik -mells -melon -melts -melty -memes -memos -menad -mends -mened -menes -menge -mengs -mensa -mense -mensh -menta -mento -menus -meous -meows -merch -mercs -mercy -merde -mered -merel -merer -meres -merge -meril -meris -merit -merks -merle -merls -merry -merse -mesal -mesas -mesel -meses -meshy -mesic -mesne -meson -messy -mesto -metal -meted -meter -metes -metho -meths -metic -metif -metis -metol -metre -metro -meuse -meved -meves -mewed -mewls -meynt -mezes -mezze -mezzo -mhorr -miaou -miaow -miasm -miaul -micas -miche -micht -micks -micky -micos -micra -micro -middy -midge -midgy -midis -midst -miens -mieve -miffs -miffy -mifty -miggs -might -mihas -mihis -miked -mikes -mikra -mikva -milch -milds -miler -miles -milfs -milia -milko -milks -milky -mille -mills -milor -milos -milpa -milts -milty -miltz -mimed -mimeo -mimer -mimes -mimic -mimsy -minae -minar -minas -mince -mincy -minds -mined -miner -mines -minge -mings -mingy -minim -minis -minke -minks -minny -minor -minos -mints -minty -minus -mired -mires -mirex -mirid -mirin -mirks -mirky -mirly -miros -mirth -mirvs -mirza -misch -misdo -miser -mises -misgo -misos -missa -missy -mists -misty -mitch -miter -mites -mitis -mitre -mitts -mixed -mixen -mixer -mixes -mixte -mixup -mizen -mizzy -mneme -moans -moats -mobby -mobes -mobey -mobie -moble -mocha -mochi -mochs -mochy -mocks -modal -model -modem -moder -modes -modge -modii -modus -moers -mofos -moggy -mogul -mohel -mohos -mohrs -mohua -mohur -moile -moils -moira -moire -moist -moits -mojos -mokes -mokis -mokos -molal -molar -molas -molds -moldy -moled -moles -molla -molls -molly -molto -molts -molys -momes -momma -mommy -momus -monad -monal -monas -monde -mondo -moner -money -mongo -mongs -monic -monie -monks -monos -monte -month -monty -moobs -mooch -moods -moody -mooed -mooks -moola -mooli -mools -mooly -moong -moons -moony -moops -moors -moory -moose -moots -moove -moped -moper -mopes -mopey -moppy -mopsy -mopus -morae -moral -moras -morat -moray -morel -mores -moria -morne -morns -moron -morph -morra -morro -morse -morts -mosed -moses -mosey -mosks -mosso -mossy -moste -mosts -moted -motel -moten -motes -motet -motey -moths -mothy -motif -motis -motor -motte -motto -motts -motty -motus -motza -mouch -moues -mould -mouls -moult -mound -mount -moups -mourn -mouse -moust -mousy -mouth -moved -mover -moves -movie -mowas -mowed -mower -mowra -moxas -moxie -moyas -moyle -moyls -mozed -mozes -mozos -mpret -mucho -mucic -mucid -mucin -mucks -mucky -mucor -mucro -mucus -muddy -mudge -mudir -mudra -muffs -mufti -mugga -muggs -muggy -muhly -muids -muils -muirs -muist -mujik -mulch -mulct -muled -mules -muley -mulga -mulie -mulla -mulls -mulse -mulsh -mumms -mummy -mumps -mumsy -mumus -munch -munga -munge -mungo -mungs -munis -munts -muntu -muons -mural -muras -mured -mures -murex -murid -murks -murky -murls -murly -murra -murre -murri -murrs -murry -murti -murva -musar -musca -mused -muser -muses -muset -musha -mushy -music -musit -musks -musky -musos -musse -mussy -musth -musts -musty -mutch -muted -muter -mutes -mutha -mutis -muton -mutts -muxed -muxes -muzak -muzzy -mvule -myall -mylar -mynah -mynas -myoid -myoma -myope -myops -myopy -myrrh -mysid -mythi -myths -mythy -myxos -mzees -naams -naans -nabes -nabis -nabks -nabla -nabob -nache -nacho -nacre -nadas -nadir -naeve -naevi -naffs -nagas -naggy -nagor -nahal -naiad -naifs -naiks -nails -naira -nairu -naive -naked -naker -nakfa -nalas -naled -nalla -named -namer -names -namma -namus -nanas -nance -nancy -nandu -nanna -nanny -nanos -nanua -napas -naped -napes -napoo -nappa -nappe -nappy -naras -narco -narcs -nards -nares -naric -naris -narks -narky -narre -nasal -nashi -nasty -natal -natch -nates -natis -natty -nauch -naunt -naval -navar -navel -naves -navew -navvy -nawab -nazes -nazir -nazis -nduja -neafe -neals -neaps -nears -neath -neats -nebek -nebel -necks -neddy -needs -needy -neeld -neele -neemb -neems -neeps -neese -neeze -negro -negus -neifs -neigh -neist -neive -nelis -nelly -nemas -nemns -nempt -nenes -neons -neper -nepit -neral -nerds -nerdy -nerka -nerks -nerol -nerts -nertz -nerve -nervy -nests -netes -netop -netts -netty -neuks -neume -neums -nevel -never -neves -nevus -newbs -newed -newel -newer -newie -newly -newsy -newts -nexts -nexus -ngaio -ngana -ngati -ngoma -ngwee -nicad -nicer -niche -nicht -nicks -nicol -nidal -nided -nides -nidor -nidus -niece -niefs -nieve -nifes -niffs -niffy -nifty -niger -nighs -night -nihil -nikab -nikah -nikau -nills -nimbi -nimbs -nimps -niner -nines -ninja -ninny -ninon -ninth -nipas -nippy -niqab -nirls -nirly -nisei -nisse -nisus -niter -nites -nitid -niton -nitre -nitro -nitry -nitty -nival -nixed -nixer -nixes -nixie -nizam -nkosi -noahs -nobby -noble -nobly -nocks -nodal -noddy -nodes -nodus -noels -noggs -nohow -noils -noily -noint -noirs -noise -noisy -noles -nolls -nolos -nomad -nomas -nomen -nomes -nomic -nomoi -nomos -nonas -nonce -nones -nonet -nongs -nonis -nonny -nonyl -noobs -nooit -nooks -nooky -noons -noops -noose -nopal -noria -noris -norks -norma -norms -north -nosed -noser -noses -nosey -notal -notch -noted -noter -notes -notum -nould -noule -nouls -nouns -nouny -noups -novae -novas -novel -novum -noway -nowed -nowls -nowts -nowty -noxal -noxes -noyau -noyed -noyes -nubby -nubia -nucha -nuddy -nuder -nudes -nudge -nudie -nudzh -nuffs -nugae -nuked -nukes -nulla -nulls -numbs -numen -nummy -nunny -nurds -nurdy -nurls -nurrs -nurse -nutso -nutsy -nutty -nyaff -nyala -nying -nylon -nymph -nyssa -oaked -oaken -oaker -oakum -oared -oases -oasis -oasts -oaten -oater -oaths -oaves -obang -obeah -obeli -obese -obeys -obias -obied -obiit -obits -objet -oboes -obole -oboli -obols -occam -occur -ocean -ocher -oches -ochre -ochry -ocker -ocrea -octad -octal -octan -octas -octet -octyl -oculi -odahs -odals -odder -oddly -odeon -odeum -odism -odist -odium -odors -odour -odyle -odyls -ofays -offal -offed -offer -offie -oflag -often -ofter -ogams -ogeed -ogees -oggin -ogham -ogive -ogled -ogler -ogles -ogmic -ogres -ohias -ohing -ohmic -ohone -oidia -oiled -oiler -oinks -oints -ojime -okapi -okays -okehs -okras -oktas -olden -older -oldie -oleic -olein -olent -oleos -oleum -olios -olive -ollas -ollav -oller -ollie -ology -olpae -olpes -omasa -omber -ombre -ombus -omega -omens -omers -omits -omlah -omovs -omrah -oncer -onces -oncet -oncus -onely -oners -onery -onion -onium -onkus -onlay -onned -onset -ontic -oobit -oohed -oomph -oonts -ooped -oorie -ooses -ootid -oozed -oozes -opahs -opals -opens -opepe -opera -opine -oping -opium -oppos -opsin -opted -opter -optic -orach -oracy -orals -orang -orant -orate -orbed -orbit -orcas -orcin -order -ordos -oread -orfes -organ -orgia -orgic -orgue -oribi -oriel -orixa -orles -orlon -orlop -ormer -ornis -orpin -orris -ortho -orval -orzos -oscar -oshac -osier -osmic -osmol -ossia -ostia -otaku -otary -other -ottar -otter -ottos -oubit -oucht -ouens -ought -ouija -oulks -oumas -ounce -oundy -oupas -ouped -ouphe -ouphs -ourie -ousel -ousts -outby -outdo -outed -outer -outgo -outre -outro -outta -ouzel -ouzos -ovals -ovary -ovate -ovels -ovens -overs -overt -ovine -ovist -ovoid -ovoli -ovolo -ovule -owche -owies -owing -owled -owler -owlet -owned -owner -owres -owrie -owsen -oxbow -oxers -oxeye -oxide -oxids -oxies -oxime -oxims -oxlip -oxter -oyers -ozeki -ozone -ozzie -paals -paans -pacas -paced -pacer -paces -pacey -pacha -packs -pacos -pacta -pacts -paddy -padis -padle -padma -padre -padri -paean -paedo -paeon -pagan -paged -pager -pages -pagle -pagod -pagri -paiks -pails -pains -paint -paire -pairs -paisa -paise -pakka -palas -palay -palea -paled -paler -pales -palet -palis -palki -palla -palls -pally -palms -palmy -palpi -palps -palsa -palsy -pampa -panax -pance -panda -pands -pandy -paned -panel -panes -panga -pangs -panic -panim -panko -panne -panni -pansy -panto -pants -panty -paoli -paolo -papal -papas -papaw -paper -papes -pappi -pappy -parae -paras -parch -pardi -pards -pardy -pared -paren -pareo -parer -pares -pareu -parev -parge -pargo -paris -parka -parki -parks -parky -parle -parly -parma -parol -parps -parra -parrs -parry -parse -parti -parts -party -parve -parvo -paseo -pases -pasha -pashm -paska -paspy -passe -pasta -paste -pasts -pasty -patch -pated -paten -pater -pates -paths -patin -patio -patka -patly -patsy -patte -patty -patus -pauas -pauls -pause -pavan -paved -paven -paver -paves -pavid -pavin -pavis -pawas -pawaw -pawed -pawer -pawks -pawky -pawls -pawns -paxes -payed -payee -payer -payor -paysd -peace -peach -peage -peags -peaks -peaky -peals -peans -peare -pearl -pears -peart -pease -peats -peaty -peavy -peaze -pebas -pecan -pechs -pecke -pecks -pecky -pedal -pedes -pedis -pedro -peece -peeks -peels -peens -peeoy -peepe -peeps -peers -peery -peeve -peggy -peghs -peins -peise -peize -pekan -pekes -pekin -pekoe -pelas -pelau -peles -pelfs -pells -pelma -pelon -pelta -pelts -penal -pence -pends -pendu -pened -penes -pengo -penie -penis -penks -penna -penne -penni -penny -pents -peons -peony -pepla -pepos -peppy -pepsi -perai -perce -perch -percs -perdu -perdy -perea -peres -peril -peris -perks -perky -perms -perns -perog -perps -perry -perse -perst -perts -perve -pervo -pervs -pervy -pesky -pesos -pesto -pests -pesty -petal -petar -peter -petit -petre -petri -petti -petto -petty -pewee -pewit -peyse -phage -phang -phare -pharm -phase -pheer -phene -pheon -phese -phial -phish -phizz -phlox -phoca -phone -phono -phons -phony -photo -phots -phpht -phuts -phyla -phyle -piani -piano -pians -pibal -pical -picas -piccy -picks -picky -picot -picra -picul -piece -piend -piers -piert -pieta -piets -piety -piezo -piggy -pight -pigmy -piing -pikas -pikau -piked -piker -pikes -pikey -pikis -pikul -pilae -pilaf -pilao -pilar -pilau -pilaw -pilch -pilea -piled -pilei -piler -piles -pilis -pills -pilot -pilow -pilum -pilus -pimas -pimps -pinas -pinch -pined -pines -piney -pingo -pings -pinko -pinks -pinky -pinna -pinny -pinon -pinot -pinta -pinto -pints -pinup -pions -piony -pious -pioye -pioys -pipal -pipas -piped -piper -pipes -pipet -pipis -pipit -pippy -pipul -pique -pirai -pirls -pirns -pirog -pisco -pises -pisky -pisos -pissy -piste -pitas -pitch -piths -pithy -piton -pitot -pitta -piums -pivot -pixel -pixes -pixie -pized -pizes -pizza -plaas -place -plack -plage -plaid -plain -plait -plane -plank -plans -plant -plaps -plash -plasm -plast -plate -plats -platt -platy -playa -plays -plaza -plead -pleas -pleat -plebe -plebs -plena -pleon -plesh -plews -plica -plied -plier -plies -plims -pling -plink -ploat -plods -plong -plonk -plook -plops -plots -plotz -plouk -plows -ploye -ploys -pluck -plues -pluff -plugs -plumb -plume -plump -plums -plumy -plunk -pluot -plush -pluto -plyer -poach -poaka -poake -poboy -pocks -pocky -podal -poddy -podex -podge -podgy -podia -poems -poeps -poesy -poets -pogey -pogge -pogos -pohed -poilu -poind -point -poise -pokal -poked -poker -pokes -pokey -pokie -polar -poled -poler -poles -poley -polio -polis -polje -polka -polks -polls -polly -polos -polts -polyp -polys -pombe -pomes -pommy -pomos -pomps -ponce -poncy -ponds -pones -poney -ponga -pongo -pongs -pongy -ponks -ponts -ponty -ponzu -pooch -poods -pooed -poofs -poofy -poohs -pooja -pooka -pooks -pools -poons -poops -poopy -poori -poort -poots -poove -poovy -popes -poppa -poppy -popsy -porae -poral -porch -pored -porer -pores -porge -porgy -porin -porks -porky -porno -porns -porny -porta -ports -porty -posed -poser -poses -posey -posho -posit -posse -posts -potae -potch -poted -potes -potin -potoo -potsy -potto -potts -potty -pouch -pouff -poufs -pouke -pouks -poule -poulp -poult -pound -poupe -poupt -pours -pouts -pouty -powan -power -powin -pownd -powns -powny -powre -poxed -poxes -poynt -poyou -poyse -pozzy -praam -prads -prahu -prams -prana -prang -prank -praos -prase -prate -prats -pratt -praty -praus -prawn -prays -predy -preed -preen -prees -preif -prems -premy -prent -preon -preop -preps -presa -prese -press -prest -preve -prexy -preys -prial -price -prick -pricy -pride -pried -prief -prier -pries -prigs -prill -prima -prime -primi -primo -primp -prims -primy -prink -print -prion -prior -prise -prism -priss -privy -prize -proas -probe -probs -prods -proem -profs -progs -proin -proke -prole -proll -promo -proms -prone -prong -pronk -proof -props -prore -prose -proso -pross -prost -prosy -proto -proud -proul -prove -prowl -prows -proxy -proyn -prude -prune -prunt -pruta -pryer -pryse -psalm -pseud -pshaw -psion -psoae -psoai -psoas -psora -psych -psyop -pubco -pubes -pubic -pubis -pucan -pucer -puces -pucka -pucks -puddy -pudge -pudgy -pudic -pudor -pudsy -pudus -puers -puffa -puffs -puffy -puggy -pugil -puhas -pujah -pujas -pukas -puked -puker -pukes -pukey -pukka -pukus -pulao -pulas -puled -puler -pules -pulik -pulis -pulka -pulks -pulli -pulls -pully -pulmo -pulps -pulpy -pulse -pulus -pumas -pumie -pumps -punas -punce -punch -punga -pungs -punji -punka -punks -punky -punny -punto -punts -punty -pupae -pupal -pupas -pupil -puppy -pupus -purda -pured -puree -purer -pures -purge -purin -puris -purls -purpy -purrs -purse -pursy -purty -puses -pushy -pusle -pussy -putid -puton -putti -putto -putts -putty -puzel -pwned -pyats -pyets -pygal -pygmy -pyins -pylon -pyned -pynes -pyoid -pyots -pyral -pyran -pyres -pyrex -pyric -pyros -pyxed -pyxes -pyxie -pyxis -pzazz -qadis -qaids -qajaq -qanat -qapik -qibla -qophs -qorma -quack -quads -quaff -quags -quail -quair -quais -quake -quaky -quale -qualm -quant -quare -quark -quart -quash -quasi -quass -quate -quats -quayd -quays -qubit -quean -queen -queer -quell -queme -quena -quern -query -quest -queue -queyn -queys -quich -quick -quids -quiet -quiff -quill -quilt -quims -quina -quine -quino -quins -quint -quipo -quips -quipu -quire -quirk -quirt -quist -quite -quits -quoad -quods -quoif -quoin -quoit -quoll -quonk -quops -quota -quote -quoth -qursh -quyte -rabat -rabbi -rabic -rabid -rabis -raced -racer -races -rache -racks -racon -radar -radge -radii -radio -radix -radon -raffs -rafts -ragas -ragde -raged -ragee -rager -rages -ragga -raggs -raggy -ragis -ragus -rahed -rahui -raias -raids -raiks -raile -rails -raine -rains -rainy -raird -raise -raita -raits -rajah -rajas -rajes -raked -rakee -raker -rakes -rakia -rakis -rakus -rales -rally -ralph -ramal -ramee -ramen -ramet -ramie -ramin -ramis -rammy -ramps -ramus -ranas -rance -ranch -rands -randy -ranee -ranga -range -rangi -rangs -rangy -ranid -ranis -ranke -ranks -rants -raped -raper -rapes -raphe -rapid -rappe -rared -raree -rarer -rares -rarks -rased -raser -rases -rasps -raspy -rasse -rasta -ratal -ratan -ratas -ratch -rated -ratel -rater -rates -ratha -rathe -raths -ratio -ratoo -ratos -ratty -ratus -rauns -raupo -raved -ravel -raven -raver -raves -ravey -ravin -rawer -rawin -rawly -rawns -raxed -raxes -rayah -rayas -rayed -rayle -rayne -rayon -razed -razee -razer -razes -razoo -razor -reach -react -readd -reads -ready -reais -reaks -realm -realo -reals -reame -reams -reamy -reans -reaps -rearm -rears -reast -reata -reate -reave -rebar -rebbe -rebec -rebel -rebid -rebit -rebop -rebus -rebut -rebuy -recal -recap -recce -recco -reccy -recit -recks -recon -recta -recti -recto -recur -recut -redan -redds -reddy -reded -redes -redia -redid -redip -redly -redon -redos -redox -redry -redub -redux -redye -reech -reede -reeds -reedy -reefs -reefy -reeks -reeky -reels -reens -reest -reeve -refed -refel -refer -reffo -refis -refit -refix -refly -refry -regal -regar -reges -reggo -regie -regma -regna -regos -regur -rehab -rehem -reifs -reify -reign -reiki -reiks -reink -reins -reird -reist -reive -rejig -rejon -reked -rekes -rekey -relax -relay -relet -relic -relie -relit -rello -reman -remap -remen -remet -remex -remit -remix -renal -renay -rends -renew -reney -renga -renig -renin -renne -renos -rente -rents -reoil -reorg -repay -repeg -repel -repin -repla -reply -repos -repot -repps -repro -reran -rerig -rerun -resat -resaw -resay -resee -reses -reset -resew -resid -resin -resit -resod -resow -resto -rests -resty -resus -retag -retax -retch -retem -retia -retie -retox -retro -retry -reuse -revel -revet -revie -revue -rewan -rewax -rewed -rewet -rewin -rewon -rewth -rexes -rezes -rheas -rheme -rheum -rhies -rhime -rhine -rhino -rhody -rhomb -rhone -rhumb -rhyme -rhyne -rhyta -riads -rials -riant -riata -ribas -ribby -ribes -riced -ricer -rices -ricey -richt -ricin -ricks -rider -rides -ridge -ridgy -ridic -riels -riems -rieve -rifer -riffs -rifle -rifte -rifts -rifty -riggs -right -rigid -rigol -rigor -riled -riles -riley -rille -rills -rimae -rimed -rimer -rimes -rimus -rinds -rindy -rines -rings -rinks -rinse -rioja -riots -riped -ripen -riper -ripes -ripps -risen -riser -rises -rishi -risks -risky -risps -risus -rites -ritts -ritzy -rival -rivas -rived -rivel -riven -river -rives -rivet -riyal -rizas -roach -roads -roams -roans -roars -roary -roast -roate -robed -robes -robin -roble -robot -rocks -rocky -roded -rodeo -rodes -roger -rogue -roguy -rohes -roids -roils -roily -roins -roist -rojak -rojis -roked -roker -rokes -rolag -roles -rolfs -rolls -romal -roman -romeo -romps -ronde -rondo -roneo -rones -ronin -ronne -ronte -ronts -roods -roofs -roofy -rooks -rooky -rooms -roomy -roons -roops -roopy -roosa -roose -roost -roots -rooty -roped -roper -ropes -ropey -roque -roral -rores -roric -rorid -rorie -rorts -rorty -rosed -roses -roset -roshi -rosin -rosit -rosti -rosts -rotal -rotan -rotas -rotch -roted -rotes -rotis -rotls -roton -rotor -rotos -rotte -rouen -roues -rouge -rough -roule -rouls -roums -round -roups -roupy -rouse -roust -route -routh -routs -roved -roven -rover -roves -rowan -rowdy -rowed -rowel -rowen -rower -rowie -rowme -rownd -rowth -rowts -royal -royne -royst -rozet -rozit -ruana -rubai -rubby -rubel -rubes -rubin -ruble -rubli -rubus -ruche -rucks -rudas -rudds -ruddy -ruder -rudes -rudie -rudis -rueda -ruers -ruffe -ruffs -rugae -rugal -rugby -ruggy -ruing -ruins -rukhs -ruled -ruler -rules -rumal -rumba -rumbo -rumen -rumes -rumly -rummy -rumor -rumpo -rumps -rumpy -runch -runds -runed -runes -rungs -runic -runny -runts -runty -rupee -rupia -rural -rurps -rurus -rusas -ruses -rushy -rusks -rusma -russe -rusts -rusty -ruths -rutin -rutty -ryals -rybat -ryked -rykes -rymme -rynds -ryots -ryper -saags -sabal -sabed -saber -sabes -sabha -sabin -sabir -sable -sabot -sabra -sabre -sacks -sacra -saddo -sades -sadhe -sadhu -sadis -sadly -sados -sadza -safed -safer -safes -sagas -sager -sages -saggy -sagos -sagum -saheb -sahib -saice -saick -saics -saids -saiga -sails -saims -saine -sains -saint -sairs -saist -saith -sajou -sakai -saker -sakes -sakia -sakis -sakti -salad -salal -salat -salep -sales -salet -salic -salix -salle -sally -salmi -salol -salon -salop -salpa -salps -salsa -salse -salto -salts -salty -salue -salut -salve -salvo -saman -samas -samba -sambo -samek -samel -samen -sames -samey -samfu -sammy -sampi -samps -sands -sandy -saned -saner -sanes -sanga -sangh -sango -sangs -sanko -sansa -santo -sants -saola -sapan -sapid -sapor -sappy -saran -sards -sared -saree -sarge -sargo -sarin -saris -sarks -sarky -sarod -saros -sarus -saser -sasin -sasse -sassy -satai -satay -sated -satem -sates -satin -satis -satyr -sauba -sauce -sauch -saucy -saugh -sauls -sault -sauna -saunt -saury -saute -sauts -saved -saver -saves -savey -savin -savor -savoy -savvy -sawah -sawed -sawer -saxes -sayed -sayer -sayid -sayne -sayon -sayst -sazes -scabs -scads -scaff -scags -scail -scala -scald -scale -scall -scalp -scaly -scamp -scams -scand -scans -scant -scapa -scape -scapi -scare -scarf -scarp -scars -scart -scary -scath -scats -scatt -scaud -scaup -scaur -scaws -sceat -scena -scend -scene -scent -schav -schmo -schul -schwa -scion -sclim -scody -scoff -scogs -scold -scone -scoog -scoop -scoot -scopa -scope -scops -score -scorn -scots -scoug -scoup -scour -scout -scowl -scowp -scows -scrab -scrae -scrag -scram -scran -scrap -scrat -scraw -scray -scree -screw -scrim -scrip -scrob -scrod -scrog -scrow -scrub -scrum -scuba -scudi -scudo -scuds -scuff -scuft -scugs -sculk -scull -sculp -sculs -scums -scups -scurf -scurs -scuse -scuta -scute -scuts -scuzz -scyes -sdayn -sdein -seals -seame -seams -seamy -seans -seare -sears -sease -seats -seaze -sebum -secco -sechs -sects -sedan -seder -sedes -sedge -sedgy -sedum -seeds -seedy -seeks -seeld -seels -seely -seems -seeps -seepy -seers -sefer -segar -segni -segno -segol -segos -segue -sehri -seifs -seils -seine -seirs -seise -seism -seity -seiza -seize -sekos -sekts -selah -seles -selfs -sella -selle -sells -selva -semee -semen -semes -semie -semis -senas -sends -senes -sengi -senna -senor -sensa -sense -sensi -sente -senti -sents -senvy -senza -sepad -sepal -sepia -sepic -sepoy -septa -septs -serac -serai -seral -sered -serer -seres -serfs -serge -seric -serif -serin -serks -seron -serow -serra -serre -serrs -serry -serum -serve -servo -sesey -sessa -setae -setal -seton -setts -setup -seven -sever -sewan -sewar -sewed -sewel -sewen -sewer -sewin -sexed -sexer -sexes -sexto -sexts -seyen -shack -shade -shads -shady -shaft -shags -shahs -shake -shako -shakt -shaky -shale -shall -shalm -shalt -shaly -shama -shame -shams -shand -shank -shans -shape -shaps -shard -share -shark -sharn -sharp -shash -shaul -shave -shawl -shawm -shawn -shaws -shaya -shays -shchi -sheaf -sheal -shear -sheas -sheds -sheel -sheen -sheep -sheer -sheet -sheik -shelf -shell -shend -shent -sheol -sherd -shere -shero -shets -sheva -shewn -shews -shiai -shied -shiel -shier -shies -shift -shill -shily -shims -shine -shins -shiny -ships -shire -shirk -shirr -shirs -shirt -shish -shiso -shist -shite -shits -shiur -shiva -shive -shivs -shlep -shlub -shmek -shmoe -shoal -shoat -shock -shoed -shoer -shoes -shogi -shogs -shoji -shojo -shola -shone -shook -shool -shoon -shoos -shoot -shope -shops -shore -shorl -shorn -short -shote -shots -shott -shout -shove -showd -shown -shows -showy -shoyu -shred -shrew -shris -shrow -shrub -shrug -shtik -shtum -shtup -shuck -shule -shuln -shuls -shuns -shunt -shura -shush -shute -shuts -shwas -shyer -shyly -sials -sibbs -sibyl -sices -sicht -sicko -sicks -sicky -sidas -sided -sider -sides -sidha -sidhe -sidle -siege -sield -siens -sient -sieth -sieur -sieve -sifts -sighs -sight -sigil -sigla -sigma -signa -signs -sijos -sikas -siker -sikes -silds -siled -silen -siler -siles -silex -silks -silky -sills -silly -silos -silts -silty -silva -simar -simas -simba -simis -simps -simul -since -sinds -sined -sines -sinew -singe -sings -sinhs -sinks -sinky -sinus -siped -sipes -sippy -sired -siree -siren -sires -sirih -siris -siroc -sirra -sirup -sisal -sises -sissy -sista -sists -sitar -sited -sites -sithe -sitka -situp -situs -siver -sixer -sixes -sixmo -sixte -sixth -sixty -sizar -sized -sizel -sizer -sizes -skags -skail -skald -skank -skart -skate -skats -skatt -skaws -skean -skear -skeds -skeed -skeef -skeen -skeer -skees -skeet -skegg -skegs -skein -skelf -skell -skelm -skelp -skene -skens -skeos -skeps -skers -skets -skews -skids -skied -skier -skies -skiey -skiff -skill -skimo -skimp -skims -skink -skins -skint -skios -skips -skirl -skirr -skirt -skite -skits -skive -skivy -sklim -skoal -skody -skoff -skogs -skols -skool -skort -skosh -skran -skrik -skuas -skugs -skulk -skull -skunk -skyed -skyer -skyey -skyfs -skyre -skyrs -skyte -slabs -slack -slade -slaes -slags -slaid -slain -slake -slams -slane -slang -slank -slant -slaps -slart -slash -slate -slats -slaty -slave -slaws -slays -slebs -sleds -sleek -sleep -sleer -sleet -slept -slews -sleys -slice -slick -slide -slier -slily -slime -slims -slimy -sling -slink -slipe -slips -slipt -slish -slits -slive -sloan -slobs -sloes -slogs -sloid -slojd -slomo -sloom -sloop -sloot -slope -slops -slopy -slorm -slosh -sloth -slots -slove -slows -sloyd -slubb -slubs -slued -slues -sluff -slugs -sluit -slump -slums -slung -slunk -slurb -slurp -slurs -sluse -slush -sluts -slyer -slyly -slype -smaak -smack -smaik -small -smalm -smalt -smarm -smart -smash -smaze -smear -smeek -smees -smeik -smeke -smell -smelt -smerk -smews -smile -smirk -smirr -smirs -smite -smith -smits -smock -smogs -smoke -smoko -smoky -smolt -smoor -smoot -smore -smorg -smote -smout -smowt -smugs -smurs -smush -smuts -snabs -snack -snafu -snags -snail -snake -snaky -snaps -snare -snarf -snark -snarl -snars -snary -snash -snath -snaws -snead -sneak -sneap -snebs -sneck -sneds -sneed -sneer -snees -snell -snibs -snick -snide -snies -sniff -snift -snigs -snipe -snips -snipy -snirt -snits -snobs -snods -snoek -snoep -snogs -snoke -snood -snook -snool -snoop -snoot -snore -snort -snots -snout -snowk -snows -snowy -snubs -snuck -snuff -snugs -snush -snyes -soaks -soaps -soapy -soare -soars -soave -sobas -sober -socas -soces -socko -socks -socle -sodas -soddy -sodic -sodom -sofar -sofas -softa -softs -softy -soger -soggy -sohur -soils -soily -sojas -sojus -sokah -soken -sokes -sokol -solah -solan -solar -solas -solde -soldi -soldo -solds -soled -solei -soler -soles -solid -solon -solos -solum -solus -solve -soman -somas -sonar -sonce -sonde -sones -songs -sonic -sonly -sonne -sonny -sonse -sonsy -sooey -sooks -sooky -soole -sools -sooms -soops -soote -sooth -soots -sooty -sophs -sophy -sopor -soppy -sopra -soral -soras -sorbo -sorbs -sorda -sordo -sords -sored -soree -sorel -sorer -sores -sorex -sorgo -sorns -sorra -sorry -sorta -sorts -sorus -soths -sotol -souce -souct -sough -souks -souls -soums -sound -soups -soupy -sours -souse -south -souts -sowar -sowce -sowed -sower -sowff -sowfs -sowle -sowls -sowms -sownd -sowne -sowps -sowse -sowth -soyas -soyle -soyuz -sozin -space -spacy -spade -spado -spaed -spaer -spaes -spags -spahi -spail -spain -spait -spake -spald -spale -spall -spalt -spams -spane -spang -spank -spans -spard -spare -spark -spars -spart -spasm -spate -spats -spaul -spawl -spawn -spaws -spayd -spays -spaza -spazz -speak -speal -spean -spear -speat -speck -specs -spect -speed -speel -speer -speil -speir -speks -speld -spelk -spell -spelt -spend -spent -speos -sperm -spets -speug -spews -spewy -spial -spica -spice -spick -spics -spicy -spide -spied -spiel -spier -spies -spiff -spifs -spike -spiks -spiky -spile -spill -spilt -spims -spina -spine -spink -spins -spiny -spire -spirt -spiry -spite -spits -spitz -spivs -splat -splay -split -splog -spode -spods -spoil -spoke -spoof -spook -spool -spoom -spoon -spoor -spoot -spore -spork -sport -sposh -spots -spout -sprad -sprag -sprat -spray -spred -spree -sprew -sprig -sprit -sprod -sprog -sprue -sprug -spuds -spued -spuer -spues -spugs -spule -spume -spumy -spunk -spurn -spurs -spurt -sputa -spyal -spyre -squab -squad -squat -squaw -squeg -squib -squid -squit -squiz -stabs -stack -stade -staff -stage -stags -stagy -staid -staig -stain -stair -stake -stale -stalk -stall -stamp -stand -stane -stang -stank -staph -staps -stare -stark -starn -starr -stars -start -stash -state -stats -staun -stave -staws -stays -stead -steak -steal -steam -stean -stear -stedd -stede -steds -steed -steek -steel -steem -steen -steep -steer -steil -stein -stela -stele -stell -steme -stems -stend -steno -stens -stent -steps -stept -stere -stern -stets -stews -stewy -steys -stich -stick -stied -sties -stiff -stilb -stile -still -stilt -stime -stims -stimy -sting -stink -stint -stipa -stipe -stire -stirk -stirp -stirs -stive -stivy -stoae -stoai -stoas -stoat -stobs -stock -stoep -stogy -stoic -stoit -stoke -stole -stoln -stoma -stomp -stond -stone -stong -stonk -stonn -stony -stood -stook -stool -stoop -stoor -stope -stops -stopt -store -stork -storm -story -stoss -stots -stott -stoun -stoup -stour -stout -stove -stown -stowp -stows -strad -strae -strag -strak -strap -straw -stray -strep -strew -stria -strig -strim -strip -strop -strow -stroy -strum -strut -stubs -stuck -stude -studs -study -stuff -stull -stulm -stumm -stump -stums -stung -stunk -stuns -stunt -stupa -stupe -sture -sturt -styed -styes -style -styli -stylo -styme -stymy -styre -styte -suave -subah -subas -subby -suber -subha -succi -sucks -sucky -sucre -sudds -sudor -sudsy -suede -suent -suers -suete -suets -suety -sugan -sugar -sughs -sugos -suhur -suids -suing -suint -suite -suits -sujee -sukhs -sukuk -sulci -sulfa -sulfo -sulks -sulky -sully -sulph -sulus -sumac -sumis -summa -sumos -sumph -sumps -sunis -sunks -sunna -sunns -sunny -sunup -super -supes -supra -surah -sural -suras -surat -surds -sured -surer -sures -surfs -surfy -surge -surgy -surly -surra -sused -suses -sushi -susus -sutor -sutra -sutta -swabs -swack -swads -swage -swags -swail -swain -swale -swaly -swami -swamp -swamy -swang -swank -swans -swaps -swapt -sward -sware -swarf -swarm -swart -swash -swath -swats -swayl -sways -sweal -swear -sweat -swede -sweed -sweel -sweep -sweer -swees -sweet -sweir -swell -swelt -swept -swerf -sweys -swies -swift -swigs -swile -swill -swims -swine -swing -swink -swipe -swire -swirl -swish -swiss -swith -swits -swive -swizz -swobs -swole -swoln -swoon -swoop -swops -swopt -sword -swore -sworn -swots -swoun -swung -sybbe -sybil -syboe -sybow -sycee -syces -sycon -syens -syker -sykes -sylis -sylph -sylva -symar -synch -syncs -synds -syned -synes -synod -synth -syped -sypes -syphs -syrah -syren -syrup -sysop -sythe -syver -taals -taata -tabby -taber -tabes -tabid -tabis -tabla -table -taboo -tabor -tabun -tabus -tacan -taces -tacet -tache -tacho -tachs -tacit -tacks -tacky -tacos -tacts -taels -taffy -tafia -taggy -tagma -tahas -tahrs -taiga -taigs -taiko -tails -tains -taint -taira -taish -taits -tajes -takas -taken -taker -takes -takhi -takin -takis -takky -talak -talaq -talar -talas -talcs -talcy -talea -taler -tales -talks -talky -talls -tally -talma -talon -talpa -taluk -talus -tamal -tamed -tamer -tames -tamin -tamis -tammy -tamps -tanas -tanga -tangi -tango -tangs -tangy -tanhs -tanka -tanks -tanky -tanna -tansy -tanti -tanto -tanty -tapas -taped -tapen -taper -tapes -tapet -tapir -tapis -tappa -tapus -taras -tardo -tardy -tared -tares -targa -targe -tarns -taroc -tarok -taros -tarot -tarps -tarre -tarry -tarsi -tarts -tarty -tasar -tased -taser -tases -tasks -tassa -tasse -tasso -taste -tasty -tatar -tater -tates -taths -tatie -tatou -tatts -tatty -tatus -taube -tauld -taunt -tauon -taupe -tauts -tavah -tavas -taver -tawai -tawas -tawed -tawer -tawie -tawny -tawse -tawts -taxed -taxer -taxes -taxis -taxol -taxon -taxor -taxus -tayra -tazza -tazze -teach -teade -teads -teaed -teaks -teals -teams -tears -teary -tease -teats -teaze -techs -techy -tecta -teddy -teels -teems -teend -teene -teens -teeny -teers -teeth -teffs -teggs -tegua -tegus -tehrs -teiid -teils -teind -teins -telae -telco -teles -telex -telia -telic -tells -telly -teloi -telos -temed -temes -tempi -tempo -temps -tempt -temse -tench -tends -tendu -tenes -tenet -tenge -tenia -tenne -tenno -tenny -tenon -tenor -tense -tenth -tents -tenty -tenue -tepal -tepas -tepee -tepid -tepoy -terai -teras -terce -terek -teres -terfe -terfs -terga -terms -terne -terns -terra -terry -terse -terts -tesla -testa -teste -tests -testy -tetes -teths -tetra -tetri -teuch -teugh -tewed -tewel -tewit -texas -texes -texts -thack -thagi -thaim -thale -thali -thana -thane -thang -thank -thans -thanx -tharm -thars -thaws -thawy -thebe -theca -theed -theek -thees -theft -thegn -theic -thein -their -thelf -thema -theme -thens -theow -there -therm -these -thesp -theta -thete -thews -thewy -thick -thief -thigh -thigs -thilk -thill -thine -thing -think -thins -thiol -third -thirl -thoft -thole -tholi -thong -thorn -thoro -thorp -those -thous -thowl -thrae -thraw -three -threw -thrid -thrip -throb -throe -throw -thrum -thuds -thugs -thuja -thumb -thump -thunk -thurl -thuya -thyme -thymi -thymy -tians -tiara -tiars -tibia -tical -ticca -ticed -tices -tichy -ticks -ticky -tidal -tiddy -tided -tides -tiers -tiffs -tifos -tifts -tiger -tiges -tight -tigon -tikas -tikes -tikis -tikka -tilak -tilde -tiled -tiler -tiles -tills -tilly -tilth -tilts -timbo -timed -timer -times -timid -timon -timps -tinas -tinct -tinds -tinea -tined -tines -tinge -tings -tinks -tinny -tints -tinty -tipis -tippy -tipsy -tired -tires -tirls -tiros -tirrs -titan -titch -titer -tithe -titis -title -titre -titty -titup -tiyin -tiyns -tizes -tizzy -toads -toady -toast -toaze -tocks -tocky -tocos -today -todde -toddy -toeas -toffs -toffy -tofts -tofus -togae -togas -toged -toges -togue -tohos -toile -toils -toing -toise -toits -tokay -toked -token -toker -tokes -tokos -tolan -tolar -tolas -toled -toles -tolls -tolly -tolts -tolus -tolyl -toman -tombs -tomes -tomia -tommy -tomos -tonal -tondi -tondo -toned -toner -tones -toney -tonga -tongs -tonic -tonka -tonks -tonne -tonus -tools -tooms -toons -tooth -toots -topaz -toped -topee -topek -toper -topes -tophe -tophi -tophs -topic -topis -topoi -topos -toppy -toque -torah -toran -toras -torch -torcs -tores -toric -torii -toros -torot -torrs -torse -torsi -torsk -torso -torta -torte -torts -torus -tosas -tosed -toses -toshy -tossy -total -toted -totem -toter -totes -totty -touch -tough -touks -touns -tours -touse -tousy -touts -touze -touzy -towed -towel -tower -towie -towns -towny -towse -towsy -towts -towze -towzy -toxic -toxin -toyed -toyer -toyon -toyos -tozed -tozes -tozie -trabs -trace -track -tract -trade -trads -tragi -traik -trail -train -trait -tramp -trams -trank -tranq -trans -trant -trape -traps -trapt -trash -trass -trats -tratt -trave -trawl -trayf -trays -tread -treat -treck -treed -treen -trees -trefa -treif -treks -trema -trems -trend -tress -trest -trets -trews -treyf -treys -triac -triad -trial -tribe -trice -trick -tride -tried -trier -tries -triff -trigo -trigs -trike -trild -trill -trims -trine -trins -triol -trior -trios -tripe -trips -tripy -trist -trite -troad -troak -troat -trock -trode -trods -trogs -trois -troke -troll -tromp -trona -tronc -trone -tronk -trons -troop -trooz -trope -troth -trots -trout -trove -trows -troys -truce -truck -trued -truer -trues -trugo -trugs -trull -truly -trump -trunk -truss -trust -truth -tryer -tryke -tryma -tryps -tryst -tsade -tsadi -tsars -tsked -tsuba -tsubo -tuans -tuart -tuath -tubae -tubal -tubar -tubas -tubby -tubed -tuber -tubes -tucks -tufas -tuffe -tuffs -tufts -tufty -tugra -tuile -tuina -tuism -tuktu -tules -tulip -tulle -tulpa -tulsi -tumid -tummy -tumor -tumps -tumpy -tunas -tunds -tuned -tuner -tunes -tungs -tunic -tunny -tupek -tupik -tuple -tuque -turbo -turds -turfs -turfy -turks -turme -turms -turns -turnt -turps -turrs -tushy -tusks -tusky -tutee -tutor -tutti -tutty -tutus -tuxes -tuyer -twaes -twain -twals -twang -twank -twats -tways -tweak -tweed -tweel -tween -tweep -tweer -tweet -twerk -twerp -twice -twier -twigs -twill -twilt -twine -twink -twins -twiny -twire -twirl -twirp -twist -twite -twits -twixt -twoer -twyer -tyees -tyers -tying -tyiyn -tykes -tyler -tymps -tynde -tyned -tynes -typal -typed -types -typey -typic -typos -typps -typto -tyran -tyred -tyres -tyros -tythe -tzars -udals -udder -udons -ugali -ugged -uhlan -uhuru -ukase -ulama -ulans -ulcer -ulema -ulmin -ulnad -ulnae -ulnar -ulnas -ulpan -ultra -ulvas -ulyie -ulzie -umami -umbel -umber -umble -umbos -umbra -umbre -umiac -umiak -umiaq -ummah -ummas -ummed -umped -umphs -umpie -umpty -umrah -umras -unais -unapt -unarm -unary -unaus -unbag -unban -unbar -unbed -unbid -unbox -uncap -unces -uncia -uncle -uncos -uncoy -uncus -uncut -undam -undee -under -undid -undos -undue -undug -uneth -unfed -unfit -unfix -ungag -unget -ungod -ungot -ungum -unhat -unhip -unica -unify -union -unite -units -unity -unjam -unked -unket -unkid -unlaw -unlay -unled -unlet -unlid -unlit -unman -unmet -unmew -unmix -unpay -unpeg -unpen -unpin -unred -unrid -unrig -unrip -unsaw -unsay -unsee -unset -unsew -unsex -unsod -untax -untie -until -untin -unwed -unwet -unwit -unwon -unzip -upbow -upbye -updos -updry -upend -upjet -uplay -upled -uplit -upped -upper -upran -uprun -upsee -upset -upsey -uptak -upter -uptie -uraei -urali -uraos -urare -urari -urase -urate -urban -urbex -urbia -urdee -ureal -ureas -uredo -ureic -urena -urent -urged -urger -urges -urial -urine -urite -urman -urnal -urned -urped -ursae -ursid -urson -urubu -urvas -usage -users -usher -using -usnea -usque -usual -usure -usurp -usury -uteri -utile -utter -uveal -uveas -uvula -vacua -vaded -vades -vagal -vague -vagus -vails -vaire -vairs -vairy -vakas -vakil -vales -valet -valid -valis -valor -valse -value -valve -vamps -vampy -vanda -vaned -vanes -vangs -vants -vaped -vaper -vapes -vapid -vapor -varan -varas -vardy -varec -vares -varia -varix -varna -varus -varve -vasal -vases -vasts -vasty -vatic -vatus -vauch -vault -vaunt -vaute -vauts -vawte -vaxes -veale -veals -vealy -veena -veeps -veers -veery -vegan -vegas -veges -vegie -vegos -vehme -veils -veily -veins -veiny -velar -velds -veldt -veles -vells -velum -venae -venal -vends -vendu -veney -venge -venin -venom -vents -venue -venus -verbs -verge -verra -verry -verse -verso -verst -verts -vertu -verve -vespa -vesta -vests -vetch -vexed -vexer -vexes -vexil -vezir -vials -viand -vibes -vibex -vibey -vicar -viced -vices -vichy -video -viers -views -viewy -vifda -viffs -vigas -vigia -vigil -vigor -vilde -viler -villa -villi -vills -vimen -vinal -vinas -vinca -vined -viner -vines -vinew -vinic -vinos -vints -vinyl -viola -viold -viols -viper -viral -vired -vireo -vires -virga -virge -virid -virls -virtu -virus -visas -vised -vises -visie -visit -visne -vison -visor -vista -visto -vitae -vital -vitas -vitex -vitro -vitta -vivas -vivat -vivda -viver -vives -vivid -vixen -vizir -vizor -vleis -vlies -vlogs -voars -vocab -vocal -voces -voddy -vodka -vodou -vodun -voema -vogie -vogue -voice -voids -voila -voile -voips -volae -volar -voled -voles -volet -volks -volta -volte -volti -volts -volva -volve -vomer -vomit -voted -voter -votes -vouch -vouge -voulu -vowed -vowel -vower -voxel -vozhd -vraic -vrils -vroom -vrous -vrouw -vrows -vuggs -vuggy -vughs -vughy -vulgo -vulns -vulva -vutty -vying -waacs -wacke -wacko -wacks -wacky -wadds -waddy -waded -wader -wades -wadge -wadis -wadts -wafer -waffs -wafts -waged -wager -wages -wagga -wagon -wagyu -wahoo -waide -waifs -waift -wails -wains -wairs -waist -waite -waits -waive -wakas -waked -waken -waker -wakes -wakfs -waldo -walds -waled -waler -wales -walie -walis -walks -walla -walls -wally -walty -waltz -wamed -wames -wamus -wands -waned -wanes -waney -wangs -wanks -wanky -wanle -wanly -wanna -wants -wanty -wanze -waqfs -warbs -warby -wards -wared -wares -warez -warks -warms -warns -warps -warre -warst -warts -warty -wases -washy -wasms -wasps -waspy -waste -wasts -watap -watch -water -watts -wauff -waugh -wauks -waulk -wauls -waurs -waved -waver -waves -wavey -wawas -wawes -wawls -waxed -waxen -waxer -waxes -wayed -wazir -wazoo -weald -weals -weamb -weans -wears -weary -weave -webby -weber -wecht -wedel -wedge -wedgy -weeds -weedy -weeke -weeks -weels -weems -weens -weeny -weeps -weepy -weest -weete -weets -wefte -wefts -weids -weigh -weils -weird -weirs -weise -weize -wekas -welch -welds -welke -welks -welkt -wells -welly -welsh -welts -wembs -wench -wends -wenge -wenny -wents -weros -wersh -wests -wetas -wetly -wexed -wexes -whack -whale -whamo -whams -whang -whaps -whare -wharf -whata -whats -whaup -whaur -wheal -whear -wheat -wheel -wheen -wheep -wheft -whelk -whelm -whelp -whens -where -whets -whews -wheys -which -whids -whiff -whift -whigs -while -whilk -whims -whine -whins -whiny -whios -whips -whipt -whirl -whirr -whirs -whish -whisk -whiss -whist -white -whits -whity -whizz -whole -whomp -whoof -whoop -whoot -whops -whore -whorl -whort -whose -whoso -whows -whump -whups -whyda -wicca -wicks -wicky -widdy -widen -wider -wides -widow -width -wield -wiels -wifed -wifes -wifey -wifie -wifty -wigan -wigga -wiggy -wight -wikis -wilco -wilds -wiled -wiles -wilga -wilis -wilja -wills -willy -wilts -wimps -wimpy -wince -winch -winds -windy -wined -wines -winey -winge -wings -wingy -winks -winna -winns -winos -winze -wiped -wiper -wipes -wired -wirer -wires -wirra -wised -wiser -wises -wisha -wisht -wisps -wispy -wists -witan -witch -wited -wites -withe -withs -withy -witty -wived -wiver -wives -wizen -wizes -woads -woald -wocks -wodge -woful -wojus -woken -woker -wokka -wolds -wolfs -wolly -wolve -woman -wombs -womby -women -womyn -wonga -wongi -wonks -wonky -wonts -woods -woody -wooed -wooer -woofs -woofy -woold -wools -wooly -woons -woops -woopy -woose -woosh -wootz -woozy -words -wordy -works -world -worms -wormy -worry -worse -worst -worth -worts -would -wound -woven -wowed -wowee -woxen -wrack -wrang -wraps -wrapt -wrast -wrate -wrath -wrawl -wreak -wreck -wrens -wrest -wrick -wried -wrier -wries -wring -wrist -write -writs -wroke -wrong -wroot -wrote -wroth -wrung -wryer -wryly -wuddy -wudus -wulls -wurst -wuses -wushu -wussy -wuxia -wyled -wyles -wynds -wynns -wyted -wytes -xebec -xenia -xenic -xenon -xeric -xerox -xerus -xoana -xrays -xylan -xylem -xylic -xylol -xylyl -xysti -xysts -yaars -yabas -yabba -yabby -yacca -yacht -yacka -yacks -yaffs -yager -yages -yagis -yahoo -yaird -yakka -yakow -yales -yamen -yampy -yamun -yangs -yanks -yapok -yapon -yapps -yappy -yarak -yarco -yards -yarer -yarfa -yarks -yarns -yarrs -yarta -yarto -yates -yauds -yauld -yaups -yawed -yawey -yawls -yawns -yawny -yawps -ybore -yclad -ycled -ycond -ydrad -ydred -yeads -yeahs -yealm -yeans -yeard -yearn -years -yeast -yecch -yechs -yechy -yedes -yeeds -yeesh -yeggs -yelks -yells -yelms -yelps -yelts -yenta -yente -yerba -yerds -yerks -yeses -yesks -yests -yesty -yetis -yetts -yeuks -yeuky -yeven -yeves -yewen -yexed -yexes -yfere -yield -yiked -yikes -yills -yince -yipes -yippy -yirds -yirks -yirrs -yirth -yites -yitie -ylems -ylike -ylkes -ymolt -ympes -yobbo -yobby -yocks -yodel -yodhs -yodle -yogas -yogee -yoghs -yogic -yogin -yogis -yoick -yojan -yoked -yokel -yoker -yokes -yokul -yolks -yolky -yomim -yomps -yonic -yonis -yonks -yoofs -yoops -yores -yorks -yorps -youks -young -yourn -yours -yourt -youse -youth -yowed -yowes -yowie -yowls -yowza -yrapt -yrent -yrivd -yrneh -ysame -ytost -yuans -yucas -yucca -yucch -yucko -yucks -yucky -yufts -yugas -yuked -yukes -yukky -yukos -yulan -yules -yummo -yummy -yumps -yupon -yuppy -yurta -yurts -yuzus -zabra -zacks -zaida -zaidy -zaire -zakat -zaman -zambo -zamia -zanja -zante -zanza -zanze -zappy -zarfs -zaris -zatis -zaxes -zayin -zazen -zeals -zebec -zebra -zebub -zebus -zedas -zeins -zendo -zerda -zerks -zeros -zests -zesty -zetas -zexes -zezes -zhomo -zibet -ziffs -zigan -zilas -zilch -zilla -zills -zimbi -zimbs -zinco -zincs -zincy -zineb -zines -zings -zingy -zinke -zinky -zippo -zippy -ziram -zitis -zizel -zizit -zlote -zloty -zoaea -zobos -zobus -zocco -zoeae -zoeal -zoeas -zoism -zoist -zombi -zonae -zonal -zonda -zoned -zoner -zones -zonks -zooea -zooey -zooid -zooks -zooms -zoons -zooty -zoppa -zoppo -zoril -zoris -zorro -zouks -zowee -zowie -zulus -zupan -zupas -zuppa -zurfs -zuzim -zygal -zygon -zymes -zymic \ No newline at end of file diff --git a/gym_wordle/dictionary/guess_list.npy b/gym_wordle/dictionary/guess_list.npy deleted file mode 100644 index c23501378db815c9b1bb4c5493bc014afe54ad17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519008 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 J-sSk`-hb8)36lT- diff --git a/gym_wordle/dictionary/solution_list.csv b/gym_wordle/dictionary/solution_list.csv deleted file mode 100644 index 821a934..0000000 --- a/gym_wordle/dictionary/solution_list.csv +++ /dev/null @@ -1,2315 +0,0 @@ -aback -abase -abate -abbey -abbot -abhor -abide -abled -abode -abort -about -above -abuse -abyss -acorn -acrid -actor -acute -adage -adapt -adept -admin -admit -adobe -adopt -adore -adorn -adult -affix -afire -afoot -afoul -after -again -agape -agate -agent -agile -aging -aglow -agony -agora -agree -ahead -aider -aisle -alarm -album -alert -algae -alibi -alien -align -alike -alive -allay -alley -allot -allow -alloy -aloft -alone -along -aloof -aloud -alpha -altar -alter -amass -amaze -amber -amble -amend -amiss -amity -among -ample -amply -amuse -angel -anger -angle -angry -angst -anime -ankle -annex -annoy -annul -anode -antic -anvil -aorta -apart -aphid -aping -apnea -apple -apply -apron -aptly -arbor -ardor -arena -argue -arise -armor -aroma -arose -array -arrow -arson -artsy -ascot -ashen -aside -askew -assay -asset -atoll -atone -attic -audio -audit -augur -aunty -avail -avert -avian -avoid -await -awake -award -aware -awash -awful -awoke -axial -axiom -axion -azure -bacon -badge -badly -bagel -baggy -baker -baler -balmy -banal -banjo -barge -baron -basal -basic -basil -basin -basis -baste -batch -bathe -baton -batty -bawdy -bayou -beach -beady -beard -beast -beech -beefy -befit -began -begat -beget -begin -begun -being -belch -belie -belle -belly -below -bench -beret -berry -berth -beset -betel -bevel -bezel -bible -bicep -biddy -bigot -bilge -billy -binge -bingo -biome -birch -birth -bison -bitty -black -blade -blame -bland -blank -blare -blast -blaze -bleak -bleat -bleed -bleep -blend -bless -blimp -blind -blink -bliss -blitz -bloat -block -bloke -blond -blood -bloom -blown -bluer -bluff -blunt -blurb -blurt -blush -board -boast -bobby -boney -bongo -bonus -booby -boost -booth -booty -booze -boozy -borax -borne -bosom -bossy -botch -bough -boule -bound -bowel -boxer -brace -braid -brain -brake -brand -brash -brass -brave -bravo -brawl -brawn -bread -break -breed -briar -bribe -brick -bride -brief -brine -bring -brink -briny -brisk -broad -broil -broke -brood -brook -broom -broth -brown -brunt -brush -brute -buddy -budge -buggy -bugle -build -built -bulge -bulky -bully -bunch -bunny -burly -burnt -burst -bused -bushy -butch -butte -buxom -buyer -bylaw -cabal -cabby -cabin -cable -cacao -cache -cacti -caddy -cadet -cagey -cairn -camel -cameo -canal -candy -canny -canoe -canon -caper -caput -carat -cargo -carol -carry -carve -caste -catch -cater -catty -caulk -cause -cavil -cease -cedar -cello -chafe -chaff -chain -chair -chalk -champ -chant -chaos -chard -charm -chart -chase -chasm -cheap -cheat -check -cheek -cheer -chess -chest -chick -chide -chief -child -chili -chill -chime -china -chirp -chock -choir -choke -chord -chore -chose -chuck -chump -chunk -churn -chute -cider -cigar -cinch -circa -civic -civil -clack -claim -clamp -clang -clank -clash -clasp -class -clean -clear -cleat -cleft -clerk -click -cliff -climb -cling -clink -cloak -clock -clone -close -cloth -cloud -clout -clove -clown -cluck -clued -clump -clung -coach -coast -cobra -cocoa -colon -color -comet -comfy -comic -comma -conch -condo -conic -copse -coral -corer -corny -couch -cough -could -count -coupe -court -coven -cover -covet -covey -cower -coyly -crack -craft -cramp -crane -crank -crash -crass -crate -crave -crawl -craze -crazy -creak -cream -credo -creed -creek -creep -creme -crepe -crept -cress -crest -crick -cried -crier -crime -crimp -crisp -croak -crock -crone -crony -crook -cross -croup -crowd -crown -crude -cruel -crumb -crump -crush -crust -crypt -cubic -cumin -curio -curly -curry -curse -curve -curvy -cutie -cyber -cycle -cynic -daddy -daily -dairy -daisy -dally -dance -dandy -datum -daunt -dealt -death -debar -debit -debug -debut -decal -decay -decor -decoy -decry -defer -deign -deity -delay -delta -delve -demon -demur -denim -dense -depot -depth -derby -deter -detox -deuce -devil -diary -dicey -digit -dilly -dimly -diner -dingo -dingy -diode -dirge -dirty -disco -ditch -ditto -ditty -diver -dizzy -dodge -dodgy -dogma -doing -dolly -donor -donut -dopey -doubt -dough -dowdy -dowel -downy -dowry -dozen -draft -drain -drake -drama -drank -drape -drawl -drawn -dread -dream -dress -dried -drier -drift -drill -drink -drive -droit -droll -drone -drool -droop -dross -drove -drown -druid -drunk -dryer -dryly -duchy -dully -dummy -dumpy -dunce -dusky -dusty -dutch -duvet -dwarf -dwell -dwelt -dying -eager -eagle -early -earth -easel -eaten -eater -ebony -eclat -edict -edify -eerie -egret -eight -eject -eking -elate -elbow -elder -elect -elegy -elfin -elide -elite -elope -elude -email -embed -ember -emcee -empty -enact -endow -enema -enemy -enjoy -ennui -ensue -enter -entry -envoy -epoch -epoxy -equal -equip -erase -erect -erode -error -erupt -essay -ester -ether -ethic -ethos -etude -evade -event -every -evict -evoke -exact -exalt -excel -exert -exile -exist -expel -extol -extra -exult -eying -fable -facet -faint -fairy -faith -false -fancy -fanny -farce -fatal -fatty -fault -fauna -favor -feast -fecal -feign -fella -felon -femme -femur -fence -feral -ferry -fetal -fetch -fetid -fetus -fever -fewer -fiber -fibre -ficus -field -fiend -fiery -fifth -fifty -fight -filer -filet -filly -filmy -filth -final -finch -finer -first -fishy -fixer -fizzy -fjord -flack -flail -flair -flake -flaky -flame -flank -flare -flash -flask -fleck -fleet -flesh -flick -flier -fling -flint -flirt -float -flock -flood -floor -flora -floss -flour -flout -flown -fluff -fluid -fluke -flume -flung -flunk -flush -flute -flyer -foamy -focal -focus -foggy -foist -folio -folly -foray -force -forge -forgo -forte -forth -forty -forum -found -foyer -frail -frame -frank -fraud -freak -freed -freer -fresh -friar -fried -frill -frisk -fritz -frock -frond -front -frost -froth -frown -froze -fruit -fudge -fugue -fully -fungi -funky -funny -furor -furry -fussy -fuzzy -gaffe -gaily -gamer -gamma -gamut -gassy -gaudy -gauge -gaunt -gauze -gavel -gawky -gayer -gayly -gazer -gecko -geeky -geese -genie -genre -ghost -ghoul -giant -giddy -gipsy -girly -girth -given -giver -glade -gland -glare -glass -glaze -gleam -glean -glide -glint -gloat -globe -gloom -glory -gloss -glove -glyph -gnash -gnome -godly -going -golem -golly -gonad -goner -goody -gooey -goofy -goose -gorge -gouge -gourd -grace -grade -graft -grail -grain -grand -grant -grape -graph -grasp -grass -grate -grave -gravy -graze -great -greed -green -greet -grief -grill -grime -grimy -grind -gripe -groan -groin -groom -grope -gross -group -grout -grove -growl -grown -gruel -gruff -grunt -guard -guava -guess -guest -guide -guild -guile -guilt -guise -gulch -gully -gumbo -gummy -guppy -gusto -gusty -gypsy -habit -hairy -halve -handy -happy -hardy -harem -harpy -harry -harsh -haste -hasty -hatch -hater -haunt -haute -haven -havoc -hazel -heady -heard -heart -heath -heave -heavy -hedge -hefty -heist -helix -hello -hence -heron -hilly -hinge -hippo -hippy -hitch -hoard -hobby -hoist -holly -homer -honey -honor -horde -horny -horse -hotel -hotly -hound -house -hovel -hover -howdy -human -humid -humor -humph -humus -hunch -hunky -hurry -husky -hussy -hutch -hydro -hyena -hymen -hyper -icily -icing -ideal -idiom -idiot -idler -idyll -igloo -iliac -image -imbue -impel -imply -inane -inbox -incur -index -inept -inert -infer -ingot -inlay -inlet -inner -input -inter -intro -ionic -irate -irony -islet -issue -itchy -ivory -jaunt -jazzy -jelly -jerky -jetty -jewel -jiffy -joint -joist -joker -jolly -joust -judge -juice -juicy -jumbo -jumpy -junta -junto -juror -kappa -karma -kayak -kebab -khaki -kinky -kiosk -kitty -knack -knave -knead -kneed -kneel -knelt -knife -knock -knoll -known -koala -krill -label -labor -laden -ladle -lager -lance -lanky -lapel -lapse -large -larva -lasso -latch -later -lathe -latte -laugh -layer -leach -leafy -leaky -leant -leapt -learn -lease -leash -least -leave -ledge -leech -leery -lefty -legal -leggy -lemon -lemur -leper -level -lever -libel -liege -light -liken -lilac -limbo -limit -linen -liner -lingo -lipid -lithe -liver -livid -llama -loamy -loath -lobby -local -locus -lodge -lofty -logic -login -loopy -loose -lorry -loser -louse -lousy -lover -lower -lowly -loyal -lucid -lucky -lumen -lumpy -lunar -lunch -lunge -lupus -lurch -lurid -lusty -lying -lymph -lynch -lyric -macaw -macho -macro -madam -madly -mafia -magic -magma -maize -major -maker -mambo -mamma -mammy -manga -mange -mango -mangy -mania -manic -manly -manor -maple -march -marry -marsh -mason -masse -match -matey -mauve -maxim -maybe -mayor -mealy -meant -meaty -mecca -medal -media -medic -melee -melon -mercy -merge -merit -merry -metal -meter -metro -micro -midge -midst -might -milky -mimic -mince -miner -minim -minor -minty -minus -mirth -miser -missy -mocha -modal -model -modem -mogul -moist -molar -moldy -money -month -moody -moose -moral -moron -morph -mossy -motel -motif -motor -motto -moult -mound -mount -mourn -mouse -mouth -mover -movie -mower -mucky -mucus -muddy -mulch -mummy -munch -mural -murky -mushy -music -musky -musty -myrrh -nadir -naive -nanny -nasal -nasty -natal -naval -navel -needy -neigh -nerdy -nerve -never -newer -newly -nicer -niche -niece -night -ninja -ninny -ninth -noble -nobly -noise -noisy -nomad -noose -north -nosey -notch -novel -nudge -nurse -nutty -nylon -nymph -oaken -obese -occur -ocean -octal -octet -odder -oddly -offal -offer -often -olden -older -olive -ombre -omega -onion -onset -opera -opine -opium -optic -orbit -order -organ -other -otter -ought -ounce -outdo -outer -outgo -ovary -ovate -overt -ovine -ovoid -owing -owner -oxide -ozone -paddy -pagan -paint -paler -palsy -panel -panic -pansy -papal -paper -parer -parka -parry -parse -party -pasta -paste -pasty -patch -patio -patsy -patty -pause -payee -payer -peace -peach -pearl -pecan -pedal -penal -pence -penne -penny -perch -peril -perky -pesky -pesto -petal -petty -phase -phone -phony -photo -piano -picky -piece -piety -piggy -pilot -pinch -piney -pinky -pinto -piper -pique -pitch -pithy -pivot -pixel -pixie -pizza -place -plaid -plain -plait -plane -plank -plant -plate -plaza -plead -pleat -plied -plier -pluck -plumb -plume -plump -plunk -plush -poesy -point -poise -poker -polar -polka -polyp -pooch -poppy -porch -poser -posit -posse -pouch -pound -pouty -power -prank -prawn -preen -press -price -prick -pride -pried -prime -primo -print -prior -prism -privy -prize -probe -prone -prong -proof -prose -proud -prove -prowl -proxy -prude -prune -psalm -pubic -pudgy -puffy -pulpy -pulse -punch -pupal -pupil -puppy -puree -purer -purge -purse -pushy -putty -pygmy -quack -quail -quake -qualm -quark -quart -quash -quasi -queen -queer -quell -query -quest -queue -quick -quiet -quill -quilt -quirk -quite -quota -quote -quoth -rabbi -rabid -racer -radar -radii -radio -rainy -raise -rajah -rally -ralph -ramen -ranch -randy -range -rapid -rarer -raspy -ratio -ratty -raven -rayon -razor -reach -react -ready -realm -rearm -rebar -rebel -rebus -rebut -recap -recur -recut -reedy -refer -refit -regal -rehab -reign -relax -relay -relic -remit -renal -renew -repay -repel -reply -rerun -reset -resin -retch -retro -retry -reuse -revel -revue -rhino -rhyme -rider -ridge -rifle -right -rigid -rigor -rinse -ripen -riper -risen -riser -risky -rival -river -rivet -roach -roast -robin -robot -rocky -rodeo -roger -rogue -roomy -roost -rotor -rouge -rough -round -rouse -route -rover -rowdy -rower -royal -ruddy -ruder -rugby -ruler -rumba -rumor -rupee -rural -rusty -sadly -safer -saint -salad -sally -salon -salsa -salty -salve -salvo -sandy -saner -sappy -sassy -satin -satyr -sauce -saucy -sauna -saute -savor -savoy -savvy -scald -scale -scalp -scaly -scamp -scant -scare -scarf -scary -scene -scent -scion -scoff -scold -scone -scoop -scope -score -scorn -scour -scout -scowl -scram -scrap -scree -screw -scrub -scrum -scuba -sedan -seedy -segue -seize -semen -sense -sepia -serif -serum -serve -setup -seven -sever -sewer -shack -shade -shady -shaft -shake -shaky -shale -shall -shalt -shame -shank -shape -shard -share -shark -sharp -shave -shawl -shear -sheen -sheep -sheer -sheet -sheik -shelf -shell -shied -shift -shine -shiny -shire -shirk -shirt -shoal -shock -shone -shook -shoot -shore -shorn -short -shout -shove -shown -showy -shrew -shrub -shrug -shuck -shunt -shush -shyly -siege -sieve -sight -sigma -silky -silly -since -sinew -singe -siren -sissy -sixth -sixty -skate -skier -skiff -skill -skimp -skirt -skulk -skull -skunk -slack -slain -slang -slant -slash -slate -slave -sleek -sleep -sleet -slept -slice -slick -slide -slime -slimy -sling -slink -sloop -slope -slosh -sloth -slump -slung -slunk -slurp -slush -slyly -smack -small -smart -smash -smear -smell -smelt -smile -smirk -smite -smith -smock -smoke -smoky -smote -snack -snail -snake -snaky -snare -snarl -sneak -sneer -snide -sniff -snipe -snoop -snore -snort -snout -snowy -snuck -snuff -soapy -sober -soggy -solar -solid -solve -sonar -sonic -sooth -sooty -sorry -sound -south -sower -space -spade -spank -spare -spark -spasm -spawn -speak -spear -speck -speed -spell -spelt -spend -spent -sperm -spice -spicy -spied -spiel -spike -spiky -spill -spilt -spine -spiny -spire -spite -splat -split -spoil -spoke -spoof -spook -spool -spoon -spore -sport -spout -spray -spree -sprig -spunk -spurn -spurt -squad -squat -squib -stack -staff -stage -staid -stain -stair -stake -stale -stalk -stall -stamp -stand -stank -stare -stark -start -stash -state -stave -stead -steak -steal -steam -steed -steel -steep -steer -stein -stern -stick -stiff -still -stilt -sting -stink -stint -stock -stoic -stoke -stole -stomp -stone -stony -stood -stool -stoop -store -stork -storm -story -stout -stove -strap -straw -stray -strip -strut -stuck -study -stuff -stump -stung -stunk -stunt -style -suave -sugar -suing -suite -sulky -sully -sumac -sunny -super -surer -surge -surly -sushi -swami -swamp -swarm -swash -swath -swear -sweat -sweep -sweet -swell -swept -swift -swill -swine -swing -swirl -swish -swoon -swoop -sword -swore -sworn -swung -synod -syrup -tabby -table -taboo -tacit -tacky -taffy -taint -taken -taker -tally -talon -tamer -tango -tangy -taper -tapir -tardy -tarot -taste -tasty -tatty -taunt -tawny -teach -teary -tease -teddy -teeth -tempo -tenet -tenor -tense -tenth -tepee -tepid -terra -terse -testy -thank -theft -their -theme -there -these -theta -thick -thief -thigh -thing -think -third -thong -thorn -those -three -threw -throb -throw -thrum -thumb -thump -thyme -tiara -tibia -tidal -tiger -tight -tilde -timer -timid -tipsy -titan -tithe -title -toast -today -toddy -token -tonal -tonga -tonic -tooth -topaz -topic -torch -torso -torus -total -totem -touch -tough -towel -tower -toxic -toxin -trace -track -tract -trade -trail -train -trait -tramp -trash -trawl -tread -treat -trend -triad -trial -tribe -trice -trick -tried -tripe -trite -troll -troop -trope -trout -trove -truce -truck -truer -truly -trump -trunk -truss -trust -truth -tryst -tubal -tuber -tulip -tulle -tumor -tunic -turbo -tutor -twang -tweak -tweed -tweet -twice -twine -twirl -twist -twixt -tying -udder -ulcer -ultra -umbra -uncle -uncut -under -undid -undue -unfed -unfit -unify -union -unite -unity -unlit -unmet -unset -untie -until -unwed -unzip -upper -upset -urban -urine -usage -usher -using -usual -usurp -utile -utter -vague -valet -valid -valor -value -valve -vapid -vapor -vault -vaunt -vegan -venom -venue -verge -verse -verso -verve -vicar -video -vigil -vigor -villa -vinyl -viola -viper -viral -virus -visit -visor -vista -vital -vivid -vixen -vocal -vodka -vogue -voice -voila -vomit -voter -vouch -vowel -vying -wacky -wafer -wager -wagon -waist -waive -waltz -warty -waste -watch -water -waver -waxen -weary -weave -wedge -weedy -weigh -weird -welch -welsh -wench -whack -whale -wharf -wheat -wheel -whelp -where -which -whiff -while -whine -whiny -whirl -whisk -white -whole -whoop -whose -widen -wider -widow -width -wield -wight -willy -wimpy -wince -winch -windy -wiser -wispy -witch -witty -woken -woman -women -woody -wooer -wooly -woozy -wordy -world -worry -worse -worst -worth -would -wound -woven -wrack -wrath -wreak -wreck -wrest -wring -wrist -write -wrong -wrote -wrung -wryly -yacht -yearn -yeast -yield -young -youth -zebra -zesty -zonal \ No newline at end of file diff --git a/gym_wordle/dictionary/solution_list.npy b/gym_wordle/dictionary/solution_list.npy deleted file mode 100644 index a03dd86f11ea17ef47b9655f06f9ac5941ca67b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92728 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 str: - """Converts a numpy integer array into a corresponding English string. - - Args: - array: Word in array (int) form. It is assumed that each integer in the - array is between 0,...,26 (inclusive). - - Returns: - A (lowercase) string representation of the word. - """ - return ''.join(_chars[i] for i in array) - - -def to_array(word: str) -> npt.NDArray[np.int64]: - """Converts a string of characters into a corresponding numpy array. - - Args: - word: Word in string form. It is assumed that each character in the - string is either an empty space ' ' or lowercase alphabetical - character. - - Returns: - An array representation of the word. - """ - return np.array([_char_d[c] for c in word]) - - -def get_words(category: str, build: bool = False) -> npt.NDArray[np.int64]: - """Loads a list of words in array form. - - If specified, this will recompute the list from the human-readable list of - words, and save the results in array form. - - Args: - category: Either 'guess' or 'solution', which corresponds to the list - of acceptable guess words and the list of acceptable solution words. - build: If True, recomputes and saves the array-version of the computed - list for future access. - - Returns: - An array representation of the list of words specified by the category. - This array has two dimensions, and the number of columns is fixed at - five. - """ - assert category in {'guess', 'solution'} - - arr_path = Path(__file__).parent / f'dictionary/{category}_list.npy' - if build: - list_path = Path(__file__).parent / f'dictionary/{category}_list.csv' - - with open(list_path, 'r') as f: - words = np.array([to_array(line.strip()) for line in f]) - np.save(arr_path, words) - - return np.load(arr_path) - - -def play(): - """Play Wordle yourself!""" - import gym - import gym_wordle - - env = gym.make('Wordle-v0') # load the environment - - env.reset() - solution = to_english(env.unwrapped.solution_space[env.solution]).upper() # no peeking! - - done = False - - while not done: - action = -1 - - # in general, the environment won't be forgiving if you input an - # invalid word, but for this function I want to let you screw up user - # input without consequence, so just loops until valid input is taken - while not env.action_space.contains(action): - guess = input('Guess: ') - action = env.unwrapped.action_space.index_of(to_array(guess)) - - state, reward, done, info = env.step(action) - env.render() - - print(f"The word was {solution}") diff --git a/gym_wordle/wordle.py b/gym_wordle/wordle.py deleted file mode 100644 index 9152117..0000000 --- a/gym_wordle/wordle.py +++ /dev/null @@ -1,353 +0,0 @@ -import gymnasium as gym -import numpy as np -import numpy.typing as npt -from sty import fg, bg, ef, rs - -from collections import Counter -from gym_wordle.utils import to_english, to_array, get_words -from typing import Optional -from collections import defaultdict - - -class WordList(gym.spaces.Discrete): - """Super class for defining a space of valid words according to a specified - list. - - The space is a subclass of gym.spaces.Discrete, where each element - corresponds to an index of a valid word in the word list. The obfuscation - is necessary for more direct implementation of RL algorithms, which expect - spaces of less sophisticated form. - - In addition to the default methods of the Discrete space, it implements - a __getitem__ method for easy index lookup, and an index_of method to - convert potential words into their corresponding index (if they exist). - """ - - def __init__(self, words: npt.NDArray[np.int64], **kwargs): - """ - Args: - words: Collection of words in array form with shape (_, 5), where - each word is a row of the array. Each array element is an integer - between 0,...,26 (inclusive). - kwargs: See documentation for gym.spaces.MultiDiscrete - """ - super().__init__(words.shape[0], **kwargs) - self.words = words - - def __getitem__(self, index: int) -> npt.NDArray[np.int64]: - """Obtains the (int-encoded) word associated with the given index. - - Args: - index: Index for the list of words. - - Returns: - Associated word at the position specified by index. - """ - return self.words[index] - - def index_of(self, word: npt.NDArray[np.int64]) -> int: - """Given a word, determine its index in the list (if it exists), - otherwise returning -1 if no index exists. - - Args: - word: Word to find in the word list. - - Returns: - The index of the given word if it exists, otherwise -1. - """ - try: - index, = np.nonzero((word == self.words).all(axis=1)) - return index[0] - except: - return -1 - - -class SolutionList(WordList): - """Space for *solution* words to the Wordle environment. - - In the game Wordle, there are two different collections of words: - - * "guesses", which the game accepts as valid words to use to guess the - answer. - * "solutions", which the game uses to choose solutions from. - - Of course, the set of solutions is a strict subset of the set of guesses. - - This class represents the set of solution words. - """ - - def __init__(self, **kwargs): - """ - Args: - kwargs: See documentation for gym.spaces.MultiDiscrete - """ - words = get_words('solution') - super().__init__(words, **kwargs) - - -class WordleObsSpace(gym.spaces.Box): - """Implementation of the state (observation) space in terms of gym - primitives, in this case, gym.spaces.Box. - - The Wordle observation space can be thought of as a 6x5 array with two - channels: - - - the character channel, indicating which characters are placed on the - board (unfilled rows are marked with the empty character, 0) - - the flag channel, indicating the in-game information associated with - each character's placement (green highlight, yellow highlight, etc.) - - where there are 6 rows, one for each turn in the game, and 5 columns, since - the solution will always be a word of length 5. - - For simplicity, and compatibility with stable_baselines algorithms, - this multichannel is modeled as a 6x10 array, where the two channels are - horizontally appended (along columns). Thus each row in the observation - should be interpreted as c0 c1 c2 c3 c4 f0 f1 f2 f3 f4 when the word is - c0...c4 and its associated flags are f0...f4. - """ - - def __init__(self, **kwargs): - self.n_rows = 6 - self.n_cols = 5 - self.max_char = 26 - self.max_flag = 4 - - low = np.zeros((self.n_rows, 2*self.n_cols)) - high = np.c_[np.full((self.n_rows, self.n_cols), self.max_char), - np.full((self.n_rows, self.n_cols), self.max_flag)] - - super().__init__(low, high, dtype=np.int64, **kwargs) - - -class GuessList(WordList): - """Space for *guess* words to the Wordle environment. - - This class represents the set of guess words. - """ - - def __init__(self, **kwargs): - """ - Args: - kwargs: See documentation for gym.spaces.MultiDiscrete - """ - words = get_words('guess') - super().__init__(words, **kwargs) - - -class WordleEnv(gym.Env): - metadata = {'render.modes': ['human']} - - # Character flag codes - no_char = 0 - right_pos = 1 - wrong_pos = 2 - wrong_char = 3 - - def __init__(self): - super().__init__() - - self.action_space = GuessList() - self.solution_space = SolutionList() - - # Example setup based on the flattened state size you're now using - num_position_availability = 26 * 5 # 26 letters for each of the 5 positions - num_global_availability = 26 # Global letter availability - num_letter_found_flags = 5 # One flag for each position - total_size = num_position_availability + num_global_availability + num_letter_found_flags - - # Define the observation space to match the flattened state format - self.observation_space = gym.spaces.Box(low=0, high=2, shape=(total_size,), dtype=np.float32) - - self._highlights = { - self.right_pos: (bg.green, bg.rs), - self.wrong_pos: (bg.yellow, bg.rs), - self.wrong_char: ('', ''), - self.no_char: ('', ''), - } - - self.n_rounds = 6 - self.n_letters = 5 - self.info = { - 'correct': False, - 'guesses': set(), - 'known_positions': np.full(5, -1), # -1 for unknown, else letter index - 'known_letters': set(), # Letters known to be in the word - 'not_in_word': set(), # Letters known not to be in the word - 'tried_positions': defaultdict(set) # Positions tried for each letter - } - self.reset() - - def _highlighter(self, char: str, flag: int) -> str: - """Terminal renderer functionality. Properly highlights a character - based on the flag associated with it. - - Args: - char: Character in question. - flag: Associated flag, one of: - - 0: no character (render no background) - - 1: right position (render green background) - - 2: wrong position (render yellow background) - - 3: wrong character (render no background) - - Returns: - Correct ASCII sequence producing the desired character in the - correct background. - """ - front, back = self._highlights[flag] - return front + char + back - - def reset(self, seed=None, options=None): - """Reset the environment to an initial state and returns an initial - observation. - - Note: The observation space instance should be a Box space. - - Returns: - state (object): The initial observation of the space. - """ - self.round = 0 - self.solution = self.solution_space.sample() - self.soln_hash = set(self.solution_space[self.solution]) - - self.state = { - 'position_availability': [np.ones(26) for _ in range(5)], # Each position can initially have any letter - 'global_availability': np.ones(26), # Initially, all letters are available - 'letter_found': np.zeros(5) # Initially, no correct letters are found - } - - self.info = { - 'correct': False, - 'guesses': set(), - 'known_positions': np.full(5, -1), - 'known_letters': set(), - 'not_in_word': set(), - 'tried_positions': defaultdict(set) - } - - self.simulate_first_guess() - - return self.get_observation(), self.info - - def simulate_first_guess(self): - fixed_first_guess = "rates" # Example: Using 'rates' as the fixed first guess - # Convert the fixed guess into the appropriate format (e.g., indices of letters) - fixed_guess_indices = to_array(fixed_first_guess) - solution_indices = self.solution_space[self.solution] - - for pos in range(5): # Iterate over each position in the word - letter_idx = fixed_guess_indices[pos] - if letter_idx == solution_indices[pos]: # Correct letter in the correct position - self.state['position_availability'][pos] = np.zeros(26) - self.state['position_availability'][pos][letter_idx] = 1 - self.state['letter_found'][pos] = 1 - elif letter_idx in solution_indices: # Correct letter in the wrong position - self.state['position_availability'][pos][letter_idx] = 0 - # Mark this letter as still available in other positions - for other_pos in range(5): - if self.state['letter_found'][other_pos] == 0: # If not already found - self.state['position_availability'][other_pos][letter_idx] = 1 - else: # Letter not in the word - self.state['global_availability'][letter_idx] = 0 - # Update all positions to reflect this letter is not in the word - for other_pos in range(5): - self.state['position_availability'][other_pos][letter_idx] = 0 - self.round = 1 # Increment round to reflect that first guess has been simulated - - def render(self, mode: str = 'human'): - """Renders the Wordle environment. - - Currently supported render modes: - - human: renders the Wordle game to the terminal. - - Args: - mode: the mode to render with. - """ - if mode == 'human': - for row in self.state: - text = ''.join(map( - self._highlighter, - to_english(row[:self.n_letters]).upper(), - row[self.n_letters:] - )) - print(text) - else: - super().render(mode=mode) - - def step(self, action): - assert self.action_space.contains(action), 'Invalid word!' - - guessed_word = self.action_space[action] - solution_word = self.solution_space[self.solution] - - reward = 0 - correct_guess = np.array_equal(guessed_word, solution_word) - - # Initialize flags for current guess based on the new state structure - current_flags = np.zeros((self.n_letters, 26)) # Replaced with a more detailed flag system - - # Track newly discovered information - new_info = False - - for i in range(self.n_letters): - guessed_letter = guessed_word[i] - 1 - if guessed_letter in solution_word: - if guessed_letter in self.info['not_in_word']: - reward -= 2 # Penalize for reusing a letter found to not be in the word - - if guessed_letter == solution_word[i]: - # Handle correct letter in the correct position - current_flags[i, :] = 0 # Set all other letters to not possible - current_flags[i, guessed_letter] = 2 # Mark this letter as correct - self.info['known_positions'][i] = 1 # Update known_positions - reward += 10 # Reward for correct placement - new_info = True - else: - # Correct letter, wrong position - if self.info['known_positions'][i] == 0: - # Only update if we haven't already found the correct letter for this position - current_flags[:, guessed_letter] = 2 # Mark this letter as found in another position - reward += 5 - new_info = True - else: - # Letter not in word - if guessed_letter not in self.info['not_in_word']: - self.info['not_in_word'].add(guessed_letter) - reward -= 2 # Penalize for guessing a letter not in the word - new_info = True - for pos in range(self.n_letters): - # Update all positions to reflect this letter is not correct - current_flags[pos, guessed_letter] = 0 - - # Update global letter availability based on the guess - for letter in range(26): - if letter not in guessed_word or letter in self.info['not_in_word']: - self.state['global_availability'][letter] = 0 - - # Check if the game is over - done = self.round == self.n_rounds - 1 or correct_guess - self.info['correct'] = correct_guess - - if correct_guess: - reward += 100 # Major reward for winning - elif done: - reward -= 50 # Penalty for losing without using new information effectively - elif not new_info: - reward -= 10 # Penalty if no new information was used in this guess - - self.round += 1 - - return self.get_observation(), reward, done, False, self.info - - def get_observation(self): - # Flatten the position-specific letter availability - position_availability_flat = np.concatenate(self.state['position_availability']) - - # Global availability is already a 1D array, but ensure consistency in data handling - global_availability_flat = self.state['global_availability'].flatten() - - # Concatenate all parts of the state into a single flat array for the DQN input - full_state_flat = np.concatenate( - [position_availability_flat, global_availability_flat, self.state['letter_found']]) - - return full_state_flat diff --git a/letter_guess.py b/letter_guess.py index 63792ea..94f5865 100644 --- a/letter_guess.py +++ b/letter_guess.py @@ -15,18 +15,17 @@ class LetterGuessingEnv(gym.Env): metadata = {'render_modes': ['human']} - def __init__(self, valid_words, seed): + def __init__(self, valid_words, seed=None): self.action_space = spaces.Discrete(26) - self.observation_space = spaces.Box(low=0, high=2, shape=(26*2 + 26*4,), dtype=np.int32) + self.observation_space = spaces.Box(low=0, high=1, shape=(26*2 + 26*4,), dtype=np.int32) self.valid_words = valid_words # List of valid Wordle words self.target_word = '' # Target word for the current episode - self.valid_words_str = '_'.join(self.valid_words) + '_' + self.valid_words_str = ' '.join(self.valid_words) + ' ' self.letter_flags = None self.letter_positions = None self.guessed_letters = set() self.guess_prefix = "" # Tracks the current guess prefix - self.round = 1 self.reset() @@ -47,16 +46,21 @@ class LetterGuessingEnv(gym.Env): self.guessed_letters.add(letter) # Update letter flags based on whether the letter is in the target word - if self.target_word_encoded[letter_index] == 1: + if self.target_word[position] == letter: self.letter_flags[letter_index, :] = [1, 0] # Update flag for correct guess + elif letter in self.target_word: + self.letter_flags[letter_index, :] = [0, 1] # Update flag for correct guess wrong position else: self.letter_flags[letter_index, :] = [0, 0] # Update flag for incorrect guess reward = 1 # Reward for adding new information by trying a new letter # Update the letter_positions matrix to reflect the new guess - self.letter_positions[:, position] = 0 - self.letter_positions[letter_index, position] = 1 + if position == 4: + self.letter_positions[:,:] = 1 + else: + self.letter_positions[:, position] = 0 + self.letter_positions[letter_index, position] = 1 # Use regex to check if the current prefix can lead to a valid word if not re.search(r'\b' + self.guess_prefix, self.valid_words_str): @@ -65,25 +69,30 @@ class LetterGuessingEnv(gym.Env): # guessed a full word so we reset our guess prefix to guess next round if len(self.guess_prefix) == len(self.target_word): - self.guess_prefix == '' + self.guess_prefix = '' self.round += 1 - # end after 3 rounds of total guesses - if self.round == 3: + # end after 5 rounds of total guesses + if self.round == 2: + # reward = 5 done = True obs = self._get_obs() + + if reward < -50: + print(obs, reward, done) return obs, reward, done, False, {} - def reset(self, seed): + def reset(self, seed=None): self.target_word = random.choice(self.valid_words) - self.target_word_encoded = self.encode_word(self.target_word) - self.letter_flags = np.ones((26, 2)) * 2 - self.letter_positions = np.ones((26, 4)) + # self.target_word_encoded = self.encode_word(self.target_word) + self.letter_flags = np.ones((26, 2), dtype=np.int32) + self.letter_positions = np.ones((26, 4), dtype=np.int32) self.guessed_letters = set() self.guess_prefix = "" # Reset the guess prefix for the new episode - return self._get_obs() + self.round = 1 + return self._get_obs(), {} def encode_word(self, word): encoded = np.zeros((26,))