Skip to content

Commit 2e0d3fa

Browse files
authored
Avoid depending on extension from within another extension (#345)
Julia's loading system ought to allow an extension w/ triggers {B,C} to depend on an extension w/ triggers {A,C}, under the condition that B depends on A (i.e. the triggers for the second extension are a strict subset of the triggers for the first extension) Unfortunately Julia's purely trigger-based mechanism for extensions does not actually do that. If `C` is the loaded after `{A,B}` then both of these extensions will trigger "simultaneously" and they will be loaded in an indeterminate order. That problem is the same as the "cycle" in JuliaLang/julia#55557, so-called because pre- compilation will try to load each of the simultaneously-triggered extensions "before" the other repeatedly, leading to an ordering cycle. This works around the problem by removing the inter-extension dependency.
1 parent 25426ee commit 2e0d3fa

File tree

3 files changed

+14
-17
lines changed

3 files changed

+14
-17
lines changed

ext/LazyArraysBandedMatricesExt.jl

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@ import ArrayLayouts: colsupport, rowsupport, materialize!, MatMulVecAdd, MatMulM
77
layout_getindex, transtype
88
import LazyArrays: sublayout, symmetriclayout, hermitianlayout, applylayout, cachedlayout, transposelayout,
99
LazyArrayStyle, ApplyArrayBroadcastStyle, AbstractInvLayout, AbstractLazyLayout, LazyLayouts,
10-
AbstractPaddedLayout, PaddedLayout, PaddedRows, PaddedColumns, CachedArray, CachedMatrix, LazyLayout, BroadcastLayout, ApplyLayout,
10+
AbstractPaddedLayout, PaddedLayout, AbstractLazyBandedLayout, LazyBandedLayout, PaddedRows,
11+
PaddedColumns, CachedArray, CachedMatrix, LazyLayout, BroadcastLayout, ApplyLayout,
1112
paddeddata, resizedata!, broadcastlayout, _broadcastarray2broadcasted, _broadcast_sub_arguments,
1213
arguments, call, applybroadcaststyle, simplify, simplifiable, islazy_layout, lazymaterialize, _broadcast_mul_mul,
13-
triangularlayout, AbstractCachedMatrix
14+
triangularlayout, AbstractCachedMatrix, _mulbanded_copyto!
1415
import Base: BroadcastStyle, similar, copy, broadcasted, getindex, OneTo, oneto, tail, sign, abs
1516
import BandedMatrices: bandedbroadcaststyle, bandwidths, isbanded, bandedcolumns, bandeddata, BandedStyle,
1617
AbstractBandedLayout, AbstractBandedMatrix, BandedColumns, BandedRows, BandedSubBandedMatrix,
1718
_bnds, prodbandwidths, banded_rowsupport, banded_colsupport, _BandedMatrix, _banded_broadcast!,
1819
resize
1920
import LinearAlgebra: AdjOrTrans, UpperOrLowerTriangular, kron
2021

21-
abstract type AbstractLazyBandedLayout <: AbstractBandedLayout end
22-
struct LazyBandedLayout <: AbstractLazyBandedLayout end
23-
2422
symmetriclayout(::AbstractLazyBandedLayout) = SymmetricLayout{LazyBandedLayout}()
2523
hermitianlayout(::Type{<:Real}, ::AbstractLazyBandedLayout) = SymmetricLayout{LazyBandedLayout}()
2624
hermitianlayout(::Type{<:Complex}, ::AbstractLazyBandedLayout) = HermitianLayout{LazyBandedLayout}()
@@ -257,10 +255,7 @@ BroadcastLayout(::BroadcastBandedLayout{F}) where F = BroadcastLayout{F}()
257255

258256

259257
# functions that satisfy f(0,0) == 0
260-
261-
const _ZERO_OPS = (:*, :-, :+, :sign, :abs)
262-
263-
for op in _ZERO_OPS
258+
for op in (:*, :-, :+, :sign, :abs)
264259
@eval broadcastlayout(::Type{typeof($op)}, ::BandedLayouts) = BroadcastBandedLayout{typeof($op)}()
265260
end
266261

ext/LazyArraysBlockBandedMatricesExt.jl

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import LazyArrays: sublayout, symmetriclayout, hermitianlayout, transposelayout,
1111
islazy_layout, arguments, call, applylayout, broadcastlayout, applybroadcaststyle,
1212
BroadcastMatrix, _broadcastarray2broadcasted, _cache, resizedata!, simplifiable,
1313
AbstractLazyLayout, LazyArrayStyle, LazyLayout, ApplyLayout, BroadcastLayout, AbstractInvLayout,
14-
_mul_args_colsupport, _mul_args_rowsupport, _mat_mul_arguments,
15-
CachedArray, _broadcast_sub_arguments, simplify, lazymaterialize
14+
_mul_args_colsupport, _mul_args_rowsupport, _mat_mul_arguments, LazyBandedLayout,
15+
CachedArray, _broadcast_sub_arguments, simplify, lazymaterialize, _mulbanded_copyto!
1616
import BlockBandedMatrices: AbstractBlockBandedLayout, AbstractBandedBlockBandedLayout, blockbandwidths, subblockbandwidths,
1717
bandedblockbandedbroadcaststyle, bandedblockbandedcolumns, BandedBlockBandedColumns, BandedBlockBandedRows,
1818
BlockRange1, Block1, BlockIndexRange1, BlockBandedColumns, BlockBandedRows, BandedBlockBandedLayout
@@ -22,11 +22,6 @@ import Base: similar, copy, broadcasted
2222
import ArrayLayouts: materialize!, MatMulVecAdd, sublayout, colsupport, rowsupport, copyto!_layout, mulreduce, inv_layout,
2323
OnesLayout, AbstractFillLayout
2424

25-
const LazyArraysBandedMatricesExt = Base.get_extension(LazyArrays, :LazyArraysBandedMatricesExt)
26-
const LazyBandedLayout = LazyArraysBandedMatricesExt.LazyBandedLayout
27-
const _mulbanded_copyto! = LazyArraysBandedMatricesExt._mulbanded_copyto!
28-
29-
3025
abstract type AbstractLazyBlockBandedLayout <: AbstractBlockBandedLayout end
3126
abstract type AbstractLazyBandedBlockBandedLayout <: AbstractBandedBlockBandedLayout end
3227

@@ -157,7 +152,8 @@ const BroadcastBlockBandedLayouts{F} = Union{BroadcastBlockBandedLayout{F},Broad
157152
blockbandwidths(B::BroadcastMatrix) = blockbandwidths(broadcasted(B))
158153
subblockbandwidths(B::BroadcastMatrix) = subblockbandwidths(broadcasted(B))
159154

160-
for op in LazyArraysBandedMatricesExt._ZERO_OPS
155+
# functions that satisfy f(0,0) == 0
156+
for op in (:*, :-, :+, :sign, :abs)
161157
@eval begin
162158
broadcastlayout(::Type{typeof($op)}, ::BlockBandedLayouts) = BroadcastBlockBandedLayout{typeof($op)}()
163159
broadcastlayout(::Type{typeof($op)}, ::BandedBlockBandedLayouts) = BroadcastBandedBlockBandedLayout{typeof($op)}()

src/LazyArrays.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ map(::typeof(length), A::BroadcastVector{<:Vcat,Type{Vcat}}) = broadcast(+,map.(
7171
broadcasted(::LazyArrayStyle{1}, ::typeof(length), A::BroadcastVector{OneTo{Int},Type{OneTo}}) = A.args[1]
7272
broadcasted(::LazyArrayStyle{1}, ::typeof(length), A::BroadcastVector{<:Fill,Type{Fill},<:NTuple{2,Any}}) = A.args[2]
7373

74+
# types for use by extensions
75+
function _mulbanded_copyto! end
76+
77+
abstract type AbstractLazyBandedLayout <: AbstractBandedLayout end
78+
struct LazyBandedLayout <: AbstractLazyBandedLayout end
79+
7480
if !isdefined(Base, :get_extension)
7581
include("../ext/LazyArraysStaticArraysExt.jl")
7682
include("../ext/LazyArraysBandedMatricesExt.jl")

0 commit comments

Comments
 (0)