Tutorial: Repository Structure¶
Introduction¶
Welcome to the first of four short tutorials, guiding you through the process of creating your own PettingZoo environment, from conception to deployment.
We will be creating a parallel environment, meaning that each agent acts simultaneously.
Before thinking about the environment logic, we should understand the structure of environment repositories.
Tree structure¶
Environment repositories are usually laid out using the following structure:
Custom-Environment
├── custom-environment
└── env
└── custom_environment.py
└── custom_environment_v0.py
├── README.md
└── requirements.txt
/custom-environment/env
is where your environment will be stored, along with any helper functions (in the case of a complicated environment)./custom-environment/custom_environment_v0.py
is a file that imports the environment - we use the file name for environment version control./README.md
is a file used to describe your environment./requirements.txt
is a file used to keep track of your environment dependencies. At the very least,pettingzoo
should be in there. Please version control all your dependencies via==
.
Advanced: Additional (optional) files¶
The above file structure is minimal. A more deployment-ready environment would include
/docs/
for documentation,/setup.py
for packaging,/custom-environment/__init__.py
for depreciation handling, andGithub actions for continuous integration of environment tests.
Implementing these are outside the scope of this tutorial.
Skeleton code¶
The entirety of your environment logic is stored within /custom-environment/env
from pettingzoo import ParallelEnv
class CustomEnvironment(ParallelEnv):
metadata = {
"name": "custom_environment_v0",
}
def __init__(self):
pass
def reset(self, seed=None, options=None):
pass
def step(self, actions):
pass
def render(self):
pass
def observation_space(self, agent):
return self.observation_spaces[agent]
def action_space(self, agent):
return self.action_spaces[agent]