MuJoCo Warp API documentation.
PiperOrigin-RevId: 810016913 Change-Id: Id4c309919068f7329cd35a2e0b63dc97c42343c3
This commit is contained in:
committed by
Copybara-Service
parent
d616f11508
commit
a5ed4ee223
Vendored
+80
@@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* This script hides Sphinx auto-generated attribute links from the
|
||||||
|
* "On this page" sidebar.
|
||||||
|
* Adapted for the Furo theme.
|
||||||
|
* Uses a MutationObserver to wait for Furo's JavaScript to create the
|
||||||
|
* sidebar before attempting to modify it.
|
||||||
|
*/
|
||||||
|
function hideAttributesFromTOC() {
|
||||||
|
// Furo's "On this page" sidebar container has the class .toc-tree
|
||||||
|
const tocContainerSelector = '.toc-tree';
|
||||||
|
|
||||||
|
// Step 1: Find all attribute definitions and collect their IDs.
|
||||||
|
const attributeDefs = document.querySelectorAll('dl.py.attribute');
|
||||||
|
if (attributeDefs.length === 0) {
|
||||||
|
return false; // No attributes on this page, nothing to do.
|
||||||
|
}
|
||||||
|
const attributeIds = new Set();
|
||||||
|
attributeDefs.forEach(def => {
|
||||||
|
const term = def.querySelector('dt');
|
||||||
|
if (term && term.id) {
|
||||||
|
attributeIds.add(term.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (attributeIds.size === 0) {
|
||||||
|
return false; // No attribute IDs found.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: Find the sidebar container.
|
||||||
|
const tocContainer = document.querySelector(tocContainerSelector);
|
||||||
|
if (!tocContainer) {
|
||||||
|
// Container not found yet. The observer will try again.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3: Get all links within that sidebar.
|
||||||
|
const tocLinks = tocContainer.querySelectorAll('a');
|
||||||
|
if (tocLinks.length === 0) {
|
||||||
|
return false; // Container found, but it's empty. Let's wait.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4: Iterate through the links and hide the ones that match.
|
||||||
|
let hiddenCount = 0;
|
||||||
|
tocLinks.forEach(link => {
|
||||||
|
const href = link.getAttribute('href');
|
||||||
|
if (href && href.startsWith('#')) {
|
||||||
|
const linkId = href.substring(1);
|
||||||
|
if (attributeIds.has(linkId)) {
|
||||||
|
// In Furo, the link is inside a list item (<li>) which we need to hide.
|
||||||
|
const listItem = link.closest('li');
|
||||||
|
if (listItem && listItem.style.display !== 'none') {
|
||||||
|
console.log(`Hiding sidebar link for: #${linkId}`);
|
||||||
|
listItem.style.display = 'none';
|
||||||
|
hiddenCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// If we successfully hid the links, we can stop observing.
|
||||||
|
if (hiddenCount > 0) {
|
||||||
|
return true; // Signal success
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we found the container but didn't hide anything, maybe it's not fully
|
||||||
|
// rendered. Let the observer run a few more times. A better approach might be
|
||||||
|
// needed if this fails, but for most cases, this is sufficient.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use a MutationObserver to wait for the page to be dynamically built.
|
||||||
|
const observer = new MutationObserver((mutations, obs) => {
|
||||||
|
// We only need to run our function once successfully.
|
||||||
|
if (hideAttributesFromTOC()) {
|
||||||
|
obs.disconnect(); // Stop observing once the task is done.
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start observing the entire document body for added/removed nodes.
|
||||||
|
observer.observe(document.body, {childList: true, subtree: true});
|
||||||
+15
@@ -25,6 +25,9 @@ import sys
|
|||||||
sys.path.insert(0, os.path.abspath('../'))
|
sys.path.insert(0, os.path.abspath('../'))
|
||||||
sys.path.append(os.path.abspath('ext'))
|
sys.path.append(os.path.abspath('ext'))
|
||||||
|
|
||||||
|
# MuJoCo Warp
|
||||||
|
sys.path.append(os.path.abspath('../../mujoco_warp'))
|
||||||
|
|
||||||
from sphinxcontrib import katex # pylint: disable=g-import-not-at-top
|
from sphinxcontrib import katex # pylint: disable=g-import-not-at-top
|
||||||
from sphinxcontrib import youtube # pylint: disable=g-import-not-at-top,unused-import
|
from sphinxcontrib import youtube # pylint: disable=g-import-not-at-top,unused-import
|
||||||
|
|
||||||
@@ -42,6 +45,9 @@ master_doc = 'index'
|
|||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
# ones.
|
# ones.
|
||||||
extensions = [
|
extensions = [
|
||||||
|
'sphinx.ext.autodoc',
|
||||||
|
'sphinx.ext.napoleon',
|
||||||
|
'sphinx.ext.viewcode',
|
||||||
'sphinxcontrib.bibtex',
|
'sphinxcontrib.bibtex',
|
||||||
'sphinxcontrib.katex',
|
'sphinxcontrib.katex',
|
||||||
'sphinxcontrib.youtube',
|
'sphinxcontrib.youtube',
|
||||||
@@ -54,6 +60,13 @@ extensions = [
|
|||||||
'mujoco_include',
|
'mujoco_include',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# MuJoCo Warp documentation
|
||||||
|
napoleon_google_docstring = True
|
||||||
|
autodoc_class_signature = 'separated'
|
||||||
|
add_module_names = False
|
||||||
|
toc_object_entries_show_parents = 'hide'
|
||||||
|
default_role = 'literal'
|
||||||
|
|
||||||
# GitHub-related options
|
# GitHub-related options
|
||||||
github_username = 'google-deepmind'
|
github_username = 'google-deepmind'
|
||||||
github_repository = 'mujoco'
|
github_repository = 'mujoco'
|
||||||
@@ -163,9 +176,11 @@ html_static_path = [
|
|||||||
]
|
]
|
||||||
html_css_files = [
|
html_css_files = [
|
||||||
'theme_overrides.css',
|
'theme_overrides.css',
|
||||||
|
'theme_overrides_mjwarp.css',
|
||||||
]
|
]
|
||||||
html_js_files = [
|
html_js_files = [
|
||||||
'linenumbers.js',
|
'linenumbers.js',
|
||||||
|
'onthispage_mjwarp.js',
|
||||||
]
|
]
|
||||||
|
|
||||||
favicons = [
|
favicons = [
|
||||||
|
|||||||
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* ===================================================================
|
||||||
|
* Unified Documentation Layout
|
||||||
|
*
|
||||||
|
* Creates a consistent two-column layout for class attributes and
|
||||||
|
* function/method parameters. Includes aggressive overrides to resolve
|
||||||
|
* conflicts with `theme_overrides.css`.
|
||||||
|
* ===================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Part 1: Class-Wide Attribute Alignment Grid
|
||||||
|
* -------------------------------------------
|
||||||
|
* This section creates a single grid for all attributes within a class,
|
||||||
|
* ensuring their names and descriptions are perfectly aligned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The container for all class members becomes the main grid. */
|
||||||
|
dl.py.class > dd {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
column-gap: 0.5ch;
|
||||||
|
align-items: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This makes each attribute's <dl> transparent to the grid, promoting its
|
||||||
|
* <dt> and <dd> children to become direct grid items. This is the key
|
||||||
|
* to achieving the unified alignment.
|
||||||
|
*/
|
||||||
|
dl.py.attribute {
|
||||||
|
display: contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Other class members (main docstring, methods) must span both columns
|
||||||
|
* to avoid breaking the attribute grid layout.
|
||||||
|
*/
|
||||||
|
dl.py.class > dd > p,
|
||||||
|
dl.py.class > dd > dl:not(.py.attribute) {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
}
|
||||||
|
dl.py.class > dd > p { margin-bottom: 1rem; }
|
||||||
|
dl.py.class > dd > dl:not(.py.attribute) { margin-top: 1.5rem; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Part 2: Parameter & Return Value Layout
|
||||||
|
* ---------------------------------------
|
||||||
|
* This section applies a similar two-column grid to the parameters
|
||||||
|
* inside functions and methods for a consistent appearance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Target the inner list of parameters to avoid grabbing the main heading. */
|
||||||
|
dl.py.function .field-list > dd > dl,
|
||||||
|
dl.py.method .field-list > dd > dl {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
column-gap: 0.5ch;
|
||||||
|
align-items: baseline;
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Part 3: Common Styling for Grid Content
|
||||||
|
* ---------------------------------------
|
||||||
|
* These rules reset default styling for elements within our new grids.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Reset margins on all description blocks (<dd>) within our custom grids. */
|
||||||
|
dl.py.attribute > dd,
|
||||||
|
dl.py.function .field-list > dd > dl > dd,
|
||||||
|
dl.py.method .field-list > dd > dl > dd {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
/* Add vertical spacing between attribute rows. */
|
||||||
|
dl.py.attribute > dd {
|
||||||
|
padding-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Force the main description paragraph of an attribute to stay on one line. */
|
||||||
|
dl.py.attribute > dd > p {
|
||||||
|
display: inline;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Part 4: Specific Styling for Attribute Type Highlight
|
||||||
|
* -----------------------------------------------------
|
||||||
|
* This styles the highlighted box for an attribute's type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The container for the type information. */
|
||||||
|
dl.py.attribute > dd > dl.field-list {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 0.4rem;
|
||||||
|
}
|
||||||
|
/* Reset its children. */
|
||||||
|
dl.py.attribute > dd > dl.field-list > dt,
|
||||||
|
dl.py.attribute > dd > dl.field-list > dd {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
/* The highlight box itself - reverted to a simple implementation. */
|
||||||
|
dl.py.attribute > dd > dl.field-list > dd {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Part 5: Aggressive Theme Overrides
|
||||||
|
* ----------------------------------
|
||||||
|
* These rules use `!important` to forcefully win conflicts with
|
||||||
|
* `theme_overrides.css` and ensure our layout is not broken.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* CONFLICT FIX: Forcefully remove left margins that break our grids. */
|
||||||
|
dl.py.attribute > dd,
|
||||||
|
dl.py.attribute > dd > dl.field-list > dd,
|
||||||
|
dl.py.function .field-list > dd > dl > dd,
|
||||||
|
dl.py.method .field-list > dd > dl > dd {
|
||||||
|
margin-left: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CONFLICT FIX: Remove the double colon rendered by the theme. */
|
||||||
|
.field-list > dt::after {
|
||||||
|
content: "" !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CONFLICT FIX: Hide unwanted labels ("TYPE:", "Return type:"). */
|
||||||
|
dl.py.attribute > dd > dl.field-list > dt,
|
||||||
|
dl.py.function .field-list > dt:last-of-type,
|
||||||
|
dl.py.method .field-list > dt:last-of-type {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove the underline from all links. */
|
||||||
|
a {
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
MuJoCo Warp API
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. automodule:: mujoco_warp
|
||||||
|
:members:
|
||||||
|
:imported-members:
|
||||||
|
:special-members: False
|
||||||
|
:private-members: False
|
||||||
|
:exclude-members:
|
||||||
|
__init__,
|
||||||
|
__format__,
|
||||||
|
__new__,
|
||||||
|
__eq__,
|
||||||
|
__hash__,
|
||||||
|
__repr__,
|
||||||
|
__weakref__,
|
||||||
|
__or__,
|
||||||
|
__and__,
|
||||||
|
__xor__,
|
||||||
|
__ror__,
|
||||||
|
__rand__,
|
||||||
|
__rxor__,
|
||||||
|
__invert__,
|
||||||
|
|
||||||
@@ -4,6 +4,11 @@
|
|||||||
MuJoCo Warp (MJWarp)
|
MuJoCo Warp (MJWarp)
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
API <api.rst>
|
||||||
|
|
||||||
MuJoCo Warp (MJWarp) is an implementation of MuJoCo written in `Warp <https://nvidia.github.io/warp/>`__ and optimized
|
MuJoCo Warp (MJWarp) is an implementation of MuJoCo written in `Warp <https://nvidia.github.io/warp/>`__ and optimized
|
||||||
for `Nvidia <https://nvidia.com>`__ GPUs. MJWarp lives in the
|
for `Nvidia <https://nvidia.com>`__ GPUs. MJWarp lives in the
|
||||||
`google-deepmind/mujoco_warp <https://github.com/google-deepmind/mujoco_warp>`__ GitHub repository and is currently in
|
`google-deepmind/mujoco_warp <https://github.com/google-deepmind/mujoco_warp>`__ GitHub repository and is currently in
|
||||||
|
|||||||
Reference in New Issue
Block a user