selfloopforwardconnection

ReservoirComputing.selfloop_forwardconnectionFunction
selfloop_forwardconnection([rng], [T], dims...;
    delay_weight=0.1, selfloop_weight=0.1,
    radius=nothing, return_sparse=false,
    selfloop_kwargs=(), delay_kwargs=())

Creates a reservoir based on a forward connection of weights between even nodes with the addition of self loops (Elsarraj et al., 2019).

This architecture is referred to as TP4 in the original paper.

\[W_{i,j} = \begin{cases} ll, & \text{if } i = j \text{ for } i = 1 \dots N \\ r, & \text{if } j = i - 2 \text{ for } i = 3 \dots N \\ 0, & \text{otherwise} \end{cases}\]

Arguments

  • rng: Random number generator. Default is Utils.default_rng()from WeightInitializers.
  • T: Type of the elements in the reservoir matrix. Default is Float32.
  • dims: Dimensions of the reservoir matrix.

Keyword arguments

  • forward_weight: Weight of the forward connections in the reservoir matrix. This can be provided as a single value or an array. In case it is provided as an array please make sure that the length of the array matches the length of the cycle you want to populate. Default is 0.1.

  • selfloop_weight: Weight of the self loops in the reservoir matrix. This can be provided as a single value or an array. In case it is provided as an array please make sure that the length of the array matches the length of the diagonal you want to populate. Default is 0.1.

  • radius: The desired spectral radius of the reservoir. If nothing is passed, no scaling takes place. Defaults to nothing.

  • return_sparse: flag for returning a sparse matrix. true requires SparseArrays to be loaded. Default is false.

  • delay_kwargs and selfloop_kwargs: named tuples that control the kwargs for the delay line weight and self loop weights respectively. The kwargs are as follows:

Examples

Default call:

julia> res_matrix = selfloop_forwardconnection(5, 5)
5×5 Matrix{Float32}:
 0.1  0.0  0.0  0.0  0.0
 0.0  0.1  0.0  0.0  0.0
 0.1  0.0  0.1  0.0  0.0
 0.0  0.1  0.0  0.1  0.0
 0.0  0.0  0.1  0.0  0.1

Changing weights:

julia> res_matrix = selfloop_forwardconnection(5, 5; forward_weight=0.5, selfloop_weight=0.99)
5×5 Matrix{Float32}:
 0.99  0.0   0.0   0.0   0.0
 0.0   0.99  0.0   0.0   0.0
 0.5   0.0   0.99  0.0   0.0
 0.0   0.5   0.0   0.99  0.0
 0.0   0.0   0.5   0.0   0.99

Changing weights to custom arrays:

julia> forward_weights = Float32[0.2, 0.4, 0.6, 0.8, 1.0];

julia> selfloop_weights = -Float32[0.1, 0.3, 0.5, 0.7, 0.9];

julia> res_matrix = selfloop_forwardconnection(5, 5;
           forward_weight = forward_weights, selfloop_weight = selfloop_weights);

julia> diag(res_matrix) == selfloop_weights && count(!iszero, res_matrix) == 8
true
julia> res_matrix = selfloop_forwardconnection(
           5, 5; delay_kwargs = (; signs = IrrationalDigitSigns()))
5×5 Matrix{Float32}:
  0.1  0.0   0.0  0.0  0.0
  0.0  0.1   0.0  0.0  0.0
 -0.1  0.0   0.1  0.0  0.0
  0.0  0.1   0.0  0.1  0.0
  0.0  0.0  -0.1  0.0  0.1

julia> res_matrix = selfloop_forwardconnection(
           5, 5; selfloop_kwargs = (; signs = RandomSigns()))
5×5 Matrix{Float32}:
 0.1   0.0  0.0   0.0  0.0
 0.0  -0.1  0.0   0.0  0.0
 0.1   0.0  0.1   0.0  0.0
 0.0   0.1  0.0  -0.1  0.0
 0.0   0.0  0.1   0.0  0.1

Returning as sparse:

julia> using SparseArrays

julia> res_matrix = selfloop_forwardconnection(5, 5; return_sparse=true)
5×5 SparseMatrixCSC{Float32, Int64} with 8 stored entries:
 0.1   ⋅    ⋅    ⋅    ⋅
  ⋅   0.1   ⋅    ⋅    ⋅
 0.1   ⋅   0.1   ⋅    ⋅
  ⋅   0.1   ⋅   0.1   ⋅
  ⋅    ⋅   0.1   ⋅   0.1
source

References

  • Elsarraj, D.; Qisi, M. A.; Rodan, A.; Obeid, N.; Sharieh, A. and Faris, H. (2019). Demystifying echo state network with deterministic simple topologies. International Journal of Computational Science and Engineering 19, 407–417.