# gpuopen-librariesandsdks/schola architecture

> Architecture diagram of the GitHub repository gpuopen-librariesandsdks/schola, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gpuopen-librariesandsdks/schola
- Repository: https://github.com/gpuopen-librariesandsdks/schola

## Overview

Schola is an Unreal Engine reinforcement-learning toolkit with Python framework integrations. In the main workflow, a developer defines an Unreal environment and agents; observations and actions cross the connector/protocol boundary to a Python Gym-style environment, where RLlib or Stable-Baselines3 can train or evaluate policies. The repository also includes in-game inference and a separate imitation-data workflow with Minari support. The README establishes these capabilities, while sampled source specifically confirms pipelined inference behavior; unsampled subsystem links are limited to the documented workflow and module naming.

Main entry points: [`Source/ScholaTraining/Public/Environment/EnvironmentInterface.h`](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaTraining/Public/Environment/EnvironmentInterface.h) (Environment And Agents), [`Resources/python/schola/gym/env.py`](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/gym/env.py) (Gym Environment), [`Source/ScholaInferenceUtils/Private/Steppers/PipelinedStepper.cpp`](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaInferenceUtils/Private/Steppers/PipelinedStepper.cpp) (Pipelined Inference), [`Resources/python/schola/sb3/env.py`](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/sb3/env.py) (SB3 Adapter)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_unreal["Unreal Environment"]
  node_ue_env["Environment And Agents"]
  node_spaces_points["Spaces And Points<br/>[Space.h]"]
  node_interactors["Sensors And Actuators<br/>[SensorInterface.h]"]
end

subgraph group_transport["Protocol Transport"]
  node_gym_connector["Gym Connector<br/>[IGymConnector.h]"]
  node_grpc_connector["gRPC Connector<br/>[gRPCGymConnector.h]"]
  node_proto["Protocol Messages<br/>[GymConnector.proto]"]
  node_py_protocol["Python Protocols<br/>[grpc_protocol.py]"]
end

subgraph group_python["Python Environments"]
  node_py_gym["Gym Environment<br/>[env.py]"]
  node_sb3_env["SB3 Adapter<br/>[env.py]"]
  node_rllib_env["RLlib Adapter<br/>[env.py]"]
end

subgraph group_rl["RL Workflows"]
  node_sb3_train["SB3 Training<br/>[train.py]"]
  node_sb3_eval["SB3 Evaluation<br/>[eval.py]"]
  node_rllib_train["RLlib Training<br/>[train.py]"]
  node_rllib_eval["RLlib Evaluation<br/>[eval.py]"]
end

subgraph group_extensions["Inference And Imitation"]
  node_inference["Pipelined Inference"]
  node_policy["Inference Policy<br/>[NNEPolicy.h]"]
  node_imitation["Imitation Environment"]
  node_im_connector["Imitation Connector"]
  node_minari["Minari Collection<br/>[datacollector.py]"]
  node_minari_script["Collection Command<br/>[collect.py]"]
end

node_developer(("Developer"))
node_python_user(("Python RL User"))
node_unreal_runtime(("Unreal Runtime"))
node_rl_frameworks(("RL Frameworks"))
node_minari_store[("Minari Dataset")]

node_developer -->|"defines"| node_ue_env
node_ue_env -->|"defines spaces"| node_spaces_points
node_ue_env -->|"uses"| node_interactors
node_ue_env -->|"serves environment"| node_gym_connector
node_gym_connector -->|"connects through"| node_grpc_connector
node_grpc_connector -->|"exchanges messages"| node_proto
node_py_protocol -->|"serializes messages"| node_proto
node_py_gym -->|"uses"| node_py_protocol
node_python_user -->|"configures"| node_py_gym
node_py_gym -->|"adapts for"| node_sb3_env
node_py_gym -->|"adapts for"| node_rllib_env
node_sb3_env -->|"supports training"| node_sb3_train
node_sb3_env -->|"supports evaluation"| node_sb3_eval
node_rllib_env -->|"supports training"| node_rllib_train
node_rllib_env -->|"supports evaluation"| node_rllib_eval
node_sb3_train -->|"trains with"| node_rl_frameworks
node_rllib_train -->|"trains with"| node_rl_frameworks
node_unreal_runtime -->|"steps agents"| node_inference
node_inference -->|"requests inference"| node_policy
node_inference -->|"collects observations"| node_ue_env
node_inference -->|"applies actions"| node_ue_env
node_imitation -->|"provides demonstrations"| node_im_connector
node_im_connector -->|"supplies data"| node_minari
node_minari_script -->|"collects through"| node_minari
node_minari -->|"writes dataset"| node_minari_store

click node_ue_env "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaTraining/Public/Environment/EnvironmentInterface.h"
click node_spaces_points "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/Schola/Public/Spaces/Space.h"
click node_interactors "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaInteractors/Public/SensorInterface.h"
click node_gym_connector "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaTraining/Public/GymConnectors/IGymConnector.h"
click node_grpc_connector "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaProtobuf/Public/GymConnectors/gRPC/gRPCGymConnector.h"
click node_proto "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Proto/GymConnector.proto"
click node_py_protocol "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/core/protocols/protobuf/grpc_protocol.py"
click node_py_gym "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/gym/env.py"
click node_sb3_env "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/sb3/env.py"
click node_rllib_env "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/rllib/env.py"
click node_sb3_train "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/sb3/train/train.py"
click node_sb3_eval "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/sb3/eval/eval.py"
click node_rllib_train "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/rllib/train/train.py"
click node_rllib_eval "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/rllib/eval/eval.py"
click node_inference "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaInferenceUtils/Private/Steppers/PipelinedStepper.cpp"
click node_policy "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaNNE/Public/Policies/NNEPolicy.h"
click node_imitation "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaImitation/Public/Environment/ImitationEnvironmentInterface.h"
click node_im_connector "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaProtobuf/Public/ImitationConnectors/gRPC/gRPCImitationConnector.h"
click node_minari "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/minari/datacollector.py"
click node_minari_script "https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/minari/collect.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ue_env,node_spaces_points,node_interactors,node_python_user toneBlue
class node_gym_connector,node_grpc_connector,node_proto,node_py_protocol,node_minari_store toneAmber
class node_py_gym,node_sb3_env,node_rllib_env toneMint
class node_sb3_train,node_sb3_eval,node_rllib_train,node_rllib_eval toneRose
class node_inference,node_policy,node_imitation,node_im_connector,node_minari,node_minari_script,node_developer,node_unreal_runtime,node_rl_frameworks toneIndigo
```

## Components

### Unreal Environment

- [Environment And Agents](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaTraining/Public/Environment/EnvironmentInterface.h): `Source/ScholaTraining/Public/Environment/EnvironmentInterface.h`
- [Spaces And Points](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/Schola/Public/Spaces/Space.h): `Source/Schola/Public/Spaces/Space.h`
- [Sensors And Actuators](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaInteractors/Public/SensorInterface.h): `Source/ScholaInteractors/Public/SensorInterface.h`

### Protocol Transport

- [Gym Connector](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaTraining/Public/GymConnectors/IGymConnector.h): `Source/ScholaTraining/Public/GymConnectors/IGymConnector.h`
- [gRPC Connector](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaProtobuf/Public/GymConnectors/gRPC/gRPCGymConnector.h): `Source/ScholaProtobuf/Public/GymConnectors/gRPC/gRPCGymConnector.h`
- [Protocol Messages](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Proto/GymConnector.proto): `Proto/GymConnector.proto`
- [Python Protocols](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/core/protocols/protobuf/grpc_protocol.py): `Resources/python/schola/core/protocols/protobuf/grpc_protocol.py`

### Python Environments

- [Gym Environment](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/gym/env.py): `Resources/python/schola/gym/env.py`
- [SB3 Adapter](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/sb3/env.py): `Resources/python/schola/sb3/env.py`
- [RLlib Adapter](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/rllib/env.py): `Resources/python/schola/rllib/env.py`

### RL Workflows

- [SB3 Training](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/sb3/train/train.py): `Resources/python/schola/scripts/sb3/train/train.py`
- [SB3 Evaluation](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/sb3/eval/eval.py): `Resources/python/schola/scripts/sb3/eval/eval.py`
- [RLlib Training](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/rllib/train/train.py): `Resources/python/schola/scripts/rllib/train/train.py`
- [RLlib Evaluation](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/rllib/eval/eval.py): `Resources/python/schola/scripts/rllib/eval/eval.py`

### Inference And Imitation

- [Pipelined Inference](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaInferenceUtils/Private/Steppers/PipelinedStepper.cpp): `Source/ScholaInferenceUtils/Private/Steppers/PipelinedStepper.cpp`
- [Inference Policy](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaNNE/Public/Policies/NNEPolicy.h): `Source/ScholaNNE/Public/Policies/NNEPolicy.h`
- [Imitation Environment](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaImitation/Public/Environment/ImitationEnvironmentInterface.h): `Source/ScholaImitation/Public/Environment/ImitationEnvironmentInterface.h`
- [Imitation Connector](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Source/ScholaProtobuf/Public/ImitationConnectors/gRPC/gRPCImitationConnector.h): `Source/ScholaProtobuf/Public/ImitationConnectors/gRPC/gRPCImitationConnector.h`
- [Minari Collection](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/minari/datacollector.py): `Resources/python/schola/minari/datacollector.py`
- [Collection Command](https://github.com/gpuopen-librariesandsdks/schola/blob/main/Resources/python/schola/scripts/minari/collect.py): `Resources/python/schola/scripts/minari/collect.py`

### Other components

- **Developer**
- **Python RL User**
- **Unreal Runtime**
- **RL Frameworks**
- **Minari Dataset**

## Connections

- Developer → Environment And Agents: defines
- Environment And Agents → Spaces And Points: defines spaces
- Environment And Agents → Sensors And Actuators: uses
- Environment And Agents → Gym Connector: serves environment
- Gym Connector → gRPC Connector: connects through
- gRPC Connector → Protocol Messages: exchanges messages
- Python Protocols → Protocol Messages: serializes messages
- Gym Environment → Python Protocols: uses
- Python RL User → Gym Environment: configures
- Gym Environment → SB3 Adapter: adapts for
- Gym Environment → RLlib Adapter: adapts for
- SB3 Adapter → SB3 Training: supports training
- SB3 Adapter → SB3 Evaluation: supports evaluation
- RLlib Adapter → RLlib Training: supports training
- RLlib Adapter → RLlib Evaluation: supports evaluation
- SB3 Training → RL Frameworks: trains with
- RLlib Training → RL Frameworks: trains with
- Unreal Runtime → Pipelined Inference: steps agents
- Pipelined Inference → Inference Policy: requests inference
- Pipelined Inference → Environment And Agents: collects observations
- Pipelined Inference → Environment And Agents: applies actions
- Imitation Environment → Imitation Connector: provides demonstrations
- Imitation Connector → Minari Collection: supplies data
- Collection Command → Minari Collection: collects through
- Minari Collection → Minari Dataset: writes dataset
