Skip to content

Commit 5747286

Browse files
authored
Fix with_variables for TypedPolynomials (#241)
1 parent 37edbcb commit 5747286

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

src/Certificate/Certificate.jl

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,32 @@ function MP.monomials(v::WithVariables)
9090
return MP.monomials(v.inner)
9191
end
9292

93-
94-
_cat(a::Vector, b::Vector) = vcat(a, b)
95-
_cat(a::Vector, ::Tuple{}) = copy(a)
96-
_cat(a::Tuple, b::Tuple) = [a..., b...]
97-
_cat(a::Tuple, ::Tuple{}) = [a...]
93+
_merge_sorted(a::Vector, ::Tuple{}) = a
94+
function _merge_sorted(a::Vector, b::Vector)
95+
vars = sort!(vcat(a, b), rev = true)
96+
unique!(vars)
97+
return vars
98+
end
99+
_merge_sorted(a::Tuple{}, ::Tuple{}) = a
100+
_merge_sorted(a::Tuple, ::Tuple{}) = a
101+
_merge_sorted(::Tuple{}, b::Tuple) = b
102+
function _merge_sorted(a::Tuple, b::Tuple)
103+
v = first(a)
104+
w = first(b)
105+
if v == w
106+
return (v, _merge_sorted(Base.tail(a), Base.tail(b))...)
107+
elseif v > w
108+
return (v, _merge_sorted(Base.tail(a), b)...)
109+
else
110+
return (w, _merge_sorted(a, Base.tail(b))...)
111+
end
112+
end
98113

99114
_vars(::SemialgebraicSets.FullSpace) = tuple()
100115
_vars(x) = MP.variables(x)
101116

102117
function with_variables(inner, outer)
103-
vars = sort!(_cat(_vars(inner), _vars(outer)), rev = true)
104-
unique!(vars)
105-
return WithVariables(inner, vars)
118+
return WithVariables(inner, _merge_sorted(_vars(inner), _vars(outer)))
106119
end
107120

108121
function preprocessed_domain(::Putinar, domain::BasicSemialgebraicSet, p)

test/certificate.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ const MP = MultivariatePolynomials
44
import MultivariateBases
55
const MB = MultivariateBases
66

7+
@testset "_merge_sorted" begin
8+
@test SumOfSquares.Certificate._merge_sorted([4, 1], [3, 0]) == [4, 3, 1, 0]
9+
@test SumOfSquares.Certificate._merge_sorted((4, 1), (3, 0)) == (4, 3, 1, 0)
10+
@test SumOfSquares.Certificate._merge_sorted([4, 1], [3, 2]) == [4, 3, 2, 1]
11+
@test SumOfSquares.Certificate._merge_sorted((4, 1), (3, 2)) == (4, 3, 2, 1)
12+
end
13+
714
@testset "with_variables" begin
815
@polyvar x y z
916
p = x + z
@@ -17,7 +24,7 @@ const MB = MultivariateBases
1724
v = SumOfSquares.Certificate.with_variables(q, FullSpace())
1825
@test v.inner === q
1926
@test MP.variables(v.inner) == [a, b, a]
20-
@test MP.variables(v) == [a, b]
27+
@test MP.variables(v) == [a, b, a]
2128
end
2229

2330
@testset "Monomial selection for certificate" begin

0 commit comments

Comments
 (0)