2023-07-14 22:50:55 +00:00
<!doctype html>
2024-10-08 10:03:58 +00:00
< html class = "no-js" lang = "en" data-content_root = "../../../../" >
2023-07-14 22:50:55 +00:00
< head > < meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width,initial-scale=1" / >
< meta name = "color-scheme" content = "light dark" >
< meta name = "description" content = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)" >
< meta property = "og:title" content = "Gymnasium Documentation" / >
< meta property = "og:type" content = "website" / >
< meta property = "og:description" content = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)" / >
< meta property = "og:url" content = "https://gymnasium.farama.org/_modules/gymnasium/spaces/utils.html" / > < meta property = "og:image" content = "https://gymnasium.farama.org/_static/img/gymnasium-github.png" / > < meta name = "twitter:card" content = "summary_large_image" > < link rel = "index" title = "Index" href = "../../../../genindex/" / > < link rel = "search" title = "Search" href = "../../../../search/" / >
< link rel = "canonical" href = "https://gymnasium.farama.org/_modules/gymnasium/spaces/utils.html" / >
2024-10-08 10:03:58 +00:00
< link rel = "shortcut icon" href = "../../../../_static/favicon.png" / > <!-- Generated with Sphinx 7.4.7 and Furo 2023.08.19.dev1 -->
2023-07-14 22:50:55 +00:00
< title > gymnasium.spaces.utils - Gymnasium Documentation< / title >
2025-02-26 11:56:33 +00:00
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/pygments.css?v=8f2a1f02" / >
2024-10-08 10:03:58 +00:00
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/styles/furo.css?v=3e7f4c72" / >
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/sg_gallery.css?v=61a4c737" / >
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/sg_gallery-binder.css?v=f4aeca0c" / >
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/sg_gallery-dataframe.css?v=2082cf3c" / >
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/sg_gallery-rendered-html.css?v=1277b6f3" / >
2025-02-26 11:56:33 +00:00
< link rel = "stylesheet" type = "text/css" href = "../../../../_static/styles/furo-extensions.css?v=82c8b628" / >
2023-07-14 22:50:55 +00:00
< style >
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
< / style > < / head >
< body >
< header class = "farama-header" aria-label = "Farama header" >
< div class = "farama-header__container" >
< div class = "farama-header__left--mobile" >
< label class = "nav-overlay-icon" for = "__navigation" >
< div class = "visually-hidden" > Toggle site navigation sidebar< / div >
< svg viewBox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" >
< defs > < / defs >
< line x1 = "0.5" y1 = "4" x2 = "23.5" y2 = "4" > < / line >
< line x1 = "0.232" y1 = "12" x2 = "23.5" y2 = "12" > < / line >
< line x1 = "0.232" y1 = "20" x2 = "23.5" y2 = "20" > < / line >
< / svg >
< / label >
< / div >
< div class = "farama-header__left farama-header__center--mobile" >
< a href = "../../../../" >
< img class = "farama-header__logo only-light" src = "../../../../_static/img/gymnasium_black.svg" alt = "Light Logo" / >
< img class = "farama-header__logo only-dark" src = "../../../../_static/img/gymnasium_white.svg" alt = "Dark Logo" / >
< span class = "farama-header__title" > Gymnasium Documentation< / span >
< / a >
< / div >
< div class = "farama-header__right" >
< div class = "farama-header-menu" >
< button class = "farama-header-menu__btn" aria-label = "Open Farama Menu" aria-expanded = "false" aria-haspopup = "true" aria-controls = "farama-menu" >
< img class = "farama-black-logo-invert" src = "../../../../_static/img/farama-logo-header.svg" >
< svg viewBox = "0 0 24 24" viewBox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" >
< polyline style = "stroke-linecap: round; stroke-linejoin: round; fill: none; stroke-width: 2px;" points = "1 7 12 18 23 7" > < / polyline >
< / svg >
< / button >
< div class = "farama-header-menu-container farama-hidden" aria-hidden = "true" id = "farama-menu" >
< div class = "farama-header-menu__header" >
< a href = "https://farama.org" >
< img class = "farama-header-menu__logo farama-white-logo-invert" src = "../../../../_static/img/farama_solid_white.svg" alt = "Farama Foundation logo" >
< span > Farama Foundation< / span >
< / a >
< div class = "farama-header-menu-header__right" >
< button id = "farama-close-menu" >
< svg viewBox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon-close">
< line x1 = "3" y1 = "21" x2 = "21" y2 = "3" > < / line >
< line x1 = "3" y1 = "3" x2 = "21" y2 = "21" > < / line >
< / svg >
< / button >
< / div >
< / div >
< div class = "farama-header-menu__body" >
<!-- Response from farama.org/api/projects.json -->
< / div >
< / div >
< / div >
< / div >
< / div >
< / header >
< script >
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
< / script >
< svg xmlns = "http://www.w3.org/2000/svg" style = "display: none;" >
< symbol id = "svg-toc" viewBox = "0 0 24 24" >
< title > Contents< / title >
< svg stroke = "currentColor" fill = "currentColor" stroke-width = "0" viewBox = "0 0 1024 1024" >
< path d = "M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z" / >
< / svg >
< / symbol >
< symbol id = "svg-menu" viewBox = "0 0 24 24" >
< title > Menu< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
< line x1 = "3" y1 = "12" x2 = "21" y2 = "12" > < / line >
< line x1 = "3" y1 = "6" x2 = "21" y2 = "6" > < / line >
< line x1 = "3" y1 = "18" x2 = "21" y2 = "18" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-arrow-right" viewBox = "0 0 24 24" >
< title > Expand< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
< polyline points = "9 18 15 12 9 6" > < / polyline >
< / svg >
< / symbol >
< symbol id = "svg-sun" viewBox = "0 0 24 24" >
< title > Light mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
< circle cx = "12" cy = "12" r = "5" > < / circle >
< line x1 = "12" y1 = "1" x2 = "12" y2 = "3" > < / line >
< line x1 = "12" y1 = "21" x2 = "12" y2 = "23" > < / line >
< line x1 = "4.22" y1 = "4.22" x2 = "5.64" y2 = "5.64" > < / line >
< line x1 = "18.36" y1 = "18.36" x2 = "19.78" y2 = "19.78" > < / line >
< line x1 = "1" y1 = "12" x2 = "3" y2 = "12" > < / line >
< line x1 = "21" y1 = "12" x2 = "23" y2 = "12" > < / line >
< line x1 = "4.22" y1 = "19.78" x2 = "5.64" y2 = "18.36" > < / line >
< line x1 = "18.36" y1 = "5.64" x2 = "19.78" y2 = "4.22" > < / line >
< / svg >
< / symbol >
< symbol id = "svg-moon" viewBox = "0 0 24 24" >
< title > Dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< path d = "M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" / >
< / svg >
< / symbol >
< symbol id = "svg-sun-half" viewBox = "0 0 24 24" >
< title > Auto light/dark mode< / title >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" / >
< circle cx = "12" cy = "12" r = "9" / >
< path d = "M13 12h5" / >
< path d = "M13 15h4" / >
< path d = "M13 18h1" / >
< path d = "M13 9h4" / >
< path d = "M13 6h1" / >
< / svg >
< / symbol >
< / svg >
< input type = "checkbox" class = "sidebar-toggle" name = "__navigation" id = "__navigation" >
< input type = "checkbox" class = "sidebar-toggle" name = "__toc" id = "__toc" >
< label class = "overlay sidebar-overlay" for = "__navigation" >
< div class = "visually-hidden" > Hide navigation sidebar< / div >
< / label >
< label class = "overlay toc-overlay" for = "__toc" >
< div class = "visually-hidden" > Hide table of contents sidebar< / div >
< / label >
< div class = "page" >
<!-- <header class="mobile - header">
< div class = "header-left" >
< label class = "nav-overlay-icon" for = "__navigation" >
< div class = "visually-hidden" > Toggle site navigation sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-menu" > < / use > < / svg > < / i >
< / label >
< / div >
< div class = "header-center" >
< a href = "../../../../" > < div class = "brand" > Gymnasium Documentation< / div > < / a >
< / div >
< div class = "header-right" >
< div class = "theme-toggle-container theme-toggle-header" >
< button class = "theme-toggle" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" > < use href = "#svg-sun-half" > < / use > < / svg >
< svg class = "theme-icon-when-dark" > < use href = "#svg-moon" > < / use > < / svg >
< svg class = "theme-icon-when-light" > < use href = "#svg-sun" > < / use > < / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-header-icon no-toc" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg > < use href = "#svg-toc" > < / use > < / svg > < / i >
< / label >
< / div >
< / header > -->
< aside class = "sidebar-drawer" >
< div class = "sidebar-container" >
< div class = "sidebar-sticky" > < a class = "farama-sidebar__title" href = "../../../../" >
< img class = "farama-header__logo only-light" src = "../../../../_static/img/gymnasium_black.svg" alt = "Light Logo" / >
< img class = "farama-header__logo only-dark" src = "../../../../_static/img/gymnasium_white.svg" alt = "Dark Logo" / >
< span class = "farama-header__title" > Gymnasium Documentation< / span >
< / a > < form class = "sidebar-search-container" method = "get" action = "../../../../search/" role = "search" >
< input class = "sidebar-search" placeholder = "Search" name = "q" aria-label = "Search" >
< input type = "hidden" name = "check_keywords" value = "yes" >
< input type = "hidden" name = "area" value = "default" >
< / form >
< div id = "searchbox" > < / div > < div class = "sidebar-scroll" > < div class = "sidebar-tree" >
< p class = "caption" role = "heading" > < span class = "caption-text" > Introduction< / span > < / p >
< ul >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/basic_usage/" > Basic Usage< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/train_agent/" > Training an Agent< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/create_custom_env/" > Create a Custom Environment< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/record_agent/" > Recording Agents< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/speed_up_env/" > Speeding Up Training< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/gym_compatibility/" > Compatibility with Gym< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../introduction/migration_guide/" > Migration Guide - v0.21 to v1.0.0< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > API< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../api/env/" > Env< / a > < / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../api/registry/" > Make and register< / a > < / li >
2023-07-14 22:50:55 +00:00
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../api/spaces/" > Spaces< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-1" name = "toctree-checkbox-1" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-1" > < div class = "visually-hidden" > Toggle navigation of Spaces< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/spaces/fundamental/" > Fundamental Spaces< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/spaces/composite/" > Composite Spaces< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/spaces/utils/" > Spaces Utils< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../api/wrappers/" > Wrappers< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-2" name = "toctree-checkbox-2" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-2" > < div class = "visually-hidden" > Toggle navigation of Wrappers< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/wrappers/table/" > List of Wrappers< / a > < / li >
2023-07-14 22:50:55 +00:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/wrappers/misc_wrappers/" > Misc Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/wrappers/action_wrappers/" > Action Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/wrappers/observation_wrappers/" > Observation Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/wrappers/reward_wrappers/" > Reward Wrappers< / a > < / li >
< / ul >
< / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../api/vector/" > Vectorize< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-3" name = "toctree-checkbox-3" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-3" > < div class = "visually-hidden" > Toggle navigation of Vectorize< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/vector/wrappers/" > Wrappers< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/vector/async_vector_env/" > AsyncVectorEnv< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/vector/sync_vector_env/" > SyncVectorEnv< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../api/vector/utils/" > Utility functions< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../api/utils/" > Utility functions< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../api/functional/" > Functional Env< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Environments< / span > < / p >
< ul >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../environments/classic_control/" > Classic Control< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-4" name = "toctree-checkbox-4" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-4" > < div class = "visually-hidden" > Toggle navigation of Classic Control< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/classic_control/acrobot/" > Acrobot< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/classic_control/cart_pole/" > Cart Pole< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/classic_control/mountain_car_continuous/" > Mountain Car Continuous< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/classic_control/mountain_car/" > Mountain Car< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/classic_control/pendulum/" > Pendulum< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../environments/box2d/" > Box2D< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-5" name = "toctree-checkbox-5" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-5" > < div class = "visually-hidden" > Toggle navigation of Box2D< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/box2d/bipedal_walker/" > Bipedal Walker< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/box2d/car_racing/" > Car Racing< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/box2d/lunar_lander/" > Lunar Lander< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../environments/toy_text/" > Toy Text< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-6" name = "toctree-checkbox-6" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-6" > < div class = "visually-hidden" > Toggle navigation of Toy Text< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/toy_text/blackjack/" > Blackjack< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/toy_text/taxi/" > Taxi< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/toy_text/cliff_walking/" > Cliff Walking< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/toy_text/frozen_lake/" > Frozen Lake< / a > < / li >
< / ul >
< / li >
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../environments/mujoco/" > MuJoCo< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-7" name = "toctree-checkbox-7" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-7" > < div class = "visually-hidden" > Toggle navigation of MuJoCo< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/ant/" > Ant< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/half_cheetah/" > Half Cheetah< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/hopper/" > Hopper< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/humanoid/" > Humanoid< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/humanoid_standup/" > Humanoid Standup< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/inverted_double_pendulum/" > Inverted Double Pendulum< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/inverted_pendulum/" > Inverted Pendulum< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/pusher/" > Pusher< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/reacher/" > Reacher< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/swimmer/" > Swimmer< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../environments/mujoco/walker2d/" > Walker2D< / a > < / li >
< / ul >
< / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../environments/atari/" > Atari< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../environments/third_party_environments/" > External Environments< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Tutorials< / span > < / p >
< ul >
2025-06-27 08:24:37 +00:00
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../tutorials/gymnasium_basics/" > Gymnasium Basics< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-8" name = "toctree-checkbox-8" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-8" > < div class = "visually-hidden" > Toggle navigation of Gymnasium Basics< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/gymnasium_basics/environment_creation/" > Make your own custom environment< / a > < / li >
2023-07-14 22:50:55 +00:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/gymnasium_basics/handling_time_limits/" > Handling Time Limits< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/gymnasium_basics/implementing_custom_wrappers/" > Implementing Custom Wrappers< / a > < / li >
2025-06-27 08:24:37 +00:00
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/gymnasium_basics/load_quadruped_model/" > Load custom quadruped robot environments< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< / li >
2025-06-27 08:24:37 +00:00
< li class = "toctree-l1 has-children" > < a class = "reference internal" href = "../../../../tutorials/training_agents/" > Training Agents< / a > < input class = "toctree-checkbox" id = "toctree-checkbox-9" name = "toctree-checkbox-9" role = "switch" type = "checkbox" / > < label for = "toctree-checkbox-9" > < div class = "visually-hidden" > Toggle navigation of Training Agents< / div > < i class = "icon" > < svg > < use href = "#svg-arrow-right" > < / use > < / svg > < / i > < / label > < ul >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/training_agents/blackjack_q_learning/" > Solving Blackjack with Tabular Q-Learning< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/training_agents/frozenlake_q_learning/" > Solving Frozenlake with Tabular Q-Learning< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/training_agents/mujoco_reinforce/" > Training using REINFORCE for Mujoco< / a > < / li >
< li class = "toctree-l2" > < a class = "reference internal" href = "../../../../tutorials/training_agents/vector_a2c/" > Speeding up A2C Training with Vector Envs< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../tutorials/third-party-tutorials/" > Third-Party Tutorials< / a > < / li >
2023-07-14 22:50:55 +00:00
< / ul >
< p class = "caption" role = "heading" > < span class = "caption-text" > Development< / span > < / p >
< ul >
< li class = "toctree-l1" > < a class = "reference external" href = "https://github.com/Farama-Foundation/Gymnasium" > Github< / a > < / li >
2024-10-08 10:03:58 +00:00
< li class = "toctree-l1" > < a class = "reference external" href = "https://arxiv.org/abs/2407.17032" > Paper< / a > < / li >
2023-07-14 22:50:55 +00:00
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../gymnasium_release_notes/" > Gymnasium Release Notes< / a > < / li >
< li class = "toctree-l1" > < a class = "reference internal" href = "../../../../gym_release_notes/" > Gym Release Notes< / a > < / li >
< li class = "toctree-l1" > < a class = "reference external" href = "https://github.com/Farama-Foundation/Gymnasium/blob/main/docs/README.md" > Contribute to the Docs< / a > < / li >
< / ul >
< / div >
< / div >
< / div >
< / div >
< / aside >
< div class = "main-container" >
< div class = "main" >
< div class = "content" >
< div class = "article-container" >
< a href = "#" class = "back-to-top muted-link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" >
< path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z" > < / path >
< / svg >
< span > Back to top< / span >
< / a >
< div class = "content-icon-container" > < div class = "theme-toggle-container theme-toggle-content" >
< button class = "theme-toggle" title = "Toggle color theme" >
< div class = "visually-hidden" > Toggle Light / Dark / Auto color theme< / div >
< svg class = "theme-icon-when-auto" >
< use href = "#svg-sun-half" > < / use >
< / svg >
< svg class = "theme-icon-when-dark" >
< use href = "#svg-moon" > < / use >
< / svg >
< svg class = "theme-icon-when-light" >
< use href = "#svg-sun" > < / use >
< / svg >
< / button >
< / div >
< label class = "toc-overlay-icon toc-content-icon no-toc" for = "__toc" >
< div class = "visually-hidden" > Toggle table of contents sidebar< / div >
< i class = "icon" > < svg >
< use href = "#svg-toc" > < / use >
< / svg > < / i >
< / label >
< / div >
< article role = "main" >
< h1 > Source code for gymnasium.spaces.utils< / h1 > < div class = "highlight" > < pre >
< span > < / span > < span class = "sd" > " " " Implementation of utility functions that can be applied to spaces.< / span >
< span class = "sd" > These functions mostly take care of flattening and unflattening elements of spaces< / span >
< span class = "sd" > to facilitate their usage in learning code.< / span >
< span class = "sd" > " " " < / span >
2024-10-08 10:03:58 +00:00
2025-02-26 11:56:33 +00:00
< span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > __future__< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > annotations< / span >
2023-07-14 22:50:55 +00:00
2025-02-26 11:56:33 +00:00
< span class = "kn" > import< / span > < span class = "w" > < / span > < span class = "nn" > operator< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "nn" > op< / span >
< span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > functools< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > reduce< / span > < span class = "p" > ,< / span > < span class = "n" > singledispatch< / span >
2025-06-27 08:24:37 +00:00
< span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > typing< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "n" > TypeVar< / span > < span class = "p" > ,< / span > < span class = "n" > Union< / span >
2023-07-14 22:50:55 +00:00
2025-02-26 11:56:33 +00:00
< span class = "kn" > import< / span > < span class = "w" > < / span > < span class = "nn" > numpy< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "nn" > np< / span >
< span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > numpy.typing< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "n" > NDArray< / span >
2023-07-14 22:50:55 +00:00
2025-02-26 11:56:33 +00:00
< span class = "kn" > import< / span > < span class = "w" > < / span > < span class = "nn" > gymnasium< / span > < span class = "w" > < / span > < span class = "k" > as< / span > < span class = "w" > < / span > < span class = "nn" > gym< / span >
< span class = "kn" > from< / span > < span class = "w" > < / span > < span class = "nn" > gymnasium.spaces< / span > < span class = "w" > < / span > < span class = "kn" > import< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > Box< / span > < span class = "p" > ,< / span >
< span class = "n" > Dict< / span > < span class = "p" > ,< / span >
< span class = "n" > Discrete< / span > < span class = "p" > ,< / span >
< span class = "n" > Graph< / span > < span class = "p" > ,< / span >
< span class = "n" > GraphInstance< / span > < span class = "p" > ,< / span >
< span class = "n" > MultiBinary< / span > < span class = "p" > ,< / span >
< span class = "n" > MultiDiscrete< / span > < span class = "p" > ,< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > OneOf< / span > < span class = "p" > ,< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > Sequence< / span > < span class = "p" > ,< / span >
< span class = "n" > Space< / span > < span class = "p" > ,< / span >
< span class = "n" > Text< / span > < span class = "p" > ,< / span >
< span class = "n" > Tuple< / span > < span class = "p" > ,< / span >
< span class = "p" > )< / span >
2024-10-08 10:03:58 +00:00
< div class = "viewcode-block" id = "flatdim" >
< a class = "viewcode-back" href = "../../../../api/spaces/utils/#gymnasium.spaces.utils.flatdim" > [docs]< / a >
< span class = "nd" > @singledispatch< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " Return the number of dimensions a flattened equivalent of this space would have.< / span >
< span class = "sd" > Args:< / span >
< span class = "sd" > space: The space to return the number of dimensions of the flattened spaces< / span >
< span class = "sd" > Returns:< / span >
< span class = "sd" > The number of dimensions for the flattened spaces< / span >
< span class = "sd" > Raises:< / span >
< span class = "sd" > NotImplementedError: if the space is not defined in :mod:`gym.spaces`.< / span >
< span class = "sd" > ValueError: if the space cannot be flattened into a :class:`gymnasium.spaces.Box`< / span >
< span class = "sd" > Example:< / span >
< span class = "sd" > > > > from gymnasium.spaces import Dict, Discrete< / span >
< span class = "sd" > > > > space = Dict({" position" : Discrete(2), " velocity" : Discrete(3)})< / span >
< span class = "sd" > > > > flatdim(space)< / span >
< span class = "sd" > 5< / span >
< span class = "sd" > " " " < / span >
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "ow" > is< / span > < span class = "kc" > False< / span > < span class = "p" > :< / span >
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > cannot be flattened to a numpy array, probably because it contains a `Graph` or `Sequence` subspace" < / span >
< span class = "p" > )< / span >
< span class = "k" > raise< / span > < span class = "ne" > NotImplementedError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unknown space: `< / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > `" < / span > < span class = "p" > )< / span > < / div >
2024-10-08 10:03:58 +00:00
2023-07-14 22:50:55 +00:00
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_box_multibinary< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > reduce< / span > < span class = "p" > (< / span > < span class = "n" > op< / span > < span class = "o" > .< / span > < span class = "n" > mul< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > ,< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_discrete< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "nb" > int< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > n< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_multidiscrete< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "nb" > int< / span > < span class = "p" > (< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > sum< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > nvec< / span > < span class = "p" > ))< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_tuple< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "nb" > sum< / span > < span class = "p" > (< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )< / span >
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > cannot be flattened to a numpy array, probably because it contains a `Graph` or `Sequence` subspace" < / span >
< span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_dict< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "nb" > sum< / span > < span class = "p" > (< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > values< / span > < span class = "p" > ())< / span >
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > cannot be flattened to a numpy array, probably because it contains a `Graph` or `Sequence` subspace" < / span >
< span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_graph< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Graph< / span > < span class = "p" > ):< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "s2" > " Cannot get flattened size as the Graph Space in Gym has a dynamic size." < / span >
< span class = "p" > )< / span >
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_text< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > max_length< / span >
2024-10-08 10:03:58 +00:00
< span class = "nd" > @flatdim< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatdim_oneof< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > int< / span > < span class = "p" > :< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "mi" > 1< / span > < span class = "o" > +< / span > < span class = "nb" > max< / span > < span class = "p" > (< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > T< / span > < span class = "o" > =< / span > < span class = "n" > TypeVar< / span > < span class = "p" > (< / span > < span class = "s2" > " T" < / span > < span class = "p" > )< / span >
2025-06-27 08:24:37 +00:00
< span class = "n" > FlatType< / span > < span class = "o" > =< / span > < span class = "n" > Union< / span > < span class = "p" > [< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ],< / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ],< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ],< / span > < span class = "n" > GraphInstance< / span > < span class = "p" > ]< / span >
2023-07-14 22:50:55 +00:00
2024-10-08 10:03:58 +00:00
< div class = "viewcode-block" id = "flatten" >
< a class = "viewcode-back" href = "../../../../api/spaces/utils/#gymnasium.spaces.utils.flatten" > [docs]< / a >
< span class = "nd" > @singledispatch< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > [< / span > < span class = "n" > T< / span > < span class = "p" > ],< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > T< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > FlatType< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " Flatten a data point from a space.< / span >
< span class = "sd" > This is useful when e.g. points from spaces must be passed to a neural< / span >
< span class = "sd" > network, which only understands flat arrays of floats.< / span >
< span class = "sd" > Args:< / span >
< span class = "sd" > space: The space that ``x`` is flattened by< / span >
< span class = "sd" > x: The value to flatten< / span >
< span class = "sd" > Returns:< / span >
< span class = "sd" > The flattened datapoint< / span >
< span class = "sd" > - For :class:`gymnasium.spaces.Box` and :class:`gymnasium.spaces.MultiBinary`, this is a flattened array< / span >
< span class = "sd" > - For :class:`gymnasium.spaces.Discrete` and :class:`gymnasium.spaces.MultiDiscrete`, this is a flattened one-hot array of the sample< / span >
< span class = "sd" > - For :class:`gymnasium.spaces.Tuple` and :class:`gymnasium.spaces.Dict`, this is a concatenated array the subspaces (does not support graph subspaces)< / span >
< span class = "sd" > - For graph spaces, returns :class:`GraphInstance` where:< / span >
< span class = "sd" > - :attr:`GraphInstance.nodes` are n x k arrays< / span >
< span class = "sd" > - :attr:`GraphInstance.edges` are either:< / span >
< span class = "sd" > - m x k arrays< / span >
< span class = "sd" > - None< / span >
< span class = "sd" > - :attr:`GraphInstance.edge_links` are either:< / span >
< span class = "sd" > - m x 2 arrays< / span >
< span class = "sd" > - None< / span >
< span class = "sd" > Raises:< / span >
< span class = "sd" > NotImplementedError: If the space is not defined in :mod:`gymnasium.spaces`.< / span >
< span class = "sd" > Example:< / span >
< span class = "sd" > > > > from gymnasium.spaces import Box, Discrete, Tuple< / span >
< span class = "sd" > > > > space = Box(0, 1, shape=(3, 5))< / span >
< span class = "sd" > > > > flatten(space, space.sample()).shape< / span >
< span class = "sd" > (15,)< / span >
< span class = "sd" > > > > space = Discrete(4)< / span >
< span class = "sd" > > > > flatten(space, 2)< / span >
< span class = "sd" > array([0, 0, 1, 0])< / span >
< span class = "sd" > > > > space = Tuple((Box(0, 1, shape=(2,)), Box(0, 1, shape=(3,)), Discrete(3)))< / span >
< span class = "sd" > > > > example = ((.5, .25), (1., 0., .2), 1)< / span >
< span class = "sd" > > > > flatten(space, example)< / span >
< span class = "sd" > array([0.5 , 0.25, 1. , 0. , 0.2 , 0. , 1. , 0. ])< / span >
< span class = "sd" > " " " < / span >
< span class = "k" > raise< / span > < span class = "ne" > NotImplementedError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unknown space: `< / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > `" < / span > < span class = "p" > )< / span > < / div >
2024-10-08 10:03:58 +00:00
2023-07-14 22:50:55 +00:00
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_box_multibinary< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ()< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_discrete< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Discrete< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > onehot< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > zeros< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > n< / span > < span class = "p" > ,< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "n" > onehot< / span > < span class = "p" > [< / span > < span class = "n" > x< / span > < span class = "o" > -< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span >
< span class = "k" > return< / span > < span class = "n" > onehot< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_multidiscrete< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > ]< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > ]:< / span >
< span class = "n" > offsets< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > zeros< / span > < span class = "p" > ((< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > nvec< / span > < span class = "o" > .< / span > < span class = "n" > size< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > ,),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int32< / span > < span class = "p" > )< / span >
< span class = "n" > offsets< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :]< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > cumsum< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > nvec< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ())< / span >
< span class = "n" > onehot< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > zeros< / span > < span class = "p" > ((< / span > < span class = "n" > offsets< / span > < span class = "p" > [< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ],),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "n" > onehot< / span > < span class = "p" > [< / span > < span class = "n" > offsets< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]< / span > < span class = "o" > +< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "o" > -< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ()]< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span >
< span class = "k" > return< / span > < span class = "n" > onehot< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_tuple< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Tuple< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > (< / span >
< span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > (< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > x_part< / span > < span class = "p" > ))< / span > < span class = "k" > for< / span > < span class = "n" > x_part< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )]< / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "nb" > tuple< / span > < span class = "p" > (< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > x_part< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > x_part< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ))< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_dict< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Dict< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > (< / span >
< span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > (< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > [< / span > < span class = "n" > key< / span > < span class = "p" > ]))< / span > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ()]< / span >
< span class = "p" > )< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > {< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > [< / span > < span class = "n" > key< / span > < span class = "p" > ])< / span > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ()}< / span >
2023-07-14 22:50:55 +00:00
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_graph< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Graph< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > GraphInstance< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > GraphInstance< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " We' re not using ``.unflatten()`` for :class:`Box` and :class:`Discrete` because a graph is not a homogeneous space, see `.flatten` docstring." " " < / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _graph_unflatten< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > unflatten_space< / span > < span class = "p" > :< / span > < span class = "n" > Discrete< / span > < span class = "o" > |< / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< span class = "n" > unflatten_x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "p" > ,< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< span class = "n" > ret< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span >
< span class = "k" > if< / span > < span class = "n" > unflatten_space< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "ow" > and< / span > < span class = "n" > unflatten_x< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_space< / span > < span class = "p" > ,< / span > < span class = "n" > Box< / span > < span class = "p" > ):< / span >
< span class = "n" > ret< / span > < span class = "o" > =< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > .< / span > < span class = "n" > reshape< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_space< / span > < span class = "p" > ,< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
< span class = "n" > ret< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > zeros< / span > < span class = "p" > (< / span >
< span class = "p" > (< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > unflatten_space< / span > < span class = "o" > .< / span > < span class = "n" > n< / span > < span class = "o" > -< / span > < span class = "n" > unflatten_space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span > < span class = "p" > ),< / span >
< span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > unflatten_space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > ,< / span >
< span class = "p" > )< / span >
< span class = "n" > ret< / span > < span class = "p" > [< / span >
< span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > arange< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ]),< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > -< / span > < span class = "n" > unflatten_space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span >
< span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span >
< span class = "k" > return< / span > < span class = "n" > ret< / span >
< span class = "n" > nodes< / span > < span class = "o" > =< / span > < span class = "n" > _graph_unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > node_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > nodes< / span > < span class = "p" > )< / span >
< span class = "k" > assert< / span > < span class = "n" > nodes< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span >
< span class = "n" > edges< / span > < span class = "o" > =< / span > < span class = "n" > _graph_unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > edges< / span > < span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > GraphInstance< / span > < span class = "p" > (< / span > < span class = "n" > nodes< / span > < span class = "p" > ,< / span > < span class = "n" > edges< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > edge_links< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_text< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Text< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > str< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int32< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > arr< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > full< / span > < span class = "p" > (< / span >
< span class = "n" > shape< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > max_length< / span > < span class = "p" > ,),< / span > < span class = "n" > fill_value< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > character_set< / span > < span class = "p" > ),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int32< / span >
< span class = "p" > )< / span >
< span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "p" > ,< / span > < span class = "n" > val< / span > < span class = "ow" > in< / span > < span class = "nb" > enumerate< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ):< / span >
< span class = "n" > arr< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ]< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > character_index< / span > < span class = "p" > (< / span > < span class = "n" > val< / span > < span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > arr< / span >
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_sequence< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "n" > Any< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "n" > Any< / span > < span class = "p" > :< / span >
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > stack< / span > < span class = "p" > :< / span >
< span class = "n" > samples_iters< / span > < span class = "o" > =< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > iterate< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > stacked_feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
< span class = "n" > flattened_samples< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > sample< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > sample< / span > < span class = "ow" > in< / span > < span class = "n" > samples_iters< / span >
< span class = "p" > ]< / span >
< span class = "n" > flattened_space< / span > < span class = "o" > =< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > )< / span >
< span class = "n" > out< / span > < span class = "o" > =< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > create_empty_array< / span > < span class = "p" > (< / span >
< span class = "n" > flattened_space< / span > < span class = "p" > ,< / span > < span class = "n" > n< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > flattened_samples< / span > < span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > (< / span > < span class = "n" > flattened_space< / span > < span class = "p" > ,< / span > < span class = "n" > flattened_samples< / span > < span class = "p" > ,< / span > < span class = "n" > out< / span > < span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "nb" > tuple< / span > < span class = "p" > (< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > item< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > item< / span > < span class = "ow" > in< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
2024-10-08 10:03:58 +00:00
< span class = "nd" > @flatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_oneof< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > OneOf< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > idx< / span > < span class = "p" > ,< / span > < span class = "n" > sample< / span > < span class = "o" > =< / span > < span class = "n" > x< / span >
< span class = "n" > sub_space< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > [< / span > < span class = "n" > idx< / span > < span class = "p" > ]< / span >
< span class = "n" > flat_sample< / span > < span class = "o" > =< / span > < span class = "n" > flatten< / span > < span class = "p" > (< / span > < span class = "n" > sub_space< / span > < span class = "p" > ,< / span > < span class = "n" > sample< / span > < span class = "p" > )< / span >
< span class = "n" > max_flatdim< / span > < span class = "o" > =< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > )< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "c1" > # Don' t include the index< / span >
< span class = "k" > if< / span > < span class = "n" > flat_sample< / span > < span class = "o" > .< / span > < span class = "n" > size< / span > < span class = "o" > < < / span > < span class = "n" > max_flatdim< / span > < span class = "p" > :< / span >
< span class = "n" > padding< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > full< / span > < span class = "p" > (< / span >
< span class = "n" > max_flatdim< / span > < span class = "o" > -< / span > < span class = "n" > flat_sample< / span > < span class = "o" > .< / span > < span class = "n" > size< / span > < span class = "p" > ,< / span > < span class = "n" > flat_sample< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > flat_sample< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span >
< span class = "p" > )< / span >
< span class = "n" > flat_sample< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([< / span > < span class = "n" > flat_sample< / span > < span class = "p" > ,< / span > < span class = "n" > padding< / span > < span class = "p" > ])< / span >
< span class = "k" > return< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([[< / span > < span class = "n" > idx< / span > < span class = "p" > ],< / span > < span class = "n" > flat_sample< / span > < span class = "p" > ])< / span >
< div class = "viewcode-block" id = "unflatten" >
< a class = "viewcode-back" href = "../../../../api/spaces/utils/#gymnasium.spaces.utils.unflatten" > [docs]< / a >
< span class = "nd" > @singledispatch< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > [< / span > < span class = "n" > T< / span > < span class = "p" > ],< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > FlatType< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > T< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " Unflatten a data point from a space.< / span >
< span class = "sd" > This reverses the transformation applied by :func:`flatten`. You must ensure< / span >
< span class = "sd" > that the ``space`` argument is the same as for the :func:`flatten` call.< / span >
< span class = "sd" > Args:< / span >
< span class = "sd" > space: The space used to unflatten ``x``< / span >
< span class = "sd" > x: The array to unflatten< / span >
< span class = "sd" > Returns:< / span >
< span class = "sd" > A point with a structure that matches the space.< / span >
< span class = "sd" > Raises:< / span >
< span class = "sd" > NotImplementedError: if the space is not defined in :mod:`gymnasium.spaces`.< / span >
< span class = "sd" > " " " < / span >
< span class = "k" > raise< / span > < span class = "ne" > NotImplementedError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unknown space: `< / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > `" < / span > < span class = "p" > )< / span > < / div >
2024-10-08 10:03:58 +00:00
2023-07-14 22:50:55 +00:00
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_box_multibinary< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
< span class = "k" > return< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > reshape< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > )< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_discrete< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Discrete< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > nonzero< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > nonzero< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
< span class = "k" > if< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > nonzero< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span > < span class = "o" > ==< / span > < span class = "mi" > 0< / span > < span class = "p" > :< / span >
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > x< / span > < span class = "si" > }< / span > < span class = "s2" > is not a valid one-hot encoded vector and can not be unflattened to space < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > . " < / span >
< span class = "s2" > " Not all valid samples in a flattened space can be unflattened." < / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span > < span class = "o" > +< / span > < span class = "n" > nonzero< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ][< / span > < span class = "mi" > 0< / span > < span class = "p" > ]< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_multidiscrete< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > integer< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]]< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > integer< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]]:< / span >
< span class = "n" > offsets< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > zeros< / span > < span class = "p" > ((< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > nvec< / span > < span class = "o" > .< / span > < span class = "n" > size< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span > < span class = "p" > ,),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "n" > offsets< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :]< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > cumsum< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > nvec< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > ())< / span >
2025-06-27 08:24:37 +00:00
< span class = "p" > (< / span > < span class = "n" > indices< / span > < span class = "p" > ,)< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > nonzero< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
< span class = "k" > if< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > indices< / span > < span class = "p" > )< / span > < span class = "o" > ==< / span > < span class = "mi" > 0< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > raise< / span > < span class = "ne" > ValueError< / span > < span class = "p" > (< / span >
< span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > x< / span > < span class = "si" > }< / span > < span class = "s2" > is not a concatenation of one-hot encoded vectors and can not be unflattened to space < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > . " < / span >
< span class = "s2" > " Not all valid samples in a flattened space can be unflattened." < / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > (< / span > < span class = "n" > indices< / span > < span class = "o" > -< / span > < span class = "n" > offsets< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > reshape< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > )< / span >
< span class = "o" > +< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > start< / span >
< span class = "p" > )< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_tuple< / span > < span class = "p" > (< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Tuple< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]< / span >
< span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]:< / span >
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span >
< span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > ndarray< / span >
< span class = "p" > ),< / span > < span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > is numpy-flattenable. Thus, you should only unflatten numpy arrays for this space. Got a < / span > < span class = "si" > {< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > )< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span >
< span class = "n" > dims< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > ([< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ],< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int_< / span > < span class = "p" > )< / span >
< span class = "n" > list_flattened< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > split< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > cumsum< / span > < span class = "p" > (< / span > < span class = "n" > dims< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]))< / span >
< span class = "k" > return< / span > < span class = "nb" > tuple< / span > < span class = "p" > (< / span >
< span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > flattened< / span > < span class = "p" > )< / span >
< span class = "k" > for< / span > < span class = "n" > flattened< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > list_flattened< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span >
< span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "nb" > tuple< / span >
< span class = "p" > ),< / span > < span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > is not numpy-flattenable. Thus, you should only unflatten tuples for this space. Got a < / span > < span class = "si" > {< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > )< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span >
< span class = "k" > return< / span > < span class = "nb" > tuple< / span > < span class = "p" > (< / span > < span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > flattened< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > flattened< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ))< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_dict< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Dict< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > dict< / span > < span class = "p" > [< / span > < span class = "nb" > str< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "n" > dims< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > ([< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > values< / span > < span class = "p" > ()],< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int_< / span > < span class = "p" > )< / span >
< span class = "n" > list_flattened< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > split< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > cumsum< / span > < span class = "p" > (< / span > < span class = "n" > dims< / span > < span class = "p" > [:< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ]))< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > {< / span >
< span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > flattened< / span > < span class = "p" > )< / span >
< span class = "k" > for< / span > < span class = "n" > flattened< / span > < span class = "p" > ,< / span > < span class = "p" > (< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "ow" > in< / span > < span class = "nb" > zip< / span > < span class = "p" > (< / span > < span class = "n" > list_flattened< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ())< / span >
< span class = "p" > }< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > assert< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span >
< span class = "n" > x< / span > < span class = "p" > ,< / span > < span class = "nb" > dict< / span >
< span class = "p" > ),< / span > < span class = "sa" > f< / span > < span class = "s2" > " < / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > is not numpy-flattenable. Thus, you should only unflatten dictionary for this space. Got a < / span > < span class = "si" > {< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > )< / span > < span class = "si" > }< / span > < span class = "s2" > " < / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > {< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > [< / span > < span class = "n" > key< / span > < span class = "p" > ])< / span > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ()}< / span >
2023-07-14 22:50:55 +00:00
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_graph< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Graph< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > GraphInstance< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > GraphInstance< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " We' re not using `.unflatten() for :class:`Box` and :class:`Discrete` because a graph is not a homogeneous space.< / span >
< span class = "sd" > The size of the outcome is actually not fixed, but determined based on the number of< / span >
< span class = "sd" > nodes and edges in the graph.< / span >
< span class = "sd" > " " " < / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _graph_unflatten< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_space< / span > < span class = "p" > ,< / span > < span class = "n" > unflatten_x< / span > < span class = "p" > ):< / span >
2023-07-14 22:50:55 +00:00
< span class = "n" > result< / span > < span class = "o" > =< / span > < span class = "kc" > None< / span >
< span class = "k" > if< / span > < span class = "n" > unflatten_space< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "ow" > and< / span > < span class = "n" > unflatten_x< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "p" > :< / span >
< span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_space< / span > < span class = "p" > ,< / span > < span class = "n" > Box< / span > < span class = "p" > ):< / span >
< span class = "n" > result< / span > < span class = "o" > =< / span > < span class = "n" > unflatten_x< / span > < span class = "o" > .< / span > < span class = "n" > reshape< / span > < span class = "p" > (< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "o" > *< / span > < span class = "n" > unflatten_space< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "p" > )< / span >
< span class = "k" > elif< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_space< / span > < span class = "p" > ,< / span > < span class = "n" > Discrete< / span > < span class = "p" > ):< / span >
< span class = "n" > result< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > asarray< / span > < span class = "p" > (< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > nonzero< / span > < span class = "p" > (< / span > < span class = "n" > unflatten_x< / span > < span class = "p" > ))[< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "p" > :]< / span >
< span class = "k" > return< / span > < span class = "n" > result< / span >
< span class = "n" > nodes< / span > < span class = "o" > =< / span > < span class = "n" > _graph_unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > node_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > nodes< / span > < span class = "p" > )< / span >
< span class = "n" > edges< / span > < span class = "o" > =< / span > < span class = "n" > _graph_unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > edges< / span > < span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > GraphInstance< / span > < span class = "p" > (< / span > < span class = "n" > nodes< / span > < span class = "p" > ,< / span > < span class = "n" > edges< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "o" > .< / span > < span class = "n" > edge_links< / span > < span class = "p" > )< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_text< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Text< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int32< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > str< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "s2" > " " < / span > < span class = "o" > .< / span > < span class = "n" > join< / span > < span class = "p" > (< / span >
< span class = "p" > [< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > character_list< / span > < span class = "p" > [< / span > < span class = "n" > val< / span > < span class = "p" > ]< / span > < span class = "k" > for< / span > < span class = "n" > val< / span > < span class = "ow" > in< / span > < span class = "n" > x< / span > < span class = "k" > if< / span > < span class = "n" > val< / span > < span class = "o" > < < / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > character_set< / span > < span class = "p" > )]< / span >
< span class = "p" > )< / span >
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_sequence< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ,< / span > < span class = "o" > ...< / span > < span class = "p" > ]< / span > < span class = "o" > |< / span > < span class = "n" > Any< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > stack< / span > < span class = "p" > :< / span >
< span class = "n" > flattened_space< / span > < span class = "o" > =< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > )< / span >
< span class = "n" > flatten_iters< / span > < span class = "o" > =< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > iterate< / span > < span class = "p" > (< / span > < span class = "n" > flattened_space< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
< span class = "n" > unflattened_samples< / span > < span class = "o" > =< / span > < span class = "p" > [< / span >
< span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > sample< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > sample< / span > < span class = "ow" > in< / span > < span class = "n" > flatten_iters< / span >
< span class = "p" > ]< / span >
< span class = "n" > out< / span > < span class = "o" > =< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > create_empty_array< / span > < span class = "p" > (< / span >
< span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > unflattened_samples< / span > < span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > gym< / span > < span class = "o" > .< / span > < span class = "n" > vector< / span > < span class = "o" > .< / span > < span class = "n" > utils< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > (< / span >
< span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > unflattened_samples< / span > < span class = "p" > ,< / span > < span class = "n" > out< / span >
< span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "k" > return< / span > < span class = "nb" > tuple< / span > < span class = "p" > (< / span > < span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > item< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > item< / span > < span class = "ow" > in< / span > < span class = "n" > x< / span > < span class = "p" > )< / span >
2024-10-08 10:03:58 +00:00
< span class = "nd" > @unflatten< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _unflatten_oneof< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > OneOf< / span > < span class = "p" > ,< / span > < span class = "n" > x< / span > < span class = "p" > :< / span > < span class = "n" > NDArray< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "nb" > tuple< / span > < span class = "p" > [< / span > < span class = "nb" > int< / span > < span class = "p" > ,< / span > < span class = "n" > Any< / span > < span class = "p" > ]:< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > idx< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int64< / span > < span class = "p" > (< / span > < span class = "n" > x< / span > < span class = "p" > [< / span > < span class = "mi" > 0< / span > < span class = "p" > ])< / span >
< span class = "n" > sub_space< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > [< / span > < span class = "n" > idx< / span > < span class = "p" > ]< / span >
< span class = "n" > original_size< / span > < span class = "o" > =< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > sub_space< / span > < span class = "p" > )< / span >
< span class = "n" > trimmed_sample< / span > < span class = "o" > =< / span > < span class = "n" > x< / span > < span class = "p" > [< / span > < span class = "mi" > 1< / span > < span class = "p" > :< / span > < span class = "mi" > 1< / span > < span class = "o" > +< / span > < span class = "n" > original_size< / span > < span class = "p" > ]< / span >
< span class = "k" > return< / span > < span class = "n" > idx< / span > < span class = "p" > ,< / span > < span class = "n" > unflatten< / span > < span class = "p" > (< / span > < span class = "n" > sub_space< / span > < span class = "p" > ,< / span > < span class = "n" > trimmed_sample< / span > < span class = "p" > )< / span >
< div class = "viewcode-block" id = "flatten_space" >
< a class = "viewcode-back" href = "../../../../api/spaces/utils/#gymnasium.spaces.utils.flatten_space" > [docs]< / a >
< span class = "nd" > @singledispatch< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > [< / span > < span class = "n" > Any< / span > < span class = "p" > ])< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > Dict< / span > < span class = "o" > |< / span > < span class = "n" > Sequence< / span > < span class = "o" > |< / span > < span class = "n" > Tuple< / span > < span class = "o" > |< / span > < span class = "n" > Graph< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " Flatten a space into a space that is as flat as possible.< / span >
< span class = "sd" > This function will attempt to flatten ``space`` into a single :class:`gymnasium.spaces.Box` space.< / span >
< span class = "sd" > However, this might not be possible when ``space`` is an instance of :class:`gymnasium.spaces.Graph`,< / span >
< span class = "sd" > :class:`gymnasium.spaces.Sequence` or a compound space that contains a :class:`gymnasium.spaces.Graph`< / span >
< span class = "sd" > or :class:`gymnasium.spaces.Sequence` space.< / span >
< span class = "sd" > This is equivalent to :func:`flatten`, but operates on the space itself. The< / span >
< span class = "sd" > result for non-graph spaces is always a :class:`gymnasium.spaces.Box` with flat boundaries. While< / span >
< span class = "sd" > the result for graph spaces is always a :class:`gymnasium.spaces.Graph` with< / span >
< span class = "sd" > :attr:`Graph.node_space` being a ``Box``< / span >
< span class = "sd" > with flat boundaries and :attr:`Graph.edge_space` being a ``Box`` with flat boundaries or< / span >
< span class = "sd" > ``None``. The box has exactly :func:`flatdim` dimensions. Flattening a sample< / span >
< span class = "sd" > of the original space has the same effect as taking a sample of the flattened< / span >
< span class = "sd" > space. However, sampling from the flattened space is not necessarily reversible.< / span >
< span class = "sd" > For example, sampling from a flattened Discrete space is the same as sampling from< / span >
< span class = "sd" > a Box, and the results may not be integers or one-hot encodings. This may result in< / span >
< span class = "sd" > errors or non-uniform sampling.< / span >
< span class = "sd" > Args:< / span >
< span class = "sd" > space: The space to flatten< / span >
< span class = "sd" > Returns:< / span >
< span class = "sd" > A flattened Box< / span >
< span class = "sd" > Raises:< / span >
< span class = "sd" > NotImplementedError: if the space is not defined in :mod:`gymnasium.spaces`.< / span >
2024-10-08 10:03:58 +00:00
< span class = "sd" > Example - Flatten spaces.Box:< / span >
2023-07-14 22:50:55 +00:00
< span class = "sd" > > > > from gymnasium.spaces import Box< / span >
< span class = "sd" > > > > box = Box(0.0, 1.0, shape=(3, 4, 5))< / span >
< span class = "sd" > > > > box< / span >
< span class = "sd" > Box(0.0, 1.0, (3, 4, 5), float32)< / span >
< span class = "sd" > > > > flatten_space(box)< / span >
< span class = "sd" > Box(0.0, 1.0, (60,), float32)< / span >
< span class = "sd" > > > > flatten(box, box.sample()) in flatten_space(box)< / span >
< span class = "sd" > True< / span >
2024-10-08 10:03:58 +00:00
< span class = "sd" > Example - Flatten spaces.Discrete:< / span >
2023-07-14 22:50:55 +00:00
< span class = "sd" > > > > from gymnasium.spaces import Discrete< / span >
< span class = "sd" > > > > discrete = Discrete(5)< / span >
< span class = "sd" > > > > flatten_space(discrete)< / span >
< span class = "sd" > Box(0, 1, (5,), int64)< / span >
< span class = "sd" > > > > flatten(discrete, discrete.sample()) in flatten_space(discrete)< / span >
< span class = "sd" > True< / span >
2024-10-08 10:03:58 +00:00
< span class = "sd" > Example - Flatten spaces.Dict:< / span >
2023-07-14 22:50:55 +00:00
< span class = "sd" > > > > from gymnasium.spaces import Dict, Discrete, Box< / span >
< span class = "sd" > > > > space = Dict({" position" : Discrete(2), " velocity" : Box(0, 1, shape=(2, 2))})< / span >
< span class = "sd" > > > > flatten_space(space)< / span >
< span class = "sd" > Box(0.0, 1.0, (6,), float64)< / span >
< span class = "sd" > > > > flatten(space, space.sample()) in flatten_space(space)< / span >
< span class = "sd" > True< / span >
2024-10-08 10:03:58 +00:00
< span class = "sd" > Example - Flatten spaces.Graph:< / span >
2023-07-14 22:50:55 +00:00
< span class = "sd" > > > > from gymnasium.spaces import Graph, Discrete, Box< / span >
< span class = "sd" > > > > space = Graph(node_space=Box(low=-100, high=100, shape=(3, 4)), edge_space=Discrete(5))< / span >
< span class = "sd" > > > > flatten_space(space)< / span >
< span class = "sd" > Graph(Box(-100.0, 100.0, (12,), float32), Box(0, 1, (5,), int64))< / span >
< span class = "sd" > > > > flatten(space, space.sample()) in flatten_space(space)< / span >
< span class = "sd" > True< / span >
< span class = "sd" > " " " < / span >
< span class = "k" > raise< / span > < span class = "ne" > NotImplementedError< / span > < span class = "p" > (< / span > < span class = "sa" > f< / span > < span class = "s2" > " Unknown space: `< / span > < span class = "si" > {< / span > < span class = "n" > space< / span > < span class = "si" > }< / span > < span class = "s2" > `" < / span > < span class = "p" > )< / span > < / div >
2024-10-08 10:03:58 +00:00
2023-07-14 22:50:55 +00:00
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_box< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > low< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > (),< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > high< / span > < span class = "o" > .< / span > < span class = "n" > flatten< / span > < span class = "p" > (),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_binary< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Discrete< / span > < span class = "o" > |< / span > < span class = "n" > MultiBinary< / span > < span class = "o" > |< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span > < span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > shape< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > ),),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_tuple< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > Tuple< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "n" > space_list< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ]< / span >
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span >
< span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > low< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > high< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > result_type< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "p" > [< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > Tuple< / span > < span class = "p" > (< / span > < span class = "n" > spaces< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ])< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_dict< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "o" > |< / span > < span class = "n" > Dict< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > is_np_flattenable< / span > < span class = "p" > :< / span >
< span class = "n" > space_list< / span > < span class = "o" > =< / span > < span class = "p" > [< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > values< / span > < span class = "p" > ()]< / span >
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span >
< span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > low< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > high< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > result_type< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "p" > [< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space_list< / span > < span class = "p" > ]),< / span >
< span class = "p" > )< / span >
< span class = "k" > return< / span > < span class = "n" > Dict< / span > < span class = "p" > (< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > spaces< / span > < span class = "o" > =< / span > < span class = "p" > {< / span > < span class = "n" > key< / span > < span class = "p" > :< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "p" > ,< / span > < span class = "n" > space< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "o" > .< / span > < span class = "n" > items< / span > < span class = "p" > ()}< / span >
2023-07-14 22:50:55 +00:00
< span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_graph< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Graph< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > Graph< / span > < span class = "p" > (< / span >
< span class = "n" > node_space< / span > < span class = "o" > =< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > node_space< / span > < span class = "p" > ),< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > edge_space< / span > < span class = "o" > =< / span > < span class = "p" > (< / span >
< span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "p" > )< / span > < span class = "k" > if< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span > < span class = "k" > else< / span > < span class = "kc" > None< / span >
< span class = "p" > ),< / span >
2023-07-14 22:50:55 +00:00
< span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_text< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span >
< span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "mi" > 0< / span > < span class = "p" > ,< / span > < span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > character_set< / span > < span class = "p" > ),< / span > < span class = "n" > shape< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > max_length< / span > < span class = "p" > ,),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > int32< / span >
< span class = "p" > )< / span >
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_sequence< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Sequence< / span > < span class = "p" > :< / span >
2023-07-14 22:50:55 +00:00
< span class = "k" > return< / span > < span class = "n" > Sequence< / span > < span class = "p" > (< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ),< / span > < span class = "n" > stack< / span > < span class = "o" > =< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > stack< / span > < span class = "p" > )< / span >
2024-10-08 10:03:58 +00:00
< span class = "nd" > @flatten_space< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _flatten_space_oneof< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "p" > :< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "n" > Box< / span > < span class = "p" > :< / span >
2024-10-08 10:03:58 +00:00
< span class = "n" > num_subspaces< / span > < span class = "o" > =< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )< / span >
< span class = "n" > max_flatdim< / span > < span class = "o" > =< / span > < span class = "nb" > max< / span > < span class = "p" > (< / span > < span class = "n" > flatdim< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > )< / span > < span class = "o" > +< / span > < span class = "mi" > 1< / span >
< span class = "n" > lows< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > ([< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > min< / span > < span class = "p" > (< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > low< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ])< / span >
< span class = "n" > highs< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > array< / span > < span class = "p" > ([< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > max< / span > < span class = "p" > (< / span > < span class = "n" > flatten_space< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > )< / span > < span class = "o" > .< / span > < span class = "n" > high< / span > < span class = "p" > )< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "p" > ])< / span >
< span class = "n" > overall_low< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > min< / span > < span class = "p" > (< / span > < span class = "n" > lows< / span > < span class = "p" > )< / span >
< span class = "n" > overall_high< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > max< / span > < span class = "p" > (< / span > < span class = "n" > highs< / span > < span class = "p" > )< / span >
< span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([[< / span > < span class = "mi" > 0< / span > < span class = "p" > ],< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > full< / span > < span class = "p" > (< / span > < span class = "n" > max_flatdim< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > overall_low< / span > < span class = "p" > )])< / span >
< span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > concatenate< / span > < span class = "p" > ([[< / span > < span class = "n" > num_subspaces< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ],< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > full< / span > < span class = "p" > (< / span > < span class = "n" > max_flatdim< / span > < span class = "o" > -< / span > < span class = "mi" > 1< / span > < span class = "p" > ,< / span > < span class = "n" > overall_high< / span > < span class = "p" > )])< / span >
< span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > np< / span > < span class = "o" > .< / span > < span class = "n" > result_type< / span > < span class = "p" > (< / span > < span class = "o" > *< / span > < span class = "p" > [< / span > < span class = "n" > s< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "k" > for< / span > < span class = "n" > s< / span > < span class = "ow" > in< / span > < span class = "n" > space< / span > < span class = "o" > .< / span > < span class = "n" > spaces< / span > < span class = "k" > if< / span > < span class = "nb" > hasattr< / span > < span class = "p" > (< / span > < span class = "n" > s< / span > < span class = "p" > ,< / span > < span class = "s2" > " dtype" < / span > < span class = "p" > )])< / span >
< span class = "k" > return< / span > < span class = "n" > Box< / span > < span class = "p" > (< / span > < span class = "n" > low< / span > < span class = "o" > =< / span > < span class = "n" > low< / span > < span class = "p" > ,< / span > < span class = "n" > high< / span > < span class = "o" > =< / span > < span class = "n" > high< / span > < span class = "p" > ,< / span > < span class = "n" > shape< / span > < span class = "o" > =< / span > < span class = "p" > (< / span > < span class = "n" > max_flatdim< / span > < span class = "p" > ,),< / span > < span class = "n" > dtype< / span > < span class = "o" > =< / span > < span class = "n" > dtype< / span > < span class = "p" > )< / span >
< span class = "nd" > @singledispatch< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > :< / span > < span class = "n" > Space< / span > < span class = "p" > )< / span > < span class = "o" > -> < / span > < span class = "nb" > bool< / span > < span class = "p" > :< / span >
2024-10-08 10:03:58 +00:00
< span class = "w" > < / span > < span class = "sd" > " " " Returns if two spaces share a common dtype and shape (plus any critical variables).< / span >
< span class = "sd" > This function is primarily used to check for compatibility of different spaces in a vector environment.< / span >
< span class = "sd" > Args:< / span >
< span class = "sd" > space_1: A Gymnasium space< / span >
< span class = "sd" > space_2: A Gymnasium space< / span >
< span class = "sd" > Returns:< / span >
< span class = "sd" > If the two spaces share a common dtype and shape (plus any critical variables).< / span >
< span class = "sd" > " " " < / span >
< span class = "k" > if< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > ,< / span > < span class = "n" > Space< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Space< / span > < span class = "p" > ):< / span >
< span class = "k" > raise< / span > < span class = "ne" > NotImplementedError< / span > < span class = "p" > (< / span >
< span class = "s2" > " `check_dtype_shape_equivalence` doesn' t support Generic Gymnasium Spaces, " < / span >
< span class = "p" > )< / span >
< span class = "k" > else< / span > < span class = "p" > :< / span >
< span class = "k" > raise< / span > < span class = "ne" > TypeError< / span > < span class = "p" > ()< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Box< / span > < span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Discrete< / span > < span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiDiscrete< / span > < span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > MultiBinary< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_fundamental_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "c1" > # this check is necessary as singledispatch only checks the first variable and there are many options< / span >
< span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > )< / span > < span class = "ow" > is< / span > < span class = "nb" > type< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span > < span class = "o" > ==< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > shape< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span > < span class = "o" > ==< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > dtype< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_text_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > Text< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Text< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > max_length< / span > < span class = "o" > ==< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > max_length< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > character_set< / span > < span class = "o" > ==< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > character_set< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_dict_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > Dict< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Dict< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span > < span class = "o" > ==< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span >
< span class = "ow" > and< / span > < span class = "nb" > all< / span > < span class = "p" > (< / span >
< span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > [< / span > < span class = "n" > key< / span > < span class = "p" > ],< / span > < span class = "n" > space_2< / span > < span class = "p" > [< / span > < span class = "n" > key< / span > < span class = "p" > ])< / span >
< span class = "k" > for< / span > < span class = "n" > key< / span > < span class = "ow" > in< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > keys< / span > < span class = "p" > ()< / span >
< span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_tuple_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Tuple< / span > < span class = "p" > )< / span > < span class = "ow" > and< / span > < span class = "nb" > all< / span > < span class = "p" > (< / span >
< span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ],< / span > < span class = "n" > space_2< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ])< / span > < span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "ow" > in< / span > < span class = "nb" > range< / span > < span class = "p" > (< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > ))< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_graph_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > Graph< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Graph< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > node_space< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > node_space< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "p" > (< / span >
< span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "ow" > is< / span > < span class = "kc" > None< / span > < span class = "ow" > and< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "ow" > is< / span > < span class = "kc" > None< / span > < span class = "p" > )< / span >
< span class = "ow" > or< / span > < span class = "p" > (< / span >
< span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span >
< span class = "ow" > and< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "ow" > is< / span > < span class = "ow" > not< / span > < span class = "kc" > None< / span >
< span class = "ow" > and< / span > < span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > edge_space< / span > < span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_oneof_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > OneOf< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > OneOf< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > )< / span > < span class = "o" > ==< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "nb" > all< / span > < span class = "p" > (< / span >
< span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ],< / span > < span class = "n" > space_2< / span > < span class = "p" > [< / span > < span class = "n" > i< / span > < span class = "p" > ])< / span >
< span class = "k" > for< / span > < span class = "n" > i< / span > < span class = "ow" > in< / span > < span class = "nb" > range< / span > < span class = "p" > (< / span > < span class = "nb" > len< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > ))< / span >
< span class = "p" > )< / span >
< span class = "p" > )< / span >
< span class = "nd" > @is_space_dtype_shape_equiv< / span > < span class = "o" > .< / span > < span class = "n" > register< / span > < span class = "p" > (< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span >
2025-02-26 11:56:33 +00:00
< span class = "k" > def< / span > < span class = "w" > < / span > < span class = "nf" > _is_space_sequence_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "p" > :< / span > < span class = "n" > Sequence< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "p" > ):< / span >
2024-10-08 10:03:58 +00:00
< span class = "k" > return< / span > < span class = "p" > (< / span >
< span class = "nb" > isinstance< / span > < span class = "p" > (< / span > < span class = "n" > space_2< / span > < span class = "p" > ,< / span > < span class = "n" > Sequence< / span > < span class = "p" > )< / span >
< span class = "ow" > and< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > stack< / span > < span class = "ow" > is< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > stack< / span >
< span class = "ow" > and< / span > < span class = "n" > is_space_dtype_shape_equiv< / span > < span class = "p" > (< / span > < span class = "n" > space_1< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > ,< / span > < span class = "n" > space_2< / span > < span class = "o" > .< / span > < span class = "n" > feature_space< / span > < span class = "p" > )< / span >
< span class = "p" > )< / span >
2023-07-14 22:50:55 +00:00
< / pre > < / div >
< / article >
< / div >
< footer >
< div class = "related-pages" >
< / div >
< div class = "bottom-of-page" >
< div class = "left-details" >
< div class = "copyright" >
2025-02-26 11:56:33 +00:00
Copyright © 2025 Farama Foundation
2023-07-14 22:50:55 +00:00
< / div >
<!--
Made with < a href = "https://www.sphinx-doc.org/" > Sphinx< / a > and < a class = "muted-link" href = "https://pradyunsg.me" > @pradyunsg< / a > 's
< a href = "https://github.com/pradyunsg/furo" > Furo< / a >
-->
< / div >
< div class = "right-details" >
< div class = "icons" >
< a class = "muted-link" href = "https://github.com/Farama-Foundation/Gymnasium/"
aria-label="On GitHub">
< svg stroke = "currentColor" fill = "currentColor" stroke-width = "0" viewBox = "0 0 16 16" >
< path fill-rule = "evenodd"
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z">
< / path >
< / svg >
< / a >
< / div >
< / div >
< / div >
< / footer >
< / div >
< aside class = "toc-drawer no-toc" >
< / aside >
< / div >
< / div >
< / div >
< script >
const toggleMenu = () => {
const menuBtn = document.querySelector(".farama-header-menu__btn");
const menuContainer = document.querySelector(".farama-header-menu-container");
if (document.querySelector(".farama-header-menu").classList.contains("active")) {
menuBtn.setAttribute("aria-expanded", "false");
menuContainer.setAttribute("aria-hidden", "true");
} else {
menuBtn.setAttribute("aria-expanded", "true");
menuContainer.setAttribute("aria-hidden", "false");
}
document.querySelector(".farama-header-menu").classList.toggle("active");
}
document.querySelector(".farama-header-menu__btn").addEventListener("click", toggleMenu);
document.getElementById("farama-close-menu").addEventListener("click", toggleMenu);
< / script >
2024-10-08 10:03:58 +00:00
< script async src = "https://www.googletagmanager.com/gtag/js?id=G-6H9C8TWXZ8" > < / script >
2023-07-14 22:50:55 +00:00
< script >
2024-10-08 10:03:58 +00:00
const enableGtag = () => {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-6H9C8TWXZ8');
}
(() => {
if (!localStorage.getItem("acceptedCookieAlert")) {
const boxElem = document.createElement("div");
boxElem.classList.add("cookie-alert");
const containerElem = document.createElement("div");
containerElem.classList.add("cookie-alert__container");
const textElem = document.createElement("p");
textElem.innerHTML = `This page uses < a href = "https://analytics.google.com/" >
Google Analytics< / a > to collect statistics.`;
containerElem.appendChild(textElem);
const declineBtn = Object.assign(document.createElement("button"),
{
innerText: "Deny",
className: "farama-btn cookie-alert__button",
id: "cookie-alert__decline",
}
);
declineBtn.addEventListener("click", () => {
localStorage.setItem("acceptedCookieAlert", false);
boxElem.remove();
});
const acceptBtn = Object.assign(document.createElement("button"),
{
innerText: "Allow",
className: "farama-btn cookie-alert__button",
id: "cookie-alert__accept",
}
);
acceptBtn.addEventListener("click", () => {
localStorage.setItem("acceptedCookieAlert", true);
boxElem.remove();
enableGtag();
});
containerElem.appendChild(declineBtn);
containerElem.appendChild(acceptBtn);
boxElem.appendChild(containerElem);
document.body.appendChild(boxElem);
} else if (localStorage.getItem("acceptedCookieAlert") === "true") {
enableGtag();
}
})()
2023-07-14 22:50:55 +00:00
< / script >
2025-06-27 08:24:37 +00:00
< script src = "../../../../_static/documentation_options.js?v=151cd43d" > < / script >
2024-10-08 10:03:58 +00:00
< script src = "../../../../_static/doctools.js?v=9a2dae69" > < / script >
< script src = "../../../../_static/sphinx_highlight.js?v=dc90522c" > < / script >
< script src = "../../../../_static/scripts/furo.js?v=7660844c" > < / script >
2023-07-14 22:50:55 +00:00
< script >
2024-10-08 10:03:58 +00:00
const createProjectsList = (projects, displayImages) => {
const ulElem = Object.assign(document.createElement('ul'),
{
className:'farama-header-menu-list',
}
)
for (let project of projects) {
const liElem = document.createElement("li");
const aElem = Object.assign(document.createElement("a"),
{
href: project.link
}
);
liElem.appendChild(aElem);
if (displayImages) {
const imgElem = Object.assign(document.createElement("img"),
{
src: project.image ? imagesBasepath + project.image : imagesBasepath + "/farama_black.svg",
alt: `${project.name} logo`,
className: "farama-black-logo-invert"
}
);
aElem.appendChild(imgElem);
}
aElem.appendChild(document.createTextNode(project.name));
ulElem.appendChild(liElem);
}
return ulElem;
}
2023-07-14 22:50:55 +00:00
// Create menu with Farama projects by using the API at farama.org/api/projects.json
const createCORSRequest = (method, url) => {
let xhr = new XMLHttpRequest();
xhr.responseType = 'json';
if ("withCredentials" in xhr) {
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// IE8 & IE9
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// CORS not supported.
xhr = null;
}
return xhr;
};
const url = 'https://farama.org/api/projects.json';
const imagesBasepath = "https://farama.org/assets/images"
const method = 'GET';
let xhr = createCORSRequest(method, url);
xhr.onload = () => {
const jsonResponse = xhr.response;
const sections = {
2024-10-08 10:03:58 +00:00
"Core Projects": [],
"Mature Projects": {
"Documentation": [],
"Repositories": [],
},
"Incubating Projects": {
"Documentation": [],
"Repositories": [],
},
2023-07-14 22:50:55 +00:00
"Foundation": [
{
name: "About",
link: "https://farama.org/about"
},
{
name: "Standards",
link: "https://farama.org/project_standards",
},
{
name: "Donate",
link: "https://farama.org/donations"
}
]
}
2024-10-08 10:03:58 +00:00
// Categorize projects
2023-07-14 22:50:55 +00:00
Object.keys(jsonResponse).forEach(key => {
projectJson = jsonResponse[key];
if (projectJson.website !== null) {
projectJson.link = projectJson.website;
} else {
projectJson.link = projectJson.github;
2024-10-08 10:03:58 +00:00
}
if (projectJson.type === "core") {
sections["Core Projects"].push(projectJson)
} else if (projectJson.type == "mature") {
if (projectJson.website !== null) {
sections["Mature Projects"]["Documentation"].push(projectJson)
} else {
sections["Mature Projects"]["Repositories"].push(projectJson)
}
} else {
if (projectJson.website !== null) {
sections["Incubating Projects"]["Documentation"].push(projectJson)
} else {
sections["Incubating Projects"]["Repositories"].push(projectJson)
}
2023-07-14 22:50:55 +00:00
}
})
const menuContainer = document.querySelector(".farama-header-menu__body");
Object.keys(sections).forEach((key, i) => {
const sectionElem = Object.assign(
document.createElement('div'), {
className:'farama-header-menu__section',
}
)
sectionElem.appendChild(Object.assign(document.createElement('span'),
{
className:'farama-header-menu__section-title' ,
innerText: key
}
))
2024-10-08 10:03:58 +00:00
// is not a list
if (sections[key].constructor !== Array) {
const subSections = sections[key];
const subSectionContainerElem = Object.assign(
document.createElement('div'), {
className:'farama-header-menu__subsections-container',
style: 'display: flex'
}
)
Object.keys(subSections).forEach((subKey, i) => {
const subSectionElem = Object.assign(
document.createElement('div'), {
className:'farama-header-menu__subsection',
}
)
subSectionElem.appendChild(Object.assign(document.createElement('span'),
2023-07-14 22:50:55 +00:00
{
2024-10-08 10:03:58 +00:00
className:'farama-header-menu__subsection-title' ,
innerText: subKey
2023-07-14 22:50:55 +00:00
}
2024-10-08 10:03:58 +00:00
))
const ulElem = createProjectsList(subSections[subKey], key !== 'Foundation');
subSectionElem.appendChild(ulElem);
subSectionContainerElem.appendChild(subSectionElem);
})
sectionElem.appendChild(subSectionContainerElem);
} else {
const projects = sections[key];
const ulElem = createProjectsList(projects, true);
sectionElem.appendChild(ulElem);
2023-07-14 22:50:55 +00:00
}
menuContainer.appendChild(sectionElem)
});
}
xhr.onerror = function() {
console.error("Unable to load projects");
};
xhr.send();
< / script >
< script >
const versioningConfig = {
githubUser: 'Farama-Foundation',
githubRepo: 'Gymnasium',
};
fetch('/main/_static/versioning/versioning_menu.html').then(response => {
if (response.status === 200) {
response.text().then(text => {
const container = document.createElement("div");
container.innerHTML = text;
document.querySelector("body").appendChild(container);
// innerHtml doenst evaluate scripts, we need to add them dynamically
Array.from(container.querySelectorAll("script")).forEach(oldScript => {
const newScript = document.createElement("script");
Array.from(oldScript.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value));
newScript.appendChild(document.createTextNode(oldScript.innerHTML));
oldScript.parentNode.replaceChild(newScript, oldScript);
});
});
} else {
console.warn("Unable to load versioning menu", response);
}
});
< / script >
< / body >
< / html >