LayeredArrays
Introduction
LayeredArrays provides layer-wise array computation written in the Julia programming language. The layers have hierarchical structure, and lower layers can be accessed by using getindex in AbstractLayeredArray. All types except subtypes of AbstractLayeredArray are on bottom layer 0. The layer-wise operations are simply available by using broadcast operations. This framework is useful for following index notation.
julia> xᵢ = @layered 3 [1,2,3]
3-element LayeredVector{3, Int64, Vector{Int64}}:
1
2
3
julia> yⱼ = @layered 2 [4,5,6]
3-element LayeredVector{2, Int64, Vector{Int64}}:
4
5
6
julia> zₖ = @layered 1 [7,8,9]
3-element LayeredVector{1, Int64, Vector{Int64}}:
7
8
9
julia> Aᵢⱼₖ = @. xᵢ * yⱼ + zₖ * yⱼ; # layerof(Aᵢⱼₖ) == 3
julia> Aᵢⱼₖ[1] == @. xᵢ[1] * yⱼ + zₖ * yⱼ # layerof(Aᵢⱼₖ[1]) == 2
true
julia> Aᵢⱼₖ[1][2] == @. xᵢ[1] * yⱼ[2] + zₖ * yⱼ[2] # layerof(Aᵢⱼₖ[1][2]) == 1
true
julia> Aᵢⱼₖ[1][2][3] == xᵢ[1] * yⱼ[2] + zₖ[3] * yⱼ[2] # layerof(Aᵢⱼₖ[1][2][3]) == 0
trueNote that the layer-wise broadcasting operations are always lazily evaluated.
Installation
pkg> add LayeredArraysTypes and Functions
LayeredArrays.AbstractLayeredArray — TypeAbstractLayeredArray{layer, T, N}Supertype for N-dimensional layered arrays with elements of type T.
LayeredArrays.LayeredArray — TypeLayeredArray(x)
LayeredArray{layer}(x)Construct LayeredArray on layer (layer = 1 by default).
See also @layered.
Examples
julia> x = LayeredArray([1,2,3])
3-element LayeredVector{1, Int64, Vector{Int64}}:
1
2
3
julia> y = LayeredArray{2}([4,5,6])
3-element LayeredVector{2, Int64, Vector{Int64}}:
4
5
6
julia> x .* y
3-element LazyLayeredVector{2, LazyLayeredVector{1, Int64, Base.Broadcast.Broadcasted{LayeredArrays.LayeredArrayStyle{1}, Nothing, typeof(*), Tuple{LayeredVector{1, Int64, Vector{Int64}}, Base.RefValue{Int64}}}}, Base.Broadcast.Broadcasted{LayeredArrays.LayeredArrayStyle{1}, Nothing, typeof(*), Tuple{Base.RefValue{LayeredVector{1, Int64, Vector{Int64}}}, LayeredVector{2, Int64, Vector{Int64}}}}}:
[4, 8, 12]
[5, 10, 15]
[6, 12, 18]LayeredArrays.@layered — Macro@layered expr
@layered layer exprConstruct LayeredArray on layer (layere = 1 by default). This is equivalent to LayeredArray{layer}(expr).
See also LayeredArray.
Examples
julia> x = @layered [1,2,3]
3-element LayeredVector{1, Int64, Vector{Int64}}:
1
2
3
julia> y = @layered 2 [4,5,6]
3-element LayeredVector{2, Int64, Vector{Int64}}:
4
5
6
julia> x .* y
3-element LazyLayeredVector{2, LazyLayeredVector{1, Int64, Base.Broadcast.Broadcasted{LayeredArrays.LayeredArrayStyle{1}, Nothing, typeof(*), Tuple{LayeredVector{1, Int64, Vector{Int64}}, Base.RefValue{Int64}}}}, Base.Broadcast.Broadcasted{LayeredArrays.LayeredArrayStyle{1}, Nothing, typeof(*), Tuple{Base.RefValue{LayeredVector{1, Int64, Vector{Int64}}}, LayeredVector{2, Int64, Vector{Int64}}}}}:
[4, 8, 12]
[5, 10, 15]
[6, 12, 18]