@@ -367,21 +367,16 @@ function (project::ProjectTo{Transpose})(dx::AbstractArray)
367
367
dy = eltype (dx) <: Number ? vec (dx) : transpose (dx)
368
368
return transpose (project. parent (dy))
369
369
end
370
- function (project:: ProjectTo{Transpose} )(
371
- dx:: Tangent{<:Transpose, <:NamedTuple{(:parent,), <:Tuple{AbstractVector}}} ,
372
- )
373
- return Transpose (project. parent (dx. parent))
370
+ function (project:: ProjectTo{Transpose} )(dx:: Tangent ) # structural => natural
371
+ return dx. parent isa Tangent ? dx : Transpose (project. parent (dx. parent))
374
372
end
375
373
376
374
# Diagonal
377
375
ProjectTo (x:: Diagonal ) = ProjectTo {Diagonal} (; diag= ProjectTo (x. diag))
378
376
(project:: ProjectTo{Diagonal} )(dx:: AbstractMatrix ) = Diagonal (project. diag (diag (dx)))
379
377
(project:: ProjectTo{Diagonal} )(dx:: Diagonal ) = Diagonal (project. diag (dx. diag))
380
- # structural => natural standardisation, very conservative signature:
381
- function (project:: ProjectTo{Diagonal} )(
382
- dx:: Tangent{<:Diagonal, <:NamedTuple{(:diag,), <:Tuple{AbstractVector}}} ,
383
- )
384
- return Diagonal (project. diag (dx. diag))
378
+ function (project:: ProjectTo{Diagonal} )(dx:: Tangent ) # structural => natural
379
+ return dx. diag isa Tangent ? dx. diag : Diagonal (project. diag (dx. diag))
385
380
end
386
381
387
382
# Symmetric
@@ -401,12 +396,8 @@ for (SymHerm, chk, fun) in
401
396
dz = $ chk (dy) ? dy : (dy .+ $ fun (dy)) ./ 2
402
397
return $ SymHerm (project. parent (dz), project. uplo)
403
398
end
404
- function (project:: ProjectTo{$SymHerm} )(dx:: Tangent{<:$SymHerm} )
405
- if dx. data isa Tangent
406
- return dx
407
- else
408
- return $ SymHerm (project. parent (dx. data))
409
- end
399
+ function (project:: ProjectTo{$SymHerm} )(dx:: Tangent ) # structural => natural
400
+ return dx. data isa Tangent ? dx : $ SymHerm (project. parent (dx. data), project. uplo)
410
401
end
411
402
# This is an example of a subspace which is not a subtype,
412
403
# not clear how broadly it's worthwhile to try to support this.
@@ -433,8 +424,9 @@ for UL in (:UpperTriangular, :LowerTriangular, :UnitUpperTriangular, :UnitLowerT
433
424
)
434
425
return Diagonal (sub_one (dx. diag))
435
426
end
436
- # Convert "structural" `Tangent`s to array-like "natural" tangents
437
- (project:: ProjectTo{$UL} )(dx:: Tangent{<:$UL, NamedTuple{(:data,), <:Tuple{AbstractMatrix}}} ) = $ UL (dx. data)
427
+ function (project:: ProjectTo{$UL} )(dx:: Tangent ) # structural => natural
428
+ return dx. data isa Tangent ? dx : $ UL (project. parent (dx. data), project. uplo)
429
+ end
438
430
end
439
431
end
440
432
0 commit comments