Compare commits

...

203 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
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
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
283 changed files with 34104 additions and 613 deletions

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/

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

298
README.md
View File

@ -1,296 +1,72 @@
<h1 align="center">
<br>
<img src='./icon.svg' width="250px">
<img src='https://raw.githubusercontent.com/ALRhub/fancy_gym/master/icon.svg' width="250px">
<br><br>
<b>Fancy Gym</b>
<br><br>
</h1>
| :exclamation: Fancy Gym has recently received a major refactor, which also updated many of the used dependencies to current versions. The update has brought some breaking changes. If you want to access the old version, check out the [legacy branch](https://github.com/ALRhub/fancy_gym/tree/legacy). Find out more about what changed [here](https://github.com/ALRhub/fancy_gym/pull/75). |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
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.
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, Table Tennis, etc.) that present a higher degree of difficulty, pushing the boundaries of reinforcement learning research.
- **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, it's 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://deepmind.com/research/publications/2020/dm-control-Software-and-Tasks-for-Continuous-Control) and [Metaworld](https://meta-world.github.io/), whether you want to use them in the regular step-based setting or using MPs.
- **Contribute Your Own Environments**: If you're inspired to create custom gym environments, both step-based and with movement primitives, this [guide](https://gymnasium.farama.org/tutorials/gymnasium_basics/environment_creation/) will assist you. We encourage and highly appreciate submissions via PRs to integrate these environments into `fancy_gym`.
- **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`.
## Movement Primitive Environments (Episode-Based/Black-Box Environments)
## Quickstart Guide
<p align="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).
</p>
<p align="justify">
Once generated, these trajectories are converted into step-by-step actions using a trajectory tracking controller. The specific controller chosen depends on the environment's 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.
</p>
<p align="justify">
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 episode's 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.
</p>
| &#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/). |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
## Installation
1. Clone the repository
Install via pip [or use an alternative installation method](https://alrhub.github.io/fancy_gym/guide/installation.html)
```bash
git clone git@github.com:ALRhub/fancy_gym.git
pip install 'fancy_gym[all]'
```
2. Go to the folder
```bash
cd fancy_gym
```
3. Install with
```bash
pip install -e .
```
We have a few optional dependencies. If you also want to install those use
```bash
pip install -e '.[all]' # to install all optional dependencies
pip install -e '.[dmc,metaworld,box2d,mujoco,mujoco-legacy,jax,testing]' # or choose only those you want
```
## 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-Based Environments
Regular step based environments added by Fancy Gym are added into the `fancy/` namespace.
| :exclamation: Legacy versions of Fancy Gym used `fancy_gym.make(...)`. This is no longer supported and will raise an Exception on new versions. |
| ----------------------------------------------------------------------------------------------------------------------------------------------- |
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 gymnasium as gym
import fancy_gym
import gymnasium as gym
import fancy_gym
import time
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)
env = gym.make('fancy/BoxPushingDense-v0', render_mode='human')
observation = env.reset()
env.render()
for i in range(1000):
action = env.action_space.sample()
observation, reward, terminated, truncated, 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 terminated or truncated:
observation, info = env.reset()
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. 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. 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.
Explore the MP-based variant [or learn more about Movement Primitives (MPs)](https://alrhub.github.io/fancy_gym/guide/episodic_rl.html)
```python
import gymnasium as gym
import fancy_gym
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
env = gym.make('fancy_ProMP/BoxPushingDense-v0', render_mode='human')
env.reset()
env.render()
# 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()
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()
```
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.
## Documentation
```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>'])
```
### How to create a new MP task
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.
```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).
```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 [examples](fancy_gym/examples/).
If the step-based is already registered with gym, you can simply do the following:
```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
```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
```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()
```
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).
## Citing the Project

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

@ -1,13 +1,15 @@
### Classic Control
# Classic Control
## Step-based Environments
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 |
| `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

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

@ -1,64 +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 Envs
## Step-Based Environments
`fancy_gym` makes all metaworld ML1 tasks avaible via the standard gym interface. To access metaworld environments using a different mode of operation (MT1 / ML100 / etc.) please use the functionality provided by metaworld directly.
`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. | 500 | 4 | 39 | 6 |
| `metaworld/basketball-v2` | A task where the robot must play a game of basketball. | 500 | 4 | 39 | 6 |
| `metaworld/bin-picking-v2` | A task involving the robot picking objects from a bin. | 500 | 4 | 39 | 6 |
| `metaworld/box-close-v2` | A task requiring the robot to close a box. | 500 | 4 | 39 | 6 |
| `metaworld/button-press-topdown-v2` | A task where the robot must press a button from a top-down perspective. | 500 | 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. | 500 | 4 | 39 | 6 |
| `metaworld/button-press-v2` | A task where the robot must press a button. | 500 | 4 | 39 | 6 |
| `metaworld/button-press-wall-v2` | A task involving the robot pressing a button with a wall. | 500 | 4 | 39 | 6 |
| `metaworld/coffee-button-v2` | A task where the robot must press a button on a coffee machine. | 500 | 4 | 39 | 6 |
| `metaworld/coffee-pull-v2` | A task involving the robot pulling a lever on a coffee machine. | 500 | 4 | 39 | 6 |
| `metaworld/coffee-push-v2` | A task involving the robot pushing a component on a coffee machine. | 500 | 4 | 39 | 6 |
| `metaworld/dial-turn-v2` | A task where the robot must turn a dial. | 500 | 4 | 39 | 6 |
| `metaworld/disassemble-v2` | A task requiring the robot to disassemble an object. | 500 | 4 | 39 | 6 |
| `metaworld/door-close-v2` | A task where the robot must close a door. | 500 | 4 | 39 | 6 |
| `metaworld/door-lock-v2` | A task involving the robot locking a door. | 500 | 4 | 39 | 6 |
| `metaworld/door-open-v2` | A task where the robot must open a door. | 500 | 4 | 39 | 6 |
| `metaworld/door-unlock-v2` | A task involving the robot unlocking a door. | 500 | 4 | 39 | 6 |
| `metaworld/hand-insert-v2` | A task requiring the robot to insert a hand into an object. | 500 | 4 | 39 | 6 |
| `metaworld/drawer-close-v2` | A task where the robot must close a drawer. | 500 | 4 | 39 | 6 |
| `metaworld/drawer-open-v2` | A task involving the robot opening a drawer. | 500 | 4 | 39 | 6 |
| `metaworld/faucet-open-v2` | A task requiring the robot to open a faucet. | 500 | 4 | 39 | 6 |
| `metaworld/faucet-close-v2` | A task where the robot must close a faucet. | 500 | 4 | 39 | 6 |
| `metaworld/hammer-v2` | A task where the robot must use a hammer. | 500 | 4 | 39 | 6 |
| `metaworld/handle-press-side-v2` | A task involving the robot pressing a handle from the side. | 500 | 4 | 39 | 6 |
| `metaworld/handle-press-v2` | A task where the robot must press a handle. | 500 | 4 | 39 | 6 |
| `metaworld/handle-pull-side-v2` | A task requiring the robot to pull a handle from the side. | 500 | 4 | 39 | 6 |
| `metaworld/handle-pull-v2` | A task where the robot must pull a handle. | 500 | 4 | 39 | 6 |
| `metaworld/lever-pull-v2` | A task involving the robot pulling a lever. | 500 | 4 | 39 | 6 |
| `metaworld/peg-insert-side-v2` | A task requiring the robot to insert a peg from the side. | 500 | 4 | 39 | 6 |
| `metaworld/pick-place-wall-v2` | A task involving the robot picking and placing an object with a wall. | 500 | 4 | 39 | 6 |
| `metaworld/pick-out-of-hole-v2` | A task where the robot must pick an object out of a hole. | 500 | 4 | 39 | 6 |
| `metaworld/reach-v2` | A task where the robot must reach an object. | 500 | 4 | 39 | 6 |
| `metaworld/push-back-v2` | A task involving the robot pushing an object backward. | 500 | 4 | 39 | 6 |
| `metaworld/push-v2` | A task where the robot must push an object. | 500 | 4 | 39 | 6 |
| `metaworld/pick-place-v2` | A task involving the robot picking up and placing an object. | 500 | 4 | 39 | 6 |
| `metaworld/plate-slide-v2` | A task requiring the robot to slide a plate. | 500 | 4 | 39 | 6 |
| `metaworld/plate-slide-side-v2` | A task involving the robot sliding a plate from the side. | 500 | 4 | 39 | 6 |
| `metaworld/plate-slide-back-v2` | A task where the robot must slide a plate backward. | 500 | 4 | 39 | 6 |
| `metaworld/plate-slide-back-side-v2` | A task involving the robot sliding a plate backward from the side. | 500 | 4 | 39 | 6 |
| `metaworld/peg-unplug-side-v2` | A task where the robot must unplug a peg from the side. | 500 | 4 | 39 | 6 |
| `metaworld/soccer-v2` | A task where the robot must play soccer. | 500 | 4 | 39 | 6 |
| `metaworld/stick-push-v2` | A task involving the robot pushing a stick. | 500 | 4 | 39 | 6 |
| `metaworld/stick-pull-v2` | A task where the robot must pull a stick. | 500 | 4 | 39 | 6 |
| `metaworld/push-wall-v2` | A task involving the robot pushing against a wall. | 500 | 4 | 39 | 6 |
| `metaworld/reach-wall-v2` | A task where the robot must reach an object with a wall. | 500 | 4 | 39 | 6 |
| `metaworld/shelf-place-v2` | A task involving the robot placing an object on a shelf. | 500 | 4 | 39 | 6 |
| `metaworld/sweep-into-v2` | A task where the robot must sweep objects into a container. | 500 | 4 | 39 | 6 |
| `metaworld/sweep-v2` | A task requiring the robot to sweep. | 500 | 4 | 39 | 6 |
| `metaworld/window-open-v2` | A task where the robot must open a window. | 500 | 4 | 39 | 6 |
| `metaworld/window-close-v2` | A task involving the robot closing a window. | 500 | 4 | 39 | 6 |
| `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-Based Envs
## 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

@ -1,11 +1,20 @@
# OpenAI Gym Wrappers
# Gymnasium
These are the Environment Wrappers for selected [OpenAI Gym](https://gym.openai.com/) environments to use
the Motion Primitive gym interface for them.
<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 OpenAI-gym counterparts.
These environments are wrapped-versions of their Gymnasium counterparts.
| Name | Description | Trajectory Horizon | Action Dimension |
| ------------------------------------ | -------------------------------------------------------------------- | ------------------ | ---------------- |

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

View File

@ -0,0 +1 @@
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});

View File

@ -0,0 +1,4 @@
/**
* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document);

View File

@ -0,0 +1,4 @@
/**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);

1
docs/build/html/_static/js/theme.js vendored Normal file

File diff suppressed because one or more lines are too long

199
docs/build/html/_static/language_data.js vendored Normal file
View File

@ -0,0 +1,199 @@
/*
* language_data.js
* ~~~~~~~~~~~~~~~~
*
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
/* Non-minified version is copied as a separate JS file, is available */
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}

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