@@ -753,6 +753,39 @@ BOOST_AUTO_TEST_CASE(cholesky_lsolve) {
753
753
GlobalFixture::world->gop .fence ();
754
754
}
755
755
756
+ BOOST_AUTO_TEST_CASE (qr_solve) {
757
+ GlobalFixture::world->gop .fence ();
758
+
759
+ auto trange = gen_trange (N, {128ul });
760
+
761
+ auto ref_ta = TA::make_array<TA::TArray<double >>(
762
+ *GlobalFixture::world, trange,
763
+ [this ](TA::Tensor<double >& t, TA::Range const & range) -> double {
764
+ return this ->make_ta_reference (t, range);
765
+ });
766
+
767
+ auto iden = non_dist::qr_solve (ref_ta, ref_ta);
768
+
769
+ BOOST_CHECK (iden.trange () == ref_ta.trange ());
770
+
771
+ TA::foreach_inplace (iden, [](TA::Tensor<double >& tile) {
772
+ auto range = tile.range ();
773
+ auto lo = range.lobound_data ();
774
+ auto up = range.upbound_data ();
775
+ for (auto m = lo[0 ]; m < up[0 ]; ++m)
776
+ for (auto n = lo[1 ]; n < up[1 ]; ++n)
777
+ if (m == n) {
778
+ tile (m, n) -= 1 .;
779
+ }
780
+ });
781
+
782
+ double epsilon = N * N * std::numeric_limits<double >::epsilon ();
783
+ double norm = iden (" i,j" ).norm (*GlobalFixture::world).get ();
784
+
785
+ BOOST_CHECK_SMALL (norm, epsilon);
786
+ GlobalFixture::world->gop .fence ();
787
+ }
788
+
756
789
BOOST_AUTO_TEST_CASE (lu_solve) {
757
790
GlobalFixture::world->gop .fence ();
758
791
0 commit comments