@@ -308,6 +308,9 @@ ProjectTo(x::Diagonal) = ProjectTo{Diagonal}(; diag=ProjectTo(x.diag))
308
308
(project:: ProjectTo{Diagonal} )(dx:: AbstractMatrix ) = Diagonal (project. diag (diag (dx)))
309
309
(project:: ProjectTo{Diagonal} )(dx:: Diagonal ) = Diagonal (project. diag (dx. diag))
310
310
311
+ (project:: ProjectTo{Diagonal} )(dx:: Tangent{T} ) where T = (@show T; Diagonal (project. diag (dx. diag)))
312
+ # (project::ProjectTo{Diagonal})(dx::Tangent{<:Diagonal, NamedTuple{(:diag,), <:Tuple{AbstractVector}}}) = Diagonal(project.diag(@show dx.diag))
313
+
311
314
# Symmetric
312
315
for (SymHerm, chk, fun) in (
313
316
(:Symmetric , :issymmetric , :transpose ),
@@ -344,13 +347,16 @@ for UL in (:UpperTriangular, :LowerTriangular, :UnitUpperTriangular, :UnitLowerT
344
347
@eval begin
345
348
ProjectTo (x:: $UL ) = ProjectTo {$UL} (; parent= ProjectTo (parent (x)))
346
349
(project:: ProjectTo{$UL} )(dx:: AbstractArray ) = $ UL (project. parent (dx))
350
+ # Another subspace which is not a subtype, like Diagonal inside Symmetric above, equally unsure
347
351
function (project:: ProjectTo{$UL} )(dx:: Diagonal )
348
352
sub = project. parent
349
353
sub_one = ProjectTo {project_type(sub)} (;
350
354
element= sub. element, axes= (sub. axes[1 ],)
351
355
)
352
356
return Diagonal (sub_one (dx. diag))
353
357
end
358
+ # Convert "structural" `Tangent`s to array-like "natural" tangents
359
+ (project:: ProjectTo{$UL} )(dx:: Tangent{<:$UL, NamedTuple{(:data,), <:Tuple{AbstractMatrix}}} ) = $ UL (dx. data)
354
360
end
355
361
end
356
362
0 commit comments