Skip to content

Commit

Permalink
Merge pull request #1324 from sumiya11/groebner-ord
Browse files Browse the repository at this point in the history
In Groebner extension, partially fix ordering
  • Loading branch information
ChrisRackauckas authored Oct 26, 2024
2 parents fbf13ec + 093b273 commit dad7414
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ DocStringExtensions = "0.9"
DomainSets = "0.6, 0.7"
DynamicPolynomials = "0.5, 0.6"
ForwardDiff = "0.10.36"
Groebner = "0.5, 0.6, 0.7"
Groebner = "0.8"
IfElse = "0.1"
LaTeXStrings = "1.3"
LambertW = "1.0.0"
Expand Down
11 changes: 9 additions & 2 deletions ext/SymbolicsGroebnerExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,16 @@ julia> @variables x y;
julia> groebner_basis([x*y^2 + x, x^2*y + y])
```
"""
function Symbolics.groebner_basis(polynomials::Vector{Num}; kwargs...)
function Symbolics.groebner_basis(polynomials::Vector{Num}; ordering=InputOrdering(), kwargs...)
polynoms, pvar2sym, sym2term = Symbolics.symbol_to_poly(polynomials)
basis = Groebner.groebner(polynoms; kwargs...)
sym2term_for_groebner = Dict{Any,Any}(v1 => k for (k, (v1, v2)) in sym2term)
all_sym_vars = Groebner.ordering_variables(ordering)
missed = setdiff(all_sym_vars, Set(collect(keys(sym2term_for_groebner))))
for var in missed
sym2term_for_groebner[var] = var
end
ordering = Groebner.ordering_transform(ordering, sym2term_for_groebner )
basis = Groebner.groebner(polynoms; ordering=ordering, kwargs...)
PolyType = symtype(first(polynomials))
Symbolics.poly_to_symbol(basis, pvar2sym, sym2term, PolyType)
end
Expand Down
8 changes: 8 additions & 0 deletions test/extensions/groebner.jl
Original file line number Diff line number Diff line change
Expand Up @@ -72,5 +72,13 @@ truebasis = [
basis = groebner_basis(system)
@test isequal(expand.(basis), truebasis)

# issues/1323
@variables t S(t) R(t)
sys = [-12 + 5S, 2 + 5R]
@test isequal(expand.(groebner_basis(sys, ordering=Lex(S, R))), [2//5 + R, -12//5 + S])
sys = [S^2 + 2*R^2 - 1, S*R - 1]
res = [(1//2) - (1//2)*(R^2) + R^4, S - R + (2//1)*(R^3)]
@test isequal(expand.(groebner_basis(sys, ordering=Lex(S, R))), res)

# Groebner does not yet work with constant ideals
@test_broken groebner_basis([1])

0 comments on commit dad7414

Please sign in to comment.