1
1
#include < tiledarray.h>
2
2
#include < random>
3
3
#include " TiledArray/config.h"
4
- // #include "range_fixture.h"
5
4
#include " unit_test_config.h"
6
5
7
6
#include " TiledArray/math/linalg/non-distributed/cholesky.h"
@@ -469,26 +468,34 @@ BOOST_AUTO_TEST_CASE(heig_same_tiling) {
469
468
return this ->make_ta_reference (t, range);
470
469
});
471
470
472
- auto [evals, evecs] = non_dist:: heig (ref_ta);
471
+ auto [evals, evecs] = heig (ref_ta);
473
472
auto [evals_non_dist, evecs_non_dist] = non_dist::heig (ref_ta);
474
- // auto evals = heig( ref_ta );
475
473
476
474
BOOST_CHECK (evecs.trange () == ref_ta.trange ());
477
475
478
- // check eigenvectors against non_dist only, for now ...
479
- decltype (evecs) evecs_error;
480
- evecs_error (" i,j" ) = evecs_non_dist (" i,j" ) - evecs (" i,j" );
481
- // TODO need to fix phases of the eigenvectors to be able to compare ...
482
- // BOOST_CHECK_SMALL(evecs_error("i,j").norm().get(),
483
- // N * N * std::numeric_limits<double>::epsilon());
484
-
485
476
// Check eigenvalue correctness
486
477
double tol = N * N * std::numeric_limits<double >::epsilon ();
487
478
for (int64_t i = 0 ; i < N; ++i) {
488
479
BOOST_CHECK_SMALL (std::abs (evals[i] - exact_evals[i]), tol);
489
480
BOOST_CHECK_SMALL (std::abs (evals_non_dist[i] - exact_evals[i]), tol);
490
481
}
491
482
483
+ // check eigenvectors by reconstruction
484
+ auto reconstruction_check = [&](const auto & s, const auto & U,
485
+ const auto str) {
486
+ using Array = TA::TArray<double >;
487
+ auto S =
488
+ TA::diagonal_array<Array>(U.world (), U.trange (), s.begin (), s.end ());
489
+ Array err;
490
+ err (" i,j" ) = U (" i,k" ) * S (" k,l" ) * U (" j,l" ).conj () - ref_ta (" i,j" );
491
+ auto err_l2 = TA::norm2 (err);
492
+ const double epsilon = N * N * std::numeric_limits<double >::epsilon ();
493
+ BOOST_CHECK (err_l2 < epsilon);
494
+ // std::cout << str << " ||U s U† - A||_2 = " << err_l2 << std::endl;
495
+ };
496
+ reconstruction_check (evals, evecs, " heig" );
497
+ reconstruction_check (evals_non_dist, evecs_non_dist, " non_dist::heig" );
498
+
492
499
GlobalFixture::world->gop .fence ();
493
500
}
494
501
@@ -576,7 +583,7 @@ BOOST_AUTO_TEST_CASE(cholesky) {
576
583
return this ->make_ta_reference (t, range);
577
584
});
578
585
579
- auto L = non_dist ::cholesky (A);
586
+ auto L = TiledArray ::cholesky (A);
580
587
581
588
BOOST_CHECK (L.trange () == A.trange ());
582
589
@@ -729,7 +736,7 @@ BOOST_AUTO_TEST_CASE(cholesky_lsolve) {
729
736
});
730
737
731
738
// Should produce X = L**H
732
- auto [L, X] = non_dist ::cholesky_lsolve (TA::NoTranspose, A, A);
739
+ auto [L, X] = TiledArray ::cholesky_lsolve (TA::NoTranspose, A, A);
733
740
BOOST_CHECK (X.trange () == A.trange ());
734
741
BOOST_CHECK (L.trange () == A.trange ());
735
742
@@ -797,7 +804,7 @@ BOOST_AUTO_TEST_CASE(lu_solve) {
797
804
return this ->make_ta_reference (t, range);
798
805
});
799
806
800
- auto iden = non_dist ::lu_solve (ref_ta, ref_ta);
807
+ auto iden = TiledArray ::lu_solve (ref_ta, ref_ta);
801
808
802
809
BOOST_CHECK (iden.trange () == ref_ta.trange ());
803
810
@@ -834,7 +841,7 @@ BOOST_AUTO_TEST_CASE(lu_inv) {
834
841
835
842
TA::TArray<double > iden (*GlobalFixture::world, trange);
836
843
837
- auto Ainv = non_dist ::lu_inv (ref_ta);
844
+ auto Ainv = TiledArray ::lu_inv (ref_ta);
838
845
iden (" i,j" ) = Ainv (" i,k" ) * ref_ta (" k,j" );
839
846
840
847
BOOST_CHECK (iden.trange () == ref_ta.trange ());
@@ -871,7 +878,7 @@ BOOST_AUTO_TEST_CASE(svd_values_only) {
871
878
return this ->make_ta_reference (t, range);
872
879
});
873
880
874
- auto S = non_dist:: svd<TA::SVD::ValuesOnly>(ref_ta, trange, trange);
881
+ auto S = svd<TA::SVD::ValuesOnly>(ref_ta, trange, trange);
875
882
876
883
std::vector exact_singular_values = exact_evals;
877
884
std::sort (exact_singular_values.begin (), exact_singular_values.end (),
@@ -895,7 +902,7 @@ BOOST_AUTO_TEST_CASE(svd_leftvectors) {
895
902
return this ->make_ta_reference (t, range);
896
903
});
897
904
898
- auto [S, U] = non_dist:: svd<TA::SVD::LeftVectors>(ref_ta, trange, trange);
905
+ auto [S, U] = svd<TA::SVD::LeftVectors>(ref_ta, trange, trange);
899
906
900
907
std::vector exact_singular_values = exact_evals;
901
908
std::sort (exact_singular_values.begin (), exact_singular_values.end (),
@@ -919,7 +926,7 @@ BOOST_AUTO_TEST_CASE(svd_rightvectors) {
919
926
return this ->make_ta_reference (t, range);
920
927
});
921
928
922
- auto [S, VT] = non_dist:: svd<TA::SVD::RightVectors>(ref_ta, trange, trange);
929
+ auto [S, VT] = svd<TA::SVD::RightVectors>(ref_ta, trange, trange);
923
930
924
931
std::vector exact_singular_values = exact_evals;
925
932
std::sort (exact_singular_values.begin (), exact_singular_values.end (),
@@ -943,7 +950,7 @@ BOOST_AUTO_TEST_CASE(svd_allvectors) {
943
950
return this ->make_ta_reference (t, range);
944
951
});
945
952
946
- auto [S, U, VT] = non_dist:: svd<TA::SVD::AllVectors>(ref_ta, trange, trange);
953
+ auto [S, U, VT] = svd<TA::SVD::AllVectors>(ref_ta, trange, trange);
947
954
948
955
std::vector exact_singular_values = exact_evals;
949
956
std::sort (exact_singular_values.begin (), exact_singular_values.end (),
@@ -985,7 +992,7 @@ void householder_qr_test(const ArrayT& A, double tol) {
985
992
: non_dist::householder_qr<false >(A);
986
993
#else
987
994
static_assert (not use_scalapack);
988
- auto [Q, R] = non_dist:: householder_qr<false >(A);
995
+ auto [Q, R] = householder_qr<false >(A);
989
996
#endif
990
997
991
998
// Check reconstruction error
@@ -1046,7 +1053,7 @@ template <typename ArrayT>
1046
1053
void cholesky_qr_q_only_test (const ArrayT& A, double tol) {
1047
1054
using value_type = typename ArrayT::element_type;
1048
1055
1049
- auto Q = TiledArray::math::linalg:: cholesky_qr<true >(A);
1056
+ auto Q = TiledArray::cholesky_qr<true >(A);
1050
1057
1051
1058
// Make sure the Q is orthogonal at least
1052
1059
TA::TArray<double > Iden;
@@ -1059,7 +1066,7 @@ void cholesky_qr_q_only_test(const ArrayT& A, double tol) {
1059
1066
1060
1067
template <typename ArrayT>
1061
1068
void cholesky_qr_test (const ArrayT& A, double tol) {
1062
- auto [Q, R] = TiledArray::math::linalg:: cholesky_qr<false >(A);
1069
+ auto [Q, R] = TiledArray::cholesky_qr<false >(A);
1063
1070
1064
1071
// Check reconstruction error
1065
1072
TA::TArray<double > QR_ERROR;
0 commit comments