@@ -34,7 +34,7 @@ broadcastlayout(::Type{typeof(*)}, ::WeightLayout, ::MappedBasisLayouts) = Mappe
34
34
35
35
# A sub of a weight is still a weight
36
36
sublayout (:: WeightLayout , _) = WeightLayout ()
37
- sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{Map,AbstractUnitRange }} ) = MappedBasisLayout ()
37
+ sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{Map,AbstractVector }} ) = MappedBasisLayout ()
38
38
39
39
40
40
# # Weighted basis interface
@@ -290,23 +290,37 @@ end
290
290
291
291
292
292
# Differentiation of sub-arrays
293
- @simplify function * (A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:Inclusion,<:Any}} )
293
+
294
+ # avoid stack overflow from unmaterialize Derivative() * parent()
295
+ _der_sub (DP, inds... ) = DP[inds... ]
296
+ _der_sub (DP:: ApplyQuasiMatrix{T,typeof(*),<:Tuple{Derivative,Any}} , kr, jr) where T = ApplyQuasiMatrix {T} (* , DP. args[1 ], view (DP. args[2 ], kr, jr))
297
+
298
+ # need to customise simplifiable so can't use @simplify
299
+ simplifiable (:: typeof (* ), A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:Inclusion,<:Any}} )= simplifiable (* , A, parent (B))
300
+ simplifiable (:: typeof (* ), Ac:: QuasiAdjoint{<:Any,<:SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:Inclusion,<:Any}}} , Bc:: QuasiAdjoint{<:Any,<:Derivative} ) = simplifiable (* , Bc' , Ac' )
301
+ function mul (A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:Inclusion,<:Any}} )
302
+ axes (A,2 ) == axes (B,1 ) || throw (DimensionMismatch ())
294
303
P = parent (B)
295
- (Derivative (axes (P,1 ))* P)[ parentindices (B)... ]
304
+ _der_sub (Derivative (axes (P,1 ))* P, parentindices (B)... )
296
305
end
306
+ mul (Ac:: QuasiAdjoint{<:Any,<:SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:Inclusion,<:Any}}} , Bc:: QuasiAdjoint{<:Any,<:Derivative} ) = mul (Bc' , Ac' )'
297
307
298
- @simplify function * (A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:AbstractAffineQuasiVector,<:Any}} )
308
+ simplifiable (:: typeof (* ), A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:AbstractAffineQuasiVector,<:Any}} ) = simplifiable (* , A, parent (B))
309
+ simplifiable (:: typeof (* ), Ac:: QuasiAdjoint{<:Any,<:SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:AbstractAffineQuasiVector,<:Any}}} , Bc:: QuasiAdjoint{<:Any,<:Derivative} ) = simplifiable (* , Bc' , Ac' )
310
+ function mul (A:: Derivative , B:: SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:AbstractAffineQuasiVector,<:Any}} )
311
+ axes (A,2 ) == axes (B,1 ) || throw (DimensionMismatch ())
299
312
P = parent (B)
300
313
kr,jr = parentindices (B)
301
314
(Derivative (axes (P,1 ))* P* kr. A)[kr,jr]
302
315
end
316
+ mul (Ac:: QuasiAdjoint{<:Any,<:SubQuasiArray{<:Any,2,<:AbstractQuasiMatrix,<:Tuple{<:AbstractAffineQuasiVector,<:Any}}} , Bc:: QuasiAdjoint{<:Any,<:Derivative} ) = mul (Bc' , Ac' )'
303
317
304
318
# we represent as a Mul with a banded matrix
305
- sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractUnitRange }} ) = SubBasisLayout ()
306
- sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{<:AbstractAffineQuasiVector,<:AbstractUnitRange }} ) = MappedBasisLayout ()
307
- sublayout (:: WeightedBasisLayouts , :: Type{<:Tuple{<:AbstractAffineQuasiVector,<:AbstractUnitRange }} ) = MappedWeightedBasisLayout ()
308
- sublayout (:: WeightedBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractUnitRange }} ) = SubWeightedBasisLayout ()
309
- sublayout (:: MappedWeightedBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractUnitRange }} ) = MappedWeightedBasisLayout ()
319
+ sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractVector }} ) = SubBasisLayout ()
320
+ sublayout (:: AbstractBasisLayout , :: Type{<:Tuple{<:AbstractAffineQuasiVector,<:AbstractVector }} ) = MappedBasisLayout ()
321
+ sublayout (:: WeightedBasisLayouts , :: Type{<:Tuple{<:AbstractAffineQuasiVector,<:AbstractVector }} ) = MappedWeightedBasisLayout ()
322
+ sublayout (:: WeightedBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractVector }} ) = SubWeightedBasisLayout ()
323
+ sublayout (:: MappedWeightedBasisLayout , :: Type{<:Tuple{<:Inclusion,<:AbstractVector }} ) = MappedWeightedBasisLayout ()
310
324
311
325
@inline sub_materialize (:: AbstractBasisLayout , V:: AbstractQuasiArray ) = V
312
326
@inline sub_materialize (:: AbstractBasisLayout , V:: AbstractArray ) = V
@@ -348,6 +362,14 @@ function arguments(::ApplyLayout{typeof(*)}, V::SubQuasiArray{<:Any,2,<:Any,<:Tu
348
362
A,P
349
363
end
350
364
365
+ function arguments (:: ApplyLayout{typeof(*)} , V:: SubQuasiArray{<:Any,2,<:Any,<:Tuple{<:Inclusion,<:AbstractVector}} )
366
+ A = parent (V)
367
+ _,jr = parentindices (V)
368
+ first (jr) ≥ 1 || throw (BoundsError ())
369
+ P = Eye {Int} ((axes (A,2 ),))[:,jr]
370
+ A,P
371
+ end
372
+
351
373
# ###
352
374
# sum
353
375
# ###
0 commit comments