|
5 | 5 | :svd_compact, :svd_full, :svd_trunc, :svd_vals, :qr_compact, :qr_full, :qr_null, |
6 | 6 | :lq_compact, :lq_full, :lq_null, :eig_full, :eig_trunc, :eig_vals, :eigh_full, |
7 | 7 | :eigh_trunc, :eigh_vals, :left_polar, :right_polar, |
| 8 | + :project_hermitian, :project_antihermitian, :project_isometric, |
8 | 9 | ] |
9 | 10 | f! = Symbol(f, :!) |
10 | 11 | @eval function MAK.default_algorithm(::typeof($f!), ::Type{T}; kwargs...) where {T <: AbstractTensorMap} |
@@ -655,3 +656,17 @@ for (f!, f_svd!) in zip((:left_null!, :right_null!), (:left_null_svd!, :right_nu |
655 | 656 | return $f!(t, N; alg_svd = alg) |
656 | 657 | end |
657 | 658 | end |
| 659 | + |
| 660 | +# Projections |
| 661 | +# ----------- |
| 662 | +function MAK.check_input(::typeof(project_hermitian!), tsrc::AbstractTensorMap, tdst::AbstractTensorMap) |
| 663 | + domain(tsrc) == codomain(tsrc) || throw(ArgumentError("Hermitian projection requires square input tensor")) |
| 664 | + tsrc === tdst || @check_space(tdst, space(tsrc)) |
| 665 | + return nothing |
| 666 | +end |
| 667 | + |
| 668 | +MAK.check_input(::typeof(project_antihermitian!), tsrc::AbstractTensorMap, tdst::AbstractTensorMap) = |
| 669 | + MAK.check_input(project_hermitian!, tsrc, tdst) |
| 670 | + |
| 671 | +MAK.initialize_output(::typeof(project_hermitian!), tsrc::AbstractTensorMap) = tsrc |
| 672 | +MAK.initialize_output(::typeof(project_antihermitian!), tsrc::AbstractTensorMap) = tsrc |
0 commit comments