`SubAgent` contrib and minor QOL upgrades
This release adds `save_fig()` kwargs which aer passed directly to `matplotlib.save_figure` function so you can modify how figures are saved.
Also adds `SubAgent` class in the controls. `SubAgent`s take as input, and are "subservient" to, another `Agent` (the LeadAgent). The key thing idea is that the `SubAgent` may have an update() function which relies heavily on the state of the LeadAgent. Examples included are:
* `DumbAgent` a noisy version of `LeadAgent`
* `ThetaSequenceAgent` theta sweeps around the `LeadAgent`s position
* `ReplayAgent` occasional short replay events
The API is as follows
Env = Environment()
Ag = Agent(Env) the lead agent
DumbAg = DumbAgent(LeadAgent=Ag, params = {'drift_distance':0.1})
while Ag.t < 60:
Ag.update()
DumbAg.update()
`DumbAg.animate_trajectory()` then returns something like:
https://github.com/user-attachments/assets/cf472dc3-f33e-41db-bd63-1587949df141
**Full Changelog**: https://github.com/RatInABox-Lab/RatInABox/compare/v1.14.1...v1.15.0