Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documentation site #146

Draft
wants to merge 140 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
cea55bb
Added /docs and readthedocs.yaml
tsampazk Jun 1, 2023
0051e12
Added setuptools strict version
tsampazk Jun 1, 2023
0a82f13
Added documentation build status badge
tsampazk Jun 1, 2023
d199b61
Various updates
tsampazk Jun 1, 2023
5242b55
Updated main readme and moved how-it-works temporarily to how-it-work…
tsampazk Jun 1, 2023
04378ce
Uncommented autodoc stuff to test
tsampazk Jun 1, 2023
c08d741
Added fail on warning
tsampazk Jun 1, 2023
2f97ac1
Removed include readme rst
tsampazk Jun 1, 2023
2c176b8
Removed references to lumache code
tsampazk Jun 1, 2023
b3cd57f
Renamed how-it-works to md
tsampazk Jun 1, 2023
7247dbd
Fixed index header
tsampazk Jun 1, 2023
30fb890
Removed _static path
tsampazk Jun 1, 2023
3c501a4
Emphasis on what deepbots is
tsampazk Jun 1, 2023
412aef5
Fixed note
tsampazk Jun 1, 2023
f9166d7
Added project requirements
tsampazk Jun 1, 2023
6c6fde7
Testing requirements
tsampazk Jun 1, 2023
4757a4b
Possible fix test requirements
tsampazk Jun 1, 2023
909928b
testing path for autodoc
tsampazk Jun 1, 2023
e2ec5fe
added extensions
tsampazk Jun 1, 2023
c524f3a
Trying new index
tsampazk Jun 1, 2023
32dc031
fixed automodule
tsampazk Jun 1, 2023
f5ce103
renamed api and usage to not use
tsampazk Jun 1, 2023
980704f
Removed references to usage and installation
tsampazk Jun 1, 2023
19c3bfd
Testing accurate paths for automodule
tsampazk Jun 1, 2023
12be414
added autodock mock import controller
tsampazk Jun 1, 2023
421fdd6
fixed automodule path
tsampazk Jun 1, 2023
e4250b4
More fixes
tsampazk Jun 1, 2023
935852f
Trying something
tsampazk Jun 1, 2023
3f8996f
Previous direct import of .py files worked, trying imported-members
tsampazk Jun 1, 2023
ce76db8
Added escape char to asterisk
tsampazk Jun 1, 2023
2a3523a
Trying without init
tsampazk Jun 1, 2023
e20bea5
Added documentation link to resources list
tsampazk Jun 2, 2023
b80fd40
Added proper contents index and a dummy installation.rst
tsampazk Jun 2, 2023
b3e6120
Added title to installation.rst
tsampazk Jun 2, 2023
f71788c
Re-added usage to investigate
tsampazk Jun 2, 2023
e2e1b43
Added usage to index
tsampazk Jun 2, 2023
a8680cf
Fixed usage file type
tsampazk Jun 2, 2023
44890b6
Complete index, trying out bibtex
tsampazk Jun 2, 2023
d4c7de5
Complete installation page
tsampazk Jun 2, 2023
a51bfcc
Added links to sections
tsampazk Jun 2, 2023
f7b2917
Possible fix for duplicate names in links
tsampazk Jun 2, 2023
3cfe562
Fixed title length, damn you rst!
tsampazk Jun 2, 2023
ba622f0
Trying out console after code-block, made installation issue thing a …
tsampazk Jun 2, 2023
77626bf
Trying out some autosummary and automodule stuff
tsampazk Jun 2, 2023
ec88183
Removed pages from tutorial
tsampazk Jun 2, 2023
2c4fac2
Removed some automodule stuff for testing, and fixed usage in index
tsampazk Jun 2, 2023
d6ee4f2
Modified note for installation issue
tsampazk Jun 2, 2023
c8ed27b
Trying some stuff for autogeneration
tsampazk Jun 2, 2023
24144e1
Added comment for mock import
tsampazk Jun 2, 2023
e2b39f3
Trying out different order in autosummary
tsampazk Jun 2, 2023
ffbe559
Trying with .controllers
tsampazk Jun 2, 2023
bbaed47
Trying deepbots only
tsampazk Jun 2, 2023
7992686
Trying maxdepth and caption for toctree
tsampazk Jun 2, 2023
82e0ead
Removed maxdepth
tsampazk Jun 2, 2023
5403a31
Try without toctree
tsampazk Jun 2, 2023
28723c2
Try with titlesonly
tsampazk Jun 2, 2023
7607744
Trying with deepbots only
tsampazk Jun 2, 2023
e238b60
Trying generated classes index
tsampazk Jun 2, 2023
8043cc8
Trying simple
tsampazk Jun 2, 2023
172666b
Removed weird link stuff for sections and removed autosummary
tsampazk Jun 2, 2023
03a0a77
Moved images to static
tsampazk Jun 2, 2023
4564fd0
Enabled static path
tsampazk Jun 2, 2023
6d60a16
Testing url image
tsampazk Jun 2, 2023
cad799f
Removed width height to test
tsampazk Jun 2, 2023
0eea79b
Trying out logo
tsampazk Jun 2, 2023
7c0b0b1
Added favicon and smaller logo
tsampazk Jun 2, 2023
4fd2453
Renamed logo
tsampazk Jun 2, 2023
5cc7647
Renamed logo
tsampazk Jun 2, 2023
7315eaf
Added autogenerated sphinx-apidoc .rst files
tsampazk Jun 2, 2023
fb2fc06
Added toctree index entry for deepbots subdir
tsampazk Jun 2, 2023
7163c3d
Trying to fix toctree and added indices and tables good luck
tsampazk Jun 2, 2023
da1d55d
More struggling
tsampazk Jun 2, 2023
6d1cda6
Added all items to toctree and added some indentation etc. love or ha…
tsampazk Jun 2, 2023
c146695
Removed path injection to test the nonexisting document errors HATE
tsampazk Jun 2, 2023
a161d59
Maybe maxdepth is the issue
tsampazk Jun 2, 2023
38a3b50
Removed additional stuff, probably going to get not included in any t…
tsampazk Jun 2, 2023
02510bc
Some modifications now that it's working
tsampazk Jun 2, 2023
21fa0fb
Some modifications to groupd stuff
tsampazk Jun 2, 2023
cc45e11
I hated it but i know it's me that's the problem
tsampazk Jun 2, 2023
4d5f7d1
Changed title to see what it does
tsampazk Jun 2, 2023
e24f91d
Some beauty in robots
tsampazk Jun 2, 2023
ed6538f
Removed intermediate package rst for deepbots.robots
tsampazk Jun 2, 2023
a3d0714
Mooore beauty less bloat
tsampazk Jun 2, 2023
3e0df6a
Removed leftover line that produced error
tsampazk Jun 2, 2023
d010077
Trying imported-members in intermediate lists
tsampazk Jun 2, 2023
8a2071c
imported-members works for automodule silly
tsampazk Jun 2, 2023
9da155e
Trying out path insertion again
tsampazk Jun 2, 2023
a1f8f90
Added viewcode
tsampazk Jun 2, 2023
c3f4e78
Trying out inherited-members
tsampazk Jun 2, 2023
5b150a8
Obviously that was silly. Trying without undoc-members
tsampazk Jun 2, 2023
7db7259
undoc members is useful, trying without show-inheritance
tsampazk Jun 2, 2023
65567a4
show-inheritance is nice, trying autoclass
tsampazk Jun 2, 2023
9dae21a
Trying shortcut
tsampazk Jun 2, 2023
212fa75
Trying better shortcut
tsampazk Jun 2, 2023
6f29cef
Converted all to autoclass
tsampazk Jun 2, 2023
0a5da35
Proper order for supervisor classes
tsampazk Jun 2, 2023
446e53f
Trying out order members by source
tsampazk Jun 2, 2023
65d3cf7
Added venv note
tsampazk Jun 2, 2023
406c557
Minor fix in venv note and changed code block to console
tsampazk Jun 2, 2023
8c429db
Added initial rst version of how deepbots works
tsampazk Jun 2, 2023
55360cf
Fixed image entries
tsampazk Jun 2, 2023
2d104c2
Added center align test
tsampazk Jun 2, 2023
8361676
Added copybutton and css
tsampazk Jun 2, 2023
0dfe946
Changed index title
tsampazk Jun 2, 2023
9d53eed
Added copybutton requirement
tsampazk Jun 2, 2023
3124d3f
Moved copybutton requirement
tsampazk Jun 2, 2023
b1c5ecc
Frickin underlines
tsampazk Jun 2, 2023
35f6ab1
Overhauled how it works
tsampazk Jun 2, 2023
1606ce0
Some fixes and trying out link to code
tsampazk Jun 2, 2023
288a6c5
Added link tags
tsampazk Jun 2, 2023
cbdd445
Added underscore, kinda hate you rst
tsampazk Jun 2, 2023
bd03dfb
Some more juggling
tsampazk Jun 2, 2023
d5cab70
trying py meth wizardry
tsampazk Jun 2, 2023
0c9c577
Removed unneeded anchors for classes
tsampazk Jun 2, 2023
1b7642b
Additions and fixes for how it works
tsampazk Jun 2, 2023
2e624ce
Moved development note higher up
tsampazk Jun 2, 2023
25ad7be
Capitalized title
tsampazk Jun 2, 2023
7df4c19
More updates in how it works
tsampazk Jun 2, 2023
6563b85
Some more fixes and proper subsections
tsampazk Jun 2, 2023
5610bde
Added modules
tsampazk Jun 2, 2023
85142a7
Trying out additional path insertion
tsampazk Jun 2, 2023
4000c10
Removed search ref
tsampazk Jun 2, 2023
eee6fb1
TWO BIRDS IN ONE STONE HYPE?
tsampazk Jun 2, 2023
5e12119
Removed useless module.rst and added modindex directive (WTH?)
tsampazk Jun 2, 2023
5d90250
Frickin hell
tsampazk Jun 2, 2023
e6627c4
Adding generated stuff to test
tsampazk Jun 2, 2023
b80b432
Removed em
tsampazk Jun 2, 2023
ce26c47
Removed fail on warning
tsampazk Jun 2, 2023
b878443
Path insertion shenanigans
tsampazk Jun 2, 2023
969e74c
More path shenanigans? last try
tsampazk Jun 2, 2023
73552d3
Moved custom files, added autogenerated
tsampazk Jun 2, 2023
89dfe40
fail on warning
tsampazk Jun 2, 2023
0113415
Switched custom with autogenerated to start trying to make it work
tsampazk Jun 2, 2023
cd77ebc
Added module contents to deepbots.rst
tsampazk Jun 2, 2023
21b3ab0
Removed header
tsampazk Jun 2, 2023
08acc9f
Added automodules everywhere fingers crossed
tsampazk Jun 2, 2023
b4f89fe
Modindex working, modified section name
tsampazk Jun 2, 2023
4375e5e
Removed autogenerated files
tsampazk Jun 2, 2023
fca7392
Added link to relevant PR on note
tsampazk Jun 8, 2023
6d7b079
Merge pull request #1 from tsampazk/link-to-pr
tsampazk Jun 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.10"
# You can also specify other tool versions:
# nodejs: "16"
# rust: "1.55"
# golang: "1.17"

# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py
fail_on_warning: true

# If using Sphinx, optionally build your docs in additional formats such as PDF
# formats:
# - pdf

# Optionally declare the Python requirements required to build your docs
python:
install:
- requirements: docs/requirements.txt
- requirements: requirements.txt
- method: pip
path: .
174 changes: 18 additions & 156 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@

[![Version](https://img.shields.io/pypi/v/deepbots?color=green)](https://pypi.org/project/deepbots/)
[![Dev Version](https://img.shields.io/github/v/tag/aidudezzz/deepbots?include_prereleases&label=test-pypi&color=green)](https://test.pypi.org/project/deepbots/)
[![Documentation Status](https://readthedocs.org/projects/deepbots/badge/?version=latest)](https://deepbots.readthedocs.io/en/latest/?badge=latest)
[![Downloads](https://static.pepy.tech/personalized-badge/deepbots?period=total&units=international_system&left_color=grey&right_color=green&left_text=Downloads)](https://pepy.tech/project/deepbots)
[![License](https://img.shields.io/github/license/aidudezzz/deepbots?color=green)](https://github.com/aidudezzz/deepbots/blob/dev/LICENSE)
[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-)

Deepbots is a simple framework which is used as "middleware" between the free
and open-source [Cyberbotics' Webots](https://cyberbotics.com/) robot simulator
and Reinforcement Learning algorithms. When it comes to Reinforcement Learning
the [OpenAI gym](https://gym.openai.com/) environment has been established as
the most used interface between the actual application and the RL algorithm.
Deepbots is a framework which follows the OpenAI gym environment interface
logic in order to be used by Webots applications.
and Reinforcement Learning (RL) algorithms. When it comes to RL,
[gym](https://www.gymlibrary.dev/) environments have been established
as the most used interface between the actual application and the RL algorithm.

**Deepbots is a framework which follows the gym interface logic and bridges the
gap between the gym environment and the simulator to enable you to easily
create custom RL environments in Webots.**

## Installation

Expand All @@ -28,7 +31,7 @@ logic in order to be used by Webots applications.
refer to
[Using Python](https://cyberbotics.com/doc/guide/using-python#introduction)
to select the proper Python version for your system)
3. Follow the [Using Python](https://cyberbotics.com/doc/guide/using-python)
3. Refer to the [Using Python](https://cyberbotics.com/doc/guide/using-python)
guide provided by Webots
4. Webots provides a basic code editor, but if you want to use
[PyCharm](https://www.jetbrains.com/pycharm/) as your IDE refer to
Expand All @@ -38,8 +41,10 @@ logic in order to be used by Webots applications.
You will probably also need a backend library to implement the neural networks,
such as [PyTorch](https://pytorch.org/) or
[TensorFlow](https://www.tensorflow.org/). Deepbots interfaces with RL agents
using the OpenAI gym logic, so it can work with any backend library you choose
to implement the agent with and any agent that already works with gym.
using the gym logic, so it can work with any backend library you choose
to implement the agent with and any agent that already works with gym, such
as [stable-baselines3](https://github.com/DLR-RM/stable-baselines3)
implementations.

### Install deepbots

Expand All @@ -48,6 +53,9 @@ Deepbots can be installed through the package installer

`pip install deepbots`

If you encounter [this](https://github.com/aidudezzz/deepbots/issues/143)
issue please use `pip install setuptools==65.5.0` before installing deepbots.

## Official resources

- On
Expand All @@ -56,6 +64,8 @@ Deepbots can be installed through the package installer
- On [the deepworlds repository](https://github.com/aidudezzz/deepworlds) you
can find examples of deepbots being used. <br>Feel free to contribute your
own!
- On [the deepbots documentation site](https://deepbots.readthedocs.io/)
you can find the framework's documentation

## Citation

Expand All @@ -79,154 +89,6 @@ https://link.springer.com/chapter/10.1007/978-3-030-49186-4_6

```

## How it works

First of all let's set up a simple glossary:

- `World`: Webots uses a tree structure to represent the different entities in
the scene. The World is the root entity which contains all the
entities/nodes. For example, the world contains the Supervisor and Robot
entities as well as other objects which might be included in the scene.

- `Supervisor`: The Supervisor is an entity which has access to all other
entities of the world, while having no physical presence in it. For example,
the Supervisor knows the exact position of all the entities of the world and
can manipulate them. Additionally, the Supervisor has the Supervisor
Controller as one of its child nodes.

- `Supervisor Controller`: The Supervisor Controller is a python script which
is responsible for the Supervisor. For example, in the Supervisor Controller
script the distance between two entities in the world can be calculated.

- `Robot`: The Robot is an entity that represents a robot in the world. It
might have sensors and other active components, like motors, etc. as child
entities. Also, one of its children is the Robot Controller. For example,
[epuck](https://cyberbotics.com/doc/guide/epuck) and
[TIAGo](https://cyberbotics.com/doc/guide/tiago-iron) are robots.

- `Robot Controller`: The Robot Controller is a python script which is
responsible for the Robot's movement and sensors. With the Robot Controller
it is possible to observe the world and act accordingly.
- `Environment`: The Environment is the interface as described by the OpenAI
gym. The Environment interface has the following methods:

- `get_observations()`: Return the observations of the robot. For example,
metrics from sensors, a camera image etc.

- step(action): Each timestep, the agent chooses an action, and the
environment returns the observation, the reward and the state of the
problem (done or not).

- `get_reward(action)`: The reward the agent receives as a result of their
action.
- `is_done()`: Whether it’s time to reset the environment. Most (but not all)
tasks are divided up into well-defined episodes, and done being True
indicates the episode has terminated. For example, if a robot has the task
to reach a goal, then the done condition might happen when the robot
"touches" the goal.
- `reset()`: Used to reset the world to the initial state.

In order to set up a task in Deepbots it is necessary to understand the
intention of the OpenAI gym environment. According to the OpenAI gym
documentation, the framework follows the classic “agent-environment loop”.
"Each timestep, the agent chooses an `action`, and the environment returns an
`observation` and a `reward`. The process gets started by calling `reset()`,
which returns an initial `observation`."

<p align="center">
<img src="https://raw.githubusercontent.com/aidudezzz/deepbots/dev/doc/img/agent_env_loop.svg">
</p>

Deepbots follows this exact agent-environment loop with the only difference
being that the agent, which is responsible to choose an action, runs on the
Supervisor and the observations are acquired by the robot. The goal of the
deepbots framework is to hide this communication from the user, especially from
those who are familiar with the OpenAI gym environment. More specifically,
`SupervisorEnv` is the interface which is used by the Reinforcement Learning
algorithms and follows the OpenAI Gym environment logic. The Deepbots framework
provides different levels of abstraction according to the user's needs.
Moreover, a goal of the framework is to provide different wrappers for a wide
range of robots.

Deepbots also provides a default implementation of the `reset()` method,
leveraging Webots' built-in simulation reset functions, removing the need for
the user to implement reset procedures for simpler use-cases. It is always
possible to override this method and implement any custom reset procedure, as
needed.

#### Emitter - receiver scheme

Currently, the communication between the `Supervisor` and the `Robot` is
achieved via an `emitter` and a `receiver`. Separating the `Supervisor` from
the `Robot`, deepbots can fit a variety of use-cases, e.g. multiple `Robots`
collecting experience and a `Supervisor` controlling them with a single agent.
The way Webots implements `emitter`/`receiver` communication requires messages
to be packed and unpacked, which introduces an overhead that becomes
prohibiting in use-cases where the observations are high-dimensional or long,
such as camera images. Deepbots provides another partially abstract class that
combines the `Supervisor` and the `Robot` into one controller and circumvents
that issue, while being less flexible, which is discussed
[later](#combined-robot-supervisor-scheme).

<p align="center">
<img src="https://raw.githubusercontent.com/aidudezzz/deepbots/dev/doc/img/deepbots_overview.png">
</p>

On one hand, the `emitter` is an entity which is provided by Webots, that
broadcasts messages to the world. On the other hand, the `receiver` is an
entity that is used to receive messages from the `World`. Consequently, the
agent-environment loop is transformed accordingly. Firstly, the `Robot` uses
its sensors to retrieve the observation from the `World` and in turn uses the
`emitter` component to broadcast this observation. Secondly, the `Supervisor`
receives the observation via the `receiver` component and in turn, the agent
uses it to choose an action. It should be noted that the observation the agent
uses might be extended from the `Supervisor`. For example, a model might use
LiDAR sensors installed on the `Robot`, but also the Euclidean distance between
the `Robot` and an object. As it is expected, the `Robot` does not know the
Euclidean distance, only the `Supervisor` can calculate it, because it has
access to all entities in the `World`.

You can follow the
[emitter-receiver scheme tutorial](https://github.com/aidudezzz/deepbots-tutorials/blob/master/emitterReceiverSchemeTutorial/README.md)
to get started and work your way up from there.

<p align="center">
<img src="https://raw.githubusercontent.com/aidudezzz/deepbots/dev/doc/img/workflow_diagram.png">
</p>

#### Combined Robot-Supervisor scheme

As mentioned earlier, in use-cases where the observation transmitted between
the `Robot` and the `Supervisor` is high-dimensional or long, e.g. high
resolution images taken from a camera, a significant overhead is introduced.
This is circumvented by inheriting and implementing the partially abstract
`RobotSupervisor` that combines the `Robot controller` and the
`Supervisor Controller` into one, forgoing all `emitter`/`receiver`
communication. This new controller runs on the `Robot`, but requires
`Supervisor` privileges and is limited to one `Robot`, one `Supervisor`.

You can follow the
[robot-supervisor scheme tutorial](https://github.com/aidudezzz/deepbots-tutorials/tree/master/robotSupervisorSchemeTutorial)
to get started and work your way up from there. We recommended this
tutorial to get started with deepbots.

### Abstraction Levels

The deepbots framework has been created mostly for educational purposes. The
aim of the framework is to enable people to use Reinforcement Learning in
Webots. More specifically, we can consider deepbots as a wrapper of Webots
exposing an OpenAI gym style interface. For this reason there are multiple
levels of abstraction. For example, a user can choose if they want to use CSV
`emitter`/`receiver` or if they want to make an implementation from scratch. In
the top level of the abstraction hierarchy is the `SupervisorEnv` which is the
OpenAI gym interface. Below that level there are partially implemented classes
with common functionality. These implementations aim to hide the communication
between the `Supervisor` and the `Robot`, as described in the two different
schemes ealier. Similarly, in the `emitter`/`receiver` scheme the `Robot` also
has different abstraction levels. According to their needs, users can choose
either to process the messages received from the `Supervisor` themselves or use
the existing implementations.

### Acknowledgments

This project has received funding from the European Union's Horizon 2020
Expand Down
2 changes: 1 addition & 1 deletion deepbots/supervisor/controllers/deepbots_supervisor_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def reset(self):
Default, problem-agnostic, implementation of reset method,
using Webots-provided methods.

*Note that this works properly only with Webots versions >R2020b
\*Note that this works properly only with Webots versions >R2020b
and must be overridden with a custom reset method when using
earlier versions. It is backwards compatible due to the fact
that the new reset method gets overridden by whatever the user
Expand Down
20 changes: 20 additions & 0 deletions docs/Makefile
Original file line number Diff line number Diff line change
@@ -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 = .
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)
63 changes: 63 additions & 0 deletions docs/_static/css/baselines_theme.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/* Taken from https://github.com/DLR-RM/stable-baselines3/blob/master/docs/_static/css/baselines_theme.css */

/* Main colors adapted from pytorch doc */
:root{
--main-bg-color: #343A40;
--link-color: #FD7E14;
}

/* Header fonts y */
h1, h2, .rst-content .toctree-wrapper p.caption, h3, h4, h5, h6, legend, p.caption {
font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
}


/* Docs background */
.wy-side-nav-search{
background-color: var(--main-bg-color);
}

/* Mobile version */
.wy-nav-top{
background-color: var(--main-bg-color);
}

/* Change link colors (except for the menu) */
a {
color: var(--link-color);
}

a:hover {
color: #4F778F;
}

.wy-menu a {
color: #b3b3b3;
}

.wy-menu a:hover {
color: #b3b3b3;
}

a.icon.icon-home {
color: #b3b3b3;
}

.version{
color: var(--link-color) !important;
}


/* Make code blocks have a background */
.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'] {
background: #f8f8f8;;
}

/* Change style of types in the docstrings .rst-content .field-list */
.field-list .xref.py.docutils, .field-list code.docutils, .field-list .docutils.literal.notranslate
{
border: None;
padding-left: 0;
padding-right: 0;
color: #404040;
}
File renamed without changes
File renamed without changes
File renamed without changes
Loading