from pyCRLD.Agents.StrategyActorCritic import stratAC
from pyCRLD.Environments.SocialDilemma import SocialDilemma
from pyCRLD.Utils import FlowPlot as fp
import numpy as np
0) np.random.seed(
FlowPlot
Examples
= SocialDilemma(R=1.0, T=0.8, S=-0.5, P=0.0)
env = stratAC(env=env, learning_rates=0.1, discount_factors=0.9)
mae = ([0], [0], [0])
x = ([1], [0], [0])
y = np.linspace(0.01 ,0.99, 9)
flowarrow_points = [mae, x, y, flowarrow_points] standards
Standard quiver flowplot
showing reward-predition error arrows
= fp.plot_strategy_flow(*standards)
ax 0].set_xlabel("Agent 0's cooperation probability")
ax[0].set_ylabel("Agent 1's cooperation probability"); ax[
Standard quiver flowplot with trajectory
= fp.plot_strategy_flow(*standards)
ax 0].set_xlabel("Agent 0's cooperation probability")
ax[0].set_ylabel("Agent 1's cooperation probability")
ax[
= mae.random_softmax_strategy()
X = mae.trajectory(X, Tmax=1000, tolerance=1e-6)
trj, fpr print("Trajectory length:", len(trj))
=[fpr], axes=ax); fp.plot_trajectories([trj], x, y, fprs
Trajectory length: 287
Quiver plot with strategy differences
Notices how the edges of the phase space differ compared to the plots with reward-prediction errors above.
= fp.plot_strategy_flow(*standards, use_RPEarrows=False)
ax 0].set_xlabel("Agent 0's cooperation probability")
ax[0].set_ylabel("Agent 1's cooperation probability"); ax[
Streamplot w RPE
with reward-prediciton errors
= fp.plot_strategy_flow(*standards, kind="streamplot")
ax 0].set_xlabel("Agent 0's cooperation probability")
ax[0].set_ylabel("Agent 1's cooperation probability");
ax[0].set_xlim(0, 1); ax[0].set_ylim(0, 1); ax[
Streamplot w dX
with strategy differences
= fp.plot_strategy_flow(*standards, kind="streamplot", use_RPEarrows=False)
ax 0].set_xlabel("Agent 0's cooperation probability")
ax[0].set_ylabel("Agent 1's cooperation probability");
ax[0].set_xlim(0, 1); ax[0].set_ylim(0, 1); ax[
Core methods
plot_strategy_flow
plot_strategy_flow (mae, x:tuple, y:tuple, flowarrow_points, NrRandom:int=3, use_RPEarrows=True, col:str='LEN', cmap='viridis', kind='quiver+samples', sf=0.5, lw=1.0, dens=0.75, acts=None, conds=None, axes:Iterable=None, verbose=False)
Create a flow plot in strategy space.
Type | Default | Details | |
---|---|---|---|
mae | CRLD multi-agent environment object | ||
x | tuple | which phase space axes to plot along x axes | |
y | tuple | which phase space axes to plot along y axes | |
flowarrow_points | specify range & resolution of flow arrows | ||
NrRandom | int | 3 | how many random (in the other dimensions) stratgies for averaging |
use_RPEarrows | bool | True | Use reward-prediction error arrows?, otherwise use strategy differences |
col | str | LEN | color indicates either strength of flow via colormap, otherwise a fixed color name |
cmap | str | viridis | Colormap |
kind | str | quiver+samples | Kind of plot: “streamplot”, “quiver+samples”, “quiver”, … |
sf | float | 0.5 | Scale factor for quiver arrows |
lw | float | 1.0 | Line width for streamplot |
dens | float | 0.75 | Density for streamplot |
acts | NoneType | None | Action descriptions |
conds | NoneType | None | Conditions descriptions |
axes | Iterable | None | Axes to plot into |
verbose | bool | False | shall I talk to you while working? |
plot_trajectories
plot_trajectories (Xtrajs:Iterable, x:tuple, y:tuple, cols:Iterable=['r'], alphas:Iterable=[1.0], lss:Iterable=['-'], lws:Iterable=[2], mss:Iterable=[None], msss:Iterable=[0], fprs:Union[Iterable,bool]=None, plot_startmarker:bool=True, axes:Iterable=None, submean:bool=False)
Plot multiple trajectories in phase space.
Type | Default | Details | |
---|---|---|---|
Xtrajs | Iterable | Iterable of phase space trajectories | |
x | tuple | which phase space axes to plot along x axes | |
y | tuple | which phase space axes to plot along y axes | |
cols | Iterable | [‘r’] | Colors to iterate through |
alphas | Iterable | [1.0] | Alpha values to iterate through |
lss | Iterable | [‘-’] | Linestyles to iterate through |
lws | Iterable | [2] | Linewidths to iterate through |
mss | Iterable | [None] | Endmarkers to iterate through |
msss | Iterable | [0] | Endmarker sizes to iterate through |
fprs | Union | None | Iteralbe indicating which trajectories reached a fixed point |
plot_startmarker | bool | True | plot a marker at the initial condition |
axes | Iterable | None | Axes to plot into |
submean | bool | False |
Helpers
_checks_and_balances
_checks_and_balances (x:tuple, y:tuple)
Check the format of the x
and y
parameter.
Type | Details | |
---|---|---|
x | tuple | which phase space axes to plot along x axes |
y | tuple | which phase space axes to plot along y axes |
Returns | tuple | (lengths for each dimension, index of dimension to iter, length of iter) |
Let’s say we want to plot the probability of cooperation of the 0th agent on the \(x\) axis and of the 1st agent on the \(y\) axis for states 2,3 and 5, we specify (assuming the cooperation is the 0th action)
= ([0], [2,3,5], [0])
x = ([1], [2,3,5], [0])
y _checks_and_balances(x, y)
(array([1, 3, 1]), 1, 3)
_prepare_axes
_prepare_axes (axes:Iterable, xlens:tuple)
Check whether axes
have been provided correctly. If axes
haven’t been provided, provide them.
Type | Details | |
---|---|---|
axes | Iterable | Axes to plot into |
xlens | tuple | Lengths for each dimension of x and y |
Returns | Iterable | of matplotlib axes |
None, [1,3,1]) _prepare_axes(
array([<Axes: >, <Axes: >, <Axes: >], dtype=object)
_dXisa_s
_dXisa_s (Xisa_s:Iterable, mae)
Compute Xisa
(t-1)-Xisa
(t) for all Xisa_s
.
Type | Details | |
---|---|---|
Xisa_s | Iterable | of joint strategies Xisa |
mae | CRLD multi-agent environment object | |
Returns | ndarray | joint strategy differences |
from pyCRLD.Agents.StrategyActorCritic import stratAC
from pyCRLD.Environments.SocialDilemma import SocialDilemma
= SocialDilemma(R=1.0, T=0.8, S=-0.5, P=0.0)
env = stratAC(env=env, learning_rates=0.1, discount_factors=0.9)
mae
= [mae.random_softmax_strategy() for _ in range(7)]
Xisa_s _dXisa_s(Xisa_s, mae).shape
(7, 2, 1, 2)
_dTDerror_s
_dTDerror_s (Xisa_s:Iterable, mae)
Compute reward-prediction errors TDerror_s
for Xs.
Type | Details | |
---|---|---|
Xisa_s | Iterable | of joint strategies Xisa |
mae | CRLD multi-agent environment object | |
Returns | ndarray | joint reward-prediction errors |
= SocialDilemma(R=1.0, T=0.8, S=-0.5, P=0.0)
env = stratAC(env=env, learning_rates=0.1, discount_factors=0.9)
mae
= [mae.random_softmax_strategy() for _ in range(7)]
Xisa_s _dTDerror_s(Xisa_s, mae).shape
(7, 2, 1, 2)
_strategies
_strategies (mae, xinds:tuple, yinds:tuple, xval:float, yval:float, NrRandom)
Creates strategies (as a particular type of phase space item) for one ax plot point. All strategies have value xval
at the xinds
index and value yval
at the yinds
.
Type | Details | |
---|---|---|
mae | CRLD multi-agent environment object | |
xinds | tuple | of indices of the phase space item to plot along the x axis |
yinds | tuple | of indices of the phase space item to plot along the y axis |
xval | float | the value of the phase space item to plot along the x axis |
yval | float | the value of the phase space item to plot along the y axis |
NrRandom | how many random (in the other dimensions) stratgies for averaging | |
Returns | ndarray | Array of joint strategies |
For example, given
= SocialDilemma(R=1.0, T=0.8, S=-0.5, P=0.0)
env = stratAC(env=env, learning_rates=0.1, discount_factors=0.9) mae
the following parameters give
= (0, 0, 0) # Plot agent 0's state-action item 0, 0
xinds = (1, 0, 0) # Plot agent 1's state-action item 0, 0
yinds = 3
NrRandom
= _strategies(mae, xinds, yinds, xval=0.2, yval=0.4, NrRandom=NrRandom)
strats assert strats.shape[0] == NrRandom
strats.shape
(3, 2, 1, 2)
The first dimension of the _strategies
return holds the randomization in the other dimensions than given by xinds
and yinds
. Note that the randomization in the other dimensions makes no sense in a stateless normal-form game since there are no other dimensions.
_data_to_plot
_data_to_plot (mae, flowarrow_points:Iterable, xinds:tuple, yinds:tuple, NrRandom:int, difffunc:collections.abc.Callable, phasespace_items:collections.abc.Callable, verbose=False)
Type | Default | Details | |
---|---|---|---|
mae | CRLD multi-agent environment object | ||
flowarrow_points | Iterable | range & resolution of flow arrows | |
xinds | tuple | of indices of the phase space object to plot along the x axis | |
yinds | tuple | of indices of the phase space object to plot along the y axis | |
NrRandom | int | how many random (in the other dimensions) stratgies for averaging | |
difffunc | Callable | to compute which kind of arrows to plot (RPE or dX) | |
phasespace_items | Callable | to obtain phase space items for one ax plot point | |
verbose | bool | False | shall I talk to you while working? |
Returns | tuple | meshgrid for (X, Y, dX, dY) |
For example, given
= SocialDilemma(R=1.0, T=0.8, S=-0.5, P=0.0)
env = stratAC(env=env, learning_rates=0.1, discount_factors=0.9) mae
the following parameters give
= (0, 0, 0) # Plot agent 0's state-action item 0, 0
xinds = (1, 0, 0) # Plot agent 1's state-action item 0, 0
yinds = np.array([0.1, 0.3, 0.5, 0.7, 0.9])
flowarrow_points =7
NrRandom= _dTDerror_s
difffunc = _strategies
phasespace_items = True
verbose
= _data_to_plot(mae, flowarrow_points, xinds, yinds, NrRandom, difffunc,
X, Y, dX, dY =_strategies, verbose=verbose)
phasespace_items
assert X.shape == Y.shape; print("\nShape of `X` and `Y`:", X.shape)
assert dX.shape == dY.shape; print("Shape of `dX` and `dY`:", dX.shape)
assert dX.shape[-1] == NrRandom
[plot] generating data 96 %
Shape of `X` and `Y`: (5, 5)
Shape of `dX` and `dY`: (5, 5, 7)
Let \(l\) be the number of the flowarrow_points
, than X
and Y
have shape of (\(l\), \(l\)). dX
and dY
have shape of (\(l\), \(l\), Number of randomizations).
_plot
_plot (dX:numpy.ndarray, dY:numpy.ndarray, X:numpy.ndarray, Y:numpy.ndarray, ax=None, sf=1.0, col='LEN', cmap='viridis', kind='quiver+samples', lw=1.0, dens=0.75)
Plots the flow for one condition into one axes
Type | Default | Details | |
---|---|---|---|
dX | ndarray | differences in x dimension | |
dY | ndarray | differences in y dimension | |
X | ndarray | meshgrid in x dimension | |
Y | ndarray | meshgrid in y dimension | |
ax | NoneType | None | Individual axis to plot into |
sf | float | 1.0 | Scale factor for quiver arrows |
col | str | LEN | what should the color indicatie |
cmap | str | viridis | Colormap |
kind | str | quiver+samples | Kind of plot: “quiver”, “quiver+samples”, “quiver”, … |
lw | float | 1.0 | Line width |
dens | float | 0.75 | Density |
_scale
_scale (x:float, y:float, a:float)
Scales length of the (x
, y
) vector accoring to length to the power of a
.
Type | Details | |
---|---|---|
x | float | x dimension |
y | float | y dimension |
a | float | scaling factor |
Returns | tuple | scaled (x,y) |
A scale factor of 0
makes all vectors equally large.
4, 3, 0) _scale(
(0.8, 0.6000000000000001)
40, 30, 0) _scale(
(0.8, 0.6)
A scale factor of 1
does not change a vector’s length
4, 3, 1) _scale(
(4.0, 3.0)
40, 30, 1) _scale(
(40.0, 30.0)