diff --git a/algebra/include/roughpy/algebra/basis.h b/algebra/include/roughpy/algebra/basis.h index eb5863ca5..0f7872ae3 100644 --- a/algebra/include/roughpy/algebra/basis.h +++ b/algebra/include/roughpy/algebra/basis.h @@ -126,6 +126,8 @@ class WordLikeBasisInterface : public void_or_base virtual deg_t size(deg_t degree) const noexcept = 0; RPY_NO_DISCARD virtual let_t first_letter(const key_type& key) const noexcept = 0; + RPY_NO_DISCARD + virtual let_t to_letter(const key_type& key) const noexcept = 0; RPY_NO_DISCARD virtual dimn_t start_of_degree(deg_t degree) const noexcept = 0; @@ -286,6 +288,9 @@ class WordLikeBasisMixin { return instance().first_letter(key); } + RPY_NO_DISCARD let_t to_letter(const key_type& key) const noexcept { + return instance().to_letter(key); + } RPY_NO_DISCARD dimn_t start_of_degree(deg_t degree) const noexcept { diff --git a/algebra/include/roughpy/algebra/basis_impl.h b/algebra/include/roughpy/algebra/basis_impl.h index 79e30d04a..0799d866f 100644 --- a/algebra/include/roughpy/algebra/basis_impl.h +++ b/algebra/include/roughpy/algebra/basis_impl.h @@ -97,6 +97,7 @@ class WordLikeBasisImplementationMixin : public Base deg_t degree(const key_type& key) const noexcept override; deg_t size(deg_t degree) const noexcept override; let_t first_letter(const key_type& key) const noexcept override; + let_t to_letter(const key_type& key) const noexcept override; dimn_t start_of_degree(deg_t degree) const noexcept override; pair, optional> parents(const key_type& key ) const override; @@ -163,6 +164,11 @@ let_t WordLikeBasisImplementationMixin::first_letter( return basis_traits::first_letter(m_impl, key); } template +let_t WordLikeBasisImplementationMixin::to_letter(const key_type& key) const noexcept +{ + return basis_traits::to_letter(m_impl, key); +} +template dimn_t WordLikeBasisImplementationMixin::start_of_degree(deg_t degree ) const noexcept diff --git a/algebra/src/libalgebra_lite_internal/lie_basis_info.h b/algebra/src/libalgebra_lite_internal/lie_basis_info.h index 5388fdfc0..fa9403269 100644 --- a/algebra/src/libalgebra_lite_internal/lie_basis_info.h +++ b/algebra/src/libalgebra_lite_internal/lie_basis_info.h @@ -176,6 +176,10 @@ struct BasisInfo { return basis->first_letter(convert_to_impl(basis, key)); } + static let_t to_letter(storage_t basis, const our_key_type& key) { + return basis->to_letter(convert_to_impl(basis, key)); + } + /// Get the key type that represents letter static our_key_type key_of_letter(storage_t basis, let_t letter) { diff --git a/algebra/src/libalgebra_lite_internal/tensor_basis_info.h b/algebra/src/libalgebra_lite_internal/tensor_basis_info.h index 3ed2f0bb2..119db37a5 100644 --- a/algebra/src/libalgebra_lite_internal/tensor_basis_info.h +++ b/algebra/src/libalgebra_lite_internal/tensor_basis_info.h @@ -171,6 +171,10 @@ struct BasisInfo { return basis->first_letter(convert_to_impl(basis, key)); } + static let_t to_letter(storage_t basis, const our_key_type& key) { + return basis->to_letter(convert_to_impl(basis, key)); + } + /// Get the key type that represents letter static our_key_type key_of_letter(storage_t basis, let_t letter) { diff --git a/external/libalgebra_lite b/external/libalgebra_lite index 2855dd7cb..eaf446d86 160000 --- a/external/libalgebra_lite +++ b/external/libalgebra_lite @@ -1 +1 @@ -Subproject commit 2855dd7cbde60917fb1c93dd3b394f3df36938b2 +Subproject commit eaf446d861e14fee9a96c06c626b1b143856007d diff --git a/roughpy/src/algebra/lie_key.cpp b/roughpy/src/algebra/lie_key.cpp index 8e7791f7e..85c7030ba 100644 --- a/roughpy/src/algebra/lie_key.cpp +++ b/roughpy/src/algebra/lie_key.cpp @@ -194,7 +194,7 @@ parse_key(const algebra::LieBasis& lbasis, key_type key) { using namespace rpy::python; if (lbasis.letter(key)) { - return {PyLieLetter::from_letter(lbasis.first_letter(key))}; + return {PyLieLetter::from_letter(lbasis.to_letter(key))}; } auto keys = lbasis.parents(key); @@ -205,8 +205,8 @@ parse_key(const algebra::LieBasis& lbasis, key_type key) const bool right_letter = lbasis.letter(right_key); if (left_letter && right_letter) { - return {PyLieLetter::from_letter(lbasis.first_letter(left_key)), - PyLieLetter::from_letter(lbasis.first_letter(right_key))}; + return {PyLieLetter::from_letter(lbasis.to_letter(left_key)), + PyLieLetter::from_letter(lbasis.to_letter(right_key))}; } typename PyLieKey::container_type result; @@ -215,7 +215,7 @@ parse_key(const algebra::LieBasis& lbasis, key_type key) auto right_result = parse_key(lbasis, right_key); result.reserve(2 + right_result.size()); - result.push_back(PyLieLetter::from_letter(lbasis.first_letter(left_key)) + result.push_back(PyLieLetter::from_letter(lbasis.to_letter(left_key)) ); result.push_back(PyLieLetter::from_offset(1)); @@ -225,7 +225,7 @@ parse_key(const algebra::LieBasis& lbasis, key_type key) result.reserve(2 + left_result.size()); result.push_back(PyLieLetter::from_offset(2)); - result.push_back(PyLieLetter::from_letter(lbasis.first_letter(right_key) + result.push_back(PyLieLetter::from_letter(lbasis.to_letter(right_key) )); result.insert(result.cend(), left_result.begin(), left_result.end()); diff --git a/roughpy/src/algebra/lie_key_iterator.cpp b/roughpy/src/algebra/lie_key_iterator.cpp index a22cc30fb..3abc2cfb8 100644 --- a/roughpy/src/algebra/lie_key_iterator.cpp +++ b/roughpy/src/algebra/lie_key_iterator.cpp @@ -43,7 +43,7 @@ static const char* LKEY_ITERATOR_DOC python::PyLieKeyIterator::PyLieKeyIterator( algebra::LieBasis basis, key_type current, key_type end ) - : m_current(current), m_end(end), m_basis(move(basis)) + : m_current(current), m_end(end), m_basis(std::move(basis)) { auto dim = m_basis.dimension(); if (m_end > m_basis.dimension()) { @@ -54,8 +54,6 @@ python::PyLieKeyIterator::PyLieKeyIterator( static python::PyLieKey to_py_lie_key(key_type k, const algebra::LieBasis& lbasis) { - auto width = lbasis.width(); - if (lbasis.letter(k)) { return python::PyLieKey(lbasis, k); } auto lparent = *lbasis.lparent(k); @@ -75,10 +73,10 @@ to_py_lie_key(key_type k, const algebra::LieBasis& lbasis) python::PyLieKey python::PyLieKeyIterator::next() { - if (m_current > m_end) { throw py::stop_iteration(); } + if (m_current > m_end) { throw py::stop_iteration(); } auto current = m_current; ++m_current; - return to_py_lie_key(current, m_basis); + return python::PyLieKey(m_basis, current); } void python::init_lie_key_iterator(py::module_& m) diff --git a/tests/algebra/test_lie_basis.py b/tests/algebra/test_lie_basis.py index fcf1a4611..b099d19fe 100644 --- a/tests/algebra/test_lie_basis.py +++ b/tests/algebra/test_lie_basis.py @@ -4,9 +4,13 @@ def test_lie_basis_iteration(): - ctx = rp.get_context(2, 2, rp.DPReal) + ctx = rp.get_context(2, 3, rp.DPReal) basis = ctx.lie_basis keys = list(basis) - assert len(keys) == 3 + # assert len(keys) == 3 + assert [str(k) for k in keys] == ["1", "2", "[1,2]", "[1,[1,2]]", "[2,[1,2]]"] + # assert str(keys[0]) == '1' + # assert str(keys[1]) == '2' + # assert str(keys[3]) == "[1,2]" \ No newline at end of file