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
true

Note that the layer-wise broadcasting operations are always lazily evaluated.

Installation

pkg> add LayeredArrays

Types and Functions

LayeredArrays.LayeredArrayType
LayeredArray(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]
source
LayeredArrays.@layeredMacro
@layered expr
@layered layer expr

Construct 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]
source