vimmoos@Thor
commited on
Commit
·
09a4b49
1
Parent(s):
6ca282a
try again
Browse files- app.py +7 -270
- pages.toml +10 -0
- poetry.lock +217 -163
- pyproject.toml +4 -1
- requirements.txt +57 -33
- resources/Acrobot-v1/ExtraTrees/conf.json +18 -0
- resources/Acrobot-v1/ExtraTrees/policy.pkl +3 -0
- resources/Acrobot-v1/Neural/conf.json +18 -0
- resources/Acrobot-v1/Neural/policy.pth +3 -0
- resources/Acrobot-v1/RandomForest/conf.json +18 -0
- resources/Acrobot-v1/RandomForest/policy.pkl +3 -0
- resources/Acrobot-v1/info.json +11 -0
- resources/CartPole-v0/ExtraTrees/conf.json +18 -0
- resources/CartPole-v0/ExtraTrees/policy.pkl +3 -0
- resources/CartPole-v0/Neural/conf.json +18 -0
- resources/CartPole-v0/Neural/policy.pth +3 -0
- resources/CartPole-v0/RandomForest/conf.json +18 -0
- resources/CartPole-v0/RandomForest/policy.pkl +3 -0
- resources/CartPole-v0/info.json +9 -0
- resources/LunarLander-v2/ExtraTrees/conf.json +18 -0
- resources/LunarLander-v2/ExtraTrees/policy.pkl +3 -0
- resources/LunarLander-v2/Neural/conf.json +18 -0
- resources/LunarLander-v2/Neural/policy.pth +3 -0
- resources/LunarLander-v2/RandomForest/conf.json +18 -0
- resources/LunarLander-v2/RandomForest/policy.pkl +3 -0
- resources/LunarLander-v2/info.json +14 -0
- udrl/app/home.py +3 -0
- udrl/app/sim.py +405 -0
app.py
CHANGED
|
@@ -1,276 +1,13 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
-
import
|
| 3 |
-
import numpy as np
|
| 4 |
-
from PIL import Image
|
| 5 |
-
import time
|
| 6 |
|
| 7 |
-
|
| 8 |
-
if "env" not in st.session_state:
|
| 9 |
-
st.session_state.env = gym.make("LunarLander-v2", render_mode="rgb_array")
|
| 10 |
-
st.session_state.env.reset()
|
| 11 |
-
st.session_state.frame = st.session_state.env.render()
|
| 12 |
-
if "paused" not in st.session_state:
|
| 13 |
-
st.session_state.paused = False
|
| 14 |
|
|
|
|
| 15 |
|
| 16 |
-
#
|
| 17 |
-
def reset_environment():
|
| 18 |
-
st.session_state.env.reset()
|
| 19 |
|
|
|
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
st.session_state.paused = not st.session_state.paused
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
# Create the Streamlit app
|
| 27 |
-
st.title("Gymnasium Environment Viewer")
|
| 28 |
-
|
| 29 |
-
# Add control buttons in a horizontal layout
|
| 30 |
-
col1, col2 = st.columns(2)
|
| 31 |
-
with col1:
|
| 32 |
-
st.button("Reset Environment", on_click=reset_environment)
|
| 33 |
-
with col2:
|
| 34 |
-
if st.session_state.paused:
|
| 35 |
-
st.button("Resume", on_click=toggle_pause)
|
| 36 |
-
else:
|
| 37 |
-
st.button("Pause", on_click=toggle_pause)
|
| 38 |
-
|
| 39 |
-
# Create a placeholder for the image
|
| 40 |
-
image_placeholder = st.empty()
|
| 41 |
-
|
| 42 |
-
# Create a container for environment info
|
| 43 |
-
sidebar_container = st.sidebar.container()
|
| 44 |
-
|
| 45 |
-
# Main simulation loop using rerun
|
| 46 |
-
if not st.session_state.paused:
|
| 47 |
-
# Take a random action
|
| 48 |
-
action = st.session_state.env.action_space.sample()
|
| 49 |
-
observation, reward, terminated, truncated, info = (
|
| 50 |
-
st.session_state.env.step(action)
|
| 51 |
-
)
|
| 52 |
-
|
| 53 |
-
# Render the environment
|
| 54 |
-
st.session_state.frame = st.session_state.env.render()
|
| 55 |
-
|
| 56 |
-
# Reset if the episode is done
|
| 57 |
-
if terminated or truncated:
|
| 58 |
-
st.session_state.env.reset()
|
| 59 |
-
# Display the frame
|
| 60 |
-
if st.session_state.paused:
|
| 61 |
-
image_placeholder.image(
|
| 62 |
-
st.session_state.frame,
|
| 63 |
-
caption="Environment Visualization (Paused)",
|
| 64 |
-
use_column_width=True,
|
| 65 |
-
)
|
| 66 |
-
else:
|
| 67 |
-
image_placeholder.image(
|
| 68 |
-
st.session_state.frame,
|
| 69 |
-
caption="Environment Visualization",
|
| 70 |
-
use_column_width=True,
|
| 71 |
-
)
|
| 72 |
-
|
| 73 |
-
# Display some information about the environment
|
| 74 |
-
with sidebar_container:
|
| 75 |
-
st.header("Environment Info")
|
| 76 |
-
st.write(f"Action Space: {st.session_state.env.action_space}")
|
| 77 |
-
st.write(f"Observation Space: {st.session_state.env.observation_space}")
|
| 78 |
-
|
| 79 |
-
# Add auto-refresh logic
|
| 80 |
-
if not st.session_state.paused:
|
| 81 |
-
time.sleep(0.1) # Add a small delay to control refresh rate
|
| 82 |
-
st.rerun()
|
| 83 |
-
|
| 84 |
-
# fig, ax = plt.subplots()
|
| 85 |
-
# ax.imshow(env.render())
|
| 86 |
-
# st.pyplot(fig)
|
| 87 |
-
# st.image(env.render())
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
# import gymnasium as gym
|
| 91 |
-
# import streamlit as st
|
| 92 |
-
# import numpy as np
|
| 93 |
-
# from udrl.policies import SklearnPolicy
|
| 94 |
-
# from udrl.agent import UpsideDownAgent, AgentHyper
|
| 95 |
-
# from pathlib import Path
|
| 96 |
-
|
| 97 |
-
# # import json
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
# def normalize_value(value, is_bounded, low=None, high=None):
|
| 101 |
-
# return (value - low) / (high - low)
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
# def visualize_environment(
|
| 105 |
-
# state,
|
| 106 |
-
# env,
|
| 107 |
-
# # paused,
|
| 108 |
-
# feature_importances,
|
| 109 |
-
# epoch,
|
| 110 |
-
# max_epoch=200,
|
| 111 |
-
# ):
|
| 112 |
-
|
| 113 |
-
# st.image(env.render())
|
| 114 |
-
# st.image(e)
|
| 115 |
-
# # Render the Gym environment
|
| 116 |
-
# # env_render = env.render()
|
| 117 |
-
|
| 118 |
-
# # # Display the rendered image using Streamlit
|
| 119 |
-
# # st.image(env_render, caption=f"Epoch {epoch}", use_column_width=True)
|
| 120 |
-
|
| 121 |
-
# # Display feature importances using Streamlit metrics
|
| 122 |
-
# # cols = st.columns(len(feature_importances))
|
| 123 |
-
# # for i, col in enumerate(cols):
|
| 124 |
-
# # col.metric(
|
| 125 |
-
# # label=f"Importance {i}", value=f"{feature_importances[i]:.2f}"
|
| 126 |
-
# # )
|
| 127 |
-
|
| 128 |
-
# # Create buttons using Streamlit
|
| 129 |
-
# # reset_button = st.button("Reset")
|
| 130 |
-
# # pause_play_button = st.button("Pause" if not paused else "Play")
|
| 131 |
-
# # next_button = st.button("Next")
|
| 132 |
-
# # save_button = st.button("Save")
|
| 133 |
-
|
| 134 |
-
# # return reset_button, pause_play_button, next_button, save_button
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
# def run_visualization(
|
| 138 |
-
# env_name,
|
| 139 |
-
# agent,
|
| 140 |
-
# init_desired_return,
|
| 141 |
-
# init_desired_horizon,
|
| 142 |
-
# max_epoch,
|
| 143 |
-
# base_path,
|
| 144 |
-
# ):
|
| 145 |
-
# # base_path = (
|
| 146 |
-
# # Path(base_path) / env_name / agent.policy.estimator.__str__()[:-2]
|
| 147 |
-
# # )
|
| 148 |
-
# # base_path.mkdir(parents=True, exist_ok=True)
|
| 149 |
-
# desired_return = init_desired_return
|
| 150 |
-
# desired_horizon = init_desired_horizon
|
| 151 |
-
|
| 152 |
-
# # Initialize the Gym environment
|
| 153 |
-
# env = gym.make(env_name, render_mode="rgb_array")
|
| 154 |
-
# state, _ = env.reset()
|
| 155 |
-
|
| 156 |
-
# epoch = 0
|
| 157 |
-
# # save_index = 0
|
| 158 |
-
|
| 159 |
-
# # paused = False
|
| 160 |
-
# # step = False
|
| 161 |
-
|
| 162 |
-
# # # Use Streamlit session state to manage paused state
|
| 163 |
-
# # if "paused" not in st.session_state:
|
| 164 |
-
# # st.session_state.paused = False
|
| 165 |
-
|
| 166 |
-
# while True:
|
| 167 |
-
# # Render and display the environment
|
| 168 |
-
# env_render = env.render()
|
| 169 |
-
# # if not st.session_state.pausedor step:
|
| 170 |
-
# command = np.array(
|
| 171 |
-
# [
|
| 172 |
-
# desired_return * agent.conf.return_scale,
|
| 173 |
-
# desired_horizon * agent.conf.horizon_scale,
|
| 174 |
-
# ]
|
| 175 |
-
# )
|
| 176 |
-
# command = np.expand_dims(command, axis=0)
|
| 177 |
-
# state = np.expand_dims(state, axis=0)
|
| 178 |
-
|
| 179 |
-
# action = agent.policy(state, command, True)
|
| 180 |
-
|
| 181 |
-
# ext_state = np.concatenate((state, command), axis=1)
|
| 182 |
-
|
| 183 |
-
# state, reward, done, truncated, info = env.step(action)
|
| 184 |
-
|
| 185 |
-
# feature_importances = {idx: [] for idx in range(ext_state.shape[1])}
|
| 186 |
-
|
| 187 |
-
# for t in agent.policy.estimator.estimators_:
|
| 188 |
-
# branch = np.array(t.decision_path(ext_state).todense(), dtype=bool)
|
| 189 |
-
# imp = t.tree_.impurity[branch[0]]
|
| 190 |
-
|
| 191 |
-
# for f, i in zip(
|
| 192 |
-
# t.tree_.feature[branch[0]][:-1], imp[:-1] - imp[1:]
|
| 193 |
-
# ):
|
| 194 |
-
# feature_importances.setdefault(f, []).append(i)
|
| 195 |
-
|
| 196 |
-
# # Line 8 Algorithm 2
|
| 197 |
-
# desired_return -= reward
|
| 198 |
-
# # Line 9 Algorithm 2
|
| 199 |
-
# desired_horizon = max(desired_horizon - 1, 1)
|
| 200 |
-
|
| 201 |
-
# summed_importances = [
|
| 202 |
-
# sum(feature_importances.get(k, [0.001]))
|
| 203 |
-
# for k in range(len(feature_importances.keys()))
|
| 204 |
-
# ]
|
| 205 |
-
|
| 206 |
-
# epoch += 1
|
| 207 |
-
# visualize_environment(
|
| 208 |
-
# state,
|
| 209 |
-
# env,
|
| 210 |
-
# # st.session_state.paused, # Use session state
|
| 211 |
-
# summed_importances,
|
| 212 |
-
# epoch,
|
| 213 |
-
# max_epoch,
|
| 214 |
-
# )
|
| 215 |
-
# # reset_button, pause_play_button, next_button, save_button = (
|
| 216 |
-
|
| 217 |
-
# # )
|
| 218 |
-
|
| 219 |
-
# if done or truncated:
|
| 220 |
-
# state, _ = env.reset()
|
| 221 |
-
# desired_horizon = init_desired_horizon
|
| 222 |
-
# desired_return = init_desired_return
|
| 223 |
-
# epoch = 0
|
| 224 |
-
|
| 225 |
-
# # step = False
|
| 226 |
-
|
| 227 |
-
# # Handle button clicks
|
| 228 |
-
# # if reset_button:
|
| 229 |
-
# # state, _ = env.reset()
|
| 230 |
-
# # desired_horizon = init_desired_horizon
|
| 231 |
-
# # desired_return = init_desired_return
|
| 232 |
-
# # epoch = 0
|
| 233 |
-
# # elif pause_play_button:
|
| 234 |
-
# # st.session_state.paused = (
|
| 235 |
-
# # not st.session_state.paused
|
| 236 |
-
# # ) # Toggle paused state
|
| 237 |
-
# # elif next_button and st.session_state.paused:
|
| 238 |
-
# # step = True
|
| 239 |
-
# # elif save_button:
|
| 240 |
-
# # # Save image and info using Streamlit
|
| 241 |
-
# # st.image(
|
| 242 |
-
# # env_render, caption=f"Epoch {epoch}", use_column_width=True
|
| 243 |
-
# # )
|
| 244 |
-
# # st.write(
|
| 245 |
-
# # {
|
| 246 |
-
# # "state": {i: str(val) for i, val in enumerate(state)},
|
| 247 |
-
# # "feature": {
|
| 248 |
-
# # i: str(val) for i, val in enumerate(summed_importances)
|
| 249 |
-
# # },
|
| 250 |
-
# # "action": str(action),
|
| 251 |
-
# # "reward": str(reward),
|
| 252 |
-
# # "desired_return": str(desired_return + reward),
|
| 253 |
-
# # "desired_horizon": str(desired_horizon + 1),
|
| 254 |
-
# # }
|
| 255 |
-
# # )
|
| 256 |
-
|
| 257 |
-
# env.close()
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
# env = "Acrobot-v1"
|
| 261 |
-
# desired_return = -79
|
| 262 |
-
# desired_horizon = 82
|
| 263 |
-
# max_epoch = 500
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
# policy = SklearnPolicy.load("policy")
|
| 267 |
-
# hyper = AgentHyper(
|
| 268 |
-
# env,
|
| 269 |
-
# warm_up=0,
|
| 270 |
-
# )
|
| 271 |
-
|
| 272 |
-
# agent = UpsideDownAgent(hyper, policy)
|
| 273 |
-
|
| 274 |
-
# run_visualization(
|
| 275 |
-
# env, agent, desired_return, desired_horizon, max_epoch, "data/viz_examples"
|
| 276 |
-
# )
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
+
from st_pages import add_page_title, get_nav_from_toml
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
+
st.set_page_config(layout="wide")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
+
nav = get_nav_from_toml("pages.toml")
|
| 7 |
|
| 8 |
+
# st.logo("logo.png")
|
|
|
|
|
|
|
| 9 |
|
| 10 |
+
pg = st.navigation(nav)
|
| 11 |
|
| 12 |
+
add_page_title(pg)
|
| 13 |
+
pg.run()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pages.toml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[[pages]]
|
| 2 |
+
path = "udrl/app/home.py"
|
| 3 |
+
name = "Home"
|
| 4 |
+
icon = "🏠"
|
| 5 |
+
|
| 6 |
+
[[pages]]
|
| 7 |
+
path = "udrl/app/sim.py"
|
| 8 |
+
name = "Feature Importance Visualization"
|
| 9 |
+
icon = ":robot_face:"
|
| 10 |
+
url_path = "simulation"
|
poetry.lock
CHANGED
|
@@ -91,101 +91,116 @@ files = [
|
|
| 91 |
|
| 92 |
[[package]]
|
| 93 |
name = "charset-normalizer"
|
| 94 |
-
version = "3.
|
| 95 |
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
| 96 |
optional = false
|
| 97 |
python-versions = ">=3.7.0"
|
| 98 |
files = [
|
| 99 |
-
{file = "
|
| 100 |
-
{file = "charset_normalizer-3.
|
| 101 |
-
{file = "charset_normalizer-3.
|
| 102 |
-
{file = "charset_normalizer-3.
|
| 103 |
-
{file = "charset_normalizer-3.
|
| 104 |
-
{file = "charset_normalizer-3.
|
| 105 |
-
{file = "charset_normalizer-3.
|
| 106 |
-
{file = "charset_normalizer-3.
|
| 107 |
-
{file = "charset_normalizer-3.
|
| 108 |
-
{file = "charset_normalizer-3.
|
| 109 |
-
{file = "charset_normalizer-3.
|
| 110 |
-
{file = "charset_normalizer-3.
|
| 111 |
-
{file = "charset_normalizer-3.
|
| 112 |
-
{file = "charset_normalizer-3.
|
| 113 |
-
{file = "charset_normalizer-3.
|
| 114 |
-
{file = "charset_normalizer-3.
|
| 115 |
-
{file = "charset_normalizer-3.
|
| 116 |
-
{file = "charset_normalizer-3.
|
| 117 |
-
{file = "charset_normalizer-3.
|
| 118 |
-
{file = "charset_normalizer-3.
|
| 119 |
-
{file = "charset_normalizer-3.
|
| 120 |
-
{file = "charset_normalizer-3.
|
| 121 |
-
{file = "charset_normalizer-3.
|
| 122 |
-
{file = "charset_normalizer-3.
|
| 123 |
-
{file = "charset_normalizer-3.
|
| 124 |
-
{file = "charset_normalizer-3.
|
| 125 |
-
{file = "charset_normalizer-3.
|
| 126 |
-
{file = "charset_normalizer-3.
|
| 127 |
-
{file = "charset_normalizer-3.
|
| 128 |
-
{file = "charset_normalizer-3.
|
| 129 |
-
{file = "charset_normalizer-3.
|
| 130 |
-
{file = "charset_normalizer-3.
|
| 131 |
-
{file = "charset_normalizer-3.
|
| 132 |
-
{file = "charset_normalizer-3.
|
| 133 |
-
{file = "charset_normalizer-3.
|
| 134 |
-
{file = "charset_normalizer-3.
|
| 135 |
-
{file = "charset_normalizer-3.
|
| 136 |
-
{file = "charset_normalizer-3.
|
| 137 |
-
{file = "charset_normalizer-3.
|
| 138 |
-
{file = "charset_normalizer-3.
|
| 139 |
-
{file = "charset_normalizer-3.
|
| 140 |
-
{file = "charset_normalizer-3.
|
| 141 |
-
{file = "charset_normalizer-3.
|
| 142 |
-
{file = "charset_normalizer-3.
|
| 143 |
-
{file = "charset_normalizer-3.
|
| 144 |
-
{file = "charset_normalizer-3.
|
| 145 |
-
{file = "charset_normalizer-3.
|
| 146 |
-
{file = "charset_normalizer-3.
|
| 147 |
-
{file = "charset_normalizer-3.
|
| 148 |
-
{file = "charset_normalizer-3.
|
| 149 |
-
{file = "charset_normalizer-3.
|
| 150 |
-
{file = "charset_normalizer-3.
|
| 151 |
-
{file = "charset_normalizer-3.
|
| 152 |
-
{file = "charset_normalizer-3.
|
| 153 |
-
{file = "charset_normalizer-3.
|
| 154 |
-
{file = "charset_normalizer-3.
|
| 155 |
-
{file = "charset_normalizer-3.
|
| 156 |
-
{file = "charset_normalizer-3.
|
| 157 |
-
{file = "charset_normalizer-3.
|
| 158 |
-
{file = "charset_normalizer-3.
|
| 159 |
-
{file = "charset_normalizer-3.
|
| 160 |
-
{file = "charset_normalizer-3.
|
| 161 |
-
{file = "charset_normalizer-3.
|
| 162 |
-
{file = "charset_normalizer-3.
|
| 163 |
-
{file = "charset_normalizer-3.
|
| 164 |
-
{file = "charset_normalizer-3.
|
| 165 |
-
{file = "charset_normalizer-3.
|
| 166 |
-
{file = "charset_normalizer-3.
|
| 167 |
-
{file = "charset_normalizer-3.
|
| 168 |
-
{file = "charset_normalizer-3.
|
| 169 |
-
{file = "charset_normalizer-3.
|
| 170 |
-
{file = "charset_normalizer-3.
|
| 171 |
-
{file = "charset_normalizer-3.
|
| 172 |
-
{file = "charset_normalizer-3.
|
| 173 |
-
{file = "charset_normalizer-3.
|
| 174 |
-
{file = "charset_normalizer-3.
|
| 175 |
-
{file = "charset_normalizer-3.
|
| 176 |
-
{file = "charset_normalizer-3.
|
| 177 |
-
{file = "charset_normalizer-3.
|
| 178 |
-
{file = "charset_normalizer-3.
|
| 179 |
-
{file = "charset_normalizer-3.
|
| 180 |
-
{file = "charset_normalizer-3.
|
| 181 |
-
{file = "charset_normalizer-3.
|
| 182 |
-
{file = "charset_normalizer-3.
|
| 183 |
-
{file = "charset_normalizer-3.
|
| 184 |
-
{file = "charset_normalizer-3.
|
| 185 |
-
{file = "charset_normalizer-3.
|
| 186 |
-
{file = "charset_normalizer-3.
|
| 187 |
-
{file = "charset_normalizer-3.
|
| 188 |
-
{file = "charset_normalizer-3.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
]
|
| 190 |
|
| 191 |
[[package]]
|
|
@@ -803,72 +818,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
|
|
| 803 |
|
| 804 |
[[package]]
|
| 805 |
name = "markupsafe"
|
| 806 |
-
version = "3.0.
|
| 807 |
description = "Safely add untrusted strings to HTML/XML markup."
|
| 808 |
optional = false
|
| 809 |
python-versions = ">=3.9"
|
| 810 |
files = [
|
| 811 |
-
{file = "MarkupSafe-3.0.
|
| 812 |
-
{file = "MarkupSafe-3.0.
|
| 813 |
-
{file = "MarkupSafe-3.0.
|
| 814 |
-
{file = "MarkupSafe-3.0.
|
| 815 |
-
{file = "MarkupSafe-3.0.
|
| 816 |
-
{file = "MarkupSafe-3.0.
|
| 817 |
-
{file = "MarkupSafe-3.0.
|
| 818 |
-
{file = "MarkupSafe-3.0.
|
| 819 |
-
{file = "MarkupSafe-3.0.
|
| 820 |
-
{file = "MarkupSafe-3.0.
|
| 821 |
-
{file = "MarkupSafe-3.0.
|
| 822 |
-
{file = "MarkupSafe-3.0.
|
| 823 |
-
{file = "MarkupSafe-3.0.
|
| 824 |
-
{file = "MarkupSafe-3.0.
|
| 825 |
-
{file = "MarkupSafe-3.0.
|
| 826 |
-
{file = "MarkupSafe-3.0.
|
| 827 |
-
{file = "MarkupSafe-3.0.
|
| 828 |
-
{file = "MarkupSafe-3.0.
|
| 829 |
-
{file = "MarkupSafe-3.0.
|
| 830 |
-
{file = "MarkupSafe-3.0.
|
| 831 |
-
{file = "MarkupSafe-3.0.
|
| 832 |
-
{file = "MarkupSafe-3.0.
|
| 833 |
-
{file = "MarkupSafe-3.0.
|
| 834 |
-
{file = "MarkupSafe-3.0.
|
| 835 |
-
{file = "MarkupSafe-3.0.
|
| 836 |
-
{file = "MarkupSafe-3.0.
|
| 837 |
-
{file = "MarkupSafe-3.0.
|
| 838 |
-
{file = "MarkupSafe-3.0.
|
| 839 |
-
{file = "MarkupSafe-3.0.
|
| 840 |
-
{file = "MarkupSafe-3.0.
|
| 841 |
-
{file = "MarkupSafe-3.0.
|
| 842 |
-
{file = "MarkupSafe-3.0.
|
| 843 |
-
{file = "MarkupSafe-3.0.
|
| 844 |
-
{file = "MarkupSafe-3.0.
|
| 845 |
-
{file = "MarkupSafe-3.0.
|
| 846 |
-
{file = "MarkupSafe-3.0.
|
| 847 |
-
{file = "MarkupSafe-3.0.
|
| 848 |
-
{file = "MarkupSafe-3.0.
|
| 849 |
-
{file = "MarkupSafe-3.0.
|
| 850 |
-
{file = "MarkupSafe-3.0.
|
| 851 |
-
{file = "MarkupSafe-3.0.
|
| 852 |
-
{file = "MarkupSafe-3.0.
|
| 853 |
-
{file = "MarkupSafe-3.0.
|
| 854 |
-
{file = "MarkupSafe-3.0.
|
| 855 |
-
{file = "MarkupSafe-3.0.
|
| 856 |
-
{file = "MarkupSafe-3.0.
|
| 857 |
-
{file = "MarkupSafe-3.0.
|
| 858 |
-
{file = "MarkupSafe-3.0.
|
| 859 |
-
{file = "MarkupSafe-3.0.
|
| 860 |
-
{file = "MarkupSafe-3.0.
|
| 861 |
-
{file = "MarkupSafe-3.0.
|
| 862 |
-
{file = "MarkupSafe-3.0.
|
| 863 |
-
{file = "MarkupSafe-3.0.
|
| 864 |
-
{file = "MarkupSafe-3.0.
|
| 865 |
-
{file = "MarkupSafe-3.0.
|
| 866 |
-
{file = "MarkupSafe-3.0.
|
| 867 |
-
{file = "MarkupSafe-3.0.
|
| 868 |
-
{file = "MarkupSafe-3.0.
|
| 869 |
-
{file = "MarkupSafe-3.0.
|
| 870 |
-
{file = "MarkupSafe-3.0.
|
| 871 |
-
{file = "markupsafe-3.0.
|
| 872 |
]
|
| 873 |
|
| 874 |
[[package]]
|
|
@@ -964,13 +979,13 @@ tests = ["pytest (>=4.6)"]
|
|
| 964 |
|
| 965 |
[[package]]
|
| 966 |
name = "narwhals"
|
| 967 |
-
version = "1.9.
|
| 968 |
description = "Extremely lightweight compatibility layer between dataframe libraries"
|
| 969 |
optional = false
|
| 970 |
python-versions = ">=3.8"
|
| 971 |
files = [
|
| 972 |
-
{file = "narwhals-1.9.
|
| 973 |
-
{file = "narwhals-1.9.
|
| 974 |
]
|
| 975 |
|
| 976 |
[package.extras]
|
|
@@ -983,20 +998,21 @@ pyarrow = ["pyarrow (>=11.0.0)"]
|
|
| 983 |
|
| 984 |
[[package]]
|
| 985 |
name = "networkx"
|
| 986 |
-
version = "3.
|
| 987 |
description = "Python package for creating and manipulating graphs and networks"
|
| 988 |
optional = false
|
| 989 |
python-versions = ">=3.10"
|
| 990 |
files = [
|
| 991 |
-
{file = "networkx-3.
|
| 992 |
-
{file = "networkx-3.
|
| 993 |
]
|
| 994 |
|
| 995 |
[package.extras]
|
| 996 |
-
default = ["matplotlib (>=3.
|
| 997 |
developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
|
| 998 |
-
doc = ["myst-nb (>=1.
|
| 999 |
-
|
|
|
|
| 1000 |
test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
|
| 1001 |
|
| 1002 |
[[package]]
|
|
@@ -1543,6 +1559,16 @@ files = [
|
|
| 1543 |
[package.extras]
|
| 1544 |
windows-terminal = ["colorama (>=0.4.6)"]
|
| 1545 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1546 |
[[package]]
|
| 1547 |
name = "pyparsing"
|
| 1548 |
version = "3.1.4"
|
|
@@ -1934,6 +1960,20 @@ files = [
|
|
| 1934 |
{file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
|
| 1935 |
]
|
| 1936 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1937 |
[[package]]
|
| 1938 |
name = "streamlit"
|
| 1939 |
version = "1.39.0"
|
|
@@ -1969,6 +2009,20 @@ watchdog = {version = ">=2.1.5,<6", markers = "platform_system != \"Darwin\""}
|
|
| 1969 |
[package.extras]
|
| 1970 |
snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python[modin] (>=1.17.0)"]
|
| 1971 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1972 |
[[package]]
|
| 1973 |
name = "swig"
|
| 1974 |
version = "4.2.1"
|
|
@@ -2275,4 +2329,4 @@ watchmedo = ["PyYAML (>=3.10)"]
|
|
| 2275 |
[metadata]
|
| 2276 |
lock-version = "2.0"
|
| 2277 |
python-versions = "3.10.14"
|
| 2278 |
-
content-hash = "
|
|
|
|
| 91 |
|
| 92 |
[[package]]
|
| 93 |
name = "charset-normalizer"
|
| 94 |
+
version = "3.4.0"
|
| 95 |
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
| 96 |
optional = false
|
| 97 |
python-versions = ">=3.7.0"
|
| 98 |
files = [
|
| 99 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
|
| 100 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
|
| 101 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
|
| 102 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
|
| 103 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
|
| 104 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
|
| 105 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
|
| 106 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
|
| 107 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
|
| 108 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
|
| 109 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
|
| 110 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
|
| 111 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
|
| 112 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
|
| 113 |
+
{file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
|
| 114 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
|
| 115 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
|
| 116 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
|
| 117 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
|
| 118 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
|
| 119 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
|
| 120 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
|
| 121 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
|
| 122 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
|
| 123 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
|
| 124 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
|
| 125 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
|
| 126 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
|
| 127 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
|
| 128 |
+
{file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
|
| 129 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
|
| 130 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
|
| 131 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
|
| 132 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
|
| 133 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
|
| 134 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
|
| 135 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
|
| 136 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
|
| 137 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
|
| 138 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
|
| 139 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
|
| 140 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
|
| 141 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
|
| 142 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
|
| 143 |
+
{file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
|
| 144 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
|
| 145 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
|
| 146 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
|
| 147 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
|
| 148 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
|
| 149 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
|
| 150 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
|
| 151 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
|
| 152 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
|
| 153 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
|
| 154 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
|
| 155 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
|
| 156 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
|
| 157 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
|
| 158 |
+
{file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
|
| 159 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
|
| 160 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
|
| 161 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
|
| 162 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
|
| 163 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
|
| 164 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
|
| 165 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
|
| 166 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
|
| 167 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
|
| 168 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
|
| 169 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
|
| 170 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
|
| 171 |
+
{file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
|
| 172 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
|
| 173 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
|
| 174 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
|
| 175 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
|
| 176 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
|
| 177 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
|
| 178 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
|
| 179 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
|
| 180 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
|
| 181 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
|
| 182 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
|
| 183 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
|
| 184 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
|
| 185 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
|
| 186 |
+
{file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
|
| 187 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
|
| 188 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
|
| 189 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
|
| 190 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
|
| 191 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
|
| 192 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
|
| 193 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
|
| 194 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
|
| 195 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
|
| 196 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
|
| 197 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
|
| 198 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
|
| 199 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
|
| 200 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
|
| 201 |
+
{file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
|
| 202 |
+
{file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
|
| 203 |
+
{file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
|
| 204 |
]
|
| 205 |
|
| 206 |
[[package]]
|
|
|
|
| 818 |
|
| 819 |
[[package]]
|
| 820 |
name = "markupsafe"
|
| 821 |
+
version = "3.0.1"
|
| 822 |
description = "Safely add untrusted strings to HTML/XML markup."
|
| 823 |
optional = false
|
| 824 |
python-versions = ">=3.9"
|
| 825 |
files = [
|
| 826 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"},
|
| 827 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"},
|
| 828 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"},
|
| 829 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"},
|
| 830 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"},
|
| 831 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"},
|
| 832 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"},
|
| 833 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"},
|
| 834 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"},
|
| 835 |
+
{file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"},
|
| 836 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"},
|
| 837 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"},
|
| 838 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"},
|
| 839 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"},
|
| 840 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"},
|
| 841 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"},
|
| 842 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"},
|
| 843 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"},
|
| 844 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"},
|
| 845 |
+
{file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"},
|
| 846 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"},
|
| 847 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"},
|
| 848 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"},
|
| 849 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"},
|
| 850 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"},
|
| 851 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"},
|
| 852 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"},
|
| 853 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"},
|
| 854 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"},
|
| 855 |
+
{file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"},
|
| 856 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"},
|
| 857 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"},
|
| 858 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"},
|
| 859 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"},
|
| 860 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"},
|
| 861 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"},
|
| 862 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"},
|
| 863 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"},
|
| 864 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"},
|
| 865 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"},
|
| 866 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"},
|
| 867 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"},
|
| 868 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"},
|
| 869 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"},
|
| 870 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"},
|
| 871 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"},
|
| 872 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"},
|
| 873 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"},
|
| 874 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"},
|
| 875 |
+
{file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"},
|
| 876 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"},
|
| 877 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"},
|
| 878 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"},
|
| 879 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"},
|
| 880 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"},
|
| 881 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"},
|
| 882 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"},
|
| 883 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"},
|
| 884 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"},
|
| 885 |
+
{file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"},
|
| 886 |
+
{file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"},
|
| 887 |
]
|
| 888 |
|
| 889 |
[[package]]
|
|
|
|
| 979 |
|
| 980 |
[[package]]
|
| 981 |
name = "narwhals"
|
| 982 |
+
version = "1.9.2"
|
| 983 |
description = "Extremely lightweight compatibility layer between dataframe libraries"
|
| 984 |
optional = false
|
| 985 |
python-versions = ">=3.8"
|
| 986 |
files = [
|
| 987 |
+
{file = "narwhals-1.9.2-py3-none-any.whl", hash = "sha256:9cb9a9a384cd7547e022f9601512c93f8bd784ab6cf55cc5fa76f724bb014989"},
|
| 988 |
+
{file = "narwhals-1.9.2.tar.gz", hash = "sha256:f5b02ec2ff3f5a668719a01e8d434b3fa100fbf1f4fb0d0653202b5c31695c9a"},
|
| 989 |
]
|
| 990 |
|
| 991 |
[package.extras]
|
|
|
|
| 998 |
|
| 999 |
[[package]]
|
| 1000 |
name = "networkx"
|
| 1001 |
+
version = "3.4"
|
| 1002 |
description = "Python package for creating and manipulating graphs and networks"
|
| 1003 |
optional = false
|
| 1004 |
python-versions = ">=3.10"
|
| 1005 |
files = [
|
| 1006 |
+
{file = "networkx-3.4-py3-none-any.whl", hash = "sha256:46dad0ec74a825a968e2b36c37ef5b91faa3868f017b2283d9cbff33112222ce"},
|
| 1007 |
+
{file = "networkx-3.4.tar.gz", hash = "sha256:1269b90f8f0d3a4095f016f49650f35ac169729f49b69d0572b2bb142748162b"},
|
| 1008 |
]
|
| 1009 |
|
| 1010 |
[package.extras]
|
| 1011 |
+
default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"]
|
| 1012 |
developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
|
| 1013 |
+
doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"]
|
| 1014 |
+
example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
|
| 1015 |
+
extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"]
|
| 1016 |
test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
|
| 1017 |
|
| 1018 |
[[package]]
|
|
|
|
| 1559 |
[package.extras]
|
| 1560 |
windows-terminal = ["colorama (>=0.4.6)"]
|
| 1561 |
|
| 1562 |
+
[[package]]
|
| 1563 |
+
name = "pylatexenc"
|
| 1564 |
+
version = "2.10"
|
| 1565 |
+
description = "Simple LaTeX parser providing latex-to-unicode and unicode-to-latex conversion"
|
| 1566 |
+
optional = false
|
| 1567 |
+
python-versions = "*"
|
| 1568 |
+
files = [
|
| 1569 |
+
{file = "pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3"},
|
| 1570 |
+
]
|
| 1571 |
+
|
| 1572 |
[[package]]
|
| 1573 |
name = "pyparsing"
|
| 1574 |
version = "3.1.4"
|
|
|
|
| 1960 |
{file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
|
| 1961 |
]
|
| 1962 |
|
| 1963 |
+
[[package]]
|
| 1964 |
+
name = "st-pages"
|
| 1965 |
+
version = "1.0.1"
|
| 1966 |
+
description = "An experimental version of Streamlit Multi-Page Apps"
|
| 1967 |
+
optional = false
|
| 1968 |
+
python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,!=3.8.*,>=3.9"
|
| 1969 |
+
files = [
|
| 1970 |
+
{file = "st_pages-1.0.1-py3-none-any.whl", hash = "sha256:9098fb4d96bc1dfa56cc2c56ef6fe44e607c69261ff4bceee1f6e9c1e0c2acb4"},
|
| 1971 |
+
{file = "st_pages-1.0.1.tar.gz", hash = "sha256:2641cfbff1c768ff146858ed742d282b30a3a4c3e4f7717898705bbaee717736"},
|
| 1972 |
+
]
|
| 1973 |
+
|
| 1974 |
+
[package.dependencies]
|
| 1975 |
+
streamlit = ">=1.36.0"
|
| 1976 |
+
|
| 1977 |
[[package]]
|
| 1978 |
name = "streamlit"
|
| 1979 |
version = "1.39.0"
|
|
|
|
| 2009 |
[package.extras]
|
| 2010 |
snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python[modin] (>=1.17.0)"]
|
| 2011 |
|
| 2012 |
+
[[package]]
|
| 2013 |
+
name = "streamlit-javascript"
|
| 2014 |
+
version = "0.1.5"
|
| 2015 |
+
description = "component to run javascript code in streamlit application"
|
| 2016 |
+
optional = false
|
| 2017 |
+
python-versions = ">=3.6"
|
| 2018 |
+
files = [
|
| 2019 |
+
{file = "streamlit-javascript-0.1.5.tar.gz", hash = "sha256:9da5176522a0acf2c39d3b0bec9f856fdd8ea3c70bb1066841a546ab1348ae1d"},
|
| 2020 |
+
{file = "streamlit_javascript-0.1.5-py3-none-any.whl", hash = "sha256:36ca4d8c46fd5b6526d1a705530472e03cb6e5bb24694330649f21d5c436d280"},
|
| 2021 |
+
]
|
| 2022 |
+
|
| 2023 |
+
[package.dependencies]
|
| 2024 |
+
streamlit = ">=0.75"
|
| 2025 |
+
|
| 2026 |
[[package]]
|
| 2027 |
name = "swig"
|
| 2028 |
version = "4.2.1"
|
|
|
|
| 2329 |
[metadata]
|
| 2330 |
lock-version = "2.0"
|
| 2331 |
python-versions = "3.10.14"
|
| 2332 |
+
content-hash = "f767bbf8a5395a83cb5196ec5a0313fcc057af9023b4430c635f5135e65c1eff"
|
pyproject.toml
CHANGED
|
@@ -31,8 +31,11 @@ scikit-image = "^0.24.0"
|
|
| 31 |
tqdm = "^4.66.5"
|
| 32 |
torch = "^2.4.1"
|
| 33 |
streamlit = "^1.39.0"
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
|
| 36 |
[build-system]
|
| 37 |
requires = ["poetry-core"]
|
| 38 |
-
build-backend = "poetry.core.masonry.api"
|
|
|
|
| 31 |
tqdm = "^4.66.5"
|
| 32 |
torch = "^2.4.1"
|
| 33 |
streamlit = "^1.39.0"
|
| 34 |
+
st-pages = "^1.0.1"
|
| 35 |
+
streamlit-javascript = "^0.1.5"
|
| 36 |
+
pylatexenc = "^2.10"
|
| 37 |
|
| 38 |
|
| 39 |
[build-system]
|
| 40 |
requires = ["poetry-core"]
|
| 41 |
+
build-backend = "poetry.core.masonry.api"
|
requirements.txt
CHANGED
|
@@ -1,60 +1,84 @@
|
|
| 1 |
-
|
| 2 |
-
|
|
|
|
|
|
|
|
|
|
| 3 |
certifi==2024.8.30
|
| 4 |
charset-normalizer==3.3.2
|
|
|
|
| 5 |
cloudpickle==3.0.0
|
| 6 |
-
colorama==0.4.6
|
| 7 |
contourpy==1.3.0
|
| 8 |
cycler==0.12.1
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
fonttools==4.
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
gymnasium==0.29.1
|
| 16 |
-
h5py==3.11.0
|
| 17 |
idna==3.10
|
| 18 |
imageio==2.35.1
|
|
|
|
| 19 |
joblib==1.4.2
|
| 20 |
-
|
|
|
|
| 21 |
kiwisolver==1.4.7
|
| 22 |
-
|
| 23 |
-
libclang==18.1.1
|
| 24 |
markdown-it-py==3.0.0
|
| 25 |
-
|
| 26 |
-
markupsafe==2.1.5
|
| 27 |
matplotlib==3.9.2
|
| 28 |
mdurl==0.1.2
|
| 29 |
-
|
| 30 |
-
|
| 31 |
networkx==3.3
|
| 32 |
numpy==1.24.4
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
packaging==24.1
|
|
|
|
| 36 |
pillow==10.4.0
|
| 37 |
-
protobuf==
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
pyparsing==3.1.4
|
| 40 |
python-dateutil==2.9.0.post0
|
|
|
|
|
|
|
| 41 |
requests==2.32.3
|
| 42 |
-
rich==13.
|
|
|
|
| 43 |
scikit-image==0.24.0
|
| 44 |
scikit-learn==1.5.2
|
| 45 |
scipy==1.14.1
|
| 46 |
-
setuptools==75.1.0
|
| 47 |
six==1.16.0
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
|
|
|
|
|
|
| 53 |
threadpoolctl==3.5.0
|
| 54 |
-
tifffile==2024.
|
|
|
|
|
|
|
|
|
|
| 55 |
tqdm==4.66.5
|
| 56 |
-
|
|
|
|
|
|
|
| 57 |
urllib3==2.2.3
|
| 58 |
-
|
| 59 |
-
wheel==0.44.0
|
| 60 |
-
wrapt==1.16.0
|
|
|
|
| 1 |
+
altair==5.4.1
|
| 2 |
+
attrs==24.2.0
|
| 3 |
+
blinker==1.8.2
|
| 4 |
+
box2d-py==2.3.5
|
| 5 |
+
cachetools==5.5.0
|
| 6 |
certifi==2024.8.30
|
| 7 |
charset-normalizer==3.3.2
|
| 8 |
+
click==8.1.7
|
| 9 |
cloudpickle==3.0.0
|
|
|
|
| 10 |
contourpy==1.3.0
|
| 11 |
cycler==0.12.1
|
| 12 |
+
Farama-Notifications==0.0.4
|
| 13 |
+
filelock==3.16.1
|
| 14 |
+
fonttools==4.54.1
|
| 15 |
+
fsspec==2024.9.0
|
| 16 |
+
gitdb==4.0.11
|
| 17 |
+
GitPython==3.1.43
|
| 18 |
gymnasium==0.29.1
|
|
|
|
| 19 |
idna==3.10
|
| 20 |
imageio==2.35.1
|
| 21 |
+
Jinja2==3.1.4
|
| 22 |
joblib==1.4.2
|
| 23 |
+
jsonschema==4.23.0
|
| 24 |
+
jsonschema-specifications==2024.10.1
|
| 25 |
kiwisolver==1.4.7
|
| 26 |
+
lazy_loader==0.4
|
|
|
|
| 27 |
markdown-it-py==3.0.0
|
| 28 |
+
MarkupSafe==3.0.0
|
|
|
|
| 29 |
matplotlib==3.9.2
|
| 30 |
mdurl==0.1.2
|
| 31 |
+
mpmath==1.3.0
|
| 32 |
+
narwhals==1.9.1
|
| 33 |
networkx==3.3
|
| 34 |
numpy==1.24.4
|
| 35 |
+
nvidia-cublas-cu12==12.1.3.1
|
| 36 |
+
nvidia-cuda-cupti-cu12==12.1.105
|
| 37 |
+
nvidia-cuda-nvrtc-cu12==12.1.105
|
| 38 |
+
nvidia-cuda-runtime-cu12==12.1.105
|
| 39 |
+
nvidia-cudnn-cu12==9.1.0.70
|
| 40 |
+
nvidia-cufft-cu12==11.0.2.54
|
| 41 |
+
nvidia-curand-cu12==10.3.2.106
|
| 42 |
+
nvidia-cusolver-cu12==11.4.5.107
|
| 43 |
+
nvidia-cusparse-cu12==12.1.0.106
|
| 44 |
+
nvidia-nccl-cu12==2.20.5
|
| 45 |
+
nvidia-nvjitlink-cu12==12.6.77
|
| 46 |
+
nvidia-nvtx-cu12==12.1.105
|
| 47 |
packaging==24.1
|
| 48 |
+
pandas==2.2.3
|
| 49 |
pillow==10.4.0
|
| 50 |
+
protobuf==5.28.2
|
| 51 |
+
pyarrow==17.0.0
|
| 52 |
+
pydeck==0.9.1
|
| 53 |
+
pygame==2.6.1
|
| 54 |
+
Pygments==2.18.0
|
| 55 |
+
pylatexenc==2.10
|
| 56 |
pyparsing==3.1.4
|
| 57 |
python-dateutil==2.9.0.post0
|
| 58 |
+
pytz==2024.2
|
| 59 |
+
referencing==0.35.1
|
| 60 |
requests==2.32.3
|
| 61 |
+
rich==13.9.2
|
| 62 |
+
rpds-py==0.20.0
|
| 63 |
scikit-image==0.24.0
|
| 64 |
scikit-learn==1.5.2
|
| 65 |
scipy==1.14.1
|
|
|
|
| 66 |
six==1.16.0
|
| 67 |
+
smmap==5.0.1
|
| 68 |
+
st-pages==1.0.1
|
| 69 |
+
streamlit==1.39.0
|
| 70 |
+
streamlit-javascript==0.1.5
|
| 71 |
+
swig==4.2.1
|
| 72 |
+
sympy==1.13.3
|
| 73 |
+
tenacity==9.0.0
|
| 74 |
threadpoolctl==3.5.0
|
| 75 |
+
tifffile==2024.9.20
|
| 76 |
+
toml==0.10.2
|
| 77 |
+
torch==2.4.1
|
| 78 |
+
tornado==6.4.1
|
| 79 |
tqdm==4.66.5
|
| 80 |
+
triton==3.0.0
|
| 81 |
+
typing_extensions==4.12.2
|
| 82 |
+
tzdata==2024.2
|
| 83 |
urllib3==2.2.3
|
| 84 |
+
watchdog==5.0.3
|
|
|
|
|
|
resources/Acrobot-v1/ExtraTrees/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "Acrobot-v1",
|
| 3 |
+
"estimator_name": "ensemble.ExtraTreesClassifier",
|
| 4 |
+
"seed": 42,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": -152,
|
| 17 |
+
"final_desired_horizon": 154
|
| 18 |
+
}
|
resources/Acrobot-v1/ExtraTrees/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ac05d51dcf842dadf19ce69f97c3d68579d4ea061c2590d8fc3ebb0ccc63ca28
|
| 3 |
+
size 6551357
|
resources/Acrobot-v1/Neural/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "Acrobot-v1",
|
| 3 |
+
"estimator_name": "neural",
|
| 4 |
+
"seed": 43,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 100,
|
| 8 |
+
"batch_size": 256,
|
| 9 |
+
"warm_up": 260,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": -63,
|
| 17 |
+
"final_desired_horizon": 64
|
| 18 |
+
}
|
resources/Acrobot-v1/Neural/policy.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:480d6e152d1620dd3244f313264cc8d591d8d50fb119630d4934302f72a10bb8
|
| 3 |
+
size 171858
|
resources/Acrobot-v1/RandomForest/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "Acrobot-v1",
|
| 3 |
+
"estimator_name": "ensemble.RandomForestClassifier",
|
| 4 |
+
"seed": 44,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": -79,
|
| 17 |
+
"final_desired_horizon": 82
|
| 18 |
+
}
|
resources/Acrobot-v1/RandomForest/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:940f574693050cadc3f8134e559d47204b4a42d6b7168e7d0ccee1528e264a17
|
| 3 |
+
size 1876900
|
resources/Acrobot-v1/info.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "Acrobot-v1",
|
| 3 |
+
"state": {
|
| 4 |
+
"0":["$\\sin{\\theta_1}$","Sine of the first link" ],
|
| 5 |
+
"1":["$\\cos{\\theta_1}$","Cosine of the first link" ],
|
| 6 |
+
"2":["$\\sin{\\theta_2}$","Sine of the second link" ],
|
| 7 |
+
"3":["$\\cos{\\theta_2}$","Cosine of the second link" ],
|
| 8 |
+
"4":["$\\dot{\\theta}_1$","Angular velocity of first link" ],
|
| 9 |
+
"5":["$\\dot{\\theta}_2$","Angular velocity of second link" ]
|
| 10 |
+
}
|
| 11 |
+
}
|
resources/CartPole-v0/ExtraTrees/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "CartPole-v0",
|
| 3 |
+
"estimator_name": "ensemble.ExtraTreesClassifier",
|
| 4 |
+
"seed": 46,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": 200,
|
| 17 |
+
"final_desired_horizon": 200
|
| 18 |
+
}
|
resources/CartPole-v0/ExtraTrees/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7879d9708d67fd2080b5d0f9e5d69a85216f263f47bee5acc17c03010047daf3
|
| 3 |
+
size 5966089
|
resources/CartPole-v0/Neural/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "CartPole-v0",
|
| 3 |
+
"estimator_name": "neural",
|
| 4 |
+
"seed": 44,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 100,
|
| 8 |
+
"batch_size": 256,
|
| 9 |
+
"warm_up": 260,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": 200,
|
| 17 |
+
"final_desired_horizon": 200
|
| 18 |
+
}
|
resources/CartPole-v0/Neural/policy.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0cbbd302ea0ab1dce7d54b9e21f81be047f07d585393e8ad001b479246e240ac
|
| 3 |
+
size 169554
|
resources/CartPole-v0/RandomForest/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "CartPole-v0",
|
| 3 |
+
"estimator_name": "ensemble.RandomForestClassifier",
|
| 4 |
+
"seed": 46,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": 200,
|
| 17 |
+
"final_desired_horizon": 200
|
| 18 |
+
}
|
resources/CartPole-v0/RandomForest/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:98520072de5d1bd3d6a0a78a0100ad313874b367a1d56ce1015752d7671bca4f
|
| 3 |
+
size 1649888
|
resources/CartPole-v0/info.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "CartPole-v0",
|
| 3 |
+
"state": {
|
| 4 |
+
"0": ["$x$","Cart Position"],
|
| 5 |
+
"1": ["$\\dot{x}$","Cart Velocity"],
|
| 6 |
+
"2": ["$\\theta$","Pole Angle"],
|
| 7 |
+
"3": ["$\\dot{\\theta}$","Pole Angular Velocity"]
|
| 8 |
+
}
|
| 9 |
+
}
|
resources/LunarLander-v2/ExtraTrees/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "LunarLander-v2",
|
| 3 |
+
"estimator_name": "ensemble.ExtraTreesClassifier",
|
| 4 |
+
"seed": 42,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": 73,
|
| 17 |
+
"final_desired_horizon": 209
|
| 18 |
+
}
|
resources/LunarLander-v2/ExtraTrees/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:973c1bf72f20983c6262aff367d74286f4550e6b43e373cef834d6c2b81c6146
|
| 3 |
+
size 6514542
|
resources/LunarLander-v2/Neural/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "LunarLander-v2",
|
| 3 |
+
"estimator_name": "neural",
|
| 4 |
+
"seed": 44,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 100,
|
| 8 |
+
"batch_size": 256,
|
| 9 |
+
"warm_up": 260,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return":49,
|
| 17 |
+
"final_desired_horizon": 101
|
| 18 |
+
}
|
resources/LunarLander-v2/Neural/policy.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b414a79f78938bece951dd20e20e74f94da2a52e0bfe1feaf71b742aa766e0ca
|
| 3 |
+
size 174162
|
resources/LunarLander-v2/RandomForest/conf.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"env_name": "LunarLander-v2",
|
| 3 |
+
"estimator_name": "ensemble.RandomForestClassifier",
|
| 4 |
+
"seed": 43,
|
| 5 |
+
"max_episode": 500,
|
| 6 |
+
"collect_iter": 15,
|
| 7 |
+
"train_per_iter": 1,
|
| 8 |
+
"batch_size": 0,
|
| 9 |
+
"warm_up": 50,
|
| 10 |
+
"memory_size": 700,
|
| 11 |
+
"last_few": 75,
|
| 12 |
+
"testing_period": 10,
|
| 13 |
+
"horizon_scale": 0.02,
|
| 14 |
+
"return_scale": 0.02,
|
| 15 |
+
"epsilon": 0.2,
|
| 16 |
+
"final_desired_return": 57,
|
| 17 |
+
"final_desired_horizon": 102
|
| 18 |
+
}
|
resources/LunarLander-v2/RandomForest/policy.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:927333c79f366e2bcb1e6122da5632f71f88c2dbb9caa60ff6185de1dde41a03
|
| 3 |
+
size 2310018
|
resources/LunarLander-v2/info.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
{
|
| 3 |
+
"env_name": "LunarLander-v2",
|
| 4 |
+
"state": {
|
| 5 |
+
"0":["$x$","X position"],
|
| 6 |
+
"1":["$y$","Y position"],
|
| 7 |
+
"2":["$\\dot{x}$","X linear velocity"],
|
| 8 |
+
"3":["$\\dot{y}$","Y linear velocity"],
|
| 9 |
+
"4":["$\\theta$","Angle"],
|
| 10 |
+
"5":["$\\dot{\\theta}$","Angular velocity"],
|
| 11 |
+
"6":["L_contact","Left leg contact points"],
|
| 12 |
+
"7":["R_contact","Right leg contact points"]
|
| 13 |
+
}
|
| 14 |
+
}
|
udrl/app/home.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
|
| 3 |
+
st.write("TODO")
|
udrl/app/sim.py
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import gymnasium as gym
|
| 3 |
+
import numpy as np
|
| 4 |
+
import time
|
| 5 |
+
from dataclasses import dataclass, field
|
| 6 |
+
from typing import Dict, Callable, List
|
| 7 |
+
from typing_extensions import Self
|
| 8 |
+
from types import MethodType
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
import re
|
| 11 |
+
from streamlit_javascript import st_javascript
|
| 12 |
+
from skimage.transform import resize
|
| 13 |
+
from udrl.agent import UpsideDownAgent, AgentHyper
|
| 14 |
+
from udrl.policies import SklearnPolicy, NeuralPolicy
|
| 15 |
+
import altair as alt
|
| 16 |
+
import pandas as pd
|
| 17 |
+
import json
|
| 18 |
+
|
| 19 |
+
# from pylatexenc.latex2text import LatexNodes2Text
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
@dataclass
|
| 23 |
+
class BaseState:
|
| 24 |
+
callbacks: List[Callable[[Self, ...], None]]
|
| 25 |
+
|
| 26 |
+
def __post_init__(self):
|
| 27 |
+
for k, v in self.callbacks.items():
|
| 28 |
+
setattr(self, k, MethodType(v, self))
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
@dataclass
|
| 32 |
+
class State(BaseState):
|
| 33 |
+
paused: bool = True
|
| 34 |
+
next: bool = False
|
| 35 |
+
reward: float = 0
|
| 36 |
+
epoch: int = 0
|
| 37 |
+
|
| 38 |
+
env_name: str = field(init=False)
|
| 39 |
+
algo_name: str = field(init=False)
|
| 40 |
+
init_desired_return: int = field(init=False)
|
| 41 |
+
init_desired_horizon: int = field(init=False)
|
| 42 |
+
desired_return: int = field(init=False)
|
| 43 |
+
desired_horizon: int = field(init=False)
|
| 44 |
+
agent: UpsideDownAgent = field(init=False)
|
| 45 |
+
feature_importances: List[float] = field(init=False, default_factory=list)
|
| 46 |
+
env: gym.Env = field(init=False)
|
| 47 |
+
frame: np.array = field(init=False, default=None)
|
| 48 |
+
obs: np.array = field(init=False)
|
| 49 |
+
|
| 50 |
+
def __post_init__(self):
|
| 51 |
+
super().__post_init__()
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
# Function to toggle pause state
|
| 55 |
+
def toggle_pause(state: State):
|
| 56 |
+
state.paused = not state.paused
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def next_epoch(state: State):
|
| 60 |
+
state.next = True
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
def update_frame(state: State):
|
| 64 |
+
state.frame = resize(state.env.render(), (400, 600, 3))
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def reset_env(state: State):
|
| 68 |
+
state.obs, _ = state.env.reset()
|
| 69 |
+
state.desired_horizon = state.init_desired_horizon
|
| 70 |
+
state.desired_return = state.init_desired_return
|
| 71 |
+
state.reward = 0
|
| 72 |
+
state.epoch = 0
|
| 73 |
+
update_frame(state)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def sync_state(state: State):
|
| 77 |
+
state.env_name = st.session_state.get("env_name", state.env_name)
|
| 78 |
+
state.algo_name = st.session_state.get("algo_name", state.algo_name)
|
| 79 |
+
state.init_desired_return = st.session_state.get(
|
| 80 |
+
"desired_return", state.init_desired_return
|
| 81 |
+
)
|
| 82 |
+
state.init_desired_horizon = st.session_state.get(
|
| 83 |
+
"desired_horizon", state.init_desired_horizon
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
def make_env(state: State):
|
| 88 |
+
state.env = gym.make(state.env_name, render_mode="rgb_array")
|
| 89 |
+
reset_env(state)
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
def make_agent(state: State):
|
| 93 |
+
hyper = AgentHyper(state.env_name, warm_up=0)
|
| 94 |
+
policy_path = str(
|
| 95 |
+
Path("resources") / state.env_name / state.algo_name / "policy"
|
| 96 |
+
)
|
| 97 |
+
if state.algo_name == "Neural":
|
| 98 |
+
policy = NeuralPolicy.load(policy_path)
|
| 99 |
+
else:
|
| 100 |
+
policy = SklearnPolicy.load(policy_path)
|
| 101 |
+
|
| 102 |
+
state.agent = UpsideDownAgent(hyper, policy)
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
def merge_callbacks(list_fun):
|
| 106 |
+
def callback():
|
| 107 |
+
for f in list_fun:
|
| 108 |
+
f()
|
| 109 |
+
|
| 110 |
+
return callback
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
CALLBACKS = [
|
| 114 |
+
toggle_pause,
|
| 115 |
+
update_frame,
|
| 116 |
+
reset_env,
|
| 117 |
+
make_env,
|
| 118 |
+
sync_state,
|
| 119 |
+
next_epoch,
|
| 120 |
+
make_agent,
|
| 121 |
+
]
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
def init():
|
| 125 |
+
state = State({c.__name__: c for c in CALLBACKS})
|
| 126 |
+
return state
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
def get_envs():
|
| 130 |
+
return [
|
| 131 |
+
p.name
|
| 132 |
+
for p in Path("resources").iterdir()
|
| 133 |
+
if re.match(r".*-v.*", p.name)
|
| 134 |
+
]
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
def get_algo(env):
|
| 138 |
+
|
| 139 |
+
return [
|
| 140 |
+
p.name
|
| 141 |
+
for p in (Path("resources") / env).iterdir()
|
| 142 |
+
if p.name != "info.json"
|
| 143 |
+
]
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
def make_exp_parameters(state):
|
| 147 |
+
with st.form("exp_param"):
|
| 148 |
+
col1, col2, col3 = st.columns(3)
|
| 149 |
+
with col1:
|
| 150 |
+
state.env_name = st.radio(
|
| 151 |
+
"Available Environments", sorted(get_envs()), key="env_name"
|
| 152 |
+
)
|
| 153 |
+
with col2:
|
| 154 |
+
state.algo_name = st.radio(
|
| 155 |
+
"Available Estimators",
|
| 156 |
+
sorted(get_algo(state.env_name)),
|
| 157 |
+
key="algo_name",
|
| 158 |
+
)
|
| 159 |
+
with col3:
|
| 160 |
+
state.init_desired_return = st.number_input(
|
| 161 |
+
"Desired return:", step=1, key="desired_return", value=200
|
| 162 |
+
)
|
| 163 |
+
state.init_desired_horizon = st.number_input(
|
| 164 |
+
"Desired horizon:", step=1, key="desired_horizon", value=200
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
st.form_submit_button(
|
| 168 |
+
"Update Experiment",
|
| 169 |
+
on_click=merge_callbacks(
|
| 170 |
+
[state.sync_state, state.make_env, state.make_agent]
|
| 171 |
+
),
|
| 172 |
+
)
|
| 173 |
+
return state
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
@st.cache_data
|
| 177 |
+
def load_env_info(env_name):
|
| 178 |
+
info_path = Path("resources") / env_name / "info.json"
|
| 179 |
+
with open(str(info_path), "r") as f:
|
| 180 |
+
info = json.load(f)
|
| 181 |
+
return info
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
def make_viz(state):
|
| 185 |
+
with st.container(key="viz"):
|
| 186 |
+
sim_col, featur_col = st.columns([3, 2], vertical_alignment="center")
|
| 187 |
+
|
| 188 |
+
with sim_col:
|
| 189 |
+
st.header("Environment Visualization", divider=True)
|
| 190 |
+
image_placeholder = st.empty()
|
| 191 |
+
image_placeholder.image(
|
| 192 |
+
state.frame,
|
| 193 |
+
caption=f"Environment Visualization {'(Paused)' if state.paused else ''}",
|
| 194 |
+
use_column_width=True,
|
| 195 |
+
)
|
| 196 |
+
|
| 197 |
+
val = st_javascript(
|
| 198 |
+
'window.parent.document.getElementsByClassName("st-key-viz")[0].querySelector("img").height'
|
| 199 |
+
)
|
| 200 |
+
|
| 201 |
+
with featur_col:
|
| 202 |
+
st.header("Feature Importance", divider=True)
|
| 203 |
+
if state.algo_name == "Neural":
|
| 204 |
+
st.write(
|
| 205 |
+
"Unable to show Feature Importance for this estimator"
|
| 206 |
+
)
|
| 207 |
+
elif not state.feature_importances:
|
| 208 |
+
st.write(
|
| 209 |
+
"Run the simulation to calculate the feature importance"
|
| 210 |
+
)
|
| 211 |
+
elif (
|
| 212 |
+
len(state.feature_importances)
|
| 213 |
+
!= len(list(load_env_info(state.env_name)["state"].values()))
|
| 214 |
+
+ 2
|
| 215 |
+
):
|
| 216 |
+
st.write(
|
| 217 |
+
"Run the simulation to calculate the feature importance"
|
| 218 |
+
)
|
| 219 |
+
|
| 220 |
+
else:
|
| 221 |
+
data = pd.DataFrame(
|
| 222 |
+
{
|
| 223 |
+
"f": state.feature_importances,
|
| 224 |
+
"index": [
|
| 225 |
+
# LatexNodes2Text().latex_to_text(v[0])
|
| 226 |
+
v[1][:17]
|
| 227 |
+
for v in load_env_info(state.env_name)[
|
| 228 |
+
"state"
|
| 229 |
+
].values()
|
| 230 |
+
]
|
| 231 |
+
+ ["d_r", "d_t"],
|
| 232 |
+
}
|
| 233 |
+
)
|
| 234 |
+
base = (
|
| 235 |
+
alt.Chart(data)
|
| 236 |
+
.mark_bar()
|
| 237 |
+
.encode(
|
| 238 |
+
x=alt.X(
|
| 239 |
+
"f",
|
| 240 |
+
scale=alt.Scale(domain=[-10, 30]),
|
| 241 |
+
),
|
| 242 |
+
y="index:O",
|
| 243 |
+
color="index:N",
|
| 244 |
+
)
|
| 245 |
+
.properties(height=int(val))
|
| 246 |
+
)
|
| 247 |
+
|
| 248 |
+
st.altair_chart(
|
| 249 |
+
base + base.mark_text(align="left", dx=2),
|
| 250 |
+
use_container_width=True,
|
| 251 |
+
)
|
| 252 |
+
|
| 253 |
+
return state
|
| 254 |
+
|
| 255 |
+
|
| 256 |
+
def make_commands(state):
|
| 257 |
+
# Add control buttons in a horizontal layout
|
| 258 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 259 |
+
with col1:
|
| 260 |
+
st.button("Reset Environment", on_click=state.reset_env)
|
| 261 |
+
with col2:
|
| 262 |
+
st.button(
|
| 263 |
+
"Resume" if state.paused else "Pause", on_click=state.toggle_pause
|
| 264 |
+
)
|
| 265 |
+
with col3:
|
| 266 |
+
st.button("Next", on_click=state.next_epoch)
|
| 267 |
+
with col4:
|
| 268 |
+
st.button("Save")
|
| 269 |
+
return state
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
def calculate_feat_imp(state: State, ext_state):
|
| 273 |
+
if state.algo_name == "Neural":
|
| 274 |
+
state.feature_importances = []
|
| 275 |
+
return
|
| 276 |
+
|
| 277 |
+
feature_importances = {idx: [] for idx in range(ext_state.shape[1])}
|
| 278 |
+
|
| 279 |
+
for t in state.agent.policy.estimator.estimators_:
|
| 280 |
+
branch = np.array(t.decision_path(ext_state).todense(), dtype=bool)
|
| 281 |
+
imp = t.tree_.impurity[branch[0]]
|
| 282 |
+
|
| 283 |
+
for f, i in zip(t.tree_.feature[branch[0]][:-1], imp[:-1] - imp[1:]):
|
| 284 |
+
feature_importances.setdefault(f, []).append(i)
|
| 285 |
+
|
| 286 |
+
state.feature_importances = [
|
| 287 |
+
sum(feature_importances.get(k, [0.001]))
|
| 288 |
+
for k in range(len(feature_importances.keys()))
|
| 289 |
+
]
|
| 290 |
+
|
| 291 |
+
|
| 292 |
+
@st.cache_data
|
| 293 |
+
def env_info_md(env_name):
|
| 294 |
+
info = load_env_info(env_name)
|
| 295 |
+
str_info = f"Environment name: {info['env_name']}\n"
|
| 296 |
+
str_info += "State dimensions: \n"
|
| 297 |
+
str_info += " " + "\n ".join(
|
| 298 |
+
[f"{v[0]} -> {v[1]}" for k, v in info["state"].items()]
|
| 299 |
+
)
|
| 300 |
+
return str_info
|
| 301 |
+
|
| 302 |
+
|
| 303 |
+
@st.cache_data
|
| 304 |
+
def load_algo_info(env_name, algo_name):
|
| 305 |
+
info_path = Path("resources") / env_name / algo_name / "conf.json"
|
| 306 |
+
with open(str(info_path), "r") as f:
|
| 307 |
+
info = json.load(f)
|
| 308 |
+
return info
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
@st.cache_data
|
| 312 |
+
def algo_info_md(env_name, algo_name):
|
| 313 |
+
info = load_algo_info(env_name, algo_name)
|
| 314 |
+
str_info = f"Algorithm: {info['estimator_name']}\n"
|
| 315 |
+
str_info += f"Suggested Desired Return: {info['final_desired_return']}\n"
|
| 316 |
+
str_info += f"Suggested Desired Horizon: {info['final_desired_horizon']}\n"
|
| 317 |
+
full_conf = " " + "\n ".join(
|
| 318 |
+
[f"{k} -> {v}" for k, v in info.items()]
|
| 319 |
+
)
|
| 320 |
+
|
| 321 |
+
return str_info, full_conf
|
| 322 |
+
|
| 323 |
+
|
| 324 |
+
def make_metrics(state: State):
|
| 325 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 326 |
+
with col1:
|
| 327 |
+
st.metric("Epoch", state.epoch)
|
| 328 |
+
with col2:
|
| 329 |
+
st.metric("Cum Reward", state.reward)
|
| 330 |
+
with col3:
|
| 331 |
+
st.metric("Desired Return", state.desired_return)
|
| 332 |
+
with col4:
|
| 333 |
+
st.metric("Desired Horizon", state.desired_horizon)
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
def run(state: State):
|
| 337 |
+
make_exp_parameters(state)
|
| 338 |
+
if state.frame is None:
|
| 339 |
+
state.sync_state()
|
| 340 |
+
state.make_env()
|
| 341 |
+
state.make_agent()
|
| 342 |
+
make_metrics(state)
|
| 343 |
+
make_viz(state)
|
| 344 |
+
make_commands(state)
|
| 345 |
+
|
| 346 |
+
if not state.paused or state.next:
|
| 347 |
+
command = np.array(
|
| 348 |
+
[
|
| 349 |
+
state.desired_return * state.agent.conf.return_scale,
|
| 350 |
+
state.desired_horizon * state.agent.conf.horizon_scale,
|
| 351 |
+
]
|
| 352 |
+
)
|
| 353 |
+
command = np.expand_dims(command, axis=0)
|
| 354 |
+
obs = np.expand_dims(state.obs, axis=0)
|
| 355 |
+
|
| 356 |
+
action = state.agent.policy(obs, command, True)
|
| 357 |
+
|
| 358 |
+
ext_state = np.concatenate((obs, command), axis=1)
|
| 359 |
+
|
| 360 |
+
state.obs, reward, ter, tru, info = state.env.step(action)
|
| 361 |
+
|
| 362 |
+
calculate_feat_imp(state, ext_state)
|
| 363 |
+
|
| 364 |
+
# Line 8 Algorithm 2
|
| 365 |
+
state.desired_return -= reward
|
| 366 |
+
# Line 9 Algorithm 2
|
| 367 |
+
state.desired_horizon = max(state.desired_horizon - 1, 1)
|
| 368 |
+
|
| 369 |
+
state.update_frame()
|
| 370 |
+
state.next = False
|
| 371 |
+
state.epoch += 1
|
| 372 |
+
state.reward += reward
|
| 373 |
+
if ter or tru:
|
| 374 |
+
state.reset_env()
|
| 375 |
+
|
| 376 |
+
# Create a container for environment info
|
| 377 |
+
sidebar_container = st.sidebar.container()
|
| 378 |
+
with sidebar_container:
|
| 379 |
+
st.slider(
|
| 380 |
+
"Refresh Rate", min_value=1, max_value=20, key="refresh_rate"
|
| 381 |
+
)
|
| 382 |
+
st.header("Environment Info")
|
| 383 |
+
for line in env_info_md(state.env_name).split("\n"):
|
| 384 |
+
st.markdown(line)
|
| 385 |
+
st.header("Algorithm Info")
|
| 386 |
+
algo_info, conf_info = algo_info_md(state.env_name, state.algo_name)
|
| 387 |
+
for line in algo_info.split("\n"):
|
| 388 |
+
st.markdown(line)
|
| 389 |
+
with st.expander("Full Configuration"):
|
| 390 |
+
for line in conf_info.split("\n"):
|
| 391 |
+
st.markdown(line)
|
| 392 |
+
|
| 393 |
+
# Add auto-refresh logic
|
| 394 |
+
if not state.paused:
|
| 395 |
+
sleep_time = 1 - (st.session_state.refresh_rate - 1) * (1 - 0.05) / 19
|
| 396 |
+
time.sleep(sleep_time) # Add a small delay to control refresh rate
|
| 397 |
+
st.rerun()
|
| 398 |
+
|
| 399 |
+
return state
|
| 400 |
+
|
| 401 |
+
|
| 402 |
+
if "sim" not in st.session_state:
|
| 403 |
+
st.session_state.sim = init()
|
| 404 |
+
|
| 405 |
+
run(st.session_state.sim)
|