Compare commits

...

421 Commits

Author SHA1 Message Date
Dominik Roth
da1bced018
Merge pull request #107 from maxmunzel/patch-1
Add toml to build requirements
2024-04-17 19:15:04 +02:00
maxmunzel
11651088ed
Add toml to build requirements
Without this change `pip install .` fails in a fresh conda env (tested with both python 3.7 and 3.11 on my mac).
2024-04-14 12:57:09 +02:00
Onur
758aa534ed
Merge pull request #100 from D-o-d-o-x/bruce_port_envs
Port Additions by Bruce to current version
2024-04-08 18:29:29 +02:00
20d0f97135 Compied new docs 2024-03-20 11:30:03 +01:00
072cbe978c Fixed typo in docs (markvoian) 2024-03-20 11:29:01 +01:00
89526c3454 Updated docs to include descriptions of the newly added env variants 2024-03-20 11:27:02 +01:00
4a19cd8270 Fix: Missed rename Markovian -> Markov in import 2024-03-20 11:10:53 +01:00
f242cc7d18 Fix typo: Missing comma 2024-03-20 11:10:05 +01:00
f972dabf7d Ensure TableTennisMarkov is imported 2024-03-20 11:08:52 +01:00
a33640abf6 Merge branch 'master' into bruce_port_envs 2024-03-20 11:06:30 +01:00
9960201cb6 Rename new envs (shorten Markovian to Markov) 2024-03-20 11:04:16 +01:00
319578da15 Merge branch 'release' of github.com:ALRhub/fancy_gym 2024-03-20 10:29:25 +01:00
Onur
2144eff45b
Merge pull request #96 from D-o-d-o-x/better_versioning
Better Versioning
2024-03-15 16:42:20 +01:00
Onur
8ea87f5b7b
Merge pull request #97 from ALRhub/pr_v0.3.0
New Release: 0.3.0
2024-03-15 16:41:19 +01:00
Onur
11d4fe9ba2
Merge pull request #98 from D-o-d-o-x/fix_readme_links
Replace links to Docs in README with final ones
2024-03-15 16:40:04 +01:00
Onur
fa72c3791c
Merge pull request #99 from D-o-d-o-x/fix_automatic_render
Fix: Some fancy envs not following gym spec regarding rendering behavior
2024-03-15 16:39:42 +01:00
Onur
7765d602b9
Merge pull request #102 from D-o-d-o-x/fix_docs_metaworld_version
Fix: Docs reference wrong version for metaworld
2024-03-15 16:38:47 +01:00
5be2df1cea Compile new docs 2024-03-14 18:34:02 +01:00
27d3c447ab Merge branch 'fix_docs_metaworld_version' into pr_v0.3.0 2024-03-14 18:33:23 +01:00
4efdcf0c5b Fix version referenced for metaworld in docs 2024-03-14 18:31:52 +01:00
688712004d Recompiled docs 2024-03-14 15:58:08 +01:00
59015bbd0e Merge branch 'fix_automatic_render' into pr_v0.3.0 2024-03-14 15:51:49 +01:00
7d8e7c3f18 Adapt examples to new rendering behavior 2024-03-14 15:50:42 +01:00
e8171207f0 Merge branch 'fix_readme_links' into pr_v0.3.0 2024-02-16 16:48:42 +01:00
1008c84a4b Merge branch 'fix_automatic_render' into pr_v0.3.0 2024-02-16 16:48:27 +01:00
1936f8bf98 Merge branch 'master' into bruce_port_envs 2024-02-10 15:34:05 +01:00
a32343807f Only do auto-rendering for render_mode = human
(https://gymnasium.farama.org/api/env/#gymnasium.Env.render)
2024-02-10 14:11:54 +01:00
e8fb90f1ae Implement automatic rendering to all fancy envs (implementuing new gym spec regarding rendering) 2024-02-10 14:03:20 +01:00
a1e0acf2c9 Replace all links to temporary docs hosting with final ones 2024-02-10 13:18:51 +01:00
Dominik Roth
e624876f24
Configure Docs Hosting via Github Actions 2024-02-10 13:11:38 +01:00
ad2f20a557 Add MP-Wrapper for new TT variants with random init robot position 2024-02-10 11:28:17 +01:00
41c5ca1120 Fix: Forgot 'fi' to end if clause in bash snippet 2024-02-10 11:13:29 +01:00
e2a805b74f Fix: Forgot 'fi' to end if clause in bash snippet 2024-02-10 11:10:14 +01:00
4d0ef519d0 Ensure following steps are skipped if any one fails 2024-02-10 11:07:02 +01:00
31b9182b53 Fix: Workflow python envs missing toml dependency 2024-02-10 10:48:01 +01:00
3c7fdc8d5b Update workflows to also validate version number consistency 2024-02-10 10:13:37 +01:00
259b13baa1 Version in pyproject.toml is now single source of truth 2024-02-10 10:13:17 +01:00
5aec4f835f Incremetn version 2024-02-10 10:12:21 +01:00
Dominik Roth
4eadfd1566
Merge pull request #95 from ALRhub/readthedocs
Migrate to ReadTheDocs-based Documentation
2024-02-10 09:40:08 +01:00
Dominik Roth
f7ccfc808a
Merge pull request #94 from ALRhub/publish_from_release
Publish from release
2024-02-10 09:36:30 +01:00
0a883f36b9 Merge branch 'master' into publish_from_release 2024-02-10 09:33:27 +01:00
Dominik Roth
d8940ac4ae
Merge pull request #93 from D-o-d-o-x/fix_pyproject_missing_deps
Fix: The pyproject.toml was missing the new mushroom-rl dependency
2024-02-10 09:32:38 +01:00
b387d4c448 Merge branch 'master' into fix_pyproject_missing_deps 2024-02-10 09:27:20 +01:00
6cb32e6203 Merge branch 'master' into fix_pyproject_missing_deps 2024-02-10 09:26:45 +01:00
Dominik Roth
3ccd839d16
Merge pull request #92 from D-o-d-o-x/fix_metaworld_rendering
Fix: Metaworld not supporting rendering
2024-02-10 09:24:50 +01:00
8672856e00 Fix: Ensure automatic rendering on .step if render was called initially (new gym spec) 2024-02-10 09:22:06 +01:00
3be34048b2 Merge branch 'master' into fix_metaworld_rendering 2024-02-10 08:56:06 +01:00
Dominik Roth
46e9a515e0
Merge pull request #88 from ALRhub/better_tests
Test Suite Improvements
2024-02-10 08:51:37 +01:00
9faaae4785 Fix: New TT variants were registered outside of fancy NS 2024-02-04 17:30:12 +01:00
642bf8761f Fix: BP was not returning new infos (smoothness metrics) 2024-02-02 17:00:23 +01:00
c9ea8cb167 BugFix: Missing new get_initial_robot_state method in TT 2024-01-28 12:56:53 +01:00
3bc0a23ec2 BugFix: DId not pass kwargs down in new TT envs 2024-01-28 12:54:49 +01:00
db8221ebb2 Fix: Accidentally removed delay_bound & tau_bound from TT_utils 2024-01-28 12:45:50 +01:00
a67637c714 Register new env variants (Bruce Vers) 2024-01-28 12:37:53 +01:00
9fce6fff42 Ported new HopperJump Rew to master 2024-01-28 12:32:52 +01:00
1372a596b5 Ported Markovian Version of TableTennis to master 2024-01-28 12:29:43 +01:00
6b59a354d7 Added new smoothness metric to BP 2024-01-28 12:16:15 +01:00
a9617a392e Merge branch 'master' into readthedocs 2024-01-23 18:04:27 +01:00
4be05440a1 Final?! changes to docs 2024-01-23 17:48:07 +01:00
59c980e495 Final? touches to the docs 2024-01-23 17:42:39 +01:00
6d583a36f4 Minor change to phrasing in docs index 2024-01-23 17:35:33 +01:00
d3941f6167 New html docs compiled 2024-01-23 17:33:00 +01:00
ac4b537f87 Docs should always use 'Step-Based' instead of 'Step-based' 2024-01-23 17:32:17 +01:00
a87353ecbe README: Two links were still broken 2024-01-23 17:25:05 +01:00
ba47981efc Fix Links in README Quickstart Guide 2024-01-23 17:24:05 +01:00
ff6f41990f Change info icon in README 2024-01-23 17:22:14 +01:00
0def834d1b Maybe fix broken box in README? 2024-01-23 17:20:45 +01:00
4b862185e6 Change .gitignore; push docs/build to GitHub 2024-01-23 17:16:12 +01:00
91b10cc90a Mimimized README 2024-01-23 17:15:24 +01:00
5d222ab1ef Remove font dependence from namelogo svg and fix ALR URL 2024-01-23 16:49:17 +01:00
acf7f6421f Removed one last .md hiding in the code part of the repo 2024-01-19 11:00:29 +01:00
2e60f2487a Removed a bunch of old README.MD files
(documentation should only be in docs, not contained in the code part of the repo)
2024-01-19 10:54:21 +01:00
4708dba0d3 Monor fixes to docs. 2024-01-19 10:52:30 +01:00
ef7a3b5052 Minor fomration changes 2024-01-19 10:45:25 +01:00
41f178d6ab Monor tweaks to docs 2024-01-18 22:55:42 +01:00
9a5c6125e5 Added a Quickstart Guide 2024-01-18 22:46:25 +01:00
4b631b7177 Tweaked image layout (docs) 2024-01-18 22:23:52 +01:00
f9a23a0e3b Moved gifs for docs around 2024-01-18 22:23:30 +01:00
15f4257690 Reduced nesting level in envs/fancy/mujoco docs 2024-01-18 18:37:13 +01:00
2a8845bacf Fixed 'Edit on Github' not working 2024-01-18 18:34:09 +01:00
4aca2d05e5 Removed ugly white line 2024-01-18 18:33:58 +01:00
6219b8460e Added a wide logo to the index page 2024-01-18 17:42:14 +01:00
6081fd73eb Minro tweaks and fixes to Docs 2024-01-18 17:03:56 +01:00
1aa870f198 Addressed some styling issues with dark theme 2024-01-18 16:54:44 +01:00
892774665d Automatic Dark Theme for Docs (Reads Device Preference)
Hell yeah!
2024-01-18 16:43:34 +01:00
aa1e44781a More and better internal crosslinking 2024-01-18 16:43:20 +01:00
fcc36ccb17 Link to Gymnasium instead of Gym. Reference Gymnasium docs for vanilla step-based 2024-01-18 14:56:59 +01:00
a7685aaab5 Fix typos 2024-01-18 14:56:45 +01:00
ec6c0c89b4 Complete overview over dmc tasks 2024-01-18 14:51:25 +01:00
934952a4fa Added desciptive text for AirHockey envs 2024-01-18 12:38:38 +01:00
4e48da6422 Added short text about Classical Controll envs 2024-01-18 12:38:27 +01:00
1e55bf13cb Text descriptions of our flagship Mujoco envs 2024-01-18 12:38:01 +01:00
9a42779027 Fix link in image desc to BoxPushing env 2024-01-18 12:37:34 +01:00
222683e685 Added imgs for more envs 2024-01-18 12:37:18 +01:00
f3a3c88978 Use checkout@v4 for ensure-release-tagged workflow 2024-01-18 11:05:46 +01:00
992ee014a3 Ensure all PRs to release to be tagged.
Will be enforced via branch protection.
2024-01-18 11:01:13 +01:00
3cac0a9258 Remove action to publish to Test-PyPI 2024-01-18 11:00:52 +01:00
b05dcb84c4 Publish to PyPI from release instead of master.
Still require commits to be tagged.
2024-01-18 11:00:10 +01:00
e488854cc1 Shorten README, reference full docs. 2024-01-18 10:20:19 +01:00
dccb4ee1b9 Added open TODOs 2024-01-18 10:04:41 +01:00
a579e5e1d4 Link to BoxPushing from image desc 2024-01-18 10:04:31 +01:00
a0a4952539 Reordered stuff in mujoco.md 2024-01-18 10:04:00 +01:00
Onur
aa652e3610
Merge pull request #87 from kayendns/airhockey-off-screen-rendering
Implemented render_mode 'rgb_array' for AirHockeyEnv
2023-12-22 10:09:28 +01:00
Onur
fa54dbb149
Merge pull request #91 from JuliusJacobitz/fix_readme_07_12_23
add render_mode to examples in README to make them work again
2023-12-22 10:07:54 +01:00
Onur
3d44454d62
Merge pull request #89 from Thifhi/airhockey-airhockit2023
Implement AirHocKIT 2023 environments
2023-12-22 10:02:56 +01:00
1a2b932802 Fix: The pyproject.toml was missing the new mushroom-rl dependency 2023-12-13 17:29:38 +01:00
04925035f9 Metaworld did not allow rendering since render_mode was not passed through comparability adapter. 2023-12-13 17:02:52 +01:00
18c17ff130 Add calls to env.render() to README 2023-12-13 16:08:49 +01:00
d26233f908 Various additions to docs 2023-12-13 15:52:44 +01:00
73d00ddab3 Updated envs docs 2023-12-13 15:52:09 +01:00
84881d5dbf Minor changes to examples 2023-12-13 15:50:53 +01:00
2e76013b46 Updated style.css 2023-12-13 15:50:34 +01:00
ddd0eaf88a Better guide 2023-12-13 15:50:13 +01:00
JuliusJacobitz
5201937ac8 add render_mode to examples in README to make them work again 2023-12-07 15:53:55 +01:00
Mustafa Enes Batur
86abbe0d97 Pass noise as parameter 2023-12-06 19:47:00 +01:00
57c3d36490 New index.rst, added assests 2023-12-05 18:16:47 +01:00
4cdff05720 Restructured envs docs 2023-12-05 18:16:26 +01:00
0b574274df Pull examples into generated docs 2023-12-05 18:15:07 +01:00
6e84703a15 Added AirHockey env desc (TODO) 2023-12-05 18:14:47 +01:00
268b74e5bd Create 'Guide' from README 2023-12-05 18:14:12 +01:00
81dbdc5745 Updated conf.py 2023-12-05 18:13:20 +01:00
43cfcf5795 Squash past history for readthedocs 2023-12-05 15:47:17 +01:00
Mustafa Enes Batur
fde5e33be6 Add noise 2023-12-03 22:37:08 +01:00
Dominik Roth
aeecf65f02
Ensure MujocoViewer opens on .render() for render_mode human 2023-11-27 13:18:41 +01:00
Mustafa Enes Batur
6afb5880db Implement AirHocKIT 2023 environments 2023-11-26 22:35:39 +01:00
Kayen
0b4e729a49
incorporated human render_mode gym spec + optimized keyword arguments 2023-11-26 21:50:11 +01:00
374d72ddde Fix wrong signature for main in examples/examples_movement_primitives.py 2023-11-26 18:52:08 +01:00
d6f42cf755 Merge branch 'master' into better_tests 2023-11-26 18:50:55 +01:00
db842db2b7 Exclude non gym native envs from test for gym builtin envs. 2023-11-26 17:59:08 +01:00
d367ac0c4b Added new test to run all examples 2023-11-26 17:51:26 +01:00
e5bb6f1a88 Restructured examples and fixed bugs 2023-11-26 17:51:09 +01:00
14b7d1d6c3 Fix small bug in test_black_box.py:test_verbosity 2023-11-26 17:20:33 +01:00
Kayen
deaca46d87
added rgb_array render mode for off-screen rendering 2023-11-25 23:34:24 +01:00
Hongyi Zhou
dbd3caebb3
Merge pull request #84 from ALRhub/pypi-package 2023-11-24 12:50:23 +01:00
Hongyi Zhou
f6b56d5b0f
Merge pull request #85 from ALRhub/81_fix_docs_mp 2023-11-24 10:41:03 +01:00
c0e55b3f48 Merge remote-tracking branch 'original/pypi-package' into pypi-package 2023-11-23 21:16:53 +01:00
beaf5df2fc Bring to parity with dev-branch 2023-11-23 21:14:11 +01:00
13e6a3b53a Merge branch '81_fix_docs_mp' into pypi-package 2023-11-23 20:56:55 +01:00
be320b2d43 Merge branch 'master' into 81_fix_docs_mp 2023-11-23 20:52:07 +01:00
Hongyi Zhou
216a6f215d
Merge pull request #83 from ALRhub/78_fix_render_mode
Fix render_mode not working for many fancy envs
2023-11-22 11:41:13 +01:00
Hongyi Zhou
052abcbf1c fix the render_mode in via_point_reacher and hole reacher 2023-11-22 11:24:23 +01:00
cee8d59107 remove 'mode' from render() for all dummy envs (test suite) 2023-11-21 20:19:47 +01:00
01d2bf44ba remove 'mode' from render() for all classic_control envs 2023-11-21 20:17:19 +01:00
Dominik Roth
99ab2344ad
Merge branch 'master' into pypi-package 2023-11-21 20:08:35 +01:00
Hongyi Zhou
2f4b6fcea4
Merge pull request #79 from maxmunzel/fix_pip_metaworld 2023-11-21 16:18:23 +01:00
Onur
ef104cfc2a
Merge pull request #86 from Thifhi/air_hockey_env
Implement Air Hockey Envs in Fancy Gym
2023-11-20 16:07:54 +01:00
Mustafa Enes Batur
879b823d02 Stop mujoco viewer on close 2023-11-20 13:50:48 +01:00
Mustafa Enes Batur
8b585d7ea8 Correct fps 2023-11-20 13:47:23 +01:00
Mustafa Enes Batur
b95cf85e3d Tournament random after reset 2023-11-20 13:47:15 +01:00
Mustafa Enes Batur
bedb4297f2 Add close. Fix rendering to conform with gym 2023-11-20 12:39:14 +01:00
Mustafa Enes Batur
62fecda9d6 Fix max episode steps 2023-11-20 12:38:27 +01:00
Mustafa Enes Batur
079225cd1b Raise exception on invalid env_mode 2023-11-19 22:55:13 +01:00
Mustafa Enes Batur
f102e49581 Empty mp types 2023-11-19 22:50:35 +01:00
Mustafa Enes Batur
7a05c063b7 Add license 2023-11-19 22:46:49 +01:00
Mustafa Enes Batur
7e537447e1 Register environments separately 2023-11-19 22:45:48 +01:00
Mustafa Enes Batur
9aa572271f Bugfixes and update for deprecated code 2023-11-19 22:45:32 +01:00
Mustafa Enes Batur
d0cb6316a5 Numpy bugfix 2023-11-18 23:07:43 +01:00
Mustafa Enes Batur
edd1e83813 Implement air hockey envs 2023-11-18 18:19:05 +01:00
74bede4ba3 fixed typo 2023-10-29 17:38:38 +01:00
fae7c887ce Version Increment 2023-10-29 17:29:22 +01:00
0d3336b8d9 Made check for wether tagged commit is on master more robust 2023-10-29 17:28:45 +01:00
06e6c64e49 Version increment 2023-10-29 17:23:44 +01:00
9d1d925179 Require tagged commits to be on master for package to be published 2023-10-29 17:21:13 +01:00
da5592124e Fix issue with trigger 2023-10-29 17:14:58 +01:00
e32f836a3c Version increment 2023-10-29 17:02:12 +01:00
bbd964ed80 Use full URLs for links in README (wont work on PyPI otherwise) 2023-10-29 16:50:02 +01:00
f024613800 Prevent fallback to setup.py when building package 2023-10-29 16:02:10 +01:00
4a9ea368b8 fix typo in publish-to-test-pypi.yml 2023-10-29 14:39:02 +01:00
3c7df90810 Ensure we only react to push onto master; disable via if clause 2023-10-29 14:37:30 +01:00
707ec08808 Disable push to reakl PyPI for initial test 2023-10-29 14:21:08 +01:00
11a46889d9 Decrement version (we will start with 01.0 on PyPI) 2023-10-29 14:11:47 +01:00
be250bee5e Add action to publish to real PyPI 2023-10-29 14:11:25 +01:00
da042eebd9 Ensure envs are closed 2023-10-29 13:41:06 +01:00
f1d3b5333f Docs: Show usage using new api functionality 2023-10-29 13:25:35 +01:00
668765b145 Merge branch '78_fix_render_mode' into 81_fix_docs_mp 2023-10-29 13:23:06 +01:00
e5a9aaff0b Fix: Did not correlcty pass render_mode to gym.make (as per new spec) 2023-10-29 12:57:29 +01:00
dc773c6c10 Fixed TableTennisWind and TableTennisGoalSwitching not correctly passing args to parent class 2023-10-29 12:53:06 +01:00
049e45cb09 Print warning when setup.py is still used. 2023-10-23 14:51:21 +02:00
af636164a8 Version bump and update setup.py 2023-10-23 14:34:43 +02:00
d138c3c1f1 README: Minor improvements 2023-10-23 14:28:26 +02:00
b277ed6477 Adding forward looking statements to README (Install instructions based on PyPI package) 2023-10-23 14:24:50 +02:00
b183c002ef Provide setup.py as fallback (again) 2023-10-23 14:14:11 +02:00
d7ea1f80a0 gym.Env actually does not want to known about render_mode 2023-10-23 13:12:34 +02:00
f7a493d8e5 Mujoco envs: Follow new spec for render_mode 2023-10-23 12:27:13 +02:00
b681129a46 Classical Controll envs: Follow new spec for render_mode 2023-10-23 12:26:26 +02:00
5db73f90c4 Update BB wrapper to follow new spec for render_kwargs 2023-10-23 12:25:53 +02:00
Max Nagy
8ba3d4ec6b Fix `pip install ".[metaworld]" 2023-10-20 14:45:20 +02:00
5e63a72882 Version bump (to test Github Action) 2023-10-14 12:40:58 +02:00
0b240b9eb4 Define Github Action for test-PyPI publication 2023-10-14 12:24:04 +02:00
a7031ce3b9 Version dump 2023-10-12 17:58:11 +02:00
4051a13324 README: GitHub ignores custom font-size; reverting to using h1 2023-10-12 17:47:34 +02:00
ebb0e00675 Minor changes to pyproject.toml 2023-10-12 17:11:19 +02:00
6fea48f6c1 Increment version 2023-10-12 17:04:03 +02:00
4107704d9a Fix install instructions (look in both Test-PyPI & PyPI) 2023-10-12 17:03:34 +02:00
a50d1788b1 PyPI does not support GitHub-Flavored Markdown. Using HTML-Code for
emojis now...
2023-10-12 16:54:45 +02:00
9538c999a0 Make sure the icon is always loaded from GitHub
So it is also visible on PyPI
2023-10-12 16:46:45 +02:00
b0b58675b2 Don't try to export metaworld envs, if metaworld is not installed 2023-10-12 15:53:41 +02:00
9565f7972f removed typo 2023-10-12 15:48:19 +02:00
3f0c7b7302 Removing setup.py (built pipeline prefered it over pyproject.toml causing issues)
setup.py remains avaible on the legacy branch.
2023-10-12 15:37:39 +02:00
0c93280796 Improve handling of missing Metaworld 2023-10-12 15:34:36 +02:00
a5b10e11a3 Allow gymnasium==0.26.0 2023-10-12 15:34:10 +02:00
894982f77f Fix typos in setup.py 2023-10-12 15:30:11 +02:00
95a6b9cf2c README: Minor cosmetic changes 2023-10-12 14:56:02 +02:00
6528c5d5b9 Update README (Test-PyPI and dependency changes) 2023-10-12 14:55:15 +02:00
ce779bc6fb Make mujoco (modern version) a required dependency 2023-10-12 14:55:00 +02:00
b6c67b1adc The pyproject.toml now actually works 2023-10-12 13:04:16 +02:00
ee573788fc Fix: pyproject.toml license needs to point to file 2023-10-12 12:55:32 +02:00
a5a29176cb Add 'all' as an optional installation to the toml 2023-10-12 12:47:37 +02:00
d10ea23b4c Added Code of Conduct and Contributing guidelines to the MANIFEST 2023-10-12 12:41:55 +02:00
180b86771d Merge branch 'master' into pypi-package 2023-10-12 12:39:05 +02:00
10038f5d73 We need to use a MANIFEST rto insure inclusion of our *.stl and *.xml files 2023-10-12 12:34:55 +02:00
7a0f446406 Switching to pyproject.toml; setup.py will remain for backwards compat 2023-10-12 12:34:37 +02:00
Fabian
c985f2c415
Create CONTRIBUTING.md 2023-10-11 15:37:18 +02:00
Fabian
8f34cfe5ed
Merge pull request #77 from ALRhub/ottofabian-patch-2
Update issue templates
2023-10-11 15:31:42 +02:00
Fabian
5e60aabef5
Update bug_report.md 2023-10-11 15:30:57 +02:00
Fabian
faa537596a
Update issue templates 2023-10-11 15:28:19 +02:00
Fabian
b1fd1e5b5c
Create CODE_OF_CONDUCT.md 2023-10-11 15:26:13 +02:00
Fabian
cfda88d98c
Merge pull request #76 from ALRhub/ottofabian-patch-1
Create LICENSE
2023-10-11 14:17:59 +02:00
Fabian
7976abae5e
Create LICENSE 2023-10-11 14:17:02 +02:00
Dominik Roth
c420a96d4f
Merge pull request #75 from D-o-d-o-x/great_refactor
Refactor and Upgrade to Gymnasium
2023-10-11 13:42:00 +02:00
a04a4b6e67 Link legacy branch in README 2023-10-11 13:36:46 +02:00
f8dcf5b2df Fix: Did not define MP_Wrapper for new RandomInit version of BoxPushing 2023-10-11 13:29:08 +02:00
614d2a42db READE: Minor cosmetic changes pt.3 2023-10-11 13:28:03 +02:00
4f534779ff READE: Minor cosmetic changes pt.2 2023-10-11 13:25:14 +02:00
fc7382443d README: Minor cosmetic changes 2023-10-11 13:23:33 +02:00
600575cbac Dont run determinism tests on arbitrary external envs added by other
libs (like atari envs added by shimmy), only those included in gym and those added by us.
2023-10-11 13:08:06 +02:00
877a7ea6ba Fix: Wrong horizon for Metaworld tasks 2023-10-11 12:50:55 +02:00
980bb0de6b Add docstring to DefaultMPWrapper 2023-10-11 12:46:34 +02:00
db5e032987 Development status alpha -> beta; version to 1.0 (for pub release) 2023-10-11 12:41:38 +02:00
3317ffb06d README: @ is not a legal symbol in BibTex attribs 2023-10-11 12:39:11 +02:00
757072c762 Documnenting merging behavior for mp_configs (and remove TODOs) 2023-10-11 12:35:23 +02:00
bc150f5a4d Fix: Bibtex in README mixed between tabs & spaces 2023-10-11 11:59:02 +02:00
5f3c28e8f0 Added bibtex for citations to README 2023-10-11 11:56:51 +02:00
fcc79cdde0 Added Hongyi & Hongyi as authors to setup.py 2023-10-11 11:38:42 +02:00
3180154fa6 Added docstring to deprecated 'fancy_gym.make' 2023-10-11 11:37:46 +02:00
9fee527dbe Fix: Typo in setup.py 2023-10-11 11:36:36 +02:00
0ae87088d9 README: Better Justifycation of text 2023-09-30 18:48:10 +02:00
1eeccff35f README: Justify text about MP envs (looks way better) 2023-09-30 18:46:50 +02:00
27f3a824c6 Tiny update to Metaworld README 2023-09-30 17:27:11 +02:00
b3de71e0d6 Expanded README for Metaworld
(Thanks to ChatGPT for helping)
2023-09-30 16:55:50 +02:00
e633b1eeeb Fixed open_ai README 2023-09-30 16:55:22 +02:00
a803d92dd2 Slighly better docs for OpenAI envs 2023-09-30 16:31:23 +02:00
e3055568e8 Improved README for classical controll envs 2023-09-29 20:39:42 +02:00
e55905a824 Improved and Updated README for custom mujoco envs 2023-09-29 20:39:11 +02:00
8bba78b813 Updated dmc README 2023-09-29 20:36:36 +02:00
56c1c65d09 Better doumentation of fancy registry fucntions (register & upgrade) 2023-09-29 19:19:57 +02:00
d6ecc0dc67 minor changes to README 2023-09-20 12:49:31 +02:00
6d0e96c6f2 typo 2023-09-19 18:04:02 +02:00
740d1d7896 README: Added link to changelog of refactor 2023-09-19 17:54:27 +02:00
310719e471 Fix: Typo in README 2023-09-19 17:32:29 +02:00
79c2eda4fe Fixed minor issues 2023-09-19 17:07:12 +02:00
49658515b0 Extended README 2023-09-19 17:05:41 +02:00
d8315c8d97 Fixed typo in NS 2023-09-19 17:00:49 +02:00
e077a8f13d Updated README 2023-09-19 16:51:30 +02:00
842ab3fbc9 Added mujoco-legacy (mujoco-py) as an optional dependency
required to pass all tests, since some OpenAI envs still use old mujoco
2023-09-19 13:42:03 +02:00
59ee559f8d README: reset will return (obs, info) 2023-09-18 19:52:08 +02:00
57c4a940b8 Another typo gone from the README 2023-09-18 19:50:23 +02:00
c5b051da20 Fixed typo in README 2023-09-18 19:47:43 +02:00
cf886b2b87 New optional dependency: jax
(Required, so that we can make all gymnasium envs during our tests)
2023-09-18 19:42:58 +02:00
659a717fbd Removed old files 2023-09-18 19:31:17 +02:00
725e6c8fe1 Fixed wrong env name (still contained mp info) 2023-09-18 19:18:26 +02:00
5488ca6dda Fixed merge error 2023-09-18 19:17:43 +02:00
60a820456c Merge remote-tracking branch 'original/master' into great_refactor 2023-09-18 19:09:03 +02:00
54e8ec4015 Print warning on seeded metaworld reset 2023-09-18 18:42:34 +02:00
ddd11c1783 Skip Tests: Metaworld does currently not correclty implement seeding 2023-09-18 18:40:47 +02:00
9ce040d110 Porting Metaworld Bug Mitigations 2023-09-18 18:40:10 +02:00
20510d8f68 Ported MetaWorld wrapper to new mujoco binding 2023-09-18 18:38:32 +02:00
592f09789d Future proofing: Accesing attributes of other wrappers needs to be
explicit in future gymnasium versions
2023-09-18 18:37:46 +02:00
513bf2361e Fix: Deprecated beerpong env still referenced old mujoco binding 2023-09-18 18:37:19 +02:00
4c8dda3b60 Fix: README code imported gym instead of gymnasium 2023-09-18 17:43:15 +02:00
c933a75880 More README improvements 2023-09-18 17:41:10 +02:00
38358c183e Upgrading metaworld 2023-09-17 19:05:42 +02:00
89bd6781c7 mp_config for vanilla gym Reacher 2023-09-17 19:05:25 +02:00
a76967a498 Forgot to port gym_Reacher over 2023-09-17 19:05:08 +02:00
7f58093c5e Fixed all examples 2023-09-17 18:50:21 +02:00
8749fc52cb Better README 2023-09-17 18:37:40 +02:00
da34db22c8 Fix: mp_config missing for BoxPushing ProDMP 2023-09-17 17:31:41 +02:00
0629d1260c Ensure mp_config defined for all envs, even if just using defaults. 2023-09-17 17:29:26 +02:00
7f95923cf4 Fixed typo in env registration 2023-09-17 17:17:20 +02:00
315e135ff0 Added message about discontinuation of fancy_gym.make 2023-09-10 09:12:15 +02:00
155807207f Fix: SimpleReacher and ViaPointReacher did not seed correctly 2023-08-28 18:38:33 +02:00
820e781a0c Fix: Some simple_reacher did not seed correctly 2023-08-28 18:32:11 +02:00
07aeb779a7 Fix: Some fancy envs failed determinism test because they sampled during reset before the random gen was seeded 2023-08-28 18:16:16 +02:00
5921e0008b Mitigation: Metaworld .reset ignores seeds; we must manually seed on reset. 2023-08-28 17:57:24 +02:00
22a72fed2f Fix: Seeding of act-space is not guaranteed, seed it manually since we
depend on it...
2023-08-28 17:37:34 +02:00
2c0c4e5508 Fix Typo: alpha_phase belongs to phase_gen not basis_gen 2023-08-28 17:37:03 +02:00
20b1b0ccac Quickfix for mp_config merging and allow defining different base_id for
upgrades
2023-08-28 17:36:17 +02:00
8b3d05aaaf Fix Typo: weights_scale should apply to traj_gen, not controller 2023-08-28 17:35:30 +02:00
a4e28837bb Fix: Incorrect Controller Type in mp_config for dmc reach_site 2023-08-28 17:34:46 +02:00
15e1bdc218 Mitigation: Allow seeding Metaworld on reset 2023-08-28 16:18:18 +02:00
6d80201a03 Simplified metaworld adapter 2023-08-21 11:58:29 +02:00
94c4397fac Fixed incorrect ns seperator for metaworld tests 2023-08-21 11:57:58 +02:00
78823d95b6 Various fixed to tests 2023-08-14 16:47:05 +02:00
5b99227fac Moving the ugly_mitigation_for_metaworld_bug into the metaworld env wrapper 2023-08-14 16:45:33 +02:00
f3ffa714cb Cleaning up test/test_dmc_envs.py 2023-08-14 16:09:28 +02:00
1fb5368cc2 Fix: Multiple issues in test/test_fancy_registry.py 2023-08-14 16:08:32 +02:00
14d545acee Fixed: Name generation wrong for mp envs 2023-08-14 16:08:13 +02:00
eefcbcb0f0 tiny fix to env references in test 2023-08-14 11:57:06 +02:00
fb1282fe1e Use new namespace convention for mp-versions of envs 2023-08-14 10:51:43 +02:00
14223c56ba Fix: Controllers not getting kwargs 2023-07-30 19:32:32 +02:00
221e3fee5a Fix: Some tests omitted new ns 'fancy' when trying to access our envs 2023-07-30 18:34:27 +02:00
caf483a23b Fixed Typo dm_controll -> dm_control 2023-07-30 18:31:50 +02:00
fb8f81afea Don't use defaultdicts for MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS
(is ugly when exporting)
2023-07-30 18:29:47 +02:00
9020eb92ea Fix: test/test_replanning_sequencing.py still referenced old fancy_gym.make
(No longer exists as we now just use gym.make)
2023-07-30 18:16:47 +02:00
9c6d7956ce Extended Tests: Ensure no known namespace is empty 2023-07-30 18:16:19 +02:00
e30b6c0e04 Removed old code samples from meta mp docs 2023-07-30 18:15:51 +02:00
5519fd5a34 Fix: Wrong name for ns: dmc -> dm_controll 2023-07-30 18:14:50 +02:00
b4793c89bc Fix: ALL_FANCY_MOVEMENT_PRIMITIVE_ENVIRONMENTS no longer exists in fancy
registry
2023-07-30 17:59:30 +02:00
20d0be3c8d Replicate legacy behavior in exporting lists off all mp envs 2023-07-30 17:56:28 +02:00
bc3f540daf weight_scale -> weights_scale 2023-07-30 17:51:37 +02:00
e63a0a50df Ported metaworld to mp-config 2023-07-30 17:42:27 +02:00
e743663018 Ported dmc envs to mp-config 2023-07-30 17:41:44 +02:00
d48836368c Print warning when trying to register already registered step-based env 2023-07-29 11:37:03 +02:00
6b07705a88 Fix: fancy_gym.upgrade ignored mp_config_override-arg 2023-07-29 11:27:58 +02:00
ae1033a18c Remember mp-envs for each ns seperately (replicate legacy functionality) 2023-07-29 11:26:48 +02:00
2fc44667c6 fancy_gym.upgrade allows adding mp-versions for already registered envs 2023-07-24 10:33:00 +02:00
bb20bb53ec entry_point does not have to be given, when skipping registration of step-based 2023-07-24 10:30:34 +02:00
edd8c75ed3 Consistent quotation marks 2023-07-23 15:26:11 +02:00
3a9143fd93 removed file deprecated 2023-07-23 15:14:14 +02:00
58bb8c0395 Fix: Env in new namespace 2023-07-23 13:24:16 +02:00
127d355ccc Move into our own namespace ('fancy') 2023-07-23 13:17:54 +02:00
95b2c255e9 Fixed typo 2023-07-23 13:13:02 +02:00
fc4b98ea7d Allow envs to already be wrapped with a RawInterfaceWrapper 2023-07-23 13:12:07 +02:00
e2ff915a71 Fix: Cannot use .get for object attributes 2023-07-23 13:11:31 +02:00
0fb0506e49 Fix: Many tests still tried to seed during make 2023-07-23 12:31:47 +02:00
6787b02bbd Fixed missing import in metaworld_adapter 2023-07-23 12:26:41 +02:00
99a02b8347 Started work on new adapter & mp_config port for metaworld 2023-07-23 12:21:34 +02:00
3e586a1407 Added tests for new fancy registry 2023-07-23 12:21:18 +02:00
eb9b6e1e22 test_black_box.py should use vanilla env.make 2023-07-23 12:20:49 +02:00
b0f7dc6c7c test/utils.py must use gym.make now (was fancy_gym.make) 2023-07-23 11:13:15 +02:00
21a9c0f8a3 Fixed Bug leading to infinite recusrion when making mp envs 2023-07-23 11:06:08 +02:00
ce34df1814 No longer export old custom make 2023-07-23 11:05:45 +02:00
a069aaac65 Removed old manual registration of mp-envs (port to fancy registry) 2023-07-23 10:25:28 +02:00
9ba3fa9dbc ported mp_config for mujoco/table_tennis 2023-07-23 10:25:01 +02:00
64e6ac5323 ported mp_config for mujoco/beerpong 2023-07-23 10:03:18 +02:00
83d5d39b42 removed deprecated envs 2023-07-20 11:48:19 +02:00
dbf2be1006 refactoring env registration wip 2023-07-20 11:45:53 +02:00
1b061b2a37 ported mp_config for mujoco/box_pushing 2023-07-20 11:45:32 +02:00
8d26cccc35 ported mp_config for mujoco/box_pushing 2023-07-20 11:44:50 +02:00
17d370e2ba Allow overriding mp_config during register and make (also better errors
for DefaultMPWrapper)
2023-07-20 11:44:04 +02:00
9d03542282 Move mp_config out of metadata and onto MPWrappers 2023-07-20 10:56:30 +02:00
f6e1718c1a metadata.mp_config now expected in MP_wrapper (implementing Fabian's feedback) 2023-07-20 10:34:38 +02:00
9fa932d2bb minor refactoring 2023-07-20 10:33:39 +02:00
30bafd7a4f Allow skipping merge with default bb config 2023-07-14 15:58:58 +02:00
f375a6e4df Ported classic_control envs to fancy registry 2023-07-14 14:31:36 +02:00
6c90f8ade2 Getting rid of some old code 2023-07-14 14:29:08 +02:00
ffbada2311 Started implementing new fancy registry 2023-07-14 14:28:31 +02:00
67a5d197d9 Weaker version requirement for dm-control 2023-07-07 18:16:13 +02:00
27f8335a0d Remove dependence of wrapper on old gym 2023-07-07 13:12:57 +02:00
14a95eb5ca Fixed Typo in README 2023-07-07 11:51:06 +02:00
cdabd3f478 Downgrading mujoco 2.3.6 -> 2.3.3 2023-07-07 10:52:48 +02:00
bf1eb496f6 Make Icon Attribution h2 2023-06-28 22:20:49 +02:00
eb1d145dbd Fix Test: Delay was not supplied to mp-generator 2023-06-28 20:25:50 +02:00
de118a3113 Down to 20 failing tests (more mitigations of metaworld bug) 2023-06-28 19:42:41 +02:00
1601a87cb1 Added attribution for the icon. 2023-06-27 21:43:22 +02:00
55f84da5e1 A fancy icon for fancy gym 2023-06-27 21:39:03 +02:00
ad7ddd3b28 Fix: A missing ',' caused very weird bugs... 2023-06-24 12:24:52 +02:00
e8119798c3 Updating some dependencies 2023-06-24 11:52:59 +02:00
bc0dcb7642 Fixed: Tried importing old dependency 2023-06-24 11:43:40 +02:00
55c6cff690 Fix: PyPi had troubles finding a compatible version for dm-control 2023-06-24 11:03:40 +02:00
0fe56c4c0e Stricter dependency versions 2023-06-24 11:01:07 +02:00
9af42112b6 Version bump (made very breaking changes) 2023-06-24 10:37:35 +02:00
7354257f8e Bug mitigation for metaworld refactored and extended 2023-06-18 17:47:54 +02:00
b6089c4b83 ugly_hack_to_mitigate_metaworld_bug 2023-06-18 15:52:17 +02:00
f8ad65b790 Remove old file 2023-06-18 14:25:59 +02:00
9ade0dcdc4 Fix: Make wrappers work with BB and Dict-Space 2023-06-18 14:25:20 +02:00
b032dec5fe Better handling of envs without defined max_steps 2023-06-18 14:23:59 +02:00
60a4cf11d6 Fix: Some envs used no longer existing binding to mujoco 2023-06-18 12:10:01 +02:00
49ac9c3785 Fix: Don't throw errors for envs, that do not expose a max_episode_steps. 2023-06-18 11:53:10 +02:00
f44f01b478 Fix: Allow observation space dict in test_replanning 2023-06-18 11:52:35 +02:00
fbba129034 Fix: Need to supply seed to reset in tests 2023-06-18 11:51:01 +02:00
9605f2e56c Fix: Test for dmc still referenced lib directly (not via shimmy) 2023-06-11 18:05:50 +02:00
c9467c0e06 Upgrading metaworld (fixed bug that affected us) 2023-06-11 17:39:04 +02:00
a23b44752e Implement support for Dict spaces for time_aware_observation-wrapper 2023-06-11 17:38:16 +02:00
abeb963b4e Little hack to make envs work, that don't expose the max_episode_steps in their spec 2023-06-11 17:37:32 +02:00
2ad42f4132 Fix: Minor bugs in time aware obs wrapper 2023-06-11 13:47:38 +02:00
e44b0ed9ed Fix: Version specification now requirted for dmc envs 2023-06-11 13:46:38 +02:00
4921cc4b0b Fix: Some envs had wrong obs space shapes and did not follow new gym spec 2023-06-11 13:45:44 +02:00
80de15fd14 Fix: Return for invalid trajectories did not follow new gym spec 2023-06-11 13:43:10 +02:00
6f1a36d18c Adding required render_fps metadata to custom envs 2023-06-11 12:30:56 +02:00
ef64b0c21c Adding/fixing obs space definitions and metadata for various envs 2023-06-11 11:08:46 +02:00
f07b8a26ac Made some assertions more verbose for easier debugging 2023-06-10 18:49:02 +02:00
40d2409c26 Fixed: ant_jump returned observations bigger then observation_space 2023-06-10 18:48:13 +02:00
42003a3f9a Allow custom XML-files for ant_env 2023-06-10 18:47:41 +02:00
ddf6fd73b2 Fixed: hopper_jump returned observations bigger then observation_space 2023-06-10 18:40:03 +02:00
5e7f027ea0 Fixed Bug: walker_2d_jump was missing obsvation_space attribute 2023-06-10 18:34:49 +02:00
ff382a2922 Converted mujoco env 'walker2d' to new coordinate convention
New versions of mujoco no longer allow global coordinates.
We therefore convert them to local ones.
The original files are kept as reference.
2023-06-10 13:40:33 +02:00
c06fbee728 Converted mujoco env 'hopper_throw' to new coordinate convention
New versions of mujoco no longer allow global coordinates.
We therefore convert them to local ones.
The original files are kept as reference.
2023-06-10 13:37:40 +02:00
38cb5e1750 Converted mujoco env 'hopper_jump' to new coordinate convention
New versions of mujoco no longer allow global coordinates.
We therefore convert them to local ones.
The original files are kept as reference.
2023-06-10 13:35:48 +02:00
1fddeb838b Forgot to make it derive from Walker2dEnvCustomXML instead of original Walker2dEnv 2023-05-27 13:06:19 +02:00
110a8a9c0c Fix: MujocoEnv no longer supports manual assignment of mujoco_bindings 2023-05-27 12:55:46 +02:00
dbd7c37da5 Also support old gym Box as observation_space (backwards compat) 2023-05-27 12:54:30 +02:00
29b458c7df Fix: hopper_jump_on_box still used unpatched HopperEnv 2023-05-27 12:53:57 +02:00
a8a67601ca Fix: NameError: name 'd' is not defined 2023-05-27 12:48:45 +02:00
35680ab9a2 Merge branch 'master' into gym_upgrade 2023-05-27 11:45:51 +02:00
d6df6779a1 Auto convert output spaces.Dict to Box for BB-Envs 2023-05-27 11:39:47 +02:00
dabfc7cafe Adapted Mujoco Envs to new gymnasium spec
Gymnasium Mujoco Envs no longer allow overriding the used xml_file
We therefore implement intermediate classes, that reimplement this
feature.
2023-05-19 15:18:14 +02:00
1c002a235b Warning no longer applicable 2023-05-19 15:17:28 +02:00
bc9d4cf19d More verbose errors for run_env_determinism 2023-05-19 14:54:13 +02:00
3bbf101e86 Fixed: test_black_box.py still used old gym specs in two places 2023-05-19 14:53:04 +02:00
e70a56a7e3 Fixed: Typos 2023-05-19 14:04:19 +02:00
e75ab89a37 Ported box_pushing to new mujoco bindings 2023-05-19 14:01:31 +02:00
bf3ed8a06c Fix: TimeAwareObservation did not support float64 and tried to forbidden access private attribute. 2023-05-19 13:59:54 +02:00
07de655025 Allow dmc envs to be accessed via dmc:... (for backwards compatibility) 2023-05-18 19:50:19 +02:00
21d5ebb442 Fixed Bug: ToyEnv did not follow new gym spec 2023-05-18 19:13:35 +02:00
0dfd8e18e4 Fixed Bug: env_id was broken, when prefix is handled by other library
(e.g. 'dmc:...' by shimmy)
2023-05-18 19:08:11 +02:00
d4a8306b9d Buf Fix: PyTests still used binding to old gym 2023-05-18 19:07:19 +02:00
1e62da0833 Use shimmy as a binding for dmc, also 'testing' seperate from 'all'
pip install .[all] will no longer install components only required for
testing
pip install .[testing] will also install all compionents required to run
all tests
2023-05-18 18:03:42 +02:00
a559f92562 Adapted test to new gym interface
In prevous gym versions executing a step returned
obs, reward, done, info = env.step(...)

With the switch to gymnasium this has changed to
obs, reward, terminated, truncated, info = env.step(...)

We also made the code a bit more self explainatory.
2023-05-18 17:52:55 +02:00
228e343a1b Merge branch '47-update-to-new-gym-api' into gym_upgrade 2023-05-15 17:19:50 +02:00
826f22b18e Update URL for Metaworld (rlworkgroup -> Farama) 2023-05-15 17:11:57 +02:00
1c092d01bd Optional Dependency: PyTest 2023-05-15 17:11:14 +02:00
2cbfff7919 Added box2d as a dependency 2023-05-15 17:09:52 +02:00
9de1257e1c Updating gym(nasium) and metaworld; sticter versions 2023-05-15 16:55:53 +02:00
b695239318 num_basis is not implemented; tests are expected to fail 2023-05-15 16:32:45 +02:00
Fabian
c53924d9fc updated to new API, so tests still failing 2023-01-17 08:27:29 +01:00
Fabian
ec2063aa0b updated tests for dm_control 2023-01-12 17:36:33 +01:00
Fabian
9ebc021ae0 updated dm_control envs to use shimmy 2023-01-12 17:23:56 +01:00
Fabian
ed724046f3 updated custom tasks to new api 2023-01-12 17:22:45 +01:00
Fabian
fbe3ef4a4b updated examples to new api, 2023-01-12 17:21:56 +01:00
Fabian
0c7ac838bf first updats to reacher and env creation 2022-10-20 10:10:44 +02:00
339 changed files with 37303 additions and 3109 deletions

32
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,32 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Select variables '....'
3. Execute '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Ubunutu]
- Python version [e.g. 3.8]
- Version [e.g. 1.0]
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -0,0 +1,52 @@
name: Ensure Version Consistency on PR to Release
on:
pull_request:
branches:
- release
jobs:
check_version_and_tag:
runs-on: ubuntu-latest
strategy:
fail-fast: true # Terminate the job immediately if any step fails
steps:
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Necessary to fetch all tags for comparison
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install toml
- name: Extract version from pyproject.toml
run: |
echo "Extracting version from pyproject.toml"
VERSION=$(python -c 'import toml; print(toml.load("pyproject.toml")["project"]["version"])')
echo "Version in pyproject.toml is $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Get tag for the PR's head commit
run: |
PR_HEAD_SHA=$(jq -r .pull_request.head.sha < "$GITHUB_EVENT_PATH")
TAG=$(git tag --contains $PR_HEAD_SHA)
echo "Tag on PR's head commit is $TAG"
echo "TAG=$TAG" >> $GITHUB_ENV
- name: Compare version and tag
run: |
if [ -z "$TAG" ]; then
echo "Head commit of PR is not tagged. Ensure the head commit of PRs onto release is tagged with the version number."
exit 1
elif [ "$VERSION" != "$TAG" ]; then
echo "Version in pyproject.toml ($VERSION) does not match the git tag ($TAG)."
exit 1
else
echo "Version and git tag match. Check passed."
fi

40
.github/workflows/host_docs_static.yml vendored Normal file
View File

@ -0,0 +1,40 @@
name: Deploy static docs to Pages
on:
push:
branches: ["release"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v4
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: 'docs/build/html'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

54
.github/workflows/publish-to-pypi.yml vendored Normal file
View File

@ -0,0 +1,54 @@
name: Publish Python package to PyPI
on:
push:
branches:
- release
jobs:
publish:
name: Publish to PyPI
strategy:
fail-fast: true # Terminate the job immediately if any step fails
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 0 # This fetches all history for all branches and tags
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.x"
- name: Validate version against tag
run: |
VERSION=$(python -c 'import toml; print(toml.load("pyproject.toml")["project"]["version"])')
TAG=$(git tag --contains HEAD)
if [ -z "$TAG" ]; then
echo "Commit is not tagged. Failing the workflow."
exit 1
fi
if [ "$VERSION" != "$TAG" ]; then
echo "Version in pyproject.toml ($VERSION) does not match the git tag ($TAG). Failing the workflow."
exit 1
fi
echo "Version and commit tag match. Proceeding with the workflow."
- name: Install pypa/build/setuptools/twine
run: >-
python3 -m
pip install
build setuptools twine
--user
- name: Build a binary wheel and a source tarball
run: python3 -m build
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: twine upload dist/*

4
.gitignore vendored
View File

@ -115,3 +115,7 @@ MUJOCO_LOG.TXT
# vscode
.vscode
# Push HTML of docs to GitHub
# Could be solved via a GitHub Action instead in the future, but that would use up compute for ALRhub
!docs/build/

128
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
their respective email addresses.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

28
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,28 @@
# Contribution Guidelines
We welcome and appreciate contributions to this repository from the community. To ensure a positive and productive collaboration, we have established the following guidelines for contributing to this project:
**Code of Conduct**: Please abide by our Code of Conduct, which sets the standards for respectful and inclusive behavior within the community.
**Issues and Feature Requests**: Feel free to open new issues to report bugs or suggest new features. Before submitting, please check if a similar issue or request already exists.
**Pull Requests**: We encourage pull requests for bug fixes, new features, and improvements. Please follow these steps when submitting a pull request:
- Fork this repository and create a new branch for your changes.
- Ensure your code aligns with our coding standards.
- Provide a clear and concise description of your changes.
- Test your changes thoroughly.
- Make sure your code is well-documented.
- Code Style: Follow our coding style guidelines, which include formatting, naming conventions, and other coding standards. Adhering to these guidelines will help streamline the review process.
**Collaboration**: Be prepared for constructive feedback during the review process. We aim to maintain the quality and consistency of the codebase.
**License**: Ensure your contributions comply with the project's existing open-source license. By contributing, you grant us the right to distribute your code under the project's license.
**Ownership**: When you submit a contribution, you confirm that you have the right to license your code to us and that your work does not violate any existing patents, trademarks, or intellectual property rights.
**Maintainers**: The repository maintainers have the final authority on merging or rejecting contributions. They will work collaboratively with contributors to ensure a smooth process.
**Community Support**: As part of our community, please consider helping others, answering questions, and providing support to fellow contributors.
We appreciate your interest in contributing to our project. Your involvement helps make this community vibrant and successful.
Thank you for being part of this project!

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 Autonomous Learning Robots Lab @ KIT
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

14
MANIFEST.in Normal file
View File

@ -0,0 +1,14 @@
# Include the README
include README.md
# Include the license, Code of Conduct and Contributing guidelines
include LICENSE
include CODE_OF_CONDUCT.md
include CONTRIBUTING.md
# Include stl and xml files from the fancy_gym/envs/mujoco directory
recursive-include fancy_gym/envs/mujoco *.stl
recursive-include fancy_gym/envs/mujoco *.xml
# Also shipping the most important part of fancy gym
include icon.svg

261
README.md
View File

@ -1,230 +1,87 @@
# Fancy Gym
<h1 align="center">
<br>
<img src='https://raw.githubusercontent.com/ALRhub/fancy_gym/master/icon.svg' width="250px">
<br><br>
<b>Fancy Gym</b>
<br><br>
</h1>
`fancy_gym` offers a large variety of reinforcement learning environments under the unifying interface
of [OpenAI gym](https://gymlibrary.dev/). We provide support (under the OpenAI gym interface) for the benchmark suites
[DeepMind Control](https://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control)
(DMC) and [Metaworld](https://meta-world.github.io/). If those are not sufficient and you want to create your own custom
gym environments, use [this guide](https://www.gymlibrary.dev/content/environment_creation/). We highly appreciate it, if
you would then submit a PR for this environment to become part of `fancy_gym`.
In comparison to existing libraries, we additionally support to control agents with movement primitives, such as Dynamic
Movement Primitives (DMPs) and Probabilistic Movement Primitives (ProMP).
Built upon the foundation of [Gymnasium](https://gymnasium.farama.org) (a maintained fork of OpenAIs renowned Gym library) `fancy_gym` offers a comprehensive collection of reinforcement learning environments.
## Movement Primitive Environments (Episode-Based/Black-Box Environments)
**Key Features**:
Unlike step-based environments, movement primitive (MP) environments are closer related to stochastic search, black-box
optimization, and methods that are often used in traditional robotics and control. MP environments are typically
episode-based and execute a full trajectory, which is generated by a trajectory generator, such as a Dynamic Movement
Primitive (DMP) or a Probabilistic Movement Primitive (ProMP). The generated trajectory is translated into individual
step-wise actions by a trajectory tracking controller. The exact choice of controller is, however, dependent on the type
of environment. We currently support position, velocity, and PD-Controllers for position, velocity, and torque control,
respectively as well as a special controller for the MetaWorld control suite.
The goal of all MP environments is still to learn an optimal policy. Yet, an action represents the parametrization of
the motion primitives to generate a suitable trajectory. Additionally, in this framework we support all of this also for
the contextual setting, i.e. we expose the context space - a subset of the observation space - in the beginning of the
episode. This requires to predict a new action/MP parametrization for each context.
- **New Challenging Environments**: `fancy_gym` includes several new environments ([Panda Box Pushing](https://alrhub.github.io/fancy_gym/envs/fancy/mujoco.html#box-pushing), [Table Tennis](https://alrhub.github.io/fancy_gym/envs/fancy/mujoco.html#table-tennis), [etc.](https://alrhub.github.io/fancy_gym/envs/fancy/index.html)) that present a higher degree of difficulty, pushing the boundaries of reinforcement learning research.
- **Support for Movement Primitives**: `fancy_gym` supports a range of movement primitives (MPs), including Dynamic Movement Primitives (DMPs), Probabilistic Movement Primitives (ProMP), and Probabilistic Dynamic Movement Primitives (ProDMP).
- **Upgrade to Movement Primitives**: With our framework, its straightforward to transform standard Gymnasium environments into environments that support movement primitives.
- **Benchmark Suite Compatibility**: `fancy_gym` makes it easy to access renowned benchmark suites such as [DeepMind Control](https://alrhub.github.io/fancy_gym/envs/dmc.html)
and [Metaworld](https://alrhub.github.io/fancy_gym/envs/meta.html), whether you want to use them in the regular step-based setting or using MPs.
- **Contribute Your Own Environments**: If youre inspired to create custom gym environments, both step-based and with movement primitives, this [guide](https://alrhub.github.io/fancy_gym/guide/upgrading_envs.html) will assist you. We encourage and highly appreciate submissions via PRs to integrate these environments into `fancy_gym`.
## Installation
## Quickstart Guide
1. Clone the repository
| &#x26A0; We recommend installing `fancy_gym` into a virtual environment as provided by [venv](https://docs.python.org/3/library/venv.html), [Poetry](https://python-poetry.org/) or [Conda](https://docs.conda.io/en/latest/). |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
```bash
git clone git@github.com:ALRhub/fancy_gym.git
Install via pip [or use an alternative installation method](https://alrhub.github.io/fancy_gym/guide/installation.html)
```bash
pip install 'fancy_gym[all]'
```
2. Go to the folder
```bash
cd fancy_gym
```
3. Install with
```bash
pip install -e .
```
In case you want to use dm_control oder metaworld, you can install them by specifying extras
```bash
pip install -e .[dmc,metaworld]
```
> **Note:**
> While our library already fully supports the new mujoco bindings, metaworld still relies on
> [mujoco_py](https://github.com/openai/mujoco-py), hence make sure to have mujoco 2.1 installed beforehand.
## How to use Fancy Gym
We will only show the basics here and prepared [multiple examples](fancy_gym/examples/) for a more detailed look.
### Step-wise Environments
Try out one of our step-based environments [or explore our other envs](https://alrhub.github.io/fancy_gym/envs/fancy/index.html)
```python
import fancy_gym
import gymnasium as gym
import fancy_gym
import time
env = fancy_gym.make('Reacher5d-v0', seed=1)
obs = env.reset()
env = gym.make('fancy/BoxPushingDense-v0', render_mode='human')
observation = env.reset()
env.render()
for i in range(1000):
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
if i % 5 == 0:
env.render()
for i in range(1000):
action = env.action_space.sample() # Randomly sample an action
observation, reward, terminated, truncated, info = env.step(action)
time.sleep(1/env.metadata['render_fps'])
if done:
obs = env.reset()
```
When using `dm_control` tasks we expect the `env_id` to be specified as `dmc:domain_name-task_name` or for manipulation
tasks as `dmc:manipulation-environment_name`. For `metaworld` tasks, we require the structure `metaworld:env_id-v2`, our
custom tasks and standard gym environments can be created without prefixes.
### Black-box Environments
All environments provide by default the cumulative episode reward, this can however be changed if necessary. Optionally,
each environment returns all collected information from each step as part of the infos. This information is, however,
mainly meant for debugging as well as logging and not for training.
|Key| Description|Type
|---|---|---|
`positions`| Generated trajectory from MP | Optional
`velocities`| Generated trajectory from MP | Optional
`step_actions`| Step-wise executed action based on controller output | Optional
`step_observations`| Step-wise intermediate observations | Optional
`step_rewards`| Step-wise rewards | Optional
`trajectory_length`| Total number of environment interactions | Always
`other`| All other information from the underlying environment are returned as a list with length `trajectory_length` maintaining the original key. In case some information are not provided every time step, the missing values are filled with `None`. | Always
Existing MP tasks can be created the same way as above. Just keep in mind, calling `step()` executes a full trajectory.
> **Note:**
> Currently, we are also in the process of enabling replanning as well as learning of sub-trajectories.
> This allows to split the episode into multiple trajectories and is a hybrid setting between step-based and
> black-box leaning.
> While this is already implemented, it is still in beta and requires further testing.
> Feel free to try it and open an issue with any problems that occur.
```python
import fancy_gym
env = fancy_gym.make('Reacher5dProMP-v0', seed=1)
# render() can be called once in the beginning with all necessary arguments.
# To turn it of again just call render() without any arguments.
env.render(mode='human')
# This returns the context information, not the full state observation
obs = env.reset()
for i in range(5):
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
# Done is always True as we are working on the episode level, hence we always reset()
obs = env.reset()
if terminated or truncated:
observation, info = env.reset()
```
To show all available environments, we provide some additional convenience variables. All of them return a dictionary
with two keys `DMP` and `ProMP` that store a list of available environment ids.
Explore the MP-based variant [or learn more about Movement Primitives (MPs)](https://alrhub.github.io/fancy_gym/guide/episodic_rl.html)
```python
import fancy_gym
import gymnasium as gym
import fancy_gym
print("Fancy Black-box tasks:")
print(fancy_gym.ALL_FANCY_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
env = gym.make('fancy_ProMP/BoxPushingDense-v0', render_mode='human')
env.reset()
env.render()
print("OpenAI Gym Black-box tasks:")
print(fancy_gym.ALL_GYM_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("Deepmind Control Black-box tasks:")
print(fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("MetaWorld Black-box tasks:")
print(fancy_gym.ALL_METAWORLD_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
for i in range(10):
action = env.action_space.sample() # Randomly sample MP parameters
observation, reward, terminated, truncated, info = env.step(action) # Will execute full trajectory, based on MP
observation = env.reset()
```
### How to create a new MP task
## Documentation
In case a required task is not supported yet in the MP framework, it can be created relatively easy. For the task at
hand, the following [interface](fancy_gym/black_box/raw_interface_wrapper.py) needs to be implemented.
Documentation for `fancy_gym` can be found [here](https://alrhub.github.io/fancy_gym/); Usage Examples can be found [here](https://alrhub.github.io/fancy_gym/examples/general.html).
```python
from abc import abstractmethod
from typing import Union, Tuple
## Citing the Project
import gym
import numpy as np
class RawInterfaceWrapper(gym.Wrapper):
@property
def context_mask(self) -> np.ndarray:
"""
Returns boolean mask of the same shape as the observation space.
It determines whether the observation is returned for the contextual case or not.
This effectively allows to filter unwanted or unnecessary observations from the full step-based case.
E.g. Velocities starting at 0 are only changing after the first action. Given we only receive the
context/part of the first observation, the velocities are not necessary in the observation for the task.
Returns:
bool array representing the indices of the observations
"""
return np.ones(self.env.observation_space.shape[0], dtype=bool)
@property
@abstractmethod
def current_pos(self) -> Union[float, int, np.ndarray, Tuple]:
"""
Returns the current position of the action/control dimension.
The dimensionality has to match the action/control dimension.
This is not required when exclusively using velocity control,
it should, however, be implemented regardless.
E.g. The joint positions that are directly or indirectly controlled by the action.
"""
raise NotImplementedError()
@property
@abstractmethod
def current_vel(self) -> Union[float, int, np.ndarray, Tuple]:
"""
Returns the current velocity of the action/control dimension.
The dimensionality has to match the action/control dimension.
This is not required when exclusively using position control,
it should, however, be implemented regardless.
E.g. The joint velocities that are directly or indirectly controlled by the action.
"""
raise NotImplementedError()
To cite this repository in publications:
```bibtex
@software{fancy_gym,
title = {Fancy Gym},
author = {Otto, Fabian and Celik, Onur and Roth, Dominik and Zhou, Hongyi},
abstract = {Fancy Gym: Unifying interface for various RL benchmarks with support for Black Box approaches.},
url = {https://github.com/ALRhub/fancy_gym},
organization = {Autonomous Learning Robots Lab (ALR) at KIT},
}
```
If you created a new task wrapper, feel free to open a PR, so we can integrate it for others to use as well. Without the
integration the task can still be used. A rough outline can be shown here, for more details we recommend having a look
at the [examples](fancy_gym/examples/).
## Icon Attribution
```python
import fancy_gym
# Base environment name, according to structure of above example
base_env_id = "dmc:ball_in_cup-catch"
# Replace this wrapper with the custom wrapper for your environment by inheriting from the RawInferfaceWrapper.
# You can also add other gym.Wrappers in case they are needed,
# e.g. gym.wrappers.FlattenObservation for dict observations
wrappers = [fancy_gym.dmc.suite.ball_in_cup.MPWrapper]
kwargs = {...}
env = fancy_gym.make_bb(base_env_id, wrappers=wrappers, seed=0, **kwargs)
rewards = 0
obs = env.reset()
# number of samples/full trajectories (multiple environment steps)
for i in range(5):
ac = env.action_space.sample()
obs, reward, done, info = env.step(ac)
rewards += reward
if done:
print(base_env_id, rewards)
rewards = 0
obs = env.reset()
```
The icon is based on the [Gymnasium](https://github.com/Farama-Foundation/Gymnasium) icon as can be found [here](https://gymnasium.farama.org/_static/img/gymnasium_black.svg).

20
docs/Makefile Normal file
View File

@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

BIN
docs/build/doctrees/api.doctree vendored Normal file

Binary file not shown.

BIN
docs/build/doctrees/environment.pickle vendored Normal file

Binary file not shown.

BIN
docs/build/doctrees/envs/dmc.doctree vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/build/doctrees/envs/meta.doctree vendored Normal file

Binary file not shown.

BIN
docs/build/doctrees/envs/open_ai.doctree vendored Normal file

Binary file not shown.

BIN
docs/build/doctrees/examples/dmc.doctree vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/build/doctrees/index.doctree vendored Normal file

Binary file not shown.

4
docs/build/html/.buildinfo vendored Normal file
View File

@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 36919d67c12a677d3f16f60d980b0313
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@ -0,0 +1,444 @@
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>fancy_gym.envs.registry &mdash; Fancy Gym 0.3.0 documentation</title>
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/style.css" type="text/css" />
<link rel="shortcut icon" href="../../../_static/icon.svg"/>
<!--[if lt IE 9]>
<script src="../../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/sphinx_highlight.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home">
Fancy Gym
<img src="../../../_static/icon.svg" class="logo" alt="Logo"/>
</a>
<div class="version">
0.3.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">User Guide</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../guide/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guide/episodic_rl.html">What is Episodic RL?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guide/basic_usage.html">Basic Usage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guide/upgrading_envs.html">Creating new MP Environments</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Environments</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../envs/fancy/index.html">Fancy</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../envs/dmc.html">DeepMind Control (DMC)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../envs/meta.html">Metaworld</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../envs/open_ai.html">Gymnasium</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Examples</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/general.html">General Usage Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/dmc.html">DeepMind Control Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/metaworld.html">Metaworld Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/open_ai.html">OpenAI Envs Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/movement_primitives.html">Movement Primitives Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/mp_params_tuning.html">MP Params Tuning Example</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/pd_control_gain_tuning.html">PD Control Gain Tuning Example</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../examples/replanning_envs.html">Replanning Example</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../api.html">API</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Fancy Gym</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../../index.html">Module code</a></li>
<li class="breadcrumb-item active">fancy_gym.envs.registry</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for fancy_gym.envs.registry</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">import</span> <span class="nn">copy</span>
<span class="kn">import</span> <span class="nn">importlib</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
<span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Mapping</span><span class="p">,</span> <span class="n">MutableMapping</span>
<span class="kn">from</span> <span class="nn">fancy_gym.utils.make_env_helpers</span> <span class="kn">import</span> <span class="n">make_bb</span>
<span class="kn">from</span> <span class="nn">fancy_gym.black_box.raw_interface_wrapper</span> <span class="kn">import</span> <span class="n">RawInterfaceWrapper</span>
<span class="kn">from</span> <span class="nn">gymnasium</span> <span class="kn">import</span> <span class="n">register</span> <span class="k">as</span> <span class="n">gym_register</span>
<span class="kn">from</span> <span class="nn">gymnasium</span> <span class="kn">import</span> <span class="n">make</span> <span class="k">as</span> <span class="n">gym_make</span>
<span class="kn">from</span> <span class="nn">gymnasium.envs.registration</span> <span class="kn">import</span> <span class="n">registry</span> <span class="k">as</span> <span class="n">gym_registry</span>
<span class="k">class</span> <span class="nc">DefaultMPWrapper</span><span class="p">(</span><span class="n">RawInterfaceWrapper</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">context_mask</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns boolean mask of the same shape as the observation space.</span>
<span class="sd"> It determines whether the observation is returned for the contextual case or not.</span>
<span class="sd"> This effectively allows to filter unwanted or unnecessary observations from the full step-based case.</span>
<span class="sd"> E.g. Velocities starting at 0 are only changing after the first action. Given we only receive the</span>
<span class="sd"> context/part of the first observation, the velocities are not necessary in the observation for the task.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool array representing the indices of the observations</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># If the env already defines a context_mask, we will use that</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">,</span> <span class="s1">&#39;context_mask&#39;</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">context_mask</span>
<span class="c1"># Otherwise we will use the whole observation as the context. (Write a custom MPWrapper to change this behavior)</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">observation_space</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">current_pos</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</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="n">Tuple</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the current position of the action/control dimension.</span>
<span class="sd"> The dimensionality has to match the action/control dimension.</span>
<span class="sd"> This is not required when exclusively using velocity control,</span>
<span class="sd"> it should, however, be implemented regardless.</span>
<span class="sd"> E.g. The joint positions that are directly or indirectly controlled by the action.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">,</span> <span class="s1">&#39;current_pos&#39;</span><span class="p">),</span> <span class="s1">&#39;DefaultMPWrapper was unable to access env.current_pos. Please write a custom MPWrapper (recommended) or expose this attribute directly.&#39;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">current_pos</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">current_vel</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Union</span><span class="p">[</span><span class="nb">float</span><span class="p">,</span> <span class="nb">int</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="n">Tuple</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the current velocity of the action/control dimension.</span>
<span class="sd"> The dimensionality has to match the action/control dimension.</span>
<span class="sd"> This is not required when exclusively using position control,</span>
<span class="sd"> it should, however, be implemented regardless.</span>
<span class="sd"> E.g. The joint velocities that are directly or indirectly controlled by the action.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">,</span> <span class="s1">&#39;current_vel&#39;</span><span class="p">),</span> <span class="s1">&#39;DefaultMPWrapper was unable to access env.current_vel. Please write a custom MPWrapper (recommended) or expose this attribute directly.&#39;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">current_vel</span>
<span class="n">_BB_DEFAULTS</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;ProMP&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;wrappers&#39;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s1">&#39;trajectory_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;trajectory_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;promp&#39;</span>
<span class="p">},</span>
<span class="s1">&#39;phase_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;phase_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;linear&#39;</span>
<span class="p">},</span>
<span class="s1">&#39;controller_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;controller_type&#39;</span><span class="p">:</span> <span class="s1">&#39;motor&#39;</span><span class="p">,</span>
<span class="s1">&#39;p_gains&#39;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
<span class="s1">&#39;d_gains&#39;</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;basis_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;basis_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;zero_rbf&#39;</span><span class="p">,</span>
<span class="s1">&#39;num_basis&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="s1">&#39;num_basis_zero_start&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s1">&#39;basis_bandwidth_factor&#39;</span><span class="p">:</span> <span class="mf">3.0</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;black_box_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="s1">&#39;DMP&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;wrappers&#39;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s1">&#39;trajectory_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;trajectory_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;dmp&#39;</span>
<span class="p">},</span>
<span class="s1">&#39;phase_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;phase_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;exp&#39;</span>
<span class="p">},</span>
<span class="s1">&#39;controller_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;controller_type&#39;</span><span class="p">:</span> <span class="s1">&#39;motor&#39;</span><span class="p">,</span>
<span class="s1">&#39;p_gains&#39;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
<span class="s1">&#39;d_gains&#39;</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;basis_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;basis_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;rbf&#39;</span><span class="p">,</span>
<span class="s1">&#39;num_basis&#39;</span><span class="p">:</span> <span class="mi">5</span>
<span class="p">},</span>
<span class="s1">&#39;black_box_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="s1">&#39;ProDMP&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;wrappers&#39;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s1">&#39;trajectory_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;trajectory_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;prodmp&#39;</span><span class="p">,</span>
<span class="s1">&#39;duration&#39;</span><span class="p">:</span> <span class="mf">2.0</span><span class="p">,</span>
<span class="s1">&#39;weights_scale&#39;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;phase_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;phase_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;exp&#39;</span><span class="p">,</span>
<span class="s1">&#39;tau&#39;</span><span class="p">:</span> <span class="mf">1.5</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;controller_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;controller_type&#39;</span><span class="p">:</span> <span class="s1">&#39;motor&#39;</span><span class="p">,</span>
<span class="s1">&#39;p_gains&#39;</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">,</span>
<span class="s1">&#39;d_gains&#39;</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;basis_generator_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;basis_generator_type&#39;</span><span class="p">:</span> <span class="s1">&#39;prodmp&#39;</span><span class="p">,</span>
<span class="s1">&#39;alpha&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="s1">&#39;num_basis&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;black_box_kwargs&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">KNOWN_MPS</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">_BB_DEFAULTS</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="n">_KNOWN_MPS_PLUS_ALL</span> <span class="o">=</span> <span class="n">KNOWN_MPS</span> <span class="o">+</span> <span class="p">[</span><span class="s1">&#39;all&#39;</span><span class="p">]</span>
<span class="n">ALL_MOVEMENT_PRIMITIVE_ENVIRONMENTS</span> <span class="o">=</span> <span class="p">{</span><span class="n">mp_type</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">mp_type</span> <span class="ow">in</span> <span class="n">_KNOWN_MPS_PLUS_ALL</span><span class="p">}</span>
<span class="n">MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS</span> <span class="o">=</span> <span class="p">{}</span>
<div class="viewcode-block" id="register"><a class="viewcode-back" href="../../../generated/fancy_gym.register.html#fancy_gym.register">[docs]</a><span class="k">def</span> <span class="nf">register</span><span class="p">(</span>
<span class="nb">id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">entry_point</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">Callable</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">mp_wrapper</span><span class="p">:</span> <span class="n">RawInterfaceWrapper</span> <span class="o">=</span> <span class="n">DefaultMPWrapper</span><span class="p">,</span>
<span class="n">register_step_based</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="c1"># TODO: Detect</span>
<span class="n">add_mp_types</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="n">KNOWN_MPS</span><span class="p">,</span>
<span class="n">mp_config_override</span><span class="p">:</span> <span class="n">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="p">{},</span>
<span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Registers a Gymnasium environment, including Movement Primitives (MP) versions.</span>
<span class="sd"> If you only want to register MP versions for an already registered environment, use fancy_gym.upgrade instead.</span>
<span class="sd"> Args:</span>
<span class="sd"> id (str): The unique identifier for the environment.</span>
<span class="sd"> entry_point (Optional[Union[Callable, str]]): The entry point for creating the environment.</span>
<span class="sd"> mp_wrapper (RawInterfaceWrapper): The MP wrapper for the environment.</span>
<span class="sd"> register_step_based (bool): Whether to also register the raw srtep-based version of the environment (default True).</span>
<span class="sd"> add_mp_types (List[str]): List of additional MP types to register.</span>
<span class="sd"> mp_config_override (Dict[str, Any]): Dictionary for overriding MP configuration.</span>
<span class="sd"> **kwargs: Additional keyword arguments which are passed to the environment constructor.</span>
<span class="sd"> Notes:</span>
<span class="sd"> - When `register_step_based` is True, the raw environment will also be registered to gymnasium otherwise only mp-versions will be registered.</span>
<span class="sd"> - `entry_point` can be given as a string, allowing the same notation as gymnasium.</span>
<span class="sd"> - If `id` already exists in the Gymnasium registry and `register_step_based` is True,</span>
<span class="sd"> a warning message will be printed, suggesting to set `register_step_based=False` or use `fancy_gym.upgrade`.</span>
<span class="sd"> Example:</span>
<span class="sd"> To register a step-based environment with Movement Primitive versions (will use default mp_wrapper):</span>
<span class="sd"> &gt;&gt;&gt; register(&quot;MyEnv-v0&quot;, MyEnvClass&quot;my_module:MyEnvClass&quot;)</span>
<span class="sd"> The entry point can also be provided as a string:</span>
<span class="sd"> &gt;&gt;&gt; register(&quot;MyEnv-v0&quot;, &quot;my_module:MyEnvClass&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">register_step_based</span> <span class="ow">and</span> <span class="nb">id</span> <span class="ow">in</span> <span class="n">gym_registry</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;[Info] Gymnasium env with id &quot;</span><span class="si">{</span><span class="nb">id</span><span class="si">}</span><span class="s1">&quot; already exists. You should supply register_step_based=False or use fancy_gym.upgrade if you only want to register mp versions of an existing env.&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">register_step_based</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">entry_point</span> <span class="o">!=</span> <span class="kc">None</span><span class="p">,</span> <span class="s1">&#39;You need to provide an entry-point, when registering step-based.&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">mp_wrapper</span><span class="p">):</span> <span class="c1"># mp_wrapper can be given as a String (same notation as for entry_point)</span>
<span class="n">mod_name</span><span class="p">,</span> <span class="n">attr_name</span> <span class="o">=</span> <span class="n">mp_wrapper</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
<span class="n">mod</span> <span class="o">=</span> <span class="n">importlib</span><span class="o">.</span><span class="n">import_module</span><span class="p">(</span><span class="n">mod_name</span><span class="p">)</span>
<span class="n">mp_wrapper</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">register_step_based</span><span class="p">:</span>
<span class="n">gym_register</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="nb">id</span><span class="p">,</span> <span class="n">entry_point</span><span class="o">=</span><span class="n">entry_point</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">upgrade</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">,</span> <span class="n">add_mp_types</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="p">)</span></div>
<div class="viewcode-block" id="upgrade"><a class="viewcode-back" href="../../../generated/fancy_gym.upgrade.html#fancy_gym.upgrade">[docs]</a><span class="k">def</span> <span class="nf">upgrade</span><span class="p">(</span>
<span class="nb">id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">mp_wrapper</span><span class="p">:</span> <span class="n">RawInterfaceWrapper</span> <span class="o">=</span> <span class="n">DefaultMPWrapper</span><span class="p">,</span>
<span class="n">add_mp_types</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="n">KNOWN_MPS</span><span class="p">,</span>
<span class="n">base_id</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">mp_config_override</span><span class="p">:</span> <span class="n">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="p">{},</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Upgrades an existing Gymnasium environment to include Movement Primitives (MP) versions.</span>
<span class="sd"> We expect the raw step-based env to be already registered with gymnasium. Otherwise please use fancy_gym.register instead.</span>
<span class="sd"> Args:</span>
<span class="sd"> id (str): The unique identifier for the environment.</span>
<span class="sd"> mp_wrapper (RawInterfaceWrapper): The MP wrapper for the environment (default is DefaultMPWrapper).</span>
<span class="sd"> add_mp_types (List[str]): List of additional MP types to register (default is KNOWN_MPS).</span>
<span class="sd"> base_id (Optional[str]): The unique identifier for the environment to upgrade. Will use id if non is provided. Can be defined to allow multiple registrations of different versions for the same step-based environment.</span>
<span class="sd"> mp_config_override (Dict[str, Any]): Dictionary for overriding MP configuration.</span>
<span class="sd"> Notes:</span>
<span class="sd"> - The `id` parameter should match the ID of the existing Gymnasium environment you wish to upgrade. You can also pick a new one, but then `base_id` needs to be provided.</span>
<span class="sd"> - The `mp_wrapper` parameter specifies the MP wrapper to use, allowing for customization.</span>
<span class="sd"> - `add_mp_types` can be used to specify additional MP types to register alongside the base environment.</span>
<span class="sd"> - The `base_id` parameter should match the ID of the existing Gymnasium environment you wish to upgrade.</span>
<span class="sd"> - `mp_config_override` allows for customizing MP configuration if needed.</span>
<span class="sd"> Example:</span>
<span class="sd"> To upgrade an existing environment with MP versions:</span>
<span class="sd"> &gt;&gt;&gt; upgrade(&quot;MyEnv-v0&quot;, mp_wrapper=CustomMPWrapper)</span>
<span class="sd"> To upgrade an existing environment with custom MP types and configuration:</span>
<span class="sd"> &gt;&gt;&gt; upgrade(&quot;MyEnv-v0&quot;, mp_wrapper=CustomMPWrapper, add_mp_types=[&quot;ProDMP&quot;, &quot;DMP&quot;], mp_config_override={&quot;param&quot;: 42})</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">base_id</span><span class="p">:</span>
<span class="n">base_id</span> <span class="o">=</span> <span class="nb">id</span>
<span class="n">register_mps</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">base_id</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">,</span> <span class="n">add_mp_types</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">register_mps</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">:</span> <span class="n">RawInterfaceWrapper</span><span class="p">,</span> <span class="n">add_mp_types</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="n">KNOWN_MPS</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="p">:</span> <span class="n">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="p">{}):</span>
<span class="k">for</span> <span class="n">mp_type</span> <span class="ow">in</span> <span class="n">add_mp_types</span><span class="p">:</span>
<span class="n">register_mp</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">base_id</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">,</span> <span class="n">mp_type</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">mp_type</span><span class="p">,</span> <span class="p">{}))</span>
<span class="k">def</span> <span class="nf">register_mp</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">:</span> <span class="n">RawInterfaceWrapper</span><span class="p">,</span> <span class="n">mp_type</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">mp_config_override</span><span class="p">:</span> <span class="n">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="p">{}):</span>
<span class="k">assert</span> <span class="n">mp_type</span> <span class="ow">in</span> <span class="n">KNOWN_MPS</span><span class="p">,</span> <span class="s1">&#39;Unknown mp_type&#39;</span>
<span class="k">assert</span> <span class="nb">id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ALL_MOVEMENT_PRIMITIVE_ENVIRONMENTS</span><span class="p">[</span><span class="n">mp_type</span><span class="p">],</span> <span class="sa">f</span><span class="s1">&#39;The environment </span><span class="si">{</span><span class="nb">id</span><span class="si">}</span><span class="s1"> is already registered for </span><span class="si">{</span><span class="n">mp_type</span><span class="si">}</span><span class="s1">.&#39;</span>
<span class="n">parts</span> <span class="o">=</span> <span class="nb">id</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">ns</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;gym&#39;</span><span class="p">,</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">ns</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;env id can not contain multiple &quot;/&quot;.&#39;</span><span class="p">)</span>
<span class="n">parts</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">parts</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">startswith</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">),</span> <span class="s1">&#39;Malformed env id, must end in -v</span><span class="si">{int}</span><span class="s1">.&#39;</span>
<span class="n">fancy_id</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">ns</span><span class="si">}</span><span class="s1">_</span><span class="si">{</span><span class="n">mp_type</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="n">gym_register</span><span class="p">(</span>
<span class="nb">id</span><span class="o">=</span><span class="n">fancy_id</span><span class="p">,</span>
<span class="n">entry_point</span><span class="o">=</span><span class="n">bb_env_constructor</span><span class="p">,</span>
<span class="n">kwargs</span><span class="o">=</span><span class="p">{</span>
<span class="s1">&#39;underlying_id&#39;</span><span class="p">:</span> <span class="n">base_id</span><span class="p">,</span>
<span class="s1">&#39;mp_wrapper&#39;</span><span class="p">:</span> <span class="n">mp_wrapper</span><span class="p">,</span>
<span class="s1">&#39;mp_type&#39;</span><span class="p">:</span> <span class="n">mp_type</span><span class="p">,</span>
<span class="s1">&#39;_mp_config_override_register&#39;</span><span class="p">:</span> <span class="n">mp_config_override</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">ALL_MOVEMENT_PRIMITIVE_ENVIRONMENTS</span><span class="p">[</span><span class="n">mp_type</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fancy_id</span><span class="p">)</span>
<span class="n">ALL_MOVEMENT_PRIMITIVE_ENVIRONMENTS</span><span class="p">[</span><span class="s1">&#39;all&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fancy_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ns</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS</span><span class="p">:</span>
<span class="n">MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS</span><span class="p">[</span><span class="n">ns</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">mp_type</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">mp_type</span> <span class="ow">in</span> <span class="n">_KNOWN_MPS_PLUS_ALL</span><span class="p">}</span>
<span class="n">MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS</span><span class="p">[</span><span class="n">ns</span><span class="p">][</span><span class="n">mp_type</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fancy_id</span><span class="p">)</span>
<span class="n">MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS</span><span class="p">[</span><span class="n">ns</span><span class="p">][</span><span class="s1">&#39;all&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fancy_id</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">nested_update</span><span class="p">(</span><span class="n">base</span><span class="p">:</span> <span class="n">MutableMapping</span><span class="p">,</span> <span class="n">update</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Updated method for nested Mappings</span>
<span class="sd"> Args:</span>
<span class="sd"> base: main Mapping to be updated</span>
<span class="sd"> update: updated values for base Mapping</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">([</span><span class="n">item</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;_type&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">update</span><span class="p">]):</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">update</span>
<span class="k">return</span> <span class="n">base</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">update</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">base</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">nested_update</span><span class="p">(</span><span class="n">base</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="p">{}),</span> <span class="n">v</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">)</span> <span class="k">else</span> <span class="n">v</span>
<span class="k">return</span> <span class="n">base</span>
<span class="k">def</span> <span class="nf">bb_env_constructor</span><span class="p">(</span><span class="n">underlying_id</span><span class="p">,</span> <span class="n">mp_wrapper</span><span class="p">,</span> <span class="n">mp_type</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="o">=</span><span class="p">{},</span> <span class="n">_mp_config_override_register</span><span class="o">=</span><span class="p">{},</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">raw_underlying_env</span> <span class="o">=</span> <span class="n">gym_make</span><span class="p">(</span><span class="n">underlying_id</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">underlying_env</span> <span class="o">=</span> <span class="n">mp_wrapper</span><span class="p">(</span><span class="n">raw_underlying_env</span><span class="p">)</span>
<span class="n">mp_config</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">underlying_env</span><span class="p">,</span> <span class="s1">&#39;mp_config&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">underlying_env</span><span class="p">,</span> <span class="s1">&#39;mp_config&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="p">{}</span>
<span class="n">active_mp_config</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">mp_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">mp_type</span><span class="p">,</span> <span class="p">{}))</span>
<span class="n">global_inherit_defaults</span> <span class="o">=</span> <span class="n">mp_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;inherit_defaults&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">inherit_defaults</span> <span class="o">=</span> <span class="n">active_mp_config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;inherit_defaults&#39;</span><span class="p">,</span> <span class="n">global_inherit_defaults</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">_BB_DEFAULTS</span><span class="p">[</span><span class="n">mp_type</span><span class="p">])</span> <span class="k">if</span> <span class="n">inherit_defaults</span> <span class="k">else</span> <span class="p">{}</span>
<span class="n">nested_update</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">active_mp_config</span><span class="p">)</span>
<span class="n">nested_update</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">_mp_config_override_register</span><span class="p">)</span>
<span class="n">nested_update</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">mp_config_override</span><span class="p">)</span>
<span class="n">wrappers</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;wrappers&#39;</span><span class="p">)</span>
<span class="n">traj_gen_kwargs</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;trajectory_generator_kwargs&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">black_box_kwargs</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;black_box_kwargs&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">contr_kwargs</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;controller_kwargs&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">phase_kwargs</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;phase_generator_kwargs&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">basis_kwargs</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;basis_generator_kwargs&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="k">return</span> <span class="n">make_bb</span><span class="p">(</span><span class="n">underlying_env</span><span class="p">,</span>
<span class="n">wrappers</span><span class="o">=</span><span class="n">wrappers</span><span class="p">,</span>
<span class="n">black_box_kwargs</span><span class="o">=</span><span class="n">black_box_kwargs</span><span class="p">,</span>
<span class="n">traj_gen_kwargs</span><span class="o">=</span><span class="n">traj_gen_kwargs</span><span class="p">,</span>
<span class="n">controller_kwargs</span><span class="o">=</span><span class="n">contr_kwargs</span><span class="p">,</span>
<span class="n">phase_kwargs</span><span class="o">=</span><span class="n">phase_kwargs</span><span class="p">,</span>
<span class="n">basis_kwargs</span><span class="o">=</span><span class="n">basis_kwargs</span><span class="p">,</span>
<span class="o">**</span><span class="n">config</span><span class="p">)</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2020-2024, Fabian Otto, Onur Celik, Dominik Roth, Hongyi Zhou.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

135
docs/build/html/_modules/index.html vendored Normal file
View File

@ -0,0 +1,135 @@
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Overview: module code &mdash; Fancy Gym 0.3.0 documentation</title>
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/style.css" type="text/css" />
<link rel="shortcut icon" href="../_static/icon.svg"/>
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
Fancy Gym
<img src="../_static/icon.svg" class="logo" alt="Logo"/>
</a>
<div class="version">
0.3.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">User Guide</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../guide/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guide/episodic_rl.html">What is Episodic RL?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guide/basic_usage.html">Basic Usage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guide/upgrading_envs.html">Creating new MP Environments</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Environments</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../envs/fancy/index.html">Fancy</a></li>
<li class="toctree-l1"><a class="reference internal" href="../envs/dmc.html">DeepMind Control (DMC)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../envs/meta.html">Metaworld</a></li>
<li class="toctree-l1"><a class="reference internal" href="../envs/open_ai.html">Gymnasium</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Examples</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../examples/general.html">General Usage Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/dmc.html">DeepMind Control Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/metaworld.html">Metaworld Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/open_ai.html">OpenAI Envs Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/movement_primitives.html">Movement Primitives Examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/mp_params_tuning.html">MP Params Tuning Example</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/pd_control_gain_tuning.html">PD Control Gain Tuning Example</a></li>
<li class="toctree-l1"><a class="reference internal" href="../examples/replanning_envs.html">Replanning Example</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../api.html">API</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Fancy Gym</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Overview: module code</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>All modules for which code is available</h1>
<ul><li><a href="fancy_gym/envs/registry.html">fancy_gym.envs.registry</a></li>
</ul>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2020-2024, Fabian Otto, Onur Celik, Dominik Roth, Hongyi Zhou.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

8
docs/build/html/_sources/api.rst.txt vendored Normal file
View File

@ -0,0 +1,8 @@
API
===
.. autosummary::
:toctree: generated
fancy_gym.register
fancy_gym.upgrade

View File

@ -0,0 +1,79 @@
# DeepMind Control (DMC)
<!-- TODO: Add Vid -->
These are the Environment Wrappers for selected
[DeepMind Control](https://github.com/google-deepmind/dm_control)
environments in order to use our Motion Primitive gym interface with them.
## Step-Based Environments
When installing fancy_gym with the optional dmc extra (e.g. `pip install fancy_gym[dmc]`), all regular dmc tasks are avaible via [Shimmy](https://github.com/Farama-Foundation/Shimmy).
| Name | Description | Action Dim | Observation Dim |
| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------- | --------------- |
| `dm_control/acrobot-swingup-v0` | Underactuated double pendulum (Acrobot) with torque applied to the second joint to swing up and balance. | 1 | 6 |
| `dm_control/acrobot-swingup_sparse-v0` | Similar to `acrobot-swingup-v0`, but with sparse rewards for achieving the swingup task. | 1 | 6 |
| `dm_control/ball_in_cup-catch-v0` | Planar ball-in-cup task where a receptacle must swing to catch a ball. Sparse reward for catching. | 2 | 8 |
| `dm_control/cartpole-balance-v0` | Cart-pole task where the goal is to balance an unactuated pole by moving a cart, starting near upright. | 1 | 5 |
| `dm_control/cartpole-balance_sparse-v0` | Similar to `cartpole-balance-v0`, but with sparse rewards. | 1 | 5 |
| `dm_control/cartpole-swingup-v0` | Cart-pole task with the pole starting downward, requiring swinging up and balancing. | 1 | 5 |
| `dm_control/cartpole-swingup_sparse-v0` | Similar to `cartpole-swingup-v0`, but with sparse rewards for the swingup task. | 1 | 5 |
| `dm_control/cartpole-two_poles-v0` | Extension of the Cart-pole domain with two serially connected poles, increasing the balancing challenge. | 1 | 8 |
| `dm_control/cartpole-three_poles-v0` | Extension of the Cart-pole domain with three serially connected poles, further increasing the challenge. | 1 | 11 |
| `dm_control/cheetah-run-v0` | Planar bipedal cheetah robot tasked with running. The reward is proportional to forward velocity up to a maximum speed. | 6 | 17 |
| `dm_control/dog-stand-v0` | Dog robot task focusing on achieving a standing posture. | 38 | 223 |
| `dm_control/dog-walk-v0` | Dog robot tasked with walking, requiring coordination of movements. | 38 | 223 |
| `dm_control/dog-trot-v0` | Dog robot performing a trotting gait. | 38 | 223 |
| `dm_control/dog-run-v0` | Dog robot tasked with running, combining speed with stability. | 38 | 223 |
| `dm_control/dog-fetch-v0` | Dog robot playing fetch, involving locomotion and object interaction. | 38 | 232 |
| `dm_control/finger-spin-v0` | Finger robot required to rotate an unactuated body on a hinge. | 2 | 9 |
| `dm_control/finger-turn_easy-v0` | Finger robot task to align the tip of a free body with a target, easier version with a larger target. | 2 | 12 |
| `dm_control/finger-turn_hard-v0` | Similar to `finger-turn_easy-v0`, but with a smaller target for increased difficulty. | 2 | 12 |
| `dm_control/fish-upright-v0` | Fish robot task focused on righting itself in a fluid environment. | 5 | 21 |
| `dm_control/fish-swim-v0` | Fish robot swimming to a target, incorporating fluid dynamics. | 5 | 24 |
| `dm_control/hopper-stand-v0` | One-legged hopper robot tasked with achieving a minimal torso height. | 4 | 15 |
| `dm_control/hopper-hop-v0` | One-legged hopper robot required to hop, combining height and forward velocity. | 4 | 15 |
| `dm_control/humanoid-stand-v0` | Simplified humanoid robot maintaining a standing posture. | 21 | 67 |
| `dm_control/humanoid-walk-v0` | Simplified humanoid robot walking at a specified speed. | 21 | 67 |
| `dm_control/humanoid-run-v0` | Simplified humanoid robot running, aiming for a high horizontal speed. | 21 | 67 |
| `dm_control/humanoid-run_pure_state-v0` | Simplified humanoid robot running with a focus on pure state control. | 21 | 55 |
| `dm_control/humanoid_CMU-stand-v0` | Advanced humanoid robot (CMU model) maintaining a standing posture. | 56 | 137 |
| `dm_control/humanoid_CMU-walk-v0` | Advanced humanoid robot (CMU model) walking. | 56 | 137 |
| `dm_control/humanoid_CMU-run-v0` | Advanced humanoid robot (CMU model) running. | 56 | 137 |
| `dm_control/lqr-lqr_2_1-v0` | Linear quadratic regulator (LQR) task with 2 masses and 1 actuator, focusing on position and control optimization. | 1 | 4 |
| `dm_control/lqr-lqr_6_2-v0` | Linear quadratic regulator (LQR) task with 6 masses and 2 actuators, more complex control optimization challenge. | 2 | 12 |
| `dm_control/manipulator-bring_ball-v0` | Planar manipulator robot bringing a ball to a target location, with object initialization variations. | 5 | 44 |
| `dm_control/manipulator-bring_peg-v0` | Planar manipulator task of bringing a peg to a target peg. | 5 | 44 |
| `dm_control/manipulator-insert_ball-v0` | Planar manipulator task requiring inserting a ball into a basket. | 5 | 44 |
| `dm_control/manipulator-insert_peg-v0` | Planar manipulator challenge of inserting a peg into a slot. | 5 | 44 |
| `dm_control/pendulum-swingup-v0` | Classic inverted pendulum task with a torque-limited actuator, requiring multiple swings to swing up and balance. | 1 | 3 |
| `dm_control/point_mass-easy-v0` | Planar point mass in an easy task, with actuators corresponding to global x and y axes | 2 | 4 |
| `dm_control/point_mass-hard-v0` | Planar point mass in a hard task, with randomized control gains per episode, challenging memoryless agents. | 2 | 4 |
| `dm_control/quadruped-walk-v0` | Four-legged robot (Quadruped) tasked with walking. | 12 | 78 |
| `dm_control/quadruped-run-v0` | Quadruped robot required to run, balancing speed and stability. | 12 | 78 |
| `dm_control/quadruped-escape-v0` | Quadruped robot in an escape task, combining locomotion with environmental interaction. | 12 | 101 |
| `dm_control/quadruped-fetch-v0` | Quadruped robot playing fetch, involving complex movements and object interaction. | 12 | 90 |
| `dm_control/reacher-easy-v0` | Two-link planar reacher with a randomized target, easier version with a larger target sphere. | 2 | 6 |
| `dm_control/reacher-hard-v0` | Similar to `reacher-easy-v0`, but with a smaller target sphere for increased difficulty. | 2 | 6 |
| `dm_control/stacker-stack_2-v0` | Stacker task requiring stacking of 2 boxes, with rewards for correct placement and gripper positioning. | 5 | 49 |
| `dm_control/stacker-stack_4-v0` | More complex stacker task with 4 boxes, increasing the stacking challenge. | 5 | 63 |
| `dm_control/swimmer-swimmer6-v0` | Six-link planar swimmer in fluid dynamics, rewarded for positioning the nose inside a target. | 5 | 25 |
| `dm_control/swimmer-swimmer15-v0` | Fifteen-link planar swimmer, a more complex version of the swimmer task with extended dynamics. | 14 | 61 |
| `dm_control/walker-stand-v0` | Planar walker robot tasked with maintaining an upright torso and minimal height. | 6 | 24 |
| `dm_control/walker-walk-v0` | Planar walker robot walking task, focusing on forward velocity and stability. | 6 | 24 |
| `dm_control/walker-run-v0` | Planar walker robot running task, aiming for high speed and balance. | 6 | 24 |
## MP Environments
[//]: <> (These environments are wrapped-versions of their Deep Mind Control Suite &#40;DMC&#41; counterparts. Given most task can be)
[//]: <> (solved in shorter horizon lengths than the original 1000 steps, we often shorten the episodes for those task.)
| Name | Description | Trajectory Horizon | Action Dimension | Context Dimension |
| ---------------------------------------- | ------------------------------------------------------------------------------ | ------------------ | ---------------- | ----------------- |
| `dm_control_ProDMP/ball_in_cup-catch-v0` | A ProMP wrapped version of the "catch" task for the "ball_in_cup" environment. | 1000 | 10 | 2 |
| `dm_control_DMP/ball_in_cup-catch-v0` | A DMP wrapped version of the "catch" task for the "ball_in_cup" environment. | 1000 | 10 | 2 |
| `dm_control_ProDMP/reacher-easy-v0` | A ProMP wrapped version of the "easy" task for the "reacher" environment. | 1000 | 10 | 4 |
| `dm_control_DMP/reacher-easy-v0` | A DMP wrapped version of the "easy" task for the "reacher" environment. | 1000 | 10 | 4 |
| `dm_control_ProDMP/reacher-hard-v0` | A ProMP wrapped version of the "hard" task for the "reacher" environment. | 1000 | 10 | 4 |
| `dm_control_DMP/reacher-hard-v0` | A DMP wrapped version of the "hard" task for the "reacher" environment. | 1000 | 10 | 4 |

View File

@ -0,0 +1,18 @@
AirHockey
=========
Fancy Gym provides access to a range of environments for the `Robot Air Hockey Challenge <https://air-hockey-challenge.robot-learning.net/>`_. The challenge aims to close the gap between simulated learning and real-world application by focusing on various aspects of robotic operation, such as dealing with disturbances, observation noise, safety, and actuator limitations.
The environments available through Fancy Gym allow for the development of agents capable of performing tasks with different levels of complexity. These tasks include hitting and defending in air hockey with both three degrees of freedom (3 DoF) and seven degrees of freedom (7 DoF) configurations. The 7 DoF tasks are based on the KUKA iiwa14 robot model, which is used in the simulations to represent a higher level of control complexity akin to real-world settings.
Participants in the challenge are required to develop strategies that enable their robots to react and adapt within these dynamic environments. The final phase of the challenge involves a tournament where the developed agents will be tested in a comprehensive game scenario, both in simulation and, for the top teams, on actual robotic systems.
For detailed information on the challenge, including rules, stages, and submission requirements, please visit the `official Robot Air Hockey Challenge website <https://air-hockey-challenge.robot-learning.net/>`_.
The available environments are as follows:
- fancy/AirHockey-7dof-hit-v0
- fancy/AirHockey-7dof-defend-v0
- fancy/AirHockey-3dof-hit-v0
- fancy/AirHockey-3dof-defend-v0
- fancy/AirHockey-7dof-hit-airhockit2023-v0
- fancy/AirHockey-7dof-defend-airhockit2023-v0

View File

@ -0,0 +1,22 @@
# Classic Control
Classic Control environments provide a foundational platform for exploring and experimenting with RL algorithms. These environments are designed to be simple, allowing researchers and practitioners to focus on the fundamental principles of control without the complexities of high-dimensional and physics-based simulations.
## Step-Based Environments
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------- | --------------------- |
| `fancy/SimpleReacher-v0` | Simple reaching task (2 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory. | 200 | 2 | 9 |
| `fancy/LongSimpleReacher-v0` | Simple reaching task (5 links) without any physics simulation. Provides no reward until 150 time steps. This allows the agent to explore the space, but requires precise actions towards the end of the trajectory. | 200 | 5 | 18 |
| `fancy/ViaPointReacher-v0` | Simple reaching task leveraging a via point, which supports self collision detection. Provides a reward only at 100 and 199 for reaching the viapoint and goal point, respectively. | 200 | 5 | 18 |
| `fancy/HoleReacher-v0` | 5 link reaching task where the end-effector needs to reach into a narrow hole without collding with itself or walls. | 200 | 5 | 18 |
## MP Environments
| Name | Description | Horizon | Action Dimension | Context Dimension |
| ----------------------------------- | -------------------------------------------------------------------------------------------------------- | ------- | ---------------- | ----------------- |
| `fancy_DMP/ViaPointReacher-v0` | A DMP provides a trajectory for the `fancy/ViaPointReacher-v0` task. | 200 | 25 |
| `fancy_DMP/HoleReacherFixedGoal-v0` | A DMP provides a trajectory for the `fancy/HoleReacher-v0` task with a fixed goal attractor. | 200 | 25 |
| `fancy_DMP/HoleReacher-v0` | A DMP provides a trajectory for the `fancy/HoleReacher-v0` task. The goal attractor needs to be learned. | 200 | 30 |
[//]: |`fancy/HoleReacherProMPP-v0`|

View File

@ -0,0 +1,17 @@
Fancy
=====
Fancy Gym adds a couple new environments. Some of these are adaptations of existing environments while others were designed and build by us from the ground up.
.. raw:: html
<div class='center'>
<img src="../../_static/imgs/env_gifs/Box_Pushing.gif" style="margin: 5%; width: 45%;">
<p>Box Pushing Task (<a href="./mujoco.html#box-pushing">fancy/BoxPushingDense-v0</a>)</p>
</div>
<br>
.. toctree::
mujoco.md
airhockey
classic_control.md

View File

@ -0,0 +1,124 @@
# Mujoco
## Step-Based Environments
### Box Pushing
<div class='center'>
<img src="../../_static/imgs/env_gifs/Box_Pushing.gif" style="margin: 5%; width: 45%;">
</div>
The box-pushing task presents an advanced environment for reinforcement learning (RL) systems, utilizing the versatile Franka Emika Panda robotic arm, which boasts seven degrees of freedom (DoFs). The objective of this task is to precisely manipulate a box to a specified goal location and orientation.
This environment defines its context space with a goal position constrained within a certain range along the x and y axes and a goal orientation that encompasses the full 360-degree range on the z-axis. The robot's mission is to achieve positional accuracy within 5 centimeters and an orientation accuracy within 0.5 radians of the specified goal.
The observation space includes the sine and cosine values of the robotic joint angles, their velocities, and quaternion orientations for the end-effector and the box. The action space describes the applied torques for each joint.
A composite reward function serves as the performance metric for the RL system. It accounts for the distance to the goal, the box's orientation, maintaining a rod within the box, achieving the rod's desired orientation, and includes penalties for joint position and velocity limit violations, as well as an action cost for energy expenditure.
Variations of this environment are available, differing in reward structures and the optionality of randomizing the box's initial position. These variations are purposefully designed to challenge RL algorithms, enhancing their generalization and adaptation capabilities. Temporally sparse environments only provide a reward at the last timestep. Spatially sparse environments only provide a reward, if the goal is almost reached, the box is close enought to the goal and somewhat correctly aligned.
These environments all provide smoothness metrics as part of the return infos:
- mean_squared_jerk: Averages the square of jerk (rate of acceleration change) across the motion. Lower values indicate smoother movement.
- maximum_jerk: Identifies the highest jerk value encountered.
- dimensionless_jerk: Normalizes the summed squared jerk over the motion's duration and peak velocity, offering a scale-independent metric of smoothness
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| ------------------------------------------ | -------------------------------------------------------------------- | ------- | ---------------- | --------------------- |
| `fancy/BoxPushingDense-v0` | Custom Box-pushing task with dense rewards | 100 | 3 | 13 |
| `fancy/BoxPushingTemporalSparse-v0` | Custom Box-pushing task with temporally sparse rewards | 100 | 3 | 13 |
| `fancy/BoxPushingTemporalSpatialSparse-v0` | Custom Box-pushing task with temporally and spatially sparse rewards | 100 | 3 | 13 |
---
### Table Tennis
<div class='center'>
<img src="../../_static/imgs/env_gifs/Table_Tennis.gif" style="margin: 5%; width: 45%;">
</div>
The table tennis task offers a robotic arm equipped with seven degrees of freedom (DoFs). The task is to respond to incoming balls and return them accurately to a specified goal location on the opponent's side of the table.
The context space for this environment includes the initial ball position, with x-coordinates ranging from -1 to -0.2 meters and y-coordinates from -0.65 to 0.65 meters, and the goal position with x-coordinates between -1.2 to -0.2 meters and y-coordinates from -0.6 to 0.6 meters. The full observation space comprises the sine and cosine values of the joint angles, the joint velocities, and the ball's velocity, providing comprehensive information for the RL system to base its decisions on.
A task is considered successfully completed when the returned ball not only lands on the opponent's side of the table but also within a tight margin of 20 centimeters from the goal location. The reward function is designed to reflect various conditions of play, including whether the ball was hit, if it landed on the table, and the proximity of the ball's landing position to the goal location.
Variations of the table tennis environment are available to cater to different research needs. These variations maintain the foundational challenge of precise ball return while providing additional complexity for RL algorithms to overcome.
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| ----------------------------------- | -------------------------------------------------------------------------------------------------- | ------- | ---------------- | --------------------- |
| `fancy/TableTennis2D-v0` | Table Tennis task with 2D context, based on a custom environment for table tennis | 350 | 7 | 19 |
| `fancy/TableTennis2DReplan-v0` | Table Tennis task with 2D context and replanning, based on a custom environment for table tennis | 350 | 7 | 19 |
| `fancy/TableTennis4D-v0` | Table Tennis task with 4D context, based on a custom environment for table tennis | 350 | 7 | 22 |
| `fancy/TableTennis4DReplan-v0` | Table Tennis task with 4D context and replanning, based on a custom environment for table tennis | 350 | 7 | 22 |
| `fancy/TableTennisWind-v0` | Table Tennis task with wind effects, based on a custom environment for table tennis | 350 | 7 | 19 |
| `fancy/TableTennisGoalSwitching-v0` | Table Tennis task with goal switching, based on a custom environment for table tennis | 350 | 7 | 19 |
| `fancy/TableTennisWindReplan-v0` | Table Tennis task with wind effects and replanning, based on a custom environment for table tennis | 350 | 7 | 19 |
| `fancy/TableTennisRndRobot-v0` | Table Tennis task with random initial robot joint positions \* | 350 | 7 | 19 |
\* Random initialization of robot joint position and speed can be enabled by providing `random_pos_scale` / `random_vel_scale` to make. `TableTennisRndRobot` is equivalent to `TableTennis4D` except, that `random_pos_scale` is set to 0.1 instead of 0 per default.
---
### Beer Pong
<div class='center'>
<img src="../../_static/imgs/env_gifs/Beer_Pong.gif" style="margin: 5%; width: 45%;">
</div>
<!-- TODO: Vid is ugly and unsuccessful. Replace. -->
The Beer Pong task is based upon a robotic system with seven Degrees of Freedom (DoF), challenging the robot to throw a ball into a cup placed on a large table. The environment's context is established by the cup's location, defined within a range of x-coordinates from -1.42 to 1.42 meters and y-coordinates from -4.05 to -1.25 meters.
The observation space includes the cosine and sine of the robot's joint angles, the angular velocities, and distances of the ball relative to the top and bottom of the cup, along with the cup's position and the current timestep. The action space for the robot is defined by the torques applied to each joint. For episode-based methods, the parameter space is expanded to 15 dimensions, which includes two weights for the basis functions per joint and the duration of the throw, namely the ball release time.
Action penalties are implemented in the form of squared torque sums applied across all joints, penalizing excessive force and encouraging efficient motion. The reward function at each timestep t before the final timestep T penalizes the action penalty, while at t=T, a non-Markovian reward based on the ball's position relative to the cup and the action penalty is considered.
An additional reward component at the final timestep T assesses the chosen ball release time to ensure it falls within a reasonable range. The overall return for an episode is the sum of the rewards at each timestep, the task-specific reward, and the release time reward.
A successful throw in this task is determined by the ball landing in the cup at the episode's conclusion, showcasing the robot's ability to accurately predict and execute the complex motion required for this popular party game.
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| ------------------------------- | ---------------------------------------------------------------------------------------------- | ------- | ---------------- | --------------------- |
| `fancy/BeerPong-v0` | Beer Pong task, based on a custom environment with multiple task variations | 300 | 3 | 29 |
| `fancy/BeerPongStepBased-v0` | Step-based rewards for the Beer Pong task, based on a custom environment with episodic rewards | 300 | 3 | 29 |
| `fancy/BeerPongFixedRelease-v0` | Beer Pong with fixed release, based on a custom environment with episodic rewards | 300 | 3 | 29 |
---
### Variations of existing environments
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| ------------------------------ | ------------------------------------------------------------------------------------------------ | ------- | ---------------- | --------------------- |
| `fancy/Reacher-v0` | Modified (5 links) gymnasiums's mujoco `Reacher-v2` (2 links) | 200 | 5 | 21 |
| `fancy/ReacherSparse-v0` | Same as `fancy/Reacher-v0`, but the distance penalty is only provided in the last time step. | 200 | 5 | 21 |
| `fancy/LongReacher-v0` | Modified (7 links) gymnasiums's mujoco `Reacher-v2` (2 links) | 200 | 7 | 27 |
| `fancy/LongReacherSparse-v0` | Same as `fancy/LongReacher-v0`, but the distance penalty is only provided in the last time step. | 200 | 7 | 27 |
| `fancy/Reacher5d-v0` | Reacher task with 5 links, based on Gymnasium's `gym.envs.mujoco.ReacherEnv` | 200 | 5 | 20 |
| `fancy/Reacher5dSparse-v0` | Sparse Reacher task with 5 links, based on Gymnasium's `gym.envs.mujoco.ReacherEnv` | 200 | 5 | 20 |
| `fancy/Reacher7d-v0` | Reacher task with 7 links, based on Gymnasium's `gym.envs.mujoco.ReacherEnv` | 200 | 7 | 22 |
| `fancy/Reacher7dSparse-v0` | Sparse Reacher task with 7 links, based on Gymnasium's `gym.envs.mujoco.ReacherEnv` | 200 | 7 | 22 |
| `fancy/HopperJump-v0` | Hopper Jump task with continuous rewards, based on Gymnasium's `gym.envs.mujoco.Hopper` | 250 | 3 | 15 / 16\* |
| `fancy/HopperJumpMarkov-v0` | `fancy/HopperJump-v0`, but with an alternative reward that is markovian. | 250 | 3 | 15 / 16\* |
| `fancy/HopperJumpSparse-v0` | Hopper Jump task with sparse rewards, based on Gymnasium's `gym.envs.mujoco.Hopper` | 250 | 3 | 15 / 16\* |
| `fancy/AntJump-v0` | Ant Jump task, based on Gymnasium's `gym.envs.mujoco.Ant` | 200 | 8 | 119 |
| `fancy/HalfCheetahJump-v0` | HalfCheetah Jump task, based on Gymnasium's `gym.envs.mujoco.HalfCheetah` | 100 | 6 | 112 |
| `fancy/HopperJumpOnBox-v0` | Hopper Jump on Box task, based on Gymnasium's `gym.envs.mujoco.Hopper` | 250 | 4 | 16 / 100\* |
| `fancy/HopperThrow-v0` | Hopper Throw task, based on Gymnasium's `gym.envs.mujoco.Hopper` | 250 | 3 | 18 / 100\* |
| `fancy/HopperThrowInBasket-v0` | Hopper Throw in Basket task, based on Gymnasium's `gym.envs.mujoco.Hopper` | 250 | 3 | 18 / 100\* |
| `fancy/Walker2DJump-v0` | Walker 2D Jump task, based on Gymnasium's `gym.envs.mujoco.Walker2d` | 300 | 6 | 18 / 19\* |
\*Observation dimensions depend on configuration.
<!--
No longer used?
| Name | Description | Horizon | Action Dimension | Observation Dimension |
| --------------------------- | --------------------------------------------------------------------------------------------------- | ------- | ---------------- | --------------------- |
| `fancy/BallInACupSimple-v0` | Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector. | 4000 | 3 | wip |
| `fancy/BallInACup-v0` | Ball-in-a-cup task where a robot needs to catch a ball attached to a cup at its end-effector | 4000 | 7 | wip |
| `fancy/BallInACupGoal-v0` | Similar to `fancy/BallInACupSimple-v0` but the ball needs to be caught at a specified goal position | 4000 | 7 | wip |
-->
## MP Environments
Most of these envs also exist as MP-variants. Refer to them using `fancy_DMP/<name>` `fancy_ProMP/<name>` or `fancy_ProDMP/<name>`.

View File

@ -0,0 +1,70 @@
# Metaworld
<div class='center'>
<img src="../_static/imgs/env_gifs/Metaworld.gif" style="margin: 5%; width: 45%;">
<p>Metaworld Dial Turn Task (metaworld/dial-turn-v2)</p>
</div>
<br>
[Metaworld](https://meta-world.github.io/) is an open-source simulated benchmark designed to advance meta-reinforcement learning and multi-task learning, comprising 50 diverse robotic manipulation tasks. The benchmark features a universal tabletop environment equipped with a simulated Sawyer arm and a variety of everyday objects. This shared environment is pivotal for reusing structured learning and efficiently acquiring related tasks.
## Step-Based Environments
`fancy_gym` makes all metaworld ML1 tasks avaible via the standard gym interface.
| Name | Description | Horizon | Action Dimension | Observation Dimension | Context Dimension |
| ---------------------------------------- | ------------------------------------------------------------------------------------- | ------- | ---------------- | --------------------- | ----------------- |
| `metaworld/assembly-v2` | A task where the robot must assemble components. | 150 | 4 | 39 | 6 |
| `metaworld/basketball-v2` | A task where the robot must play a game of basketball. | 150 | 4 | 39 | 6 |
| `metaworld/bin-picking-v2` | A task involving the robot picking objects from a bin. | 150 | 4 | 39 | 6 |
| `metaworld/box-close-v2` | A task requiring the robot to close a box. | 150 | 4 | 39 | 6 |
| `metaworld/button-press-topdown-v2` | A task where the robot must press a button from a top-down perspective. | 150 | 4 | 39 | 6 |
| `metaworld/button-press-topdown-wall-v2` | A task involving the robot pressing a button with a wall from a top-down perspective. | 150 | 4 | 39 | 6 |
| `metaworld/button-press-v2` | A task where the robot must press a button. | 150 | 4 | 39 | 6 |
| `metaworld/button-press-wall-v2` | A task involving the robot pressing a button with a wall. | 150 | 4 | 39 | 6 |
| `metaworld/coffee-button-v2` | A task where the robot must press a button on a coffee machine. | 150 | 4 | 39 | 6 |
| `metaworld/coffee-pull-v2` | A task involving the robot pulling a lever on a coffee machine. | 150 | 4 | 39 | 6 |
| `metaworld/coffee-push-v2` | A task involving the robot pushing a component on a coffee machine. | 150 | 4 | 39 | 6 |
| `metaworld/dial-turn-v2` | A task where the robot must turn a dial. | 150 | 4 | 39 | 6 |
| `metaworld/disassemble-v2` | A task requiring the robot to disassemble an object. | 150 | 4 | 39 | 6 |
| `metaworld/door-close-v2` | A task where the robot must close a door. | 150 | 4 | 39 | 6 |
| `metaworld/door-lock-v2` | A task involving the robot locking a door. | 150 | 4 | 39 | 6 |
| `metaworld/door-open-v2` | A task where the robot must open a door. | 150 | 4 | 39 | 6 |
| `metaworld/door-unlock-v2` | A task involving the robot unlocking a door. | 150 | 4 | 39 | 6 |
| `metaworld/hand-insert-v2` | A task requiring the robot to insert a hand into an object. | 150 | 4 | 39 | 6 |
| `metaworld/drawer-close-v2` | A task where the robot must close a drawer. | 150 | 4 | 39 | 6 |
| `metaworld/drawer-open-v2` | A task involving the robot opening a drawer. | 150 | 4 | 39 | 6 |
| `metaworld/faucet-open-v2` | A task requiring the robot to open a faucet. | 150 | 4 | 39 | 6 |
| `metaworld/faucet-close-v2` | A task where the robot must close a faucet. | 150 | 4 | 39 | 6 |
| `metaworld/hammer-v2` | A task where the robot must use a hammer. | 150 | 4 | 39 | 6 |
| `metaworld/handle-press-side-v2` | A task involving the robot pressing a handle from the side. | 150 | 4 | 39 | 6 |
| `metaworld/handle-press-v2` | A task where the robot must press a handle. | 150 | 4 | 39 | 6 |
| `metaworld/handle-pull-side-v2` | A task requiring the robot to pull a handle from the side. | 150 | 4 | 39 | 6 |
| `metaworld/handle-pull-v2` | A task where the robot must pull a handle. | 150 | 4 | 39 | 6 |
| `metaworld/lever-pull-v2` | A task involving the robot pulling a lever. | 150 | 4 | 39 | 6 |
| `metaworld/peg-insert-side-v2` | A task requiring the robot to insert a peg from the side. | 150 | 4 | 39 | 6 |
| `metaworld/pick-place-wall-v2` | A task involving the robot picking and placing an object with a wall. | 150 | 4 | 39 | 6 |
| `metaworld/pick-out-of-hole-v2` | A task where the robot must pick an object out of a hole. | 150 | 4 | 39 | 6 |
| `metaworld/reach-v2` | A task where the robot must reach an object. | 150 | 4 | 39 | 6 |
| `metaworld/push-back-v2` | A task involving the robot pushing an object backward. | 150 | 4 | 39 | 6 |
| `metaworld/push-v2` | A task where the robot must push an object. | 150 | 4 | 39 | 6 |
| `metaworld/pick-place-v2` | A task involving the robot picking up and placing an object. | 150 | 4 | 39 | 6 |
| `metaworld/plate-slide-v2` | A task requiring the robot to slide a plate. | 150 | 4 | 39 | 6 |
| `metaworld/plate-slide-side-v2` | A task involving the robot sliding a plate from the side. | 150 | 4 | 39 | 6 |
| `metaworld/plate-slide-back-v2` | A task where the robot must slide a plate backward. | 150 | 4 | 39 | 6 |
| `metaworld/plate-slide-back-side-v2` | A task involving the robot sliding a plate backward from the side. | 150 | 4 | 39 | 6 |
| `metaworld/peg-unplug-side-v2` | A task where the robot must unplug a peg from the side. | 150 | 4 | 39 | 6 |
| `metaworld/soccer-v2` | A task where the robot must play soccer. | 150 | 4 | 39 | 6 |
| `metaworld/stick-push-v2` | A task involving the robot pushing a stick. | 150 | 4 | 39 | 6 |
| `metaworld/stick-pull-v2` | A task where the robot must pull a stick. | 150 | 4 | 39 | 6 |
| `metaworld/push-wall-v2` | A task involving the robot pushing against a wall. | 150 | 4 | 39 | 6 |
| `metaworld/reach-wall-v2` | A task where the robot must reach an object with a wall. | 150 | 4 | 39 | 6 |
| `metaworld/shelf-place-v2` | A task involving the robot placing an object on a shelf. | 150 | 4 | 39 | 6 |
| `metaworld/sweep-into-v2` | A task where the robot must sweep objects into a container. | 150 | 4 | 39 | 6 |
| `metaworld/sweep-v2` | A task requiring the robot to sweep. | 150 | 4 | 39 | 6 |
| `metaworld/window-open-v2` | A task where the robot must open a window. | 150 | 4 | 39 | 6 |
| `metaworld/window-close-v2` | A task involving the robot closing a window. | 150 | 4 | 39 | 6 |
## MP Environments
All envs also exist in MP-variants. Refer to them using `metaworld_ProMP/<name-v2>` or `metaworld_ProDMP/<name-v2>` (DMP is currently not supported as of now).

View File

@ -0,0 +1,24 @@
# Gymnasium
<div class='center'>
<img src="../_static/imgs/env_gifs/Lunar_Lander.gif" style="margin: 5%; width: 60%;">
<p>Lunar Lander Task (LunarLander-v2)</p>
</div>
<br>
We provide MP versions for selected [Farama Gymnasium](https://gymnasium.farama.org/) (previously OpenAI Gym) environments.
## Step-Based Environments
We refer to the [Gymnasium docs](https://gymnasium.farama.org/content/basic_usage/) for an overview of step-based environments provided by them.
## MP Environments
These environments are wrapped-versions of their Gymnasium counterparts.
| Name | Description | Trajectory Horizon | Action Dimension |
| ------------------------------------ | -------------------------------------------------------------------- | ------------------ | ---------------- |
| `gym_ProMP/ContinuousMountainCar-v0` | A ProMP wrapped version of the ContinuousMountainCar-v0 environment. | 100 | 1 |
| `gym_ProMP/Reacher-v2` | A ProMP wrapped version of the Reacher-v2 environment. | 50 | 2 |
| `gym_ProMP/FetchSlideDense-v1` | A ProMP wrapped version of the FetchSlideDense-v1 environment. | 50 | 4 |
| `gym_ProMP/FetchReachDense-v1` | A ProMP wrapped version of the FetchReachDense-v1 environment. | 50 | 4 |

View File

@ -0,0 +1,6 @@
DeepMind Control Examples
=========================
.. literalinclude:: ../../../fancy_gym/examples/examples_dmc.py
:language: python
:linenos:

View File

@ -0,0 +1,8 @@
.. _example-general:
General Usage Examples
======================
.. literalinclude:: ../../../fancy_gym/examples/examples_general.py
:language: python
:linenos:

View File

@ -0,0 +1,6 @@
Metaworld Examples
==================
.. literalinclude:: ../../../fancy_gym/examples/examples_metaworld.py
:language: python
:linenos:

View File

@ -0,0 +1,9 @@
.. _example-mp:
Movement Primitives Examples
============================
.. literalinclude:: ../../../fancy_gym/examples/examples_movement_primitives.py
:language: python
:linenos:

View File

@ -0,0 +1,6 @@
MP Params Tuning Example
========================
.. literalinclude:: ../../../fancy_gym/examples/mp_params_tuning.py
:language: python
:linenos:

View File

@ -0,0 +1,6 @@
OpenAI Envs Examples
====================
.. literalinclude:: ../../../fancy_gym/examples/examples_open_ai.py
:language: python
:linenos:

View File

@ -0,0 +1,6 @@
PD Control Gain Tuning Example
==============================
.. literalinclude:: ../../../fancy_gym/examples/pd_control_gain_tuning.py
:language: python
:linenos:

View File

@ -0,0 +1,6 @@
Replanning Example
==================
.. literalinclude:: ../../../fancy_gym/examples/example_replanning_envs.py
:language: python
:linenos:

View File

@ -0,0 +1,23 @@
fancy\_gym.envs
===============
.. automodule:: fancy_gym.envs

View File

@ -0,0 +1,6 @@
fancy\_gym.register
===================
.. currentmodule:: fancy_gym
.. autofunction:: register

View File

@ -0,0 +1,6 @@
fancy\_gym.upgrade
==================
.. currentmodule:: fancy_gym
.. autofunction:: upgrade

View File

@ -0,0 +1,125 @@
Basic Usage
-----------
We will only show the basics here and prepared :ref:`multiple examples <example-general>` for a more detailed look.
Step-Based Environments
~~~~~~~~~~~~~~~~~~~~~~~
Regular step based environments added by Fancy Gym are added into the
``fancy/`` namespace.
.. note::
Legacy versions of Fancy Gym used ``fancy_gym.make(...)``. This is no longer supported and will raise an Exception on new versions.
.. code:: python
import gymnasium as gym
import fancy_gym
env = gym.make('fancy/Reacher5d-v0')
# or env = gym.make('metaworld/reach-v2') # fancy_gym allows access to all metaworld ML1 tasks via the metaworld/ NS
# or env = gym.make('dm_control/ball_in_cup-catch-v0')
# or env = gym.make('Reacher-v2')
observation = env.reset(seed=1)
for i in range(1000):
action = env.action_space.sample()
observation, reward, terminated, truncated, info = env.step(action)
if i % 5 == 0:
env.render()
if terminated or truncated:
observation, info = env.reset()
Black-Box Environments
~~~~~~~~~~~~~~~~~~~~~~
All environments provide by default the cumulative episode reward, this
can however be changed if necessary. Optionally, each environment
returns all collected information from each step as part of the infos.
This information is, however, mainly meant for debugging as well as
logging and not for training.
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| Key | Description | Type |
+=====================+============================================================================================================================================+==========+
| `positions` | Generated trajectory from MP | Optional |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `velocities` | Generated trajectory from MP | Optional |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `step_actions` | Step-wise executed action based on controller output | Optional |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `step_observations` | Step-wise intermediate observations | Optional |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `step_rewards` | Step-wise rewards | Optional |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `trajectory_length` | Total number of environment interactions | Always |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
| `other` | All other information from the underlying environment are returned as a list with length `trajectory_length` maintaining the original key. | Always |
| | In case some information are not provided every time step, the missing values are filled with `None`. | |
+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------+----------+
Existing MP tasks can be created the same way as above. The namespace of
a MP-variant of an environment is given by
``<original namespace>_<MP name>/``. Just keep in mind, calling
``step()`` executes a full trajectory.
.. note::
Currently, we are also in the process of enabling replanning as
well as learning of sub-trajectories. This allows to split the
episode into multiple trajectories and is a hybrid setting between
step-based and black-box leaning. While this is already
implemented, it is still in beta and requires further testing. Feel
free to try it and open an issue with any problems that occur.
.. code:: python
import gymnasium as gym
import fancy_gym
env = gym.make('fancy_ProMP/Reacher5d-v0')
# or env = gym.make('metaworld_ProDMP/reach-v2')
# or env = gym.make('dm_control_DMP/ball_in_cup-catch-v0')
# or env = gym.make('gym_ProMP/Reacher-v2') # mp versions of envs added directly by gymnasium are in the gym_<MP-type> NS
# render() can be called once in the beginning with all necessary arguments.
# To turn it of again just call render() without any arguments.
env.render(mode='human')
# This returns the context information, not the full state observation
observation, info = env.reset(seed=1)
for i in range(5):
action = env.action_space.sample()
observation, reward, terminated, truncated, info = env.step(action)
# terminated or truncated is always True as we are working on the episode level, hence we always reset()
observation, info = env.reset()
To show all available environments, we provide some additional
convenience variables. All of them return a dictionary with the keys
``DMP``, ``ProMP``, ``ProDMP`` and ``all`` that store a list of
available environment ids.
.. code:: python
import fancy_gym
print("All Black-box tasks:")
print(fancy_gym.ALL_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("Fancy Black-box tasks:")
print(fancy_gym.ALL_FANCY_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("OpenAI Gym Black-box tasks:")
print(fancy_gym.ALL_GYM_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("Deepmind Control Black-box tasks:")
print(fancy_gym.ALL_DMC_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("MetaWorld Black-box tasks:")
print(fancy_gym.ALL_METAWORLD_MOVEMENT_PRIMITIVE_ENVIRONMENTS)
print("If you add custom envs, their mp versions will be found in:")
print(fancy_gym.MOVEMENT_PRIMITIVE_ENVIRONMENTS_FOR_NS['<my_custom_namespace>'])

View File

@ -0,0 +1,36 @@
What is Episodic RL?
--------------------
.. raw:: html
<div class="justify">
Movement primitive (MP) environments differ from traditional step-based
environments. They align more with concepts from stochastic search,
black-box optimization, and methods commonly found in classical robotics
and control. Instead of individual steps, MP environments operate on an
episode basis, executing complete trajectories. These trajectories are
produced by trajectory generators like Dynamic Movement Primitives
(DMP), Probabilistic Movement Primitives (ProMP) or Probabilistic
Dynamic Movement Primitives (ProDMP).
Once generated, these trajectories are converted into step-by-step
actions using a trajectory tracking controller. The specific controller
chosen depends on the environments requirements. Currently, we support
position, velocity, and PD-Controllers tailored for position, velocity,
and torque control. Additionally, we have a specialized controller
designed for the MetaWorld control suite.
While the overarching objective of MP environments remains the learning
of an optimal policy, the actions here represent the parametrization of
motion primitives to craft the right trajectory. Our framework further
enhances this by accommodating a contextual setting. At the episodes
onset, we present the context space—a subset of the observation space.
This demands the prediction of a new action or MP parametrization for
every unique context.
.. raw:: html
</div>

View File

@ -0,0 +1,73 @@
Installation
------------
.. note::
We recommend installing ``fancy_gym`` into a virtual environment as
provided by `venv <https://docs.python.org/3/library/venv.html>`__. 3rd
party alternatives to venv like `Poetry <https://python-poetry.org/>`__
or `Conda <https://docs.conda.io/en/latest/>`__ can also be used.
Installation from PyPI (recommended)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Install ``fancy_gym`` via
.. code:: bash
pip install fancy_gym
We have a few optional dependencies. If you also want to install those
use
.. code:: bash
# to install all optional dependencies
pip install 'fancy_gym[all]'
# or choose only those you want
pip install 'fancy_gym[dmc,box2d,mujoco-legacy,jax,testing]'
Pip can not automatically install up-to-date versions of metaworld,
since they are not avaible on PyPI yet. Install metaworld via
.. code:: bash
pip install metaworld@git+https://github.com/Farama-Foundation/Metaworld.git@c822f28f582ba1ad49eb5dcf61016566f28003ba#egg=metaworld
Installation from master
~~~~~~~~~~~~~~~~~~~~~~~~
1. Clone the repository
.. code:: bash
git clone git@github.com:ALRhub/fancy_gym.git
2. Go to the folder
.. code:: bash
cd fancy_gym
3. Install with
.. code:: bash
pip install -e .
We have a few optional dependencies. If you also want to install those
use
.. code:: bash
# to install all optional dependencies
pip install -e '.[all]'
# or choose only those you want
pip install -e '.[dmc,box2d,mujoco-legacy,jax,testing]'
Metaworld has to be installed manually with
.. code:: bash
pip install metaworld@git+https://github.com/Farama-Foundation/Metaworld.git@c822f28f582ba1ad49eb5dcf61016566f28003ba#egg=metaworld

View File

@ -0,0 +1,138 @@
Creating new MP Environments
----------------------------
This guide will explain to you how to upgrade an existing step-based Gymnasium environment into one, that supports Movement Primitives (MPs). If you are looking for a guide to build such a Gymnasium environment instead, please have a look at `this guide <https://gymnasium.farama.org/tutorials/gymnasium_basics/environment_creation/>`__.
In case a required task is not supported yet in the MP framework, it can
be created relatively easy. For the task at hand, the following
`interface <https://github.com/ALRhub/fancy_gym/tree/master/fancy_gym/black_box/raw_interface_wrapper.py>`__
needs to be implemented.
.. code:: python
from abc import abstractmethod
from typing import Union, Tuple
import gymnasium as gym
import numpy as np
class RawInterfaceWrapper(gym.Wrapper):
mp_config = {
'ProMP': {},
'DMP': {},
'ProDMP': {},
}
@property
def context_mask(self) -> np.ndarray:
"""
Returns boolean mask of the same shape as the observation space.
It determines whether the observation is returned for the contextual case or not.
This effectively allows to filter unwanted or unnecessary observations from the full step-based case.
E.g. Velocities starting at 0 are only changing after the first action. Given we only receive the
context/part of the first observation, the velocities are not necessary in the observation for the task.
Returns:
bool array representing the indices of the observations
"""
return np.ones(self.env.observation_space.shape[0], dtype=bool)
@property
@abstractmethod
def current_pos(self) -> Union[float, int, np.ndarray, Tuple]:
"""
Returns the current position of the action/control dimension.
The dimensionality has to match the action/control dimension.
This is not required when exclusively using velocity control,
it should, however, be implemented regardless.
E.g. The joint positions that are directly or indirectly controlled by the action.
"""
raise NotImplementedError()
@property
@abstractmethod
def current_vel(self) -> Union[float, int, np.ndarray, Tuple]:
"""
Returns the current velocity of the action/control dimension.
The dimensionality has to match the action/control dimension.
This is not required when exclusively using position control,
it should, however, be implemented regardless.
E.g. The joint velocities that are directly or indirectly controlled by the action.
"""
raise NotImplementedError()
Default configurations for MPs can be overitten by defining attributes
in mp_config. Available parameters are documented in the `MP_PyTorch
Userguide <https://github.com/ALRhub/MP_PyTorch/blob/main/doc/README.md>`__.
.. code:: python
class RawInterfaceWrapper(gym.Wrapper):
mp_config = {
'ProMP': {
'phase_generator_kwargs': {
'phase_generator_type': 'linear'
# When selecting another generator type, the default configuration will not be merged for the attribute.
},
'controller_kwargs': {
'p_gains': 0.5 * np.array([1.0, 4.0, 2.0, 4.0, 1.0, 4.0, 1.0]),
'd_gains': 0.5 * np.array([0.1, 0.4, 0.2, 0.4, 0.1, 0.4, 0.1]),
},
'basis_generator_kwargs': {
'num_basis': 3,
'num_basis_zero_start': 1,
'num_basis_zero_goal': 1,
},
},
'DMP': {},
'ProDMP': {}.
}
[...]
If you created a new task wrapper, feel free to open a PR, so we can
integrate it for others to use as well. Without the integration the task
can still be used. A rough outline can be shown here, for more details
we recommend having a look at the
:ref:`multiple examples <example-mp>`.
If the step-based is already registered with gym, you can simply do the
following:
.. code:: python
fancy_gym.upgrade(
id='custom/cool_new_env-v0',
mp_wrapper=my_custom_MPWrapper
)
If the step-based is not yet registered with gym we can add both the
step-based and MP-versions via
.. code:: python
fancy_gym.register(
id='custom/cool_new_env-v0',
entry_point=my_custom_env,
mp_wrapper=my_custom_MPWrapper
)
From this point on, you can access MP-version of your environments via
.. code:: python
env = gym.make('custom_ProDMP/cool_new_env-v0')
rewards = 0
observation, info = env.reset()
# number of samples/full trajectories (multiple environment steps)
for i in range(5):
ac = env.action_space.sample()
observation, reward, terminated, truncated, info = env.step(ac)
rewards += reward
if terminated or truncated:
print(rewards)
rewards = 0
observation, info = env.reset()

166
docs/build/html/_sources/index.rst.txt vendored Normal file
View File

@ -0,0 +1,166 @@
Fancy Gym
=========
.. raw:: html
<div style="text-align: center;">
<img src="_static/imgs/fancy_namelogo.svg" style="margin: 5%; width: 80%;"></a>
</div>
<style>
/* Little Hack: We don't want to show the title (ugly), but need to define it since it also sets the pages metadata (for titlebar and stuff) */
h1 {
display: none;
}
</style>
Built upon the foundation of
`Gymnasium <https://gymnasium.farama.org/>`__ (a maintained fork of
OpenAIs renowned Gym library) ``fancy_gym`` offers a comprehensive
collection of reinforcement learning environments.
Key Features
------------
- **New Challenging Environments**: ``fancy_gym`` includes several new
environments (`Panda Box Pushing <envs/fancy/mujoco.html#box-pushing>`_,
`Table Tennis <envs/fancy/mujoco.html#table-tennis>`_,
`etc. <envs/fancy/index.html>`_) that present a higher degree of
difficulty, pushing the boundaries of reinforcement learning research.
- **Support for Movement Primitives**: ``fancy_gym`` supports a range
of movement primitives (MPs), including Dynamic Movement Primitives
(DMPs), Probabilistic Movement Primitives (ProMP), and Probabilistic
Dynamic Movement Primitives (ProDMP).
- **Upgrade to Movement Primitives**: With our framework, its
straightforward to transform standard Gymnasium environments into
environments that support movement primitives.
- **Benchmark Suite Compatibility**: ``fancy_gym`` makes it easy to
access renowned benchmark suites such as `DeepMind
Control <envs/dmc.html>`__
and `Metaworld <envs/meta.html>`__, whether you want
to use them in the regular step-based setting or using MPs.
- **Contribute Your Own Environments**: If youre inspired to create
custom gym environments, both step-based and with movement
primitives, this
`guide <guide/upgrading_envs.html>`__
will assist you. We encourage and highly appreciate submissions via
PRs to integrate these environments into ``fancy_gym``.
Quickstart Guide
----------------
Install via pip (`or use an alternative installation method <guide/installation.html>`__)
.. code:: bash
pip install 'fancy_gym[all]'
Try out one of our step-based environments (`or explore our other envs <envs/fancy/index.html>`__)
.. code:: python
import gymnasium as gym
import fancy_gym
import time
env = gym.make('fancy/BoxPushingDense-v0', render_mode='human')
observation = env.reset()
env.render()
for i in range(1000):
action = env.action_space.sample() # Randomly sample an action
observation, reward, terminated, truncated, info = env.step(action)
time.sleep(1/env.metadata['render_fps'])
if terminated or truncated:
observation, info = env.reset()
Explore the MP-based variant (`or learn more about Movement Primitives (MPs) <guide/episodic_rl.html>`__)
.. code:: python
import gymnasium as gym
import fancy_gym
env = gym.make('fancy_ProMP/BoxPushingDense-v0', render_mode='human')
env.reset()
env.render()
for i in range(10):
action = env.action_space.sample() # Randomly sample MP parameters
observation, reward, terminated, truncated, info = env.step(action) # Will execute full trajectory, based on MP
observation = env.reset()
.. toctree::
:maxdepth: 3
:caption: User Guide
guide/installation
guide/episodic_rl
guide/basic_usage
guide/upgrading_envs
.. toctree::
:maxdepth: 3
:caption: Environments
envs/fancy/index
envs/dmc
envs/meta
envs/open_ai
.. toctree::
:maxdepth: 3
:caption: Examples
examples/general
examples/dmc
examples/metaworld
examples/open_ai
examples/movement_primitives
examples/mp_params_tuning
examples/pd_control_gain_tuning
examples/replanning_envs
.. toctree::
:maxdepth: 3
:caption: API
api
Citing the Project
------------------
To cite `fancy_gym` in publications:
.. code:: bibtex
@software{fancy_gym,
title = {Fancy Gym},
author = {Otto, Fabian and Celik, Onur and Roth, Dominik and Zhou, Hongyi},
abstract = {Fancy Gym: Unifying interface for various RL benchmarks with support for Black Box approaches.},
url = {https://github.com/ALRhub/fancy_gym},
organization = {Autonomous Learning Robots Lab (ALR) at KIT},
}
Icon Attribution
----------------
The icon is based on the
`Gymnasium <https://github.com/Farama-Foundation/Gymnasium>`__ icon as
can be found
`here <https://gymnasium.farama.org/_static/img/gymnasium_black.svg>`__.
=================
.. raw:: html
<div style="text-align: center; background: #f8f8f8; border-radius: 10px;">
<a href="https://alr.iar.kit.edu/"><img src="_static/imgs/alr.svg" style="margin: 5%; width: 20%;"></a>
<a href="https://www.kit.edu/"><img src="_static/imgs/kit.svg" style="margin: 5%; width: 20%;"></a>
<a href="https://uni-tuebingen.de/"><img src="_static/imgs/uni_tuebingen.svg" style="margin: 5%; width: 20%;"></a>
</div>
<br>

View File

@ -0,0 +1,134 @@
/*
* _sphinx_javascript_frameworks_compat.js
* ~~~~~~~~~~
*
* Compatability shim for jQuery and underscores.js.
*
* WILL BE REMOVED IN Sphinx 6.0
* xref RemovedInSphinx60Warning
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

900
docs/build/html/_static/basic.css vendored Normal file
View File

@ -0,0 +1,900 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 360px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, figure.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar,
aside.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure, figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption, figcaption {
padding: 0.3em;
}
div.figure p.caption span.caption-number,
figcaption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text,
figcaption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0 0.5em;
content: ":";
display: inline-block;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
pre, div[class*="highlight-"] {
clear: both;
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
white-space: nowrap;
}
div[class*="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

View File

@ -0,0 +1 @@
.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

4
docs/build/html/_static/css/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

156
docs/build/html/_static/doctools.js vendored Normal file
View File

@ -0,0 +1,156 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Base JavaScript utilities for all Sphinx HTML documentation.
*
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
"use strict";
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
document.addEventListener("DOMContentLoaded", callback);
}
};
/**
* Small JavaScript module for the documentation.
*/
const Documentation = {
init: () => {
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
},
/**
* helper function to focus on search bar
*/
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* Initialise the domain index toggle buttons
*/
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
});
},
};
// quick alias for translations
const _ = Documentation.gettext;
_ready(Documentation.init);

View File

@ -0,0 +1,14 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '0.3.0',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
};

BIN
docs/build/html/_static/file.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

101
docs/build/html/_static/icon.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 114 KiB

281
docs/build/html/_static/imgs/alr.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 118 KiB

101
docs/build/html/_static/imgs/icon.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 114 KiB

23
docs/build/html/_static/imgs/kit.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,568 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="269px" height="70px" viewBox="0 0 269 70" enable-background="new 0 0 269 70" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A11E3B" d="M139.13,2.989c0.438-0.005,1.4-0.078,2.172,0.708
c0.773,0.787,0.816,1.763,0.816,2.243c0,1.339-1.1,2.343-2.513,2.343c-0.584,0-1.228-0.1-1.44-0.228
c-0.07-0.043-0.099-0.1-0.099-0.17V3.244c0-0.085,0.042-0.142,0.112-0.17C138.322,3.031,138.704,2.994,139.13,2.989 M140.775,8.418
c1.48-0.406,2.479-1.644,2.479-3.321c0-0.773-0.408-1.429-0.728-1.734c-0.232-0.218-0.889-0.83-2.709-0.83
c-0.67,0-1.905,0.045-2.291,0.045c-0.167,0-0.966-0.043-1.604-0.043c-0.155,0-0.227,0.029-0.227,0.114
c0,0.057,0.057,0.085,0.114,0.085c0.128,0,0.369,0.015,0.481,0.043c0.47,0.1,0.583,0.326,0.611,0.809
c0.027,0.454,0.027,0.852,0.027,3.065v2.499c0,1.362,0,2.483-0.069,3.08c-0.059,0.411-0.129,0.724-0.412,0.78
c-0.129,0.028-0.299,0.057-0.426,0.057c-0.085,0-0.113,0.042-0.113,0.085c0,0.086,0.07,0.113,0.227,0.113
c0.425,0,1.319-0.042,1.334-0.042c0.07,0,0.964,0.042,1.745,0.042c0.156,0,0.229-0.042,0.229-0.113c0-0.043-0.029-0.085-0.114-0.085
c-0.129,0-0.44-0.028-0.639-0.057c-0.426-0.057-0.512-0.369-0.555-0.78c-0.069-0.597-0.069-1.718-0.069-3.08V8.808
c0-0.07,0.028-0.113,0.099-0.113l1.378,0.022c0.085,0,0.16,0.033,0.188,0.091c0.214,0.473,0.513,1.27,0.941,2.148
c0.587,1.202,0.688,1.733,1.298,2.061c0.369,0.199,0.756,0.248,1.551,0.248h0.684c0.256,0,0.342-0.027,0.342-0.113
c0-0.043-0.058-0.087-0.129-0.085c-0.14,0.003-0.375-0.036-0.645-0.084c-0.23-0.04-0.902-0.203-1.316-0.98
C141.938,11.03,141.341,9.615,140.775,8.418 M147.781,6.65c0-2.214,0-2.611,0.027-3.065c0.028-0.497,0.142-0.737,0.554-0.809
c0.171-0.028,0.369-0.043,0.468-0.043c0.057,0,0.112-0.028,0.112-0.085c0-0.085-0.069-0.114-0.226-0.114
c-0.427,0-1.462,0.044-1.532,0.044c-0.072,0-0.966-0.044-1.604-0.044c-0.157,0-0.228,0.029-0.228,0.114
c0,0.057,0.057,0.085,0.113,0.085c0.129,0,0.369,0.015,0.483,0.043c0.468,0.1,0.582,0.326,0.609,0.809
c0.029,0.454,0.029,0.852,0.029,3.065v2.499c0,1.362,0,2.483-0.071,3.08c-0.057,0.411-0.128,0.724-0.411,0.78
c-0.128,0.028-0.298,0.057-0.426,0.057c-0.085,0-0.114,0.042-0.114,0.085c0,0.086,0.072,0.113,0.228,0.113
c0.213,0,0.525-0.014,0.809-0.027c0.284,0,0.526-0.015,0.583-0.015c0.41,0,0.852,0.015,1.448,0.042
c0.595,0.015,1.333,0.043,2.354,0.043c0.752,0,0.795-0.057,0.894-0.384c0.114-0.412,0.214-1.263,0.214-1.418
c0-0.157-0.014-0.214-0.084-0.214c-0.086,0-0.114,0.071-0.13,0.185c-0.043,0.27-0.185,0.625-0.369,0.852
c-0.34,0.412-0.965,0.426-1.718,0.426c-1.105,0-1.475-0.1-1.702-0.326c-0.255-0.256-0.311-1.164-0.311-3.251V6.65z M155.006,13.464
c0.767,0,1.532-0.171,2.143-0.596c0.979-0.696,1.206-1.774,1.206-2.356c0-1.136-0.396-2.016-2.072-3.335l-0.396-0.313
c-1.362-1.065-1.731-1.576-1.731-2.386c0-1.036,0.766-1.646,1.745-1.646c1.307,0,1.689,0.597,1.774,0.752
c0.085,0.156,0.169,0.539,0.186,0.71c0.013,0.113,0.028,0.184,0.114,0.184c0.069,0,0.099-0.098,0.099-0.325
c0-0.966,0.056-1.435,0.056-1.505s-0.028-0.1-0.142-0.1c-0.114,0-0.228-0.015-0.497-0.07c-0.354-0.085-0.767-0.143-1.32-0.143
c-1.803,0-2.938,1.036-2.938,2.555c0,0.966,0.342,1.846,1.848,3.08l0.639,0.525c1.218,1.008,1.631,1.576,1.631,2.555
c0,0.909-0.667,1.888-2.031,1.888c-0.95,0-1.887-0.397-2.099-1.448c-0.044-0.198-0.044-0.396-0.044-0.524
c0-0.114-0.014-0.156-0.099-0.156c-0.071,0-0.1,0.071-0.114,0.227c-0.014,0.228-0.07,0.795-0.07,1.505
c0,0.383,0.015,0.44,0.212,0.54C153.686,13.364,154.338,13.464,155.006,13.464 M127.632,13.265c0.127,0,0.213-0.028,0.213-0.113
c0-0.058-0.042-0.085-0.143-0.085h-0.142c-0.24,0-0.539-0.128-0.539-0.412c0-0.255,0.071-0.596,0.198-0.951l0.853-2.512
c0.028-0.07,0.069-0.114,0.142-0.114h3.051c0.072,0,0.1,0.029,0.129,0.086l1.318,3.491c0.086,0.228,0,0.355-0.084,0.384
c-0.056,0.015-0.1,0.043-0.1,0.1c0,0.085,0.156,0.085,0.427,0.099c0.979,0.028,2.015,0.028,2.228,0.028
c0.156,0,0.284-0.028,0.284-0.113c0-0.07-0.058-0.085-0.142-0.085c-0.143,0-0.355-0.014-0.569-0.085
c-0.298-0.086-0.71-0.313-1.22-1.575c-0.866-2.158-3.094-8.02-3.308-8.56c-0.17-0.439-0.227-0.511-0.312-0.511
s-0.143,0.085-0.313,0.554l-3.221,8.813c-0.213,0.59-0.444,1.061-0.89,1.253c-0.37-0.124-0.739-0.406-1.208-0.932
c-1.066-1.198-3.283-4.028-3.81-4.748c0.299-0.356,2.784-2.783,3.139-3.123c0.639-0.611,0.951-0.966,1.534-1.221
c0.283-0.128,0.581-0.199,0.794-0.199c0.113,0,0.143-0.028,0.143-0.1c0-0.07-0.057-0.1-0.214-0.1c-0.355,0-1.291,0.044-1.361,0.044
c-0.342,0-0.781-0.044-1.065-0.044c-0.099,0-0.17,0.029-0.17,0.1c0,0.057,0.056,0.085,0.128,0.114
c0.113,0.042,0.184,0.128,0.184,0.298c0,0.241-0.369,0.61-0.766,1.021c-0.512,0.554-3.081,3.165-3.32,3.435l-0.058-0.852
c0-2.214,0-2.611,0.027-3.065c0.03-0.497,0.143-0.738,0.525-0.809c0.171-0.028,0.256-0.043,0.356-0.043
c0.057,0,0.112-0.028,0.112-0.085c0-0.085-0.071-0.114-0.228-0.114c-0.425,0-1.248,0.044-1.376,0.044
c-0.085,0-0.923-0.044-1.562-0.044c-0.156,0-0.228,0.029-0.228,0.114c0,0.057,0.058,0.085,0.114,0.085
c0.127,0,0.369,0.015,0.482,0.043c0.468,0.1,0.581,0.326,0.61,0.809c0.028,0.454,0.028,0.852,0.028,3.065v2.499
c0,1.362,0,2.483-0.07,3.08c-0.058,0.411-0.128,0.724-0.413,0.78c-0.128,0.028-0.298,0.057-0.425,0.057
c-0.086,0-0.114,0.042-0.114,0.085c0,0.085,0.071,0.113,0.229,0.113c0.425,0,1.248-0.042,1.362-0.042
c0.113,0,0.937,0.042,1.632,0.042c0.155,0,0.227-0.042,0.227-0.113c0-0.043-0.028-0.085-0.112-0.085
c-0.129,0-0.356-0.028-0.555-0.057c-0.426-0.057-0.511-0.369-0.554-0.78c-0.07-0.597-0.07-1.718-0.07-3.08l0.007-1.381
c0.319,0.442,1.632,2.193,2.501,3.293c0.755,0.956,1.319,1.632,1.925,1.966c0.259,0.141,0.392,0.24,1.051,0.24
c0,0,0.933-0.047,1.43-0.047C126.829,13.221,127.291,13.265,127.632,13.265 M128.369,8.567c-0.042,0-0.07-0.029-0.042-0.1
l1.249-3.833c0.07-0.212,0.143-0.212,0.214,0l1.347,3.833c0.015,0.057,0.015,0.1-0.057,0.1H128.369z M82.699,11.703
c-0.256,0.71-0.54,1.25-1.192,1.335c-0.113,0.015-0.313,0.028-0.412,0.028c-0.07,0-0.127,0.027-0.127,0.085
c0,0.086,0.085,0.113,0.27,0.113c0.667,0,1.447-0.042,1.604-0.042c0.157,0,0.767,0.042,1.107,0.042c0.127,0,0.213-0.027,0.213-0.113
c0-0.058-0.042-0.085-0.142-0.085h-0.143c-0.241,0-0.539-0.128-0.539-0.412c0-0.255,0.07-0.596,0.199-0.951l0.852-2.512
c0.027-0.07,0.07-0.114,0.141-0.114h3.053c0.071,0,0.099,0.029,0.127,0.086l1.32,3.491c0.085,0.228,0,0.355-0.085,0.384
c-0.057,0.015-0.1,0.043-0.1,0.1c0,0.085,0.157,0.085,0.427,0.1c0.979,0.027,2.015,0.027,2.228,0.027
c0.156,0,0.284-0.027,0.284-0.113c0-0.07-0.057-0.085-0.143-0.085c-0.142,0-0.354-0.014-0.567-0.085
c-0.299-0.086-0.71-0.313-1.221-1.575c-0.866-2.158-3.095-8.02-3.308-8.559c-0.169-0.44-0.226-0.512-0.312-0.512
c-0.085,0-0.143,0.085-0.313,0.554L82.699,11.703z M84.686,8.567c-0.042,0-0.07-0.029-0.042-0.1l1.25-3.833
c0.069-0.212,0.141-0.212,0.213,0l1.347,3.833c0.015,0.057,0.015,0.1-0.056,0.1H84.686z M63.874,2.989
c0.439-0.005,1.402-0.078,2.173,0.708c0.772,0.787,0.815,1.763,0.815,2.243c0,1.339-1.1,2.343-2.512,2.343
c-0.584,0-1.229-0.1-1.441-0.228c-0.071-0.043-0.099-0.1-0.099-0.17V3.244c0-0.085,0.042-0.142,0.113-0.17
C63.065,3.031,63.448,2.994,63.874,2.989 M65.519,8.418c1.482-0.406,2.48-1.644,2.48-3.321c0-0.773-0.408-1.429-0.729-1.734
c-0.232-0.218-0.889-0.83-2.708-0.83c-0.671,0-1.906,0.045-2.292,0.045c-0.167,0-0.965-0.043-1.604-0.043
c-0.155,0-0.226,0.029-0.226,0.114c0,0.057,0.056,0.085,0.113,0.085c0.127,0,0.368,0.015,0.481,0.043
c0.469,0.1,0.583,0.326,0.611,0.809c0.028,0.454,0.028,0.852,0.028,3.065v2.499c0,1.362,0,2.483-0.071,3.08
c-0.057,0.411-0.127,0.724-0.412,0.78c-0.128,0.028-0.297,0.057-0.426,0.057c-0.085,0-0.113,0.042-0.113,0.085
c0,0.086,0.071,0.113,0.228,0.113c0.426,0,1.319-0.042,1.334-0.042c0.071,0,0.965,0.042,1.746,0.042
c0.155,0,0.227-0.042,0.227-0.113c0-0.043-0.027-0.085-0.113-0.085c-0.127,0-0.44-0.028-0.639-0.057
c-0.426-0.057-0.511-0.369-0.554-0.78c-0.07-0.597-0.07-1.718-0.07-3.08V8.808c0-0.07,0.027-0.113,0.099-0.113l1.377,0.022
c0.086,0,0.162,0.033,0.188,0.091c0.216,0.473,0.515,1.27,0.943,2.148c0.586,1.202,0.688,1.733,1.298,2.061
c0.369,0.199,0.756,0.248,1.551,0.248h0.684c0.256,0,0.342-0.027,0.342-0.113c0-0.043-0.057-0.087-0.128-0.085
c-0.141,0.003-0.376-0.036-0.646-0.084c-0.229-0.04-0.901-0.203-1.316-0.98C66.683,11.03,66.086,9.615,65.519,8.418 M102.369,9.149
c0,1.362,0,2.483-0.071,3.08c-0.057,0.411-0.128,0.724-0.412,0.78c-0.128,0.028-0.297,0.057-0.425,0.057
c-0.085,0-0.114,0.042-0.114,0.085c0,0.086,0.071,0.113,0.227,0.113c0.213,0,0.539-0.027,0.824-0.027
c0.297-0.015,0.539-0.015,0.566-0.015c0.072,0,0.555,0.042,1.179,0.085c0.611,0.043,1.363,0.085,1.974,0.085
c2.412,0,3.689-0.993,4.3-1.633c0.795-0.836,1.533-2.214,1.533-4.001c0-1.69-0.667-2.868-1.377-3.605
c-1.688-1.746-4.286-1.619-5.691-1.619c-0.852,0-1.746,0.044-1.917,0.044c-0.07,0-0.965-0.044-1.604-0.044
c-0.156,0-0.227,0.029-0.227,0.114c0,0.057,0.057,0.085,0.113,0.085c0.129,0,0.369,0.015,0.482,0.043
c0.469,0.1,0.582,0.326,0.611,0.809c0.028,0.454,0.028,0.852,0.028,3.065V9.149z M103.561,6.424c0-1.093,0-2.541,0.016-3.023
c0-0.156,0.041-0.228,0.169-0.283c0.114-0.057,0.639-0.1,0.923-0.1c1.689,0,3.307,0.198,4.642,1.604
c0.582,0.61,1.362,1.774,1.362,3.577c0,1.306-0.397,2.668-1.136,3.392c-0.838,0.838-2.058,1.321-3.378,1.321
c-1.674,0-2.229-0.299-2.413-0.569c-0.112-0.155-0.142-0.724-0.155-1.078c-0.014-0.27-0.029-1.575-0.029-3.08V6.424z M95.334,2.989
c0.438-0.005,1.401-0.078,2.173,0.708c0.772,0.787,0.815,1.763,0.815,2.243c0,1.339-1.101,2.343-2.513,2.343
c-0.583,0-1.228-0.1-1.44-0.228c-0.071-0.043-0.1-0.1-0.1-0.17V3.244c0-0.085,0.043-0.142,0.114-0.17
C94.525,3.031,94.909,2.994,95.334,2.989 M96.979,8.418c1.483-0.406,2.479-1.644,2.479-3.321c0-0.773-0.407-1.429-0.727-1.734
c-0.234-0.218-0.889-0.83-2.71-0.83c-0.669,0-1.905,0.045-2.29,0.045c-0.168,0-0.966-0.043-1.605-0.043
c-0.155,0-0.227,0.029-0.227,0.114c0,0.057,0.058,0.085,0.114,0.085c0.127,0,0.369,0.015,0.482,0.043
c0.468,0.1,0.581,0.326,0.609,0.809c0.029,0.454,0.029,0.852,0.029,3.065v2.499c0,1.362,0,2.483-0.071,3.08
c-0.057,0.411-0.128,0.724-0.411,0.78c-0.128,0.028-0.299,0.057-0.426,0.057c-0.086,0-0.114,0.042-0.114,0.085
c0,0.086,0.071,0.113,0.228,0.113c0.426,0,1.319-0.042,1.335-0.042c0.069,0,0.965,0.042,1.745,0.042
c0.156,0,0.227-0.042,0.227-0.113c0-0.043-0.028-0.085-0.113-0.085c-0.128,0-0.44-0.028-0.639-0.057
c-0.426-0.057-0.511-0.369-0.554-0.78c-0.071-0.597-0.071-1.718-0.071-3.08V8.808c0-0.07,0.028-0.113,0.1-0.113l1.378,0.022
c0.084,0,0.16,0.033,0.188,0.091c0.215,0.473,0.513,1.27,0.943,2.148c0.585,1.202,0.687,1.733,1.297,2.061
c0.368,0.199,0.756,0.248,1.551,0.248h0.686c0.254,0,0.339-0.027,0.339-0.113c0-0.043-0.057-0.087-0.127-0.085
c-0.141,0.003-0.376-0.036-0.646-0.084c-0.229-0.04-0.9-0.203-1.317-0.98C98.143,11.03,97.545,9.615,96.979,8.418 M79.32,6.65
c0-2.214,0-2.611,0.028-3.065c0.028-0.497,0.142-0.737,0.525-0.809c0.17-0.028,0.255-0.043,0.354-0.043
c0.057,0,0.113-0.028,0.113-0.085c0-0.085-0.071-0.114-0.228-0.114c-0.426,0-1.319,0.044-1.391,0.044
c-0.07,0-0.965-0.044-1.604-0.044c-0.156,0-0.228,0.029-0.228,0.114c0,0.057,0.057,0.085,0.114,0.085
c0.127,0,0.369,0.015,0.481,0.043c0.469,0.1,0.583,0.326,0.611,0.809c0.028,0.454,0.028,0.852,0.028,3.065v0.299
c0,0.07-0.043,0.085-0.086,0.085h-6.018c-0.043,0-0.085-0.015-0.085-0.085V6.65c0-2.214,0-2.611,0.028-3.065
c0.028-0.497,0.143-0.737,0.525-0.809c0.17-0.028,0.256-0.043,0.354-0.043c0.058,0,0.114-0.028,0.114-0.085
c0-0.085-0.072-0.114-0.229-0.114c-0.426,0-1.318,0.044-1.391,0.044c-0.07,0-0.965-0.044-1.604-0.044
c-0.156,0-0.227,0.029-0.227,0.114c0,0.057,0.057,0.085,0.113,0.085c0.128,0,0.369,0.015,0.482,0.043
c0.469,0.1,0.582,0.326,0.61,0.809c0.028,0.454,0.028,0.852,0.028,3.065v2.499c0,1.362,0,2.483-0.071,3.08
c-0.057,0.411-0.127,0.724-0.411,0.78c-0.128,0.028-0.298,0.057-0.426,0.057c-0.085,0-0.113,0.042-0.113,0.085
c0,0.086,0.071,0.113,0.227,0.113c0.426,0,1.32-0.042,1.391-0.042c0.072,0,0.965,0.042,1.746,0.042c0.156,0,0.228-0.042,0.228-0.113
c0-0.043-0.028-0.085-0.114-0.085c-0.127,0-0.439-0.028-0.639-0.057c-0.426-0.057-0.51-0.369-0.554-0.78
c-0.07-0.597-0.07-1.718-0.07-3.08V7.658c0-0.07,0.042-0.085,0.085-0.085h6.018c0.043,0,0.086,0.028,0.086,0.085v1.491
c0,1.362,0,2.483-0.07,3.08c-0.058,0.411-0.128,0.724-0.412,0.78c-0.128,0.028-0.299,0.057-0.427,0.057
c-0.085,0-0.113,0.042-0.113,0.085c0,0.086,0.071,0.113,0.228,0.113c0.426,0,1.32-0.042,1.391-0.042
c0.071,0,0.965,0.042,1.747,0.042c0.155,0,0.226-0.042,0.226-0.113c0-0.043-0.028-0.085-0.112-0.085c-0.129,0-0.44-0.028-0.64-0.057
c-0.426-0.057-0.511-0.369-0.554-0.78c-0.07-0.597-0.07-1.718-0.07-3.08V6.65z M46.516,7.658c0-0.07,0.027-0.099,0.085-0.099
c0.213,0,0.922,0,1.107,0.028c0.34,0.043,0.695,0.085,1.177,0.412c1.094,0.752,1.378,1.986,1.378,2.838
c0,1.604-1.235,2.016-2.002,2.016c-0.255,0-0.865-0.028-1.249-0.213c-0.439-0.213-0.439-0.411-0.482-1.107
c-0.014-0.213-0.014-1.973-0.014-3.065V7.658z M46.516,3.159c0-0.085,0.042-0.128,0.17-0.156c0.228-0.057,0.525-0.07,0.681-0.07
c1.392,0,1.917,1.263,1.917,2.441c0,0.582-0.213,1.092-0.511,1.434c-0.299,0.34-0.497,0.369-1.292,0.369
c-0.525,0-0.781-0.043-0.866-0.058c-0.071-0.028-0.099-0.057-0.099-0.156V3.159z M45.38,9.149c0,1.362,0,2.483-0.071,3.08
c-0.057,0.411-0.127,0.724-0.412,0.78c-0.127,0.028-0.297,0.057-0.426,0.057c-0.085,0-0.112,0.042-0.112,0.085
c0,0.086,0.07,0.113,0.227,0.113c0.213,0,0.54-0.027,0.823-0.027c0.298-0.015,0.539-0.015,0.567-0.015
c0.058,0,0.454,0.015,0.866,0.042c0.411,0.015,0.866,0.043,1.022,0.043c2.426,0,3.619-1.575,3.619-3.095
c0-1.66-1.405-2.667-2.456-2.994c0.667-0.695,1.334-1.391,1.334-2.556c0-0.709-0.511-2.129-2.839-2.129
c-0.652,0-1.206,0.044-1.547,0.044c-0.07,0-0.965-0.044-1.604-0.044c-0.156,0-0.228,0.029-0.228,0.114
c0,0.057,0.057,0.085,0.114,0.085c0.127,0,0.368,0.015,0.481,0.043c0.47,0.1,0.583,0.326,0.611,0.809
C45.38,4.039,45.38,4.437,45.38,6.65V9.149z M37.294,9.149c0,1.362,0,2.483-0.07,3.08c-0.057,0.411-0.128,0.724-0.412,0.78
c-0.128,0.028-0.298,0.057-0.426,0.057c-0.085,0-0.113,0.042-0.113,0.085c0,0.086,0.071,0.113,0.227,0.113
c0.213,0,0.539-0.027,0.823-0.027c0.298-0.015,0.54-0.015,0.567-0.015c0.213,0,0.555,0.015,1.107,0.042
c0.554,0.015,1.334,0.043,2.399,0.043c0.553,0,0.667,0,0.766-0.369c0.071-0.298,0.185-1.263,0.185-1.377
c0-0.099,0-0.213-0.085-0.213c-0.07,0-0.1,0.058-0.128,0.213c-0.099,0.582-0.27,0.866-0.638,1.022
c-0.369,0.156-0.994,0.156-1.363,0.156c-1.391,0-1.604-0.185-1.646-1.164c-0.014-0.298,0-1.944,0-2.427V7.9
c0-0.058,0.028-0.1,0.099-0.1c0.242,0,1.647,0.028,2.03,0.07c0.554,0.058,0.682,0.299,0.738,0.497
c0.057,0.185,0.057,0.326,0.057,0.469c0,0.07,0.028,0.128,0.1,0.128c0.1,0,0.1-0.157,0.1-0.271c0-0.1,0.027-0.624,0.057-0.908
c0.042-0.468,0.113-0.709,0.113-0.795c0-0.084-0.028-0.113-0.071-0.113c-0.056,0-0.113,0.071-0.212,0.185
c-0.129,0.142-0.327,0.17-0.668,0.198c-0.326,0.028-2.072,0.028-2.257,0.028c-0.07,0-0.085-0.042-0.085-0.142V3.23
c0-0.1,0.028-0.143,0.085-0.143c0.156,0,1.704,0.015,1.944,0.043c0.768,0.085,0.909,0.256,1.008,0.482
c0.071,0.171,0.086,0.412,0.086,0.511c0,0.114,0.027,0.185,0.113,0.185c0.057,0,0.085-0.085,0.1-0.155
c0.028-0.171,0.057-0.795,0.07-0.938c0.043-0.397,0.114-0.567,0.114-0.667c0-0.07-0.015-0.128-0.058-0.128
c-0.07,0-0.127,0.058-0.198,0.07c-0.114,0.029-0.341,0.058-0.61,0.072c-0.326,0.015-3.151,0.015-3.251,0.015l-0.581-0.029
c-0.313-0.015-0.695-0.015-1.022-0.015c-0.155,0-0.227,0.029-0.227,0.114c0,0.057,0.057,0.085,0.113,0.085
c0.128,0,0.369,0.015,0.482,0.043c0.469,0.1,0.582,0.326,0.61,0.809c0.028,0.454,0.028,0.852,0.028,3.065V9.149z M54.173,9.149
c0,1.362,0,2.483-0.07,3.08c-0.057,0.411-0.128,0.724-0.412,0.78c-0.128,0.028-0.298,0.057-0.426,0.057
c-0.085,0-0.113,0.042-0.113,0.085c0,0.086,0.071,0.113,0.227,0.113c0.214,0,0.54-0.027,0.823-0.027
c0.299-0.015,0.54-0.015,0.568-0.015c0.213,0,0.554,0.015,1.107,0.042c0.553,0.015,1.334,0.043,2.398,0.043
c0.554,0,0.667,0,0.767-0.369c0.07-0.298,0.185-1.263,0.185-1.377c0-0.099,0-0.213-0.085-0.213c-0.071,0-0.1,0.058-0.128,0.213
c-0.1,0.582-0.27,0.866-0.639,1.022s-0.993,0.156-1.363,0.156c-1.391,0-1.604-0.185-1.646-1.164c-0.014-0.298,0-1.944,0-2.427V7.9
c0-0.058,0.029-0.1,0.1-0.1c0.241,0,1.647,0.028,2.03,0.07c0.554,0.058,0.681,0.299,0.738,0.497
c0.057,0.185,0.057,0.326,0.057,0.469c0,0.07,0.028,0.128,0.099,0.128c0.1,0,0.1-0.157,0.1-0.271c0-0.1,0.028-0.624,0.057-0.908
c0.043-0.468,0.113-0.709,0.113-0.795c0-0.084-0.028-0.113-0.07-0.113c-0.057,0-0.113,0.071-0.213,0.185
c-0.128,0.142-0.326,0.17-0.667,0.198c-0.326,0.028-2.072,0.028-2.256,0.028c-0.072,0-0.087-0.042-0.087-0.142V3.23
c0-0.1,0.029-0.143,0.087-0.143c0.155,0,1.702,0.015,1.943,0.043c0.767,0.085,0.908,0.256,1.008,0.482
c0.071,0.171,0.085,0.412,0.085,0.511c0,0.114,0.028,0.185,0.113,0.185c0.057,0,0.085-0.085,0.1-0.155
c0.028-0.171,0.057-0.795,0.071-0.938c0.042-0.397,0.113-0.567,0.113-0.667c0-0.07-0.015-0.128-0.057-0.128
c-0.071,0-0.128,0.058-0.199,0.07c-0.113,0.029-0.34,0.058-0.609,0.072c-0.327,0.015-3.151,0.015-3.251,0.015l-0.582-0.029
c-0.313-0.015-0.695-0.015-1.021-0.015c-0.156,0-0.228,0.029-0.228,0.114c0,0.057,0.057,0.085,0.113,0.085
c0.128,0,0.369,0.015,0.482,0.043c0.47,0.1,0.582,0.326,0.611,0.809c0.027,0.454,0.027,0.852,0.027,3.065V9.149z M67.401,56.393
c0-0.144,0.057-0.199,0.17-0.199c0.427,0,1.846,0,2.214,0.056c0.682,0.086,1.392,0.171,2.356,0.824
c2.186,1.504,2.754,3.975,2.754,5.677c0,3.209-2.47,4.031-4.002,4.031c-0.512,0-1.732-0.057-2.499-0.426
c-0.88-0.426-0.88-0.824-0.965-2.215c-0.028-0.425-0.028-3.944-0.028-6.131V56.393z M67.401,47.394c0-0.17,0.085-0.256,0.341-0.313
c0.454-0.114,1.051-0.142,1.362-0.142c2.782,0,3.832,2.526,3.832,4.883c0,1.163-0.426,2.185-1.021,2.867
c-0.596,0.682-0.993,0.737-2.583,0.737c-1.051,0-1.562-0.086-1.732-0.113c-0.142-0.057-0.198-0.114-0.198-0.312V47.394z
M65.131,59.372c0,2.726,0,4.969-0.142,6.159c-0.114,0.824-0.257,1.449-0.824,1.563c-0.256,0.057-0.596,0.113-0.852,0.113
c-0.17,0-0.227,0.085-0.227,0.171c0,0.171,0.141,0.228,0.454,0.228c0.426,0,1.079-0.057,1.646-0.057
c0.597-0.03,1.079-0.03,1.136-0.03c0.114,0,0.908,0.03,1.731,0.087c0.824,0.027,1.731,0.084,2.044,0.084
c4.854,0,7.239-3.15,7.239-6.188c0-3.32-2.811-5.336-4.911-5.99c1.334-1.39,2.668-2.781,2.668-5.108
c0-1.419-1.021-4.259-5.677-4.259c-1.306,0-2.413,0.086-3.095,0.086c-0.142,0-1.931-0.086-3.207-0.086
c-0.313,0-0.454,0.058-0.454,0.229c0,0.113,0.113,0.17,0.227,0.17c0.256,0,0.738,0.028,0.965,0.085
c0.938,0.198,1.164,0.653,1.221,1.618c0.058,0.908,0.058,1.703,0.058,6.131V59.372z M84.098,54.376c0-4.428,0-5.223,0.057-6.131
c0.057-0.994,0.283-1.477,1.05-1.618c0.342-0.057,0.511-0.085,0.71-0.085c0.114,0,0.227-0.057,0.227-0.17
c0-0.171-0.142-0.229-0.454-0.229c-0.852,0-2.64,0.086-2.781,0.086c-0.143,0-1.931-0.086-2.867-0.086
c-0.313,0-0.454,0.058-0.454,0.229c0,0.113,0.113,0.17,0.227,0.17c0.199,0,0.567,0.028,0.88,0.113
c0.625,0.142,0.908,0.625,0.965,1.59c0.058,0.908,0.058,1.703,0.058,6.131v4.996c0,2.726,0,4.969-0.142,6.159
c-0.114,0.824-0.256,1.449-0.823,1.563c-0.256,0.057-0.597,0.113-0.853,0.113c-0.17,0-0.227,0.085-0.227,0.171
c0,0.171,0.142,0.228,0.454,0.228c0.852,0,2.64-0.087,2.782-0.087c0.142,0,1.93,0.087,3.491,0.087c0.313,0,0.454-0.087,0.454-0.228
c0-0.086-0.057-0.171-0.228-0.171c-0.255,0-0.88-0.057-1.277-0.113c-0.851-0.113-1.021-0.738-1.106-1.563
c-0.142-1.19-0.142-3.434-0.142-6.159V54.376z M92.693,50.146c0.908,1.022,4.111,4.599,7.398,8.146
c3.004,3.237,7.085,7.409,7.396,7.693c1.508,1.505,1.852,1.817,2.08,1.817c0.201,0,0.258-0.143,0.258-2.017l0.057-16.634
c0-1.703,0.113-2.328,1.051-2.526c0.34-0.085,0.54-0.085,0.682-0.085c0.198,0,0.312-0.085,0.312-0.199
c0-0.17-0.199-0.199-0.511-0.199c-1.164,0-2.104,0.086-2.42,0.086c-0.314,0-1.679-0.086-2.953-0.086
c-0.341,0-0.566,0.029-0.566,0.199c0,0.114,0.028,0.199,0.226,0.199c0.229,0,0.879,0.028,1.39,0.142
c0.878,0.228,1.076,0.852,1.105,2.697l0.313,14.42c-0.908-0.937-3.997-4.399-6.804-7.408c-4.363-4.685-8.586-9.255-9.013-9.737
c-0.286-0.283-0.772-0.908-1.002-0.908c-0.228,0-0.313,0.313-0.313,1.419l-0.029,16.267c0,2.582-0.142,3.405-0.852,3.604
c-0.426,0.144-0.936,0.171-1.164,0.171c-0.142,0-0.227,0.058-0.227,0.171c0,0.197,0.17,0.228,0.455,0.228
c1.277,0,2.474-0.087,2.731-0.087c0.257,0,1.394,0.087,3.01,0.087c0.34,0,0.51-0.057,0.51-0.228c0-0.113-0.085-0.171-0.227-0.171
c-0.256,0-0.879-0.027-1.417-0.171c-0.765-0.226-1.049-0.965-1.105-3.292L92.693,50.146z M130.306,65.19
c0,0.482-0.199,0.794-0.567,0.993c-0.737,0.426-2.214,0.596-3.236,0.596c-2.61,0-5.194-0.852-7.437-3.037
c-0.994-0.965-3.01-3.86-3.01-7.864c0-3.32,1.164-5.904,2.812-7.21c2.156-1.702,4.286-1.873,6.073-1.873
c3.663,0,5.962,1.221,6.671,2.3c0.427,0.682,0.568,1.476,0.596,1.874c0.028,0.254,0.058,0.425,0.199,0.425
c0.199,0,0.256-0.142,0.256-0.596c0-2.839,0.199-3.634,0.199-4.03c0-0.114-0.057-0.228-0.341-0.257
c-0.71-0.027-1.704-0.142-2.3-0.283c-0.539-0.113-2.554-0.482-4.344-0.482c-2.185,0-4.995,0.198-7.55,1.788
c-2.526,1.59-4.74,4.797-4.74,9.34c0,3.548,1.646,6.585,3.378,8.089c3.15,2.754,7.182,3.038,9.339,3.038
c1.646,0,4.202-0.313,6.019-1.276c0.34-0.199,0.368-0.257,0.368-1.533v-3.18c0-1.192,0-2.044,0.057-2.953
c0.058-0.992,0.284-1.476,1.051-1.617c0.34-0.058,0.512-0.085,0.709-0.085c0.113,0,0.228-0.058,0.228-0.171
c0-0.171-0.141-0.228-0.454-0.228c-0.852,0-2.64,0.086-2.782,0.086c-0.142,0-1.93-0.086-3.207-0.086
c-0.313,0-0.455,0.057-0.455,0.228c0,0.113,0.114,0.171,0.228,0.171c0.255,0,0.738,0.027,0.966,0.085
c1.135,0.312,1.276,0.625,1.276,2.924V65.19z M139.192,59.372c0,2.726,0,4.969-0.143,6.159c-0.113,0.824-0.256,1.449-0.822,1.563
c-0.257,0.057-0.598,0.113-0.854,0.113c-0.169,0-0.227,0.085-0.227,0.171c0,0.171,0.142,0.228,0.454,0.228
c0.425,0,1.079-0.057,1.647-0.057c0.596-0.03,1.078-0.03,1.135-0.03c0.426,0,1.107,0.03,2.215,0.087
c1.106,0.027,2.667,0.084,4.797,0.084c1.106,0,1.335,0,1.532-0.738c0.143-0.596,0.37-2.525,0.37-2.754c0-0.197,0-0.426-0.171-0.426
c-0.143,0-0.199,0.114-0.256,0.426c-0.198,1.165-0.539,1.732-1.277,2.045c-0.737,0.312-1.987,0.312-2.725,0.312
c-2.781,0-3.208-0.369-3.293-2.327c-0.028-0.596,0-3.89,0-4.854v-2.497c0-0.114,0.057-0.199,0.198-0.199
c0.482,0,3.294,0.056,4.061,0.142c1.105,0.114,1.362,0.597,1.476,0.994c0.113,0.369,0.113,0.652,0.113,0.937
c0,0.142,0.056,0.255,0.198,0.255c0.199,0,0.199-0.313,0.199-0.539c0-0.198,0.057-1.249,0.114-1.816
c0.083-0.937,0.226-1.42,0.226-1.59s-0.056-0.228-0.143-0.228c-0.112,0-0.227,0.143-0.425,0.369
c-0.255,0.284-0.653,0.342-1.334,0.397c-0.653,0.058-4.145,0.058-4.515,0.058c-0.141,0-0.169-0.086-0.169-0.283v-7.836
c0-0.199,0.057-0.284,0.169-0.284c0.313,0,3.407,0.029,3.891,0.085c1.532,0.171,1.816,0.512,2.015,0.966
c0.142,0.341,0.171,0.822,0.171,1.021c0,0.228,0.057,0.369,0.227,0.369c0.113,0,0.171-0.17,0.199-0.312
c0.057-0.342,0.115-1.59,0.142-1.874c0.085-0.795,0.228-1.135,0.228-1.334c0-0.143-0.028-0.255-0.114-0.255
c-0.14,0-0.255,0.112-0.396,0.142c-0.228,0.057-0.682,0.113-1.221,0.142c-0.653,0.028-6.302,0.028-6.501,0.028l-1.164-0.057
c-0.624-0.029-1.391-0.029-2.044-0.029c-0.313,0-0.453,0.058-0.453,0.229c0,0.113,0.113,0.17,0.226,0.17
c0.257,0,0.739,0.028,0.966,0.085c0.936,0.198,1.164,0.653,1.221,1.618c0.058,0.908,0.058,1.703,0.058,6.131V59.372z
M155.766,50.146c0.908,1.022,4.11,4.599,7.397,8.146c3.004,3.237,7.085,7.409,7.397,7.693c1.508,1.505,1.851,1.817,2.079,1.817
c0.201,0,0.259-0.143,0.259-2.017l0.057-16.634c0-1.703,0.114-2.328,1.051-2.526c0.34-0.085,0.539-0.085,0.681-0.085
c0.199,0,0.313-0.085,0.313-0.199c0-0.17-0.199-0.199-0.512-0.199c-1.164,0-2.104,0.086-2.419,0.086s-1.679-0.086-2.953-0.086
c-0.341,0-0.567,0.029-0.567,0.199c0,0.114,0.028,0.199,0.227,0.199c0.227,0,0.88,0.028,1.389,0.142
c0.879,0.228,1.076,0.852,1.105,2.697l0.314,14.42c-0.909-0.937-3.999-4.399-6.804-7.408c-4.364-4.685-8.587-9.255-9.014-9.737
c-0.286-0.283-0.773-0.908-1.002-0.908s-0.313,0.313-0.313,1.419l-0.029,16.267c0,2.582-0.143,3.405-0.852,3.604
c-0.427,0.144-0.938,0.171-1.165,0.171c-0.141,0-0.227,0.058-0.227,0.171c0,0.197,0.171,0.228,0.454,0.228
c1.277,0,2.476-0.087,2.732-0.087c0.258,0,1.395,0.087,3.01,0.087c0.34,0,0.51-0.057,0.51-0.228c0-0.113-0.085-0.171-0.228-0.171
c-0.254,0-0.876-0.027-1.416-0.171c-0.766-0.226-1.048-0.965-1.105-3.292L155.766,50.146z M29.806,47.365l3.569,0.057
c2.721,0.057,3.4,0.71,3.485,1.562l0.029,0.312c0.029,0.397,0.087,0.482,0.231,0.482c0.116,0,0.204-0.113,0.204-0.369
c0-0.312,0.086-2.271,0.086-3.122c0-0.17,0-0.341-0.145-0.341c-0.116,0-0.377,0.085-0.803,0.143
c-0.453,0.085-1.104,0.142-2.012,0.142H23.815c-0.34,0-1.419-0.057-2.242-0.142c-0.767-0.058-1.051-0.341-1.249-0.341
c-0.114,0-0.228,0.369-0.284,0.539c-0.057,0.227-0.625,2.668-0.625,2.952c0,0.17,0.057,0.256,0.143,0.256
c0.113,0,0.199-0.057,0.283-0.284c0.086-0.198,0.172-0.397,0.483-0.879c0.454-0.682,1.136-0.881,2.896-0.909l4.201-0.057v12.007
c0,2.726,0,4.969-0.143,6.159c-0.112,0.824-0.255,1.449-0.823,1.563c-0.255,0.057-0.596,0.113-0.852,0.113
c-0.17,0-0.227,0.085-0.227,0.171c0,0.171,0.143,0.228,0.454,0.228c0.852,0,2.64-0.087,2.782-0.087c0.142,0,1.929,0.087,3.487,0.087
c0.312,0,0.453-0.087,0.453-0.228c0-0.086-0.057-0.171-0.226-0.171c-0.256,0-0.879-0.057-1.275-0.113
c-0.851-0.113-1.021-0.738-1.105-1.563c-0.142-1.19-0.142-3.434-0.142-6.159V47.365z M41.755,58.519c0,4.145,1.079,6.132,2.47,7.466
c2.016,1.9,4.883,2.015,5.848,2.015c1.676,0,3.804-0.284,5.848-2.101c2.271-2.015,2.611-5.423,2.611-8.487v-3.038
c0-4.428,0-5.223,0.058-6.131c0.057-0.993,0.283-1.448,1.051-1.618c0.339-0.057,0.511-0.085,0.709-0.085
c0.113,0,0.228-0.057,0.228-0.17c0-0.171-0.143-0.229-0.455-0.229c-0.852,0-2.186,0.086-2.385,0.086
c-0.17,0-1.731-0.086-3.009-0.086c-0.313,0-0.453,0.058-0.453,0.229c0,0.113,0.112,0.17,0.226,0.17c0.257,0,0.739,0.028,0.966,0.085
c0.937,0.198,1.164,0.653,1.221,1.618c0.057,0.908,0.057,1.703,0.057,6.131v3.549c0,2.924-0.341,5.337-1.646,6.954
c-1.022,1.222-2.725,2.045-4.457,2.045c-1.617,0-2.895-0.256-4.286-1.563c-1.221-1.163-2.129-2.923-2.129-7.011v-3.975
c0-4.428,0-5.223,0.057-6.131c0.057-0.993,0.284-1.504,1.051-1.618c0.341-0.057,0.511-0.085,0.709-0.085
c0.114,0,0.228-0.057,0.228-0.17c0-0.171-0.142-0.229-0.454-0.229c-0.852,0-2.555,0.086-2.811,0.086
c-0.255,0-1.987-0.086-3.265-0.086c-0.313,0-0.454,0.058-0.454,0.229c0,0.113,0.114,0.17,0.228,0.17
c0.256,0,0.738,0.028,0.965,0.085c0.938,0.198,1.164,0.653,1.221,1.618c0.057,0.908,0.057,1.703,0.057,6.131V58.519z M51.902,53.502
c0-0.767-0.568-1.248-1.306-1.248c-0.71,0-1.136,0.539-1.136,1.22c0,0.88,0.71,1.221,1.221,1.221
C51.221,54.694,51.902,54.354,51.902,53.502 M51.902,47.797c0-0.767-0.568-1.249-1.306-1.249c-0.71,0-1.136,0.54-1.136,1.221
c0,0.88,0.71,1.22,1.221,1.22C51.221,48.988,51.902,48.648,51.902,47.797 M106.209,30.812c2.97-0.814,4.97-3.294,4.97-6.658
c0-1.547-0.817-2.86-1.46-3.473c-0.466-0.438-1.779-1.664-5.427-1.664c-1.344,0-3.82,0.09-4.593,0.09
c-0.335,0-1.935-0.085-3.215-0.085c-0.313,0-0.455,0.057-0.455,0.228c0,0.114,0.114,0.171,0.228,0.171
c0.257,0,0.739,0.028,0.968,0.085c0.938,0.199,1.165,0.654,1.223,1.621c0.057,0.91,0.057,1.708,0.057,6.145v5.007
c0,2.731,0,4.978-0.141,6.172c-0.114,0.825-0.258,1.452-0.826,1.564c-0.257,0.058-0.598,0.114-0.854,0.114
c-0.17,0-0.228,0.085-0.228,0.17c0,0.172,0.143,0.229,0.455,0.229c0.854,0,2.646-0.085,2.674-0.085c0.142,0,1.935,0.085,3.499,0.085
c0.313,0,0.455-0.085,0.455-0.229c0-0.085-0.057-0.17-0.229-0.17c-0.255,0-0.881-0.057-1.278-0.114
c-0.854-0.112-1.024-0.739-1.11-1.564c-0.143-1.194-0.143-3.44-0.143-6.172v-0.683c0-0.143,0.057-0.228,0.2-0.228l2.76,0.042
c0.171,0,0.321,0.067,0.376,0.186c0.432,0.944,1.029,2.54,1.89,4.303c1.175,2.409,1.378,3.476,2.602,4.13
c0.739,0.399,1.515,0.499,3.107,0.499h1.371c0.512,0,0.684-0.057,0.684-0.229c0-0.085-0.114-0.173-0.257-0.17
c-0.281,0.008-0.753-0.071-1.292-0.167c-0.462-0.082-1.808-0.408-2.639-1.966C108.541,36.046,107.344,33.212,106.209,30.812
M4.476,31.418c0,4.155,1.081,6.147,2.477,7.485c2.02,1.906,4.895,2.021,5.862,2.021c1.679,0,3.813-0.284,5.863-2.105
c2.277-2.021,2.618-5.438,2.618-8.511v-3.045c0-4.44,0-5.237,0.058-6.147c0.057-0.997,0.284-1.451,1.052-1.622
c0.343-0.058,0.514-0.086,0.713-0.086c0.113,0,0.228-0.057,0.228-0.171c0-0.171-0.143-0.228-0.456-0.228
c-0.854,0-2.191,0.085-2.391,0.085c-0.171,0-1.736-0.085-3.017-0.085c-0.313,0-0.455,0.057-0.455,0.228
c0,0.114,0.113,0.171,0.227,0.171c0.257,0,0.741,0.028,0.969,0.086c0.939,0.198,1.166,0.654,1.224,1.622
c0.057,0.91,0.057,1.707,0.057,6.147v3.558c0,2.932-0.341,5.351-1.651,6.973c-1.023,1.224-2.731,2.049-4.468,2.049
c-1.622,0-2.903-0.256-4.298-1.565c-1.224-1.167-2.134-2.931-2.134-7.029v-3.984c0-4.44,0-5.237,0.057-6.147
c0.057-0.997,0.284-1.509,1.054-1.622c0.341-0.058,0.512-0.086,0.711-0.086c0.113,0,0.228-0.057,0.228-0.171
c0-0.171-0.143-0.228-0.455-0.228c-0.854,0-2.562,0.085-2.818,0.085c-0.256,0-1.992-0.085-3.272-0.085
C2.142,19.009,2,19.065,2,19.236c0,0.114,0.113,0.171,0.228,0.171c0.256,0,0.739,0.028,0.968,0.086
c0.939,0.198,1.166,0.654,1.223,1.622c0.058,0.91,0.058,1.707,0.058,6.147V31.418z M27.707,23.021
c0.911,1.025,4.121,4.611,7.418,8.17c3.012,3.243,7.104,7.428,7.415,7.712c1.513,1.508,1.856,1.821,2.086,1.821
c0.202,0,0.259-0.143,0.259-2.021l0.057-16.679c0-1.708,0.114-2.334,1.054-2.532c0.341-0.086,0.54-0.086,0.684-0.086
c0.198,0,0.313-0.086,0.313-0.199c0-0.171-0.199-0.199-0.513-0.199c-1.167,0-2.11,0.085-2.426,0.085
c-0.316,0-1.683-0.085-2.961-0.085c-0.342,0-0.568,0.028-0.568,0.199c0,0.113,0.028,0.199,0.227,0.199
c0.228,0,0.882,0.028,1.393,0.143c0.881,0.228,1.08,0.854,1.108,2.704l0.313,14.457c-0.91-0.938-4.007-4.411-6.82-7.428
c-4.376-4.696-8.608-9.278-9.037-9.762c-0.286-0.285-0.774-0.911-1.004-0.911s-0.315,0.313-0.315,1.424l-0.028,16.307
c0,2.591-0.143,3.416-0.854,3.615c-0.427,0.143-0.938,0.17-1.167,0.17c-0.142,0-0.228,0.059-0.228,0.171
c0,0.2,0.171,0.229,0.456,0.229c1.28,0,2.481-0.086,2.739-0.086s1.397,0.086,3.018,0.086c0.341,0,0.511-0.057,0.511-0.229
c0-0.112-0.085-0.171-0.227-0.171c-0.256,0-0.881-0.027-1.421-0.17c-0.768-0.228-1.051-0.967-1.108-3.301L27.707,23.021z
M53.576,27.263c0-4.44,0-5.237,0.057-6.147c0.058-0.997,0.285-1.48,1.053-1.622c0.343-0.058,0.514-0.086,0.712-0.086
c0.114,0,0.229-0.057,0.229-0.171c0-0.171-0.144-0.228-0.456-0.228c-0.854,0-2.646,0.085-2.788,0.085
c-0.144,0-1.937-0.085-2.875-0.085c-0.313,0-0.456,0.057-0.456,0.228c0,0.114,0.114,0.171,0.228,0.171
c0.199,0,0.569,0.028,0.883,0.114c0.626,0.143,0.91,0.626,0.968,1.594c0.057,0.91,0.057,1.707,0.057,6.147v5.01
c0,2.731,0,4.98-0.143,6.176c-0.113,0.825-0.256,1.451-0.824,1.565c-0.258,0.057-0.598,0.112-0.854,0.112
c-0.171,0-0.228,0.086-0.228,0.171c0,0.172,0.142,0.229,0.455,0.229c0.854,0,2.646-0.086,2.79-0.086c0.142,0,1.935,0.086,3.5,0.086
c0.313,0,0.454-0.086,0.454-0.229c0-0.085-0.056-0.171-0.227-0.171c-0.257,0-0.883-0.056-1.281-0.112
c-0.854-0.114-1.024-0.74-1.109-1.565c-0.143-1.195-0.143-3.444-0.143-6.176V27.263z M162.65,21.653c0.77,0,1.254-0.569,1.254-1.309
c0-0.712-0.542-1.139-1.226-1.139c-0.881,0-1.224,0.711-1.224,1.223C161.455,20.97,161.798,21.653,162.65,21.653 M169.952,21.653
c0.77,0,1.253-0.569,1.253-1.309c0-0.712-0.54-1.139-1.224-1.139c-0.883,0-1.224,0.711-1.224,1.223
C168.758,20.97,169.099,21.653,169.952,21.653 M163.043,31.104c-0.086,0-0.143-0.057-0.086-0.199l2.506-7.684
c0.142-0.427,0.284-0.427,0.427,0l2.703,7.684c0.029,0.114,0.029,0.199-0.113,0.199H163.043z M159.06,37.395
c-0.514,1.424-1.083,2.505-2.392,2.676c-0.228,0.028-0.625,0.056-0.826,0.056c-0.142,0-0.257,0.059-0.257,0.171
c0,0.172,0.173,0.229,0.542,0.229c1.338,0,2.903-0.086,3.218-0.086c0.312,0,1.535,0.086,2.219,0.086
c0.257,0,0.427-0.057,0.427-0.229c0-0.112-0.086-0.171-0.284-0.171h-0.285c-0.484,0-1.082-0.255-1.082-0.824
c0-0.513,0.143-1.195,0.399-1.907l1.707-5.038c0.058-0.142,0.144-0.228,0.284-0.228h6.119c0.143,0,0.2,0.058,0.257,0.171
l2.646,7.002c0.171,0.455,0,0.712-0.169,0.769c-0.114,0.028-0.2,0.085-0.2,0.199c0,0.17,0.313,0.17,0.853,0.199
c1.965,0.057,4.042,0.057,4.47,0.057c0.312,0,0.568-0.057,0.568-0.229c0-0.142-0.113-0.171-0.284-0.171
c-0.284,0-0.712-0.027-1.139-0.17c-0.598-0.171-1.424-0.626-2.448-3.159c-1.735-4.326-6.204-16.08-6.631-17.162
c-0.341-0.882-0.455-1.024-0.627-1.024c-0.17,0-0.284,0.171-0.625,1.11L159.06,37.395z M63.469,22.481
c-0.427-1.11-0.769-1.992-0.769-2.363c0-0.198,0.057-0.427,0.37-0.568c0.257-0.114,0.769-0.143,1.081-0.143
c0.199,0,0.285-0.057,0.285-0.199s-0.257-0.199-0.769-0.199c-1.082,0-2.362,0.085-2.647,0.085c-0.341,0-1.964-0.085-3.329-0.085
c-0.456,0-0.74,0.028-0.74,0.199c0,0.113,0.057,0.199,0.228,0.199s0.655,0,1.082,0.114c0.996,0.284,1.423,0.597,2.049,2.19
l6.973,17.447c0.541,1.366,0.683,1.765,1.025,1.765c0.283,0,0.397-0.455,1.194-2.163c0.655-1.396,1.936-4.468,3.673-8.623
c1.45-3.501,2.874-6.916,3.187-7.713c0.77-1.936,1.196-2.42,1.565-2.677c0.541-0.341,1.167-0.341,1.366-0.341
c0.228,0,0.341-0.057,0.341-0.199s-0.17-0.199-0.483-0.199c-0.824,0-2.049,0.085-2.22,0.085c-0.341,0-1.651-0.085-2.789-0.085
c-0.456,0-0.626,0.057-0.626,0.228c0,0.143,0.142,0.171,0.313,0.171c0.313,0,0.739,0,1.081,0.114
c0.284,0.143,0.369,0.426,0.369,0.654c0,0.256-0.113,0.655-0.256,1.081c-0.625,2.05-4.439,11.982-6.091,15.797L63.469,22.481z
M83.183,32.272c0,2.731,0,4.98-0.143,6.176c-0.113,0.825-0.256,1.451-0.825,1.565c-0.256,0.057-0.598,0.112-0.854,0.112
c-0.171,0-0.228,0.086-0.228,0.171c0,0.172,0.142,0.229,0.455,0.229c0.427,0,1.082-0.057,1.65-0.057
c0.598-0.029,1.082-0.029,1.139-0.029c0.427,0,1.11,0.029,2.22,0.086c1.111,0.029,2.676,0.085,4.81,0.085
c1.11,0,1.339,0,1.537-0.739c0.143-0.598,0.37-2.532,0.37-2.762c0-0.198,0-0.426-0.171-0.426c-0.143,0-0.199,0.113-0.256,0.426
c-0.199,1.167-0.541,1.736-1.28,2.05c-0.74,0.313-1.992,0.313-2.732,0.313c-2.789,0-3.217-0.369-3.302-2.333
c-0.027-0.598,0-3.899,0-4.866v-2.505c0-0.114,0.057-0.199,0.199-0.199c0.483,0,3.302,0.056,4.07,0.142
c1.11,0.114,1.366,0.598,1.479,0.997c0.114,0.37,0.114,0.654,0.114,0.938c0,0.143,0.057,0.257,0.199,0.257
c0.199,0,0.199-0.313,0.199-0.541c0-0.199,0.056-1.253,0.113-1.822c0.086-0.939,0.229-1.422,0.229-1.593s-0.058-0.229-0.143-0.229
c-0.114,0-0.228,0.142-0.427,0.37c-0.257,0.285-0.654,0.342-1.338,0.398c-0.654,0.057-4.155,0.057-4.525,0.057
c-0.143,0-0.171-0.085-0.171-0.284v-7.854c0-0.199,0.057-0.286,0.171-0.286c0.313,0,3.415,0.029,3.899,0.087
c1.536,0.17,1.821,0.512,2.02,0.967c0.144,0.342,0.172,0.825,0.172,1.024c0,0.229,0.056,0.37,0.228,0.37
c0.114,0,0.171-0.171,0.198-0.313c0.058-0.342,0.115-1.595,0.144-1.879c0.085-0.797,0.228-1.139,0.228-1.338
c0-0.142-0.028-0.256-0.114-0.256c-0.142,0-0.257,0.114-0.398,0.143c-0.229,0.057-0.683,0.113-1.224,0.142
c-0.654,0.028-6.318,0.028-6.518,0.028l-1.166-0.057c-0.628-0.028-1.396-0.028-2.051-0.028c-0.313,0-0.455,0.057-0.455,0.228
c0,0.114,0.114,0.171,0.229,0.171c0.256,0,0.739,0.028,0.967,0.086c0.939,0.198,1.167,0.654,1.224,1.622
c0.058,0.91,0.058,1.707,0.058,6.147V32.272z M120.217,40.924c1.535,0,3.071-0.342,4.296-1.195c1.964-1.395,2.419-3.558,2.419-4.725
c0-2.276-0.798-4.041-4.155-6.688l-0.797-0.627c-2.731-2.134-3.472-3.159-3.472-4.781c0-2.077,1.537-3.302,3.5-3.302
c2.619,0,3.388,1.195,3.559,1.509c0.17,0.313,0.341,1.081,0.37,1.423c0.027,0.228,0.057,0.37,0.228,0.37
c0.143,0,0.199-0.2,0.199-0.654c0-1.937,0.113-2.875,0.113-3.018s-0.058-0.199-0.285-0.199s-0.455-0.028-0.995-0.142
c-0.712-0.171-1.538-0.285-2.647-0.285c-3.614,0-5.891,2.077-5.891,5.123c0,1.936,0.683,3.7,3.699,6.176l1.28,1.054
c2.448,2.021,3.273,3.159,3.273,5.122c0,1.821-1.338,3.786-4.07,3.786c-1.906,0-3.785-0.797-4.212-2.902
c-0.085-0.399-0.085-0.798-0.085-1.054c0-0.228-0.029-0.313-0.199-0.313c-0.143,0-0.199,0.143-0.228,0.455
c-0.028,0.456-0.143,1.594-0.143,3.018c0,0.768,0.029,0.882,0.427,1.081C117.568,40.725,118.878,40.924,120.217,40.924
M135.028,27.263c0-4.44,0-5.237,0.058-6.147c0.058-0.997,0.285-1.48,1.055-1.622c0.34-0.058,0.511-0.086,0.71-0.086
c0.114,0,0.228-0.057,0.228-0.171c0-0.171-0.142-0.228-0.456-0.228c-0.853,0-2.646,0.085-2.788,0.085
c-0.142,0-1.936-0.085-2.874-0.085c-0.313,0-0.456,0.057-0.456,0.228c0,0.114,0.114,0.171,0.228,0.171
c0.2,0,0.569,0.028,0.883,0.114c0.627,0.143,0.91,0.626,0.968,1.594c0.057,0.91,0.057,1.707,0.057,6.147v5.01
c0,2.731,0,4.98-0.143,6.176c-0.114,0.825-0.255,1.451-0.826,1.565c-0.255,0.057-0.597,0.112-0.854,0.112
c-0.17,0-0.227,0.086-0.227,0.171c0,0.172,0.142,0.229,0.456,0.229c0.853,0,2.646-0.086,2.788-0.086
c0.143,0,1.936,0.086,3.501,0.086c0.313,0,0.455-0.086,0.455-0.229c0-0.085-0.058-0.171-0.228-0.171
c-0.257,0-0.882-0.056-1.281-0.112c-0.853-0.114-1.023-0.74-1.11-1.565c-0.143-1.195-0.143-3.444-0.143-6.176V27.263z
M149.724,20.232l3.579,0.057c2.726,0.058,3.409,0.712,3.495,1.565l0.026,0.313c0.031,0.398,0.09,0.483,0.233,0.483
c0.116,0,0.204-0.113,0.204-0.369c0-0.313,0.087-2.277,0.087-3.131c0-0.171,0-0.342-0.146-0.342c-0.115,0-0.379,0.086-0.805,0.142
c-0.454,0.086-1.106,0.143-2.016,0.143h-10.666c-0.341,0-1.423-0.057-2.246-0.143c-0.77-0.056-1.055-0.341-1.254-0.341
c-0.113,0-0.228,0.37-0.286,0.541c-0.056,0.228-0.625,2.675-0.625,2.96c0,0.171,0.057,0.256,0.142,0.256
c0.114,0,0.2-0.057,0.286-0.284c0.086-0.2,0.172-0.398,0.483-0.882c0.455-0.684,1.139-0.884,2.903-0.912l4.212-0.057v12.04
c0,2.731,0,4.98-0.143,6.176c-0.114,0.825-0.256,1.451-0.824,1.565c-0.258,0.057-0.599,0.112-0.855,0.112
c-0.171,0-0.227,0.086-0.227,0.171c0,0.172,0.143,0.229,0.455,0.229c0.854,0,2.646-0.086,2.789-0.086s1.934,0.086,3.496,0.086
c0.313,0,0.454-0.086,0.454-0.229c0-0.085-0.057-0.171-0.227-0.171c-0.256,0-0.88-0.056-1.278-0.112
c-0.852-0.114-1.022-0.74-1.106-1.565c-0.143-1.195-0.143-3.444-0.143-6.176V20.232z M184.798,20.232l3.581,0.057
c2.726,0.058,3.407,0.712,3.493,1.565l0.028,0.313c0.029,0.398,0.087,0.483,0.233,0.483c0.116,0,0.203-0.113,0.203-0.369
c0-0.313,0.087-2.277,0.087-3.131c0-0.171,0-0.342-0.145-0.342c-0.116,0-0.379,0.086-0.805,0.142
c-0.455,0.086-1.108,0.143-2.017,0.143h-10.666c-0.341,0-1.422-0.057-2.246-0.143c-0.77-0.056-1.055-0.341-1.253-0.341
c-0.116,0-0.229,0.37-0.286,0.541c-0.057,0.228-0.625,2.675-0.625,2.96c0,0.171,0.056,0.256,0.141,0.256
c0.115,0,0.2-0.057,0.286-0.284c0.085-0.2,0.172-0.398,0.484-0.882c0.455-0.684,1.138-0.884,2.902-0.912l4.212-0.057v12.04
c0,2.731,0,4.98-0.143,6.176c-0.113,0.825-0.255,1.451-0.826,1.565c-0.255,0.057-0.597,0.112-0.854,0.112
c-0.17,0-0.228,0.086-0.228,0.171c0,0.172,0.144,0.229,0.457,0.229c0.853,0,2.646-0.086,2.788-0.086
c0.144,0,1.935,0.086,3.496,0.086c0.313,0,0.454-0.086,0.454-0.229c0-0.085-0.056-0.171-0.226-0.171c-0.256,0-0.88-0.056-1.28-0.112
c-0.852-0.114-1.022-0.74-1.105-1.565c-0.144-1.195-0.144-3.444-0.144-6.176V20.232z M102.913,19.932
c0.878-0.01,2.808-0.156,4.354,1.42c1.548,1.576,1.636,3.531,1.636,4.495c0,2.685-2.206,4.695-5.037,4.695
c-1.17,0-2.461-0.199-2.887-0.455c-0.144-0.085-0.2-0.199-0.2-0.341v-9.303c0-0.171,0.086-0.284,0.229-0.341
C101.292,20.017,102.06,19.941,102.913,19.932"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A11E3B" d="M237.585,63.408c0.547-0.123,0.857-0.265,1.308-0.6
c0.647-0.48,0.959-0.907,1.218-1.67c0.091,0.906-0.058,1.772-0.874,2.215C238.669,63.66,238.165,63.591,237.585,63.408
M235.53,56.925c1.341-1.311,1.729-2.884,1.153-4.668c-0.354-1.097-0.819-1.717-1.771-2.365c0.273-0.301,0.439-0.461,0.746-0.728
c0.259-0.225,0.41-0.345,0.69-0.542l0.335,0.9c0.428,1.151,1.082,1.86,1.113,2.947C237.852,54.414,236.641,56.05,235.53,56.925
M255.319,31.198c-2.092,3.557-4.832,5.294-6.18,5.27c0.247-0.381,0.328-0.903,0.305-1.211c-1.206,0.023-2.019-0.567-2.625-1.603
c-0.489-0.832-0.348-2.451-0.348-2.451c-1.101-0.154-1.735,0.975-1.735,2.018v10.386c0,0.782,0.086,1.302,0.367,1.852
c1.129,2.202,3.647,3.552,5.753,3.273c-0.928,1.021-1.864,1.732-3.36,1.893c-0.849,0.09-1.37,0.027-2.172-0.263
c1.033,0.938,2.068,1.421,3.476,1.167c1.439-0.258,2.259-1.53,3.002-1.736c0.453-0.126,0.846-0.053,1.37,0.048
c-0.652,0.072-1.124,0.431-1.448,0.86c-0.268,0.356-0.336,0.984-0.355,1.362c0.472,0.113,0.993,0.142,1.563-0.078
c0.427-0.163,0.661-0.324,0.967-0.666c0.646,0.424,1.07,1.515,1.07,1.515c-0.625-0.264-1.287-0.287-1.873-0.088
c-1.785,0.607-2.51,1.759-5.909,1.16c-1.491-0.262-1.966-1.322-3.172-1.506c0.405,0.242,0.645,0.587,0.817,1.089
c0.128,0.369,0.154,0.608,0.107,0.996c1.94-0.475,3.137,0.638,4.431,0.722c1.725,0.112,1.938-1.39,4.682-1.359
c0.856,0.01,2.065,0.609,2.44,1.553c-0.915-0.433-2.268-0.307-2.992-0.105c-1.123,0.311-1.794,0.685-2.587,1.556
c0.811,0.319,1.33,0.409,2.202,0.384c0.737-0.021,1.166-0.108,1.854-0.374c-0.967,0.925-1.898,1.438-3.413,1.954
c-1.017,0.346-1.686,0.227-2.726,0.005c0.307-0.165,0.473-0.465,0.473-0.465c-1.542-0.267-1.679-1.193-2.926-1.448
c-0.331-0.066-0.521-0.092-0.858-0.114c1.255,2.354,4.11,3.707,6.381,3.176c1.091-0.255,2.524-0.711,3.629-1.854
c-0.33,1.621-0.938,2.472-2.268,3.061c-1.778,0.787-3.157,0.925-4.98,0.238c0.81,0.715,1.737,1.014,2.973,1.235
c0.811,0.146,1.292,0.164,2.111,0.078c-2.111,1.284-5.568,0.598-7.846-1.093c-1.621-1.205-2.52-2.41-3.215-4.389
c0.252,2.153,0.727,4.495,2.878,5.85c1.015,0.639,1.986,1.062,2.924,0.944c-0.783,0.541-1.911,0.678-2.819,0.678
c-1.814,0-3.503-1.699-4.285-3.698c0.164,2.238-0.718,3.698-2.282,3.698c-0.882,0-1.338-0.386-2.186-0.396
c-0.53-0.006-0.91,0.11-1.448,0.326c0.25-0.553,0.357-0.92,0.802-1.332c0.916-0.848,2.672-0.854,3.318-2.287
c0.416-0.92,0.35-1.552,0.224-2.577c-0.656,1.843-1.854,2.693-3.891,3.628c-1.113,0.512-1.679,1.604-1.931,2.539
c-0.098-1.251-0.029-2.087,0.627-3.156c0.783-1.274,2.665-1.64,3.438-2.953c0.6-1.019,0.736-1.76,0.734-2.942
c-0.407,1.391-1.015,2.394-1.739,2.895c-1.557,1.077-3.212,1.526-3.976,2.858c-0.618,1.08-0.653,1.918-0.443,3.135
c-0.832-0.786-1.129-1.646-0.956-2.778c0.147-0.973,0.529-1.581,1.342-2.135c-1.152,0.117-1.955,0.769-2.307,1.872
c-0.284,0.895-0.174,1.61,0.367,2.378c-1.961-0.515-1.819-3.238-0.579-4.576c2.124-2.297,5.889-2.126,4.313-6.323
c-0.185,1.575-0.455,2.498-1.64,3.332c-1.883,1.321-4.787,1.186-5.312,4.314c-0.151-2.404,0.586-3.184,1.98-4.5
c0.86-0.812,2.49-1.207,2.383-3.531c-0.539,1.274-1.304,1.785-2.363,2.248c-1.228,0.534-1.979,0.29-2.992,1.574
c-0.049-0.938,0.272-1.813,1.159-2.338c0.811-0.481,1.678-0.376,2.295-1.301c0,0-0.702-0.271-1.717,0.123
c0.967-1.216,1.678-0.904,2.635-1.368c0.59-0.284,0.828-0.533,1.255-0.977c-0.839-0.097-1.632-0.108-2.49,0.097
c-1.012,0.243-2.095,1.1-2.095,1.1c0.618-1.733,3.044-3.195,5.434-3.871c3.24-0.914,4.555-1.244,5.159-2.365
c0.414-0.768,0.488-1.021,0.488-2.795V32.367c0-1.172-1.859-0.811-2.407-0.264c-0.495,0.495-0.656,1.094-0.272,1.887
c-2.332,0.031-2.955-1.805-2.955-1.805c-0.016,0.203-0.02,0.414-0.018,0.635c-0.826-0.402-1.266-0.803-1.743-1.589
c-0.302-0.497-0.426-0.82-0.534-1.392c-0.726,0.575-2.65,0.76-2.961,0.533c-0.788-0.576-1.245-2.045-1.448-3.513
c-0.187-1.357-0.105-2.2,0.34-3.495c-1.107-1.979-1.352-4.262-1.352-6.582c0-1.938,1.182-4.409,2.799-5.984
c0.657-3.239,4.154-5.18,6.711-5.18c2.428,0,4.431,1.393,5.62,3.986c1.104-2.554,3.739-3.986,6.433-3.986
c2.519,0,4.267,0.954,5.707,3.02c1.179,0.247,1.919,0.531,2.752,1.4c1.103,1.153,1.894,2.224,1.943,4.159
c0.015,0.534-0.231,0.818-0.52,1.269c0.962,1.363,1.386,2.377,1.386,4.045c0,1.704-0.154,2.584-0.916,3.985
c0.083,0.162,0.12,0.261,0.165,0.437c0.064,0.254,0.08,0.406,0.066,0.668c-0.548,0.181-1.151,0.144-1.302,0.699
C255.97,25.787,256.999,28.176,255.319,31.198 M245.106,30.978c0.112-1.009,0.563-1.955,1.197-2.678
c0.331,0.091,0.583,0.222,0.908,0.46c0.238,0.174,0.39,0.311,0.545,0.505C246.68,29.453,245.608,30.124,245.106,30.978
M251.367,29.599c0.16,1.255-0.09,2.697-0.701,3.717c0.139-0.857,0.091-1.853-0.22-2.645c0.35-0.176,0.562-0.389,0.771-0.759
C251.282,29.798,251.33,29.698,251.367,29.599 M249.261,26.957c0.118,0.013,0.235,0.035,0.353,0.065
c0.705,0.184,1.194,0.742,1.483,1.479c-0.426,0.197-0.702,0.402-1.064,0.775c-0.131,0.135-0.219,0.235-0.308,0.354
c-0.182-0.144-0.39-0.253-0.626-0.321c-0.135-0.038-0.273-0.065-0.414-0.082c0.02-0.572,0.09-0.941,0.277-1.522
C249.061,27.401,249.142,27.195,249.261,26.957 M247.431,27.37c0.48-0.272,0.999-0.428,1.52-0.431
c-0.158,0.18-0.274,0.367-0.403,0.635c-0.09,0.186-0.131,0.298-0.187,0.496c-0.147-0.23-0.266-0.35-0.497-0.496
C247.708,27.476,247.573,27.409,247.431,27.37 M232.526,22.254c0.15-0.109,0.301-0.209,0.456-0.302
c0.104,0.145,0.165,0.252,0.252,0.431c0.189,0.388,0.276,0.666,0.312,1.044c-0.378,0.167-0.717,0.395-1.017,0.666
c-0.095-0.211-0.137-0.379-0.168-0.64C232.306,22.979,232.348,22.641,232.526,22.254 M233.201,21.828
c0.762-0.41,1.6-0.609,2.598-0.464l0.082,0.013c-0.21,0.359-0.387,0.603-0.688,0.961c-0.226,0.268-0.362,0.41-0.618,0.647
c-0.271-0.246-0.426-0.382-0.707-0.617C233.606,22.148,233.437,22.011,233.201,21.828 M236.473,21.51
c0.733,0.209,1.409,0.585,1.995,1.113c-0.077,0.343-0.147,0.699-0.188,1.01c-0.063,0.486-0.09,0.822-0.094,1.229
c-0.667-0.807-1.431-1.406-2.322-1.641L236.473,21.51z M238.876,23.031c0.728,0.813,1.272,1.898,1.546,3.229
c-0.227-0.199-0.452-0.315-0.787-0.424c-0.313-0.102-0.547-0.139-0.822-0.12l-0.211-0.311c0.105-0.318,0.164-0.587,0.223-0.983
C238.904,23.876,238.92,23.514,238.876,23.031 M240.463,26.478c0.147,0.827,0.191,1.743,0.113,2.744
c-0.373-0.897-0.785-1.814-1.253-2.656L240.463,26.478z M232.019,24.641c-0.075,0.095-0.147,0.192-0.216,0.293l-0.697-0.861
l-0.692-0.297c0.102-0.255,0.333-0.717,0.488-0.893c-0.285-0.124-0.639-0.867-0.77-1.251c0.368,0.06,0.586,0.066,0.958,0.028
c0.25-0.023,0.392-0.05,0.633-0.118l-0.662-2.337c0.597,0.178,0.927,0.329,1.452,0.662c0.438,0.277,0.828,0.359,1.035,0.834
c0.053,0.125,0.08,0.215,0.099,0.329c-0.765,0.351-1.381,0.916-1.702,1.685c-0.045,0.333-0.056,0.524-0.049,0.858
C231.903,23.997,231.932,24.254,232.019,24.641 M231.282,25.868c-0.522,1.156-0.729,2.479-0.672,3.56
c-0.713-0.374-1.285-0.838-1.71-1.392c0.198-0.054,0.362-0.108,0.597-0.194c0.332-0.121,0.516-0.199,0.833-0.355
c-0.048-0.49-0.135-0.775-0.368-1.21c-0.151-0.282-0.369-0.366-0.478-0.669c-0.071-0.196-0.091-0.319-0.09-0.528
c0.278-0.042,0.45-0.03,0.72,0.051c0.234,0.07,0.347,0.165,0.555,0.293C230.925,25.579,231.078,25.689,231.282,25.868
M228.604,27.601c-0.385-0.652-0.595-1.407-0.623-2.254c0.385,0.228,0.624,0.436,0.944,0.811c0.304,0.355,0.448,0.589,0.633,1.019
c-0.146,0.104-0.233,0.157-0.396,0.231C228.957,27.503,228.783,27.565,228.604,27.601 M228,24.581
c0.046-0.548,0.153-0.935,0.403-1.495c0-0.603,0.146-1.252,0.371-1.873l0.947,1.612l-0.401,0.92
c-0.326,0.179-0.508,0.287-0.82,0.491C228.298,24.368,228.167,24.459,228,24.581 M228.902,20.887
c0.384-0.922,0.926-1.746,1.403-2.216c0.068,0.363,0.124,0.631,0.235,1.048c0.133,0.499,0.229,0.775,0.431,1.251
c-0.306-0.061-0.485-0.073-0.796-0.061c-0.278,0.013-0.429,0.122-0.708,0.104C229.239,21,229.08,20.966,228.902,20.887
M230.978,18.107c0.764-0.544,1.676-0.911,2.636-1.069c-0.1,0.642-0.161,1.059-0.26,1.75l-0.119,0.856l-0.439-0.044
c-0.253-0.162-0.393-0.259-0.633-0.44C231.661,18.782,231.367,18.523,230.978,18.107 M234.352,16.959
c0.741-0.037,1.492,0.051,2.213,0.279c-0.139-0.186-0.315-0.369-0.52-0.537l0.011-0.719c0.06-0.245,0.088-0.384,0.134-0.633
c0.038-0.211,0.062-0.349,0.086-0.53l0.093,0.013c0.223,0.035,0.439,0.079,0.647,0.129c0.146,0.332,0.408,0.908,0.558,1.082
c0.121,0.142,0.194,0.219,0.327,0.35c0,0-0.306,0.547-0.356,0.794c-0.106,0.505-0.052,0.981,0.147,1.355l-0.972-0.692
c-0.085,0.276-0.173,0.552-0.145,0.692c0.115,0.558,0.171,0.887,0.128,1.453c-0.021,0.273-0.047,0.453-0.102,0.681
c-0.958-0.154-1.938-0.06-2.766,0.272c-0.045-0.3-0.042-0.524,0.001-0.865c0.051-0.395,0.227-0.587,0.283-0.982
c0.042-0.296-0.017-0.471,0.029-0.766C234.183,18.118,234.269,17.39,234.352,16.959 M235.523,16.35
c-0.226-0.122-0.466-0.215-0.714-0.265c-0.181-0.037-0.358-0.065-0.531-0.085c0.043-0.196,0.053-0.374,0.044-0.62
c-0.011-0.229-0.031-0.393-0.082-0.573c0.278-0.039,0.565-0.062,0.855-0.065l0.506,0.505c0.082,0.324,0.082,0.532,0,0.854
C235.577,16.197,235.553,16.275,235.523,16.35 M233.769,15.965c-1.202-0.026-2.173,0.352-3.027,0.837
c0.66-0.966,1.721-1.609,2.958-1.896c0.067,0.171,0.096,0.318,0.108,0.533C233.82,15.647,233.812,15.796,233.769,15.965
M238.683,15.604c0.937,0.537,1.639,1.323,2.112,2.385c-0.055,0.153-0.141,0.295-0.267,0.45c-0.089,0.11-0.148,0.168-0.261,0.253
l-0.96-0.84c0.053-0.304,0-0.522-0.188-0.767c-0.146-0.193-0.279-0.284-0.513-0.351c-0.028-0.269-0.028-0.424,0-0.691
C238.627,15.867,238.647,15.739,238.683,15.604 M241.53,21.729c0.007,0.185,0.01,0.374,0.01,0.566c0,0.94,0.02,1.759,0.04,2.555
l-0.982-0.364c-0.118-0.329-0.243-0.629-0.372-0.903c0.043-0.259,0.092-0.454,0.184-0.745c0.137-0.434,0.24-0.674,0.461-1.072
L241.53,21.729z M241.598,25.539c0.028,1.077,0.05,2.165,0.024,3.518c-0.194-1.417-0.432-2.592-0.705-3.565L241.598,25.539z
M239.831,22.845c-0.413-0.674-0.867-1.138-1.35-1.464c0.366-0.386,0.608-0.61,1.034-0.97c0.331-0.278,0.525-0.429,0.879-0.678
c-0.063,0.64-0.114,0.999-0.231,1.631C240.055,21.955,239.975,22.313,239.831,22.845 M238.16,21.186
c-0.254-0.138-0.515-0.243-0.782-0.327c-0.09-0.306-0.136-0.534-0.184-0.894c-0.051-0.363-0.063-0.572-0.061-0.938
c0.209,0.104,0.325,0.175,0.514,0.313c0.144,0.104,0.221,0.169,0.351,0.291c0.294-0.127,0.491-0.16,0.811-0.134
c0.249,0.021,0.394,0.06,0.618,0.171c-0.357,0.276-0.542,0.461-0.819,0.818C238.405,20.746,238.294,20.919,238.16,21.186
M228.436,19.074c0.018-1.903,0.399-3.186,1.424-4.628l0.286,0.093c0.057,0.293,0.114,0.458,0.253,0.723
c0.127,0.24,0.225,0.379,0.4,0.563C229.748,16.735,228.94,17.898,228.436,19.074 M230.253,13.922
c0.485-0.611,0.982-1.137,1.511-1.575c0.086,0.274,0.149,0.508,0.199,0.741l0.922,0.893l0.288,0.44
c-0.716,0.252-1.374,0.621-1.965,1.071c-0.172-0.259-0.457-0.685-0.492-0.841c-0.035-0.154-0.251-0.54-0.453-0.725L230.253,13.922z
M232.407,11.865c1.102-0.734,2.34-1.117,3.812-1.117c0.503,0,0.967,0.054,1.393,0.155l0.007,0.286
c-0.072,0.473-0.151,0.74-0.351,1.177c-0.143,0.313-0.243,0.485-0.446,0.766c-0.167-0.145-1.782-1.352-2.001-1.354
c-0.151,0.458-0.786,2.051-1.094,2.476l-0.115,0.03c-0.119-0.444-0.267-0.712-0.584-1.068c-0.264-0.296-0.453-0.439-0.806-0.618
l0.119-0.351L232.407,11.865z M238.555,11.226c0.941,0.433,1.634,1.125,2.096,1.929c-0.057,0.087-0.114,0.167-0.196,0.271
c-0.116,0.148-0.188,0.23-0.32,0.365c-0.149-0.099-0.228-0.168-0.343-0.306c-0.267-0.32-0.768-1.442-0.967-1.765
C238.707,11.533,238.626,11.384,238.555,11.226 M240.985,13.85c0.419,1.068,0.487,2.244,0.241,3.239
c-1.111-1.561-2.38-2.469-4.025-2.841l0.669-2.456c0.558,0.436,0.839,0.745,1.222,1.34c0.255,0.397,0.68,1.305,0.996,2.101
c0.054-0.173,0.131-0.344,0.238-0.545C240.526,14.316,240.696,14.095,240.985,13.85 M236.504,14.125
c-0.333-0.044-0.68-0.068-1.043-0.074c-0.449-0.008-0.884,0.029-1.303,0.106l0.686-1.18l0.356-0.454
c0.328,0.262,0.498,0.432,0.761,0.76C236.208,13.594,236.35,13.809,236.504,14.125 M238.97,29.362
c-0.226-0.26-0.492-0.474-0.779-0.646c-0.193-0.658-0.485-1.4-0.591-1.605c-0.166-0.324-0.348-0.501-0.579-0.715
c-0.29,0.155-0.484,0.252-0.733,0.503c-0.168,0.166-0.575,0.508-0.686,0.717c-0.133-0.259-0.22-0.399-0.396-0.632
c-0.354-0.475-0.608-0.715-1.101-1.043c-0.149,0.134-0.218,0.245-0.269,0.44c-0.037,0.146-0.041,0.237-0.014,0.385
c-0.368-0.028-0.58-0.087-0.91-0.252c-0.309-0.156-0.508-0.299-0.704-0.522c0.169-0.21,0.362-0.398,0.584-0.559
C236.211,22.962,239.052,26.224,238.97,29.362 M234.97,28.304c-0.061,0.021-0.119,0.045-0.176,0.069
c-0.527,0.235-0.97,0.55-1.32,0.923l-2.056,0.263c-0.141-0.888-0.058-1.865,0.286-2.696c0.728,0.073,1.181,0.205,1.872,0.53
C234.171,27.673,234.515,27.895,234.97,28.304 M232.963,29.987c-0.3,0.53-0.459,1.131-0.467,1.764
c-0.417-0.351-0.729-0.888-0.921-1.512L232.963,29.987z M227.299,20.293c-0.372-0.69-0.652-1.364-0.815-2.03
c0.154-0.063,0.289-0.1,0.485-0.137c0.276-0.051,0.473-0.064,0.708-0.039C227.518,18.748,227.403,19.458,227.299,20.293
M226.382,17.753c-0.18-1.155,0.01-2.3,0.688-3.488c0.058-0.103,0.119-0.206,0.188-0.308c0.099,0.249,0.205,0.428,0.389,0.679
c0.167,0.228,0.719,0.557,1.053,0.785c-0.361,0.685-0.624,1.31-0.824,1.956L226.382,17.753z M227.673,13.386
c0.519-0.644,1.17-1.243,1.853-1.743c0.02,0.108,0.049,0.218,0.092,0.352c0.065,0.207,0.356,0.735,0.54,1.059
c-0.365,0.517-0.696,1.044-1.021,1.591c-0.278-0.268-0.471-0.448-0.785-0.736C228.238,13.802,227.872,13.54,227.673,13.386
M230.386,11.075c0.863-0.508,1.714-0.826,2.357-0.847c-0.801,0.68-1.442,1.353-1.994,2.039c-0.014-0.164-0.035-0.306-0.074-0.505
C230.648,11.633,230.506,11.332,230.386,11.075 M244.364,30.745c-0.232-0.436-0.454-0.71-0.403-1.202
c0.031-0.296,0.093-0.634,0.187-0.992c0.082,0.082,0.162,0.144,0.281,0.221c0.191,0.124,0.337,0.191,0.524,0.237
C244.656,29.658,244.496,30.305,244.364,30.745 M244.256,28.167c0.211-0.68,0.528-1.415,0.958-2.1
c0.856-1.366,1.903-2.493,3.303-3.007c0.123,0.483,0.577,1.678,0.577,1.678c-0.02,0.214-0.034,0.867-0.027,1.257
c-1.38-0.093-2.374,0.736-3.368,1.843c-0.17,0.19-0.318,0.396-0.447,0.606c-0.263,0.043-0.48,0.003-0.751-0.126
C244.398,28.268,244.334,28.23,244.256,28.167 M249.109,22.885c0.429-0.097,0.889-0.141,1.383-0.12
c0.883,0.035,1.821,0.433,2.564,1.019c0.04,0.258,0.091,0.444-0.018,0.801c-0.125,0.413-0.198,0.719-0.444,1.15
c-0.175-0.566-0.446-1.434-0.584-1.44c-0.204-0.01-1.237,0.372-1.626,0.435c0.031,0.187,0.069,0.381,0.118,0.613
c0.23-0.07,0.984-0.314,1.235-0.4c0.13,0.35,0.476,1.468,0.496,1.909c0.268-0.146,0.278-0.152,0.583-0.174
c0.175-0.014,0.494,0.021,0.668,0.051c-0.103,0.227-0.126,0.501-0.238,0.724c-0.2,0.396-0.378,0.619-0.716,0.907
c-0.115,0.098-0.199,0.155-0.315,0.212l-0.043-0.18c-0.357-1.384-1.264-2.035-2.56-2.314c0.045-0.629,0.026-1.017-0.079-1.659
C249.434,23.798,249.332,23.426,249.109,22.885 M255.184,28.248c-0.016,0.205-0.044,0.414-0.087,0.628
c-0.207,1.028-0.761,2.091-1.434,3.061c-0.087-0.413-0.26-1.069-0.59-1.673c-0.216-0.397-0.499-0.593-0.729-0.721
c-0.01-0.194-0.028-0.384-0.056-0.568c0.498-0.391,0.896-0.566,1.551-0.697C254.358,28.172,254.695,28.163,255.184,28.248
M252.969,32.855c-0.748,0.919-1.547,1.692-2.147,2.181c0.708-1.074,1.008-1.782,1.285-3.039c0.123-0.556,0.201-1.086,0.231-1.586
c0.281,0.211,0.441,0.448,0.563,0.821c0.127,0.376,0.013,0.62,0.031,1.017C252.944,32.488,252.954,32.668,252.969,32.855
M242.379,27.525c-0.081-0.695-0.152-1.362-0.204-2.019l0.902-0.094C242.795,26.288,242.573,27.046,242.379,27.525 M242.154,25.216
c-0.046-0.663-0.068-1.317-0.06-1.982c0.32,0.105,0.512,0.223,0.771,0.463c0.183,0.171,0.275,0.285,0.4,0.503
c-0.129,0.209-0.218,0.319-0.391,0.494C242.627,24.943,242.441,25.08,242.154,25.216 M242.206,21.425
c0.02-0.175,0.042-0.352,0.067-0.529c0.194-1.417,1.63-3.766,3.143-4.917c0.212,0.043,0.384,0.097,0.63,0.189
c0.368,0.141,0.569,0.244,0.895,0.464c0.016-0.324,0.014-0.509-0.011-0.833c-0.02-0.277-0.04-0.458-0.084-0.692
c0.393-0.199,0.788-0.366,1.188-0.5c0.184,0.086,0.339,0.181,0.544,0.326c0.304,0.216,0.462,0.363,0.7,0.648l0.511-1.331
l0.188-0.011c0.047,0.59,0.031,0.965-0.062,1.58c-0.065,0.437-0.122,0.682-0.256,1.103l-1.729-1.256l-0.331,1.738
c-0.441-0.107-0.693-0.156-1.144-0.227c-0.459-0.071-0.721-0.101-1.184-0.133c0.005,0.313,0.015,0.49,0.041,0.803
c0.025,0.31,0.047,0.484,0.095,0.792c-0.404,0.232-0.649,0.341-1.093,0.483c-0.384,0.124-0.609,0.175-1.01,0.227
c-0.082,0.185,0.156,0.279,0.434,0.463c0.195,0.131,0.234,0.3,0.361,0.505c-0.012,0.118,0.021,0.24-0.084,0.29
c-0.39,0.185-0.577,0.264-0.946,0.431L242.206,21.425z M250.252,14.23c0.804-0.011,1.656,0.109,2.579,0.372l0.266,0.081l0.362,0.32
c-0.398,0.246-0.611,0.41-0.948,0.733c-0.348,0.333-0.525,0.546-0.792,0.946c-0.343-0.504-0.526-0.794-0.835-1.317
C250.621,14.922,250.462,14.637,250.252,14.23 M254.002,15.058c0.938,0.481,1.645,1.168,2.194,2.027
c-0.096,0.191-0.207,0.375-0.327,0.547c-0.267,0.376-0.46,0.568-0.836,0.833c0.017-0.339-0.147-0.644-0.243-0.969
c-0.118-0.398-0.202-0.45-0.365-0.833C254.169,16.061,254.062,15.663,254.002,15.058 M256.571,17.75
c0.178,0.349,0.335,0.719,0.477,1.11c0.608,1.674,0.726,2.8-0.312,4.555c-0.172-1.063-0.476-1.883-0.997-2.603
c0.009-0.351,0.05-0.678,0.13-1.112C255.978,19.103,256.306,18.351,256.571,17.75 M254.571,19.615l-0.241-0.186
c-0.371-0.28-0.743-0.512-1.12-0.696c-0.021-0.29-0.073-0.521-0.184-0.845c-0.115-0.339-0.207-0.524-0.403-0.823
c-0.098,0.355-0.159,0.555-0.276,0.905l-0.133,0.381c-1.317-0.365-2.687-0.211-4.175,0.368c-1.194,0.465-2.107,1.208-2.788,2.046
c-0.235-0.138-0.375-0.249-0.576-0.458c-0.262-0.271-0.388-0.458-0.544-0.803c0.403-0.15,0.644-0.211,1.068-0.269
c0.321-0.044,0.504-0.052,0.827-0.041c-0.024-0.269-0.036-0.42-0.053-0.689c-0.017-0.276-0.023-0.434-0.033-0.71
c0.395-0.016,0.621-0.003,1.011,0.062c0.345,0.058,0.538,0.107,0.866,0.226c0.103-0.228,0.318-1.535,0.337-1.707
c0.185,0.148,1.563,1.265,1.823,1.338c-0.002-0.278,0.01-0.436,0.052-0.71c0.075-0.494,0.16-0.773,0.372-1.225
c0.201,0.212,0.307,0.343,0.472,0.586c0.199,0.295,0.508,1.046,0.535,1.205c0.289-0.303,0.45-0.476,0.732-0.784
c0.276-0.302,0.432-0.474,0.7-0.782c0.309,0.225,0.83,0.881,1.007,1.218C254.073,17.654,254.504,19.355,254.571,19.615
M245.165,20.872c-0.341,0.438-0.623,0.898-0.85,1.356c-0.247,0.502-0.468,1.021-0.664,1.536l-1.106-0.884l0.308-0.576l0.691-0.297
l-0.371-0.577c0.324-0.207,0.522-0.304,0.884-0.434c0.309-0.11,0.491-0.249,0.815-0.205
C244.991,20.809,245.071,20.829,245.165,20.872 M251.711,21.998c-0.996-0.269-1.973-0.229-2.888,0.056
c-0.259-0.335-0.913-0.634-0.913-0.634c-0.251-0.132-1.037-0.445-1.474-0.585c0.701-0.691,1.486-1.21,2.325-1.521
c0.214,0.106,0.374,0.22,0.588,0.407c0.288,0.252,0.43,0.429,0.618,0.762c0.143-0.305,0.218-0.479,0.342-0.792
c0.11-0.281,0.179-0.472,0.257-0.713c0.2-0.001,0.402,0.008,0.604,0.031c0.263,0.547,0.583,1.337,0.583,1.337l0.603,1.898
C252.15,22.143,251.936,22.059,251.711,21.998 M247.845,22.456c-1.078,0.561-2.046,1.457-2.834,2.561l-0.785-0.694
c0.447-1.16,1.046-2.172,1.752-2.994L247.845,22.456z M244.824,25.288c-0.629,0.939-1.129,2.015-1.464,3.15
c0.075-1.296,0.312-2.507,0.679-3.601L244.824,25.288z M251.84,19.124c0.202,0.048,0.402,0.108,0.604,0.181
c0.954,0.343,1.747,0.995,2.297,1.798c-0.105,0.175-0.215,0.314-0.385,0.499c-0.425,0.463-0.784,0.729-1.358,1.04
c-0.09-0.067-0.181-0.131-0.275-0.19c-0.009-0.44-0.017-0.863-0.116-1.304C252.418,20.314,252.229,19.804,251.84,19.124
M255.133,21.781c0.563,1.185,0.636,2.566,0.014,3.742c-0.343-0.804-0.971-1.875-1.857-2.646L255.133,21.781z M227.117,27.986
c0.552,0.421,0.887,0.633,1.503,0.954c0.557,0.29,0.887,0.431,1.481,0.633c-0.574,0.207-0.931,0.271-1.541,0.275
c-0.288,0.002-0.452-0.01-0.736-0.053C227.824,29.796,227.131,28.999,227.117,27.986 M242.206,17.205
c-0.153-0.53-0.248-1.119-0.269-1.721l0.669,0.182c-0.012-0.226-0.021-0.353-0.041-0.576c-0.037-0.403-0.067-0.631-0.134-1.031
c0.508,0.13,0.796,0.198,1.308,0.308c0.314,0.067,0.512,0.107,0.793,0.158C243.643,15.192,242.877,16.08,242.206,17.205
M242.13,13.614c0.219-0.838,0.629-1.603,1.279-2.149c0.712-0.601,1.565-1.123,2.513-1.509c0.004,0.415,0.047,0.698,0.165,1.138
c0.075,0.278,0.156,0.424,0.247,0.699c0.124,0.386,0.188,0.606,0.289,1c-0.625-0.222-0.988-0.323-1.638-0.454
c-0.442-0.089-0.695-0.128-1.144-0.174c-0.023,0.188-0.023,0.297,0,0.483c0.05,0.392,0.364,0.543,0.382,0.937
c0.01,0.222-0.009,0.355-0.082,0.565L242.13,13.614z M246.491,9.744c1.317-0.442,2.783-0.616,4.283-0.378
c-0.324,0.145-0.557,0.318-0.848,0.614c-0.289,0.296-0.402,0.513-0.597,0.877c-0.159,0.296-0.235,0.474-0.342,0.792l-0.628-0.464
c-0.484-0.357-0.776-0.537-1.245-0.915C246.861,10.066,246.701,9.931,246.491,9.744 M251.321,9.471
c0.392,0.089,0.782,0.206,1.173,0.354c0.533,0.202,1.033,0.479,1.483,0.811c-0.386,0.357-0.656,0.58-1.116,0.921
c-0.205,0.153-0.322,0.236-0.536,0.38c-0.429-0.548-0.62-0.918-0.822-1.584C251.4,10.011,251.352,9.785,251.321,9.471
M254.384,10.961c1.413,1.235,2.192,3.047,1.652,4.745c-0.69-0.735-1.381-1.31-2.114-1.738c-0.213-0.365-0.291-0.667-0.306-1.127
C253.592,12.048,253.83,11.457,254.384,10.961 M252.572,13.355c-0.653-0.218-1.352-0.344-2.114-0.386
c0.006-0.265,0.005-0.438-0.002-0.724c-0.012-0.454-0.027-0.711-0.071-1.164c0.352,0.081,0.55,0.163,0.856,0.355
c0.398,0.252,0.59,0.467,0.856,0.857C252.355,12.672,252.474,12.935,252.572,13.355 M248.946,12.984
c-0.667,0.049-1.291,0.151-1.875,0.311c0.004-0.201,0.001-0.374-0.011-0.621c-0.032-0.626-0.079-0.98-0.216-1.592
c0.421,0.252,0.649,0.417,1.021,0.738C248.343,12.232,248.62,12.528,248.946,12.984 M246.436,13.497
c-0.616,0.225-1.185,0.519-1.712,0.889c-0.207-0.73-0.302-1.492-0.134-1.569c0.425-0.059,0.695-0.022,1.092,0.143
C246.02,13.102,246.222,13.243,246.436,13.497 M243.563,7.423c0.464-0.338,1-0.553,1.591-0.676c0.226,0.168,0.469,0.476,0.6,0.606
c0.309,0.307,0.506,0.562,0.499,0.995c-0.003,0.161-0.025,0.294-0.071,0.416l-0.404,0.18c-0.188-0.257-0.378-0.424-0.688-0.619
C244.865,8.186,243.938,7.644,243.563,7.423 M245.934,6.641c0.271-0.021,0.55-0.026,0.836-0.02c1.446,0.034,2.377,0.413,3.435,1.4
c-0.94-0.011-1.691,0.047-2.422,0.211L246.75,7.97L245.934,6.641z M244.736,8.779c0.201,0.132,0.301,0.263,0.373,0.49
c-1.234,0.636-1.986,1.252-2.969,2.392c-0.047-0.86-0.195-1.803,0.235-2.763c0.195-0.082,0.386-0.115,0.643-0.119
c0.313-0.005,0.937-0.08,1.093-0.144C244.343,8.542,244.527,8.643,244.736,8.779 M229.134,10.183
c0.371-0.665,0.854-1.309,1.434-1.86c0.31,0.162,0.529,0.313,0.835,0.573c0.234,0.197,0.376,0.337,0.547,0.542
c-0.932,0.203-1.777,0.554-2.752,1.115c-0.004-0.063-0.012-0.128-0.027-0.206L229.134,10.183z M231.017,7.932
c0.888-0.708,1.963-1.19,3.188-1.242c-0.102,0.526-0.337,1.323-0.442,1.573c0.062,0.064,0.366,0.601,0.449,0.945
c-0.492,0.008-0.942,0.033-1.364,0.082C232.379,8.938,231.444,8.246,231.017,7.932 M234.924,6.702
c1.25,0.078,2.138,0.363,2.803,0.833l0.076,0.638c0,0-0.33,0.841-0.577,1.357c-0.376-0.105-0.758-0.182-1.16-0.233
c-0.093-0.233-0.195-0.468-0.333-0.612c-0.315-0.333-0.536-0.493-0.949-0.69l0.072-0.666L234.924,6.702z M238.591,8.399
c0.422,0.583,0.721,1.304,0.997,2.142c-0.653-0.36-1.237-0.635-1.813-0.838L238.591,8.399z M234.491,32.701
c-0.722-0.588-0.921-1.497-0.509-2.332l0.612,0.167l0.606,0.466C234.751,31.447,234.547,31.987,234.491,32.701 M234.43,29.827
c0.798-0.623,2.174-0.588,2.796,0.233c-0.646,0.027-1.298,0.388-1.663,0.643l-0.386-0.784L234.43,29.827z M248.278,30.028
c0.007,0.21,0.053,0.381,0.122,0.528c-0.093,0.264-0.137,0.49-0.172,0.823c-0.065,0.618-0.031,0.992,0.149,1.587l0.353-0.754
l0.032-1.174c0.327,0.324,0.729,0.606,0.9,1.207c0.148,0.528,0.084,1.197-0.184,1.886c-1.02-0.065-1.72-0.408-2.019-1.268
C247.212,32.146,247.378,30.597,248.278,30.028"/>
</svg>

After

Width:  |  Height:  |  Size: 60 KiB

10907
docs/build/html/_static/jquery.js vendored Normal file

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More