Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix lie key iterator #41

Merged
merged 3 commits into from
Oct 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions algebra/include/roughpy/algebra/basis.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ class WordLikeBasisInterface : public void_or_base<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;
Expand Down Expand Up @@ -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
{
Expand Down
6 changes: 6 additions & 0 deletions algebra/include/roughpy/algebra/basis_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<key_type>, optional<key_type>> parents(const key_type& key
) const override;
Expand Down Expand Up @@ -163,6 +164,11 @@ let_t WordLikeBasisImplementationMixin<T, Derived, Base>::first_letter(
return basis_traits::first_letter(m_impl, key);
}
template <typename T, typename Derived, typename Base>
let_t WordLikeBasisImplementationMixin<T, Derived, Base>::to_letter(const key_type& key) const noexcept
{
return basis_traits::to_letter(m_impl, key);
}
template <typename T, typename Derived, typename Base>
dimn_t
WordLikeBasisImplementationMixin<T, Derived, Base>::start_of_degree(deg_t degree
) const noexcept
Expand Down
4 changes: 4 additions & 0 deletions algebra/src/libalgebra_lite_internal/lie_basis_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ struct BasisInfo<LieBasis, lal::hall_basis> {
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)
{
Expand Down
4 changes: 4 additions & 0 deletions algebra/src/libalgebra_lite_internal/tensor_basis_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,10 @@ struct BasisInfo<TensorBasis, lal::tensor_basis> {
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)
{
Expand Down
10 changes: 5 additions & 5 deletions roughpy/src/algebra/lie_key.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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));

Expand All @@ -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());
Expand Down
8 changes: 3 additions & 5 deletions roughpy/src/algebra/lie_key_iterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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);
Expand All @@ -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)
Expand Down
8 changes: 6 additions & 2 deletions tests/algebra/test_lie_basis.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]"