From d7feb5b813f129ea1ace1293b314ad1468138ecd Mon Sep 17 00:00:00 2001 From: Deniz Unal <22716633+deniz-unal@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:12:18 -0400 Subject: [PATCH 1/4] Add failing test for complex float input in lstsq Add a test case to show the issue when using > with lstsq --- test/test_linalg.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/test_linalg.cpp b/test/test_linalg.cpp index bb1327a..9e0fb11 100644 --- a/test/test_linalg.cpp +++ b/test/test_linalg.cpp @@ -486,6 +486,25 @@ namespace xt EXPECT_TRUE(allclose(cel_1, std::get<1>(cres))); EXPECT_EQ(cel_2, std::get<2>(cres)); EXPECT_TRUE(allclose(cel_3, std::get<3>(cres))); + + xarray> cfarg_0 = {{0.f, 1.f}, {1.f - 3if, 1.f}, {2.f, 1.f}, {3.f, 1.f}}; + xarray> cfarg_1 = {{-1.f, 0.2f + 4if, 0.9f, 2.1f - 1if}, {2.f, 3if, 2.f, 1.f}}; + cfarg_1 = transpose(cfarg_1); + auto cfres = xt::linalg::lstsq(cfarg_0, cfarg_1); + + xarray, layout_type::column_major> cfel_0 = { + {-0.40425532f - 0.38723404if, -0.61702128f - 0.44680851if}, + {1.44680851f + 1.02765957if, 2.51063830f + 0.95744681if} + }; + xarray cfel_1 = {16.11787234f, 2.68085106f}; + int cfel_2 = 2; + xarray cfel_3 = {5.01295356f, 1.36758789f}; + + EXPECT_TRUE(allclose(imag(cfel_0), imag(std::get<0>(cfres)))); + EXPECT_TRUE(allclose(real(cfel_0), real(std::get<0>(cfres)))); + EXPECT_TRUE(allclose(cfel_1, std::get<1>(cfres))); + EXPECT_EQ(cfel_2, std::get<2>(cfres)); + EXPECT_TRUE(allclose(cfel_3, std::get<3>(cfres))); } TEST(xlinalg, trace) From 750a59910762ea63edbbb3f9e8f00a6b3d05da9e Mon Sep 17 00:00:00 2001 From: Deniz Unal <22716633+deniz-unal@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:14:27 -0400 Subject: [PATCH 2/4] Fix complex float inputs for lstsq Resolves compile error when lstsq is called with complex float arguments. --- .../cxxlapack/netlib/interface/dummy.in.cc | 30 +++++++++---------- .../cxxlapack/netlib/interface/lapack.in.h | 30 +++++++++---------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/include/xflens/cxxlapack/netlib/interface/dummy.in.cc b/include/xflens/cxxlapack/netlib/interface/dummy.in.cc index 58ea20b..6255419 100644 --- a/include/xflens/cxxlapack/netlib/interface/dummy.in.cc +++ b/include/xflens/cxxlapack/netlib/interface/dummy.in.cc @@ -1026,21 +1026,21 @@ LAPACK_DECL(cgels)(const char *TRANS, //-- cgelsd -------------------------------------------------------------------- void -LAPACK_DECL(cgelsd)(const INTEGER *M, - const INTEGER *N, - const INTEGER *NRHS, - FLOAT_COMPLEX *A, - const INTEGER *LDA, - FLOAT_COMPLEX *B, - const INTEGER *LDB, - FLOAT *S, - const FLOAT *RCOND, - INTEGER *RANK, - FLOAT_COMPLEX *WORK, - const INTEGER *LWORK, - FLOAT *RWORK, - INTEGER *IWORK, - INTEGER *INFO) +LAPACK_DECL(cgelsd)(const INTEGER *M, + const INTEGER *N, + const INTEGER *NRHS, + const FLOAT_COMPLEX *A, + const INTEGER *LDA, + FLOAT_COMPLEX *B, + const INTEGER *LDB, + FLOAT *S, + const FLOAT *RCOND, + INTEGER *RANK, + FLOAT_COMPLEX *WORK, + const INTEGER *LWORK, + FLOAT *RWORK, + INTEGER *IWORK, + INTEGER *INFO) { DEBUG_LAPACK_STUB("cgelsd"); LAPACK_IMPL(cgelsd)(M, diff --git a/include/xflens/cxxlapack/netlib/interface/lapack.in.h b/include/xflens/cxxlapack/netlib/interface/lapack.in.h index 93b593e..eb12b5e 100644 --- a/include/xflens/cxxlapack/netlib/interface/lapack.in.h +++ b/include/xflens/cxxlapack/netlib/interface/lapack.in.h @@ -579,21 +579,21 @@ LAPACK_IMPL(cgels)(const char *TRANS, //-- cgelsd -------------------------------------------------------------------- void -LAPACK_IMPL(cgelsd)(const INTEGER *M, - const INTEGER *N, - const INTEGER *NRHS, - FLOAT_COMPLEX *A, - const INTEGER *LDA, - FLOAT_COMPLEX *B, - const INTEGER *LDB, - FLOAT *S, - const FLOAT *RCOND, - INTEGER *RANK, - FLOAT_COMPLEX *WORK, - const INTEGER *LWORK, - FLOAT *RWORK, - INTEGER *IWORK, - INTEGER *INFO); +LAPACK_IMPL(cgelsd)(const INTEGER *M, + const INTEGER *N, + const INTEGER *NRHS, + const FLOAT_COMPLEX *A, + const INTEGER *LDA, + FLOAT_COMPLEX *B, + const INTEGER *LDB, + FLOAT *S, + const FLOAT *RCOND, + INTEGER *RANK, + FLOAT_COMPLEX *WORK, + const INTEGER *LWORK, + FLOAT *RWORK, + INTEGER *IWORK, + INTEGER *INFO); //-- cgelss -------------------------------------------------------------------- void From cbf14add5a9925be136b1c7abc45803b94a05601 Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Tue, 15 Jul 2025 15:35:51 +0200 Subject: [PATCH 3/4] Migrated last test to doctest --- test/test_linalg.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_linalg.cpp b/test/test_linalg.cpp index 1fb7dab..99e5022 100644 --- a/test/test_linalg.cpp +++ b/test/test_linalg.cpp @@ -505,11 +505,11 @@ namespace xt int cfel_2 = 2; xarray cfel_3 = {5.01295356f, 1.36758789f}; - EXPECT_TRUE(allclose(imag(cfel_0), imag(std::get<0>(cfres)))); - EXPECT_TRUE(allclose(real(cfel_0), real(std::get<0>(cfres)))); - EXPECT_TRUE(allclose(cfel_1, std::get<1>(cfres))); - EXPECT_EQ(cfel_2, std::get<2>(cfres)); - EXPECT_TRUE(allclose(cfel_3, std::get<3>(cfres))); + CHECK(allclose(imag(cfel_0), imag(std::get<0>(cfres)))); + CHECK(allclose(real(cfel_0), real(std::get<0>(cfres)))); + CHECK(allclose(cfel_1, std::get<1>(cfres))); + CHECK_EQ(cfel_2, std::get<2>(cfres)); + CHECK(allclose(cfel_3, std::get<3>(cfres))); } TEST_CASE("trace") From d6555b4e052d436dc9d98085c45be1bc69605416 Mon Sep 17 00:00:00 2001 From: Johan Mabille Date: Tue, 15 Jul 2025 15:39:17 +0200 Subject: [PATCH 4/4] linter --- test/test_linalg.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_linalg.cpp b/test/test_linalg.cpp index 99e5022..7e53270 100644 --- a/test/test_linalg.cpp +++ b/test/test_linalg.cpp @@ -491,7 +491,7 @@ namespace xt CHECK(allclose(cel_1, std::get<1>(cres))); CHECK_EQ(cel_2, std::get<2>(cres)); CHECK(allclose(cel_3, std::get<3>(cres))); - + xarray> cfarg_0 = {{0.f, 1.f}, {1.f - 3if, 1.f}, {2.f, 1.f}, {3.f, 1.f}}; xarray> cfarg_1 = {{-1.f, 0.2f + 4if, 0.9f, 2.1f - 1if}, {2.f, 3if, 2.f, 1.f}}; cfarg_1 = transpose(cfarg_1); @@ -504,7 +504,7 @@ namespace xt xarray cfel_1 = {16.11787234f, 2.68085106f}; int cfel_2 = 2; xarray cfel_3 = {5.01295356f, 1.36758789f}; - + CHECK(allclose(imag(cfel_0), imag(std::get<0>(cfres)))); CHECK(allclose(real(cfel_0), real(std::get<0>(cfres)))); CHECK(allclose(cfel_1, std::get<1>(cfres)));