@@ -7,6 +7,9 @@ export Grassmann, Stiefel, Unitary
77export inner, retract, transport, transport!
88
99using TensorKit
10+ using MatrixAlgebraKit: MatrixAlgebraKit, AbstractAlgorithm, Algorithm, PolarViaSVD,
11+ LAPACK_DivideAndConquer, diagview
12+ import MatrixAlgebraKit as MAK
1013
1114# Every submodule -- Grassmann, Stiefel, and Unitary -- implements their own methods for
1215# these. The signatures should be
@@ -28,23 +31,8 @@ checkbase(x, y, z, args...) = checkbase(checkbase(x, y), z, args...)
2831# the machine epsilon for the elements of an object X, name inspired from eltype
2932scalareps (X) = eps (real (scalartype (X)))
3033
31- # default SVD algorithm used in the algorithms
32- default_svd_alg (:: AbstractTensorMap ) = TensorKit. SVD ()
33-
34- function isisometry (W:: AbstractTensorMap ; tol= 10 * scalareps (W))
35- WdW = W' * W
36- s = zero (float (real (scalartype (W))))
37- for (c, b) in blocks (WdW)
38- _subtractone! (b)
39- s += dim (c) * length (b)
40- end
41- return norm (WdW) <= tol * sqrt (s)
42- end
43-
44- function isunitary (W:: AbstractTensorMap ; tol= 10 * scalareps (W))
45- return isisometry (W; tol= tol) && isisometry (W' ; tol= tol)
46- end
47-
34+ # TODO : these functions should be replaced by MAK functions
35+ projecthermitian (W:: AbstractTensorMap ) = projecthermitian! (copy (W))
4836function projecthermitian! (W:: AbstractTensorMap )
4937 codomain (W) == domain (W) ||
5038 throw (DomainError (" Tensor with distinct domain and codomain cannot be hermitian." ))
@@ -53,6 +41,8 @@ function projecthermitian!(W::AbstractTensorMap)
5341 end
5442 return W
5543end
44+
45+ projectantihermitian (W:: AbstractTensorMap ) = projectantihermitian! (copy (W))
5646function projectantihermitian! (W:: AbstractTensorMap )
5747 codomain (W) == domain (W) ||
5848 throw (DomainError (" Tensor with distinct domain and codomain cannot be anithermitian." ))
@@ -62,27 +52,18 @@ function projectantihermitian!(W::AbstractTensorMap)
6252 return W
6353end
6454
65- struct PolarNewton <: TensorKit.OrthogonalFactorizationAlgorithm
66- end
67- function projectisometric! (W:: AbstractTensorMap ; alg= default_svd_alg (W))
68- if alg isa TensorKit. Polar || alg isa TensorKit. SDD
69- foreach (blocks (W)) do (c, b)
70- return _polarsdd! (b)
71- end
72- elseif alg isa TensorKit. SVD
73- foreach (blocks (W)) do (c, b)
74- return _polarsvd! (b)
75- end
76- elseif alg isa PolarNewton
77- foreach (blocks (W)) do (c, b)
78- return _polarnewton! (b)
79- end
80- else
81- throw (ArgumentError (" unkown algorithm for projectisometric!: alg = $alg " ))
55+ projectisometric (W:: AbstractTensorMap ; kwargs... ) = projectisometric! (copy (W); kwargs... )
56+ function projectisometric! (W:: AbstractTensorMap ;
57+ alg:: AbstractAlgorithm = MAK. select_algorithm (left_polar!, W))
58+ TensorKit. foreachblock (W) do c, (b,)
59+ return _left_polar! (b, alg)
8260 end
8361 return W
8462end
8563
64+ function projectcomplement (X:: AbstractTensorMap , W:: AbstractTensorMap , kwargs... )
65+ return projectcomplement! (copy (X), W; kwargs... )
66+ end
8667function projectcomplement! (X:: AbstractTensorMap , W:: AbstractTensorMap ;
8768 tol= 10 * scalareps (X))
8869 P = W' * X
@@ -97,18 +78,6 @@ function projectcomplement!(X::AbstractTensorMap, W::AbstractTensorMap;
9778 return X
9879end
9980
100- projecthermitian (W:: AbstractTensorMap ) = projecthermitian! (copy (W))
101- projectantihermitian (W:: AbstractTensorMap ) = projectantihermitian! (copy (W))
102-
103- function projectisometric (W:: AbstractTensorMap ;
104- alg= default_svd_alg (W))
105- return projectisometric! (copy (W); alg= alg)
106- end
107- function projectcomplement (X:: AbstractTensorMap , W:: AbstractTensorMap ,
108- tol= 10 * scalareps (X))
109- return projectcomplement! (copy (X), W; tol= tol)
110- end
111-
11281include (" auxiliary.jl" )
11382include (" grassmann.jl" )
11483include (" stiefel.jl" )
0 commit comments