@@ -343,6 +343,16 @@ function (project::ProjectTo{Adjoint})(dx::AbstractArray)
343343 dy = eltype (dx) <: Real ? vec (dx) : adjoint (dx)
344344 return adjoint (project. parent (dy))
345345end
346+ # structural => natural standardisation, broadest possible signature
347+ function (project:: ProjectTo{Adjoint} )(dx:: Tangent )
348+ if dx. parent isa Tangent
349+ # Can't wrap a structural representation of an array in an Adjoint:
350+ return dx
351+ else
352+ # This case should handle dx.parent isa AbstractZero, too
353+ return Adjoint (project. parent (dx. parent))
354+ end
355+ end
346356
347357function ProjectTo (x:: LinearAlgebra.TransposeAbsVec )
348358 return ProjectTo {Transpose} (; parent= ProjectTo (parent (x)))
@@ -357,14 +367,22 @@ function (project::ProjectTo{Transpose})(dx::AbstractArray)
357367 dy = eltype (dx) <: Number ? vec (dx) : transpose (dx)
358368 return transpose (project. parent (dy))
359369end
370+ function (project:: ProjectTo{Transpose} )(
371+ dx:: Tangent{<:Transpose, <:NamedTuple{(:parent,), <:Tuple{AbstractVector}}} ,
372+ )
373+ return Transpose (project. parent (dx. parent))
374+ end
360375
361376# Diagonal
362377ProjectTo (x:: Diagonal ) = ProjectTo {Diagonal} (; diag= ProjectTo (x. diag))
363378(project:: ProjectTo{Diagonal} )(dx:: AbstractMatrix ) = Diagonal (project. diag (diag (dx)))
364379(project:: ProjectTo{Diagonal} )(dx:: Diagonal ) = Diagonal (project. diag (dx. diag))
365-
366- (project:: ProjectTo{Diagonal} )(dx:: Tangent{T} ) where T = (@show T; Diagonal (project. diag (dx. diag)))
367- # (project::ProjectTo{Diagonal})(dx::Tangent{<:Diagonal, NamedTuple{(:diag,), <:Tuple{AbstractVector}}}) = Diagonal(project.diag(@show 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))
385+ end
368386
369387# Symmetric
370388for (SymHerm, chk, fun) in
@@ -383,6 +401,13 @@ for (SymHerm, chk, fun) in
383401 dz = $ chk (dy) ? dy : (dy .+ $ fun (dy)) ./ 2
384402 return $ SymHerm (project. parent (dz), project. uplo)
385403 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
410+ end
386411 # This is an example of a subspace which is not a subtype,
387412 # not clear how broadly it's worthwhile to try to support this.
388413 function (project:: ProjectTo{$SymHerm} )(dx:: Diagonal )
0 commit comments