Implementation of the Alberta Plan for AI Research - continual learning with meta-learned step-sizes
Project description
Alberta Framework
A JAX-based research framework implementing components of The Alberta Plan for AI Research in the pursuit of building the foundations of Continual AI.
"The agents are complex only because they interact with a complex world... their initial design is as simple, general, and scalable as possible." — Sutton et al., 2022
Overview
The Alberta Framework provides foundational components for continual reinforcement learning research. Built on JAX for hardware acceleration, the framework emphasizes temporal uniformity every component updates at every time step, with no special training phases or batch processing.
Project Context
This framework is developed as part of my D.Eng. work focusing on the foundations of Continual AI. For more background and context see:
- Research Blog: blog.9600baud.net
- Replicating Sutton '92: The Foundation of Step-size Adaptation
- About the Author: Keith Lawson
Roadmap
Depending on my research trajectory I may or may not implement components required for the plan. The current focus of this framework is the Step 1 Baseline Study, investigating the interaction between adaptive optimizers and online normalization.
| Step | Focus | Status |
|---|---|---|
| 1 | Meta-learned step-sizes (IDBD, Autostep) | Complete |
| 2 | Feature generation and testing | Planned |
| 3 | GVF predictions, Horde architecture | Planned |
| 4 | Actor-critic with eligibility traces | Planned |
| 5-6 | Off-policy learning, average reward | Planned |
| 7-12 | Hierarchical, multi-agent, world models | Future |
Installation
pip install alberta-framework
# With optional dependencies
pip install alberta-framework[gymnasium] # RL environment support
pip install alberta-framework[dev] # Development (pytest, ruff)
Requirements: Python >= 3.13, JAX >= 0.4, NumPy >= 2.0
Quick Start
import jax.random as jr
from alberta_framework import LinearLearner, IDBD, RandomWalkStream, run_learning_loop
# Non-stationary stream where target weights drift over time
stream = RandomWalkStream(feature_dim=10, drift_rate=0.001)
# Learner with IDBD meta-learned step-sizes
learner = LinearLearner(optimizer=IDBD())
# JIT-compiled training via jax.lax.scan
state, metrics = run_learning_loop(learner, stream, num_steps=10000, key=jr.key(42))
Core Components
Optimizers
- LMS: Fixed step-size baseline
- IDBD: Per-weight adaptive step-sizes via gradient correlation (Sutton, 1992)
- Autostep: Tuning-free adaptation with gradient normalization (Mahmood et al., 2012)
Streams
Non-stationary experience generators implementing the ScanStream protocol:
RandomWalkStream: Gradual target driftAbruptChangeStream: Sudden target switchesPeriodicChangeStream: Sinusoidal oscillationDynamicScaleShiftStream: Time-varying feature scales
Gymnasium Integration
from alberta_framework.streams.gymnasium import collect_trajectory, learn_from_trajectory, PredictionMode
import gymnasium as gym
env = gym.make("CartPole-v1")
observations, targets = collect_trajectory(env, policy, num_steps=10000, mode=PredictionMode.REWARD)
state, metrics = learn_from_trajectory(learner, observations, targets)
Publication Tools
Multi-seed experiments with statistical analysis and publication-ready outputs:
from alberta_framework.utils import ExperimentConfig, run_multi_seed_experiment, pairwise_comparisons
results = run_multi_seed_experiment(configs, seeds=30, parallel=True)
significance = pairwise_comparisons(results, test="ttest", correction="bonferroni")
Documentation
Full documentation available at j-klawson.github.io/alberta-framework or build locally:
pip install alberta-framework[docs]
mkdocs serve # http://localhost:8000
Contributing
Contributions are welcome, particularly for upcoming roadmap steps. Please ensure tests pass and follow the existing code style.
pytest tests/ -v
Citation
If you use this framework in your research, please cite:
@software{alberta_framework,
title = {Alberta Framework: A JAX Implementation of Alberta Plan components},
author = {Lawson, Keith},
year = {2026},
url = {https://github.com/j-klawson/alberta-framework}
}
Key References
@article{sutton2022alberta,
title = {The Alberta Plan for AI Research},
author = {Sutton, Richard S. and Bowling, Michael and Pilarski, Patrick M.},
year = {2022},
eprint = {2208.11173},
archivePrefix = {arXiv}
}
@inproceedings{sutton1992idbd,
title = {Adapting Bias by Gradient Descent: An Incremental Version of Delta-Bar-Delta},
author = {Sutton, Richard S.},
booktitle = {Proceedings of the AAAI Conference on Artificial Intelligence},
year = {1992}
}
@inproceedings{mahmood2012autostep,
title = {Tuning-free Step-size Adaptation},
author = {Mahmood, A. Rupam and Sutton, Richard S. and Degris, Thomas and Pilarski, Patrick M.},
booktitle = {IEEE International Conference on Acoustics, Speech and Signal Processing},
year = {2012}
}
License
Apache License 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file alberta_framework-0.2.1.tar.gz.
File metadata
- Download URL: alberta_framework-0.2.1.tar.gz
- Upload date:
- Size: 106.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f9abacfe9127d0abd1c71871db191e543aa0b893c1a543e326627fa67e5ee24
|
|
| MD5 |
b88f5ec2f514e7a93350e51686c5ad0a
|
|
| BLAKE2b-256 |
4e2c6fa9a71c30636d50be8f2ef0f17db9b2f219b3d61d8f341967984063a4e2
|
Provenance
The following attestation bundles were made for alberta_framework-0.2.1.tar.gz:
Publisher:
publish.yml on j-klawson/alberta-framework
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alberta_framework-0.2.1.tar.gz -
Subject digest:
4f9abacfe9127d0abd1c71871db191e543aa0b893c1a543e326627fa67e5ee24 - Sigstore transparency entry: 902181683
- Sigstore integration time:
-
Permalink:
j-klawson/alberta-framework@e1d679d951debcddedfe07ff4d88dfb90aaa1e04 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/j-klawson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e1d679d951debcddedfe07ff4d88dfb90aaa1e04 -
Trigger Event:
push
-
Statement type:
File details
Details for the file alberta_framework-0.2.1-py3-none-any.whl.
File metadata
- Download URL: alberta_framework-0.2.1-py3-none-any.whl
- Upload date:
- Size: 55.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc0c3fbb1e53f47577326ef88c5cede1e7959dd333653d97673c73d96d7a0dd5
|
|
| MD5 |
9cd0902249416efc9447e0fb6fb8004d
|
|
| BLAKE2b-256 |
b917e56433b14c0dc33f7f8112a981702a2a531915554270bbab7d1b2fff882d
|
Provenance
The following attestation bundles were made for alberta_framework-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on j-klawson/alberta-framework
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
alberta_framework-0.2.1-py3-none-any.whl -
Subject digest:
fc0c3fbb1e53f47577326ef88c5cede1e7959dd333653d97673c73d96d7a0dd5 - Sigstore transparency entry: 902181794
- Sigstore integration time:
-
Permalink:
j-klawson/alberta-framework@e1d679d951debcddedfe07ff4d88dfb90aaa1e04 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/j-klawson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e1d679d951debcddedfe07ff4d88dfb90aaa1e04 -
Trigger Event:
push
-
Statement type: