2626for f! in (
2727 :qr_compact! , :qr_full! , :lq_compact! , :lq_full! ,
2828 :eig_full! , :eigh_full! , :svd_compact! , :svd_full! ,
29- :left_polar! , :right_polar! , :left_orth! , :right_orth! ,
29+ :left_polar! , :right_polar!
3030 )
3131 @eval function MAK. $f! (t:: AbstractTensorMap , F, alg:: AbstractAlgorithm )
3232 MAK. check_input ($ f!, t, F, alg)
@@ -45,6 +45,43 @@ for f! in (
4545 end
4646end
4747
48+ for alg in (MAK. LeftOrthAlgorithm{:qr }, MAK. LeftOrthAlgorithm{:svd }, MAK. LeftOrthAlgorithm{:polar })
49+ @eval begin
50+ function MAK. left_orth! (t:: AbstractTensorMap , F, alg:: $alg )
51+ MAK. check_input (left_orth!, t, F, alg)
52+
53+ foreachblock (t, F... ) do _, bs
54+ factors = Base. tail (bs)
55+ factors′ = left_orth! (first (bs), factors, alg)
56+ # deal with the case where the output is not in-place
57+ for (f′, f) in zip (factors′, factors)
58+ f′ === f || copy! (f, f′)
59+ end
60+ return nothing
61+ end
62+ return F
63+ end
64+ end
65+ end
66+
67+ for alg in (MAK. RightOrthAlgorithm{:lq }, MAK. RightOrthAlgorithm{:svd }, MAK. RightOrthAlgorithm{:polar })
68+ @eval function MAK. right_orth! (t:: AbstractTensorMap , F, alg:: $alg )
69+ MAK. check_input (right_orth!, t, F, alg)
70+
71+ foreachblock (t, F... ) do _, bs
72+ factors = Base. tail (bs)
73+ factors′ = right_orth! (first (bs), factors, alg)
74+ # deal with the case where the output is not in-place
75+ for (f′, f) in zip (factors′, factors)
76+ f′ === f || copy! (f, f′)
77+ end
78+ return nothing
79+ end
80+ return F
81+ end
82+ end
83+
84+
4885# Handle these separately because single output instead of tuple
4986for f! in (:qr_null! , :lq_null! )
5087 @eval function MAK. $f! (t:: AbstractTensorMap , N, alg:: AbstractAlgorithm )
@@ -464,6 +501,18 @@ function MAK.check_input(::typeof(left_orth!), t::AbstractTensorMap, VC, ::Abstr
464501 return nothing
465502end
466503
504+ function MAK. check_input (:: typeof (left_orth!), t:: AbstractTensorMap , VC, alg:: MAK.LeftOrthAlgorithm{:qr} )
505+ return MAK. check_input (qr_compact!, t, VC, alg. alg)
506+ end
507+
508+ function MAK. check_input (:: typeof (left_orth!), t:: AbstractTensorMap , VC, alg:: MAK.LeftOrthAlgorithm{:svd} )
509+ return MAK. check_input (svd_compact!, t, VC, alg. alg)
510+ end
511+
512+ function MAK. check_input (:: typeof (left_orth!), t:: AbstractTensorMap , VC, alg:: MAK.LeftOrthAlgorithm{:polar} )
513+ return MAK. check_input (left_polar!, t, VC, alg. alg)
514+ end
515+
467516function MAK. check_input (:: typeof (right_orth!), t:: AbstractTensorMap , CVᴴ, :: AbstractAlgorithm )
468517 C, Vᴴ = CVᴴ
469518
@@ -479,6 +528,18 @@ function MAK.check_input(::typeof(right_orth!), t::AbstractTensorMap, CVᴴ, ::A
479528 return nothing
480529end
481530
531+ function MAK. check_input (:: typeof (right_orth!), t:: AbstractTensorMap , VC, alg:: MAK.RightOrthAlgorithm{:lq} )
532+ return MAK. check_input (lq_compact!, t, VC, alg. alg)
533+ end
534+
535+ function MAK. check_input (:: typeof (right_orth!), t:: AbstractTensorMap , VC, alg:: MAK.RightOrthAlgorithm{:svd} )
536+ return MAK. check_input (svd_compact!, t, VC, alg. alg)
537+ end
538+
539+ function MAK. check_input (:: typeof (right_orth!), t:: AbstractTensorMap , VC, alg:: MAK.RightOrthAlgorithm{:polar} )
540+ return MAK. check_input (right_polar!, t, VC, alg. alg)
541+ end
542+
482543function MAK. initialize_output (:: typeof (left_orth!), t:: AbstractTensorMap )
483544 V_C = infimum (fuse (codomain (t)), fuse (domain (t)))
484545 V = similar (t, codomain (t) ← V_C)
@@ -501,44 +562,16 @@ end
501562function MAK. left_orth! (
502563 t:: AbstractTensorMap ;
503564 trunc:: TruncationStrategy = notrunc (),
504- kind = trunc == notrunc () ? :qr : :svd ,
505- alg_qr = (; positive = true ), alg_polar = (;), alg_svd = (;)
565+ alg:: AbstractAlgorithm = (trunc == notrunc ()) ? MAK. select_algorithm (left_orth!, t, Val (:qr )) : MAK. select_algorithm (left_orth!, t, Val (:svd ); trunc)
506566 )
507- trunc == notrunc () || kind === :svd ||
508- throw (ArgumentError (" truncation not supported for left_orth with kind = $kind " ))
509-
510- return if kind === :qr
511- alg_qr isa NamedTuple ? qr_compact! (t; alg_qr... ) : qr_compact! (t; alg = alg_qr)
512- elseif kind === :polar
513- alg_polar isa NamedTuple ? left_orth_polar! (t; alg_polar... ) :
514- left_orth_polar! (t; alg = alg_polar)
515- elseif kind === :svd
516- alg_svd isa NamedTuple ? left_orth_svd! (t; trunc, alg_svd... ) :
517- left_orth_svd! (t; trunc, alg = alg_svd)
518- else
519- throw (ArgumentError (lazy " `left_orth!` received unknown value `kind = $kind`" ))
520- end
567+ MAK. left_orth! (t, MAK. initialize_output (left_orth!, t, alg), alg)
521568end
522569function MAK. right_orth! (
523570 t:: AbstractTensorMap ;
524571 trunc:: TruncationStrategy = notrunc (),
525- kind = trunc == notrunc () ? :lq : :svd ,
526- alg_lq = (; positive = true ), alg_polar = (;), alg_svd = (;)
572+ alg:: AbstractAlgorithm = (trunc == notrunc ()) ? MAK. select_algorithm (right_orth!, t, Val (:lq )) : MAK. select_algorithm (right_orth!, t, Val (:svd ); trunc)
527573 )
528- trunc == notrunc () || kind === :svd ||
529- throw (ArgumentError (" truncation not supported for right_orth with kind = $kind " ))
530-
531- return if kind === :lq
532- alg_lq isa NamedTuple ? lq_compact! (t; alg_lq... ) : lq_compact! (t; alg = alg_lq)
533- elseif kind === :polar
534- alg_polar isa NamedTuple ? right_orth_polar! (t; alg_polar... ) :
535- right_orth_polar! (t; alg = alg_polar)
536- elseif kind === :svd
537- alg_svd isa NamedTuple ? right_orth_svd! (t; trunc, alg_svd... ) :
538- right_orth_svd! (t; trunc, alg = alg_svd)
539- else
540- throw (ArgumentError (lazy " `right_orth!` received unknown value `kind = $kind`" ))
541- end
574+ MAK. right_orth! (t, MAK. initialize_output (right_orth!, t, alg), alg)
542575end
543576
544577# Nullspace
0 commit comments