@@ -52,6 +52,20 @@ function DiagonalTensorMap(data::DenseVector{T}, V::IndexSpace) where {T}
52
52
return DiagonalTensorMap {T} (data, V)
53
53
end
54
54
55
+ function DiagonalTensorMap (t:: AbstractTensorMap{T,S,1,1} ) where {T,S}
56
+ isa (t, DiagonalTensorMap) && return t
57
+ domain (t) == codomain (t) ||
58
+ throw (SpaceMismatch (" DiagonalTensorMap requires equal domain and codomain" ))
59
+ A = storagetype (t)
60
+ d = DiagonalTensorMap {T,S,A} (undef, space (t, 1 ))
61
+ for (c, b) in blocks (d)
62
+ bt = block (t, c)
63
+ # TODO : rewrite in terms of `diagview` from MatrixAlgebraKit.jl
64
+ copy! (b. diag, view (bt, LinearAlgebra. diagind (bt)))
65
+ end
66
+ return d
67
+ end
68
+
55
69
# TODO : more constructors needed?
56
70
57
71
# Special case adjoint:
73
87
TensorMap (d:: DiagonalTensorMap ) = copy! (similar (d), d)
74
88
Base. convert (:: Type{TensorMap} , d:: DiagonalTensorMap ) = TensorMap (d)
75
89
76
- function Base. convert (:: Type{DiagonalTensorMap{T,S,A}} ,
77
- d:: DiagonalTensorMap{T,S,A} ) where {T,S,A}
78
- return d
79
- end
80
90
function Base. convert (D:: Type{<:DiagonalTensorMap} , d:: DiagonalTensorMap )
81
- return DiagonalTensorMap (convert (storagetype (D), d. data), d. domain)
91
+ return (d isa D) ? d : DiagonalTensorMap (convert (storagetype (D), d. data), d. domain)
92
+ end
93
+ Base. convert (:: Type{DiagonalTensorMap} , t:: DiagonalTensorMap ) = t
94
+ function Base. convert (:: Type{DiagonalTensorMap} , t:: AbstractTensorMap )
95
+ LinearAlgebra. isdiag (t) ||
96
+ throw (ArgumentError (" DiagonalTensorMap requires input tensor that is diagonal" ))
97
+ return DiagonalTensorMap (t)
98
+ end
99
+ function Base. convert (:: Type{DiagonalTensorMap} , d:: Dict{Symbol,Any} )
100
+ return convert (DiagonalTensorMap, convert (TensorMap, d))
82
101
end
83
102
84
103
# Complex, real and imaginary parts
0 commit comments