@@ -21,29 +21,33 @@ Base.:(==)(x::RationalPoly, α::Nothing) = false
21
21
Base.:(== )(α:: Dict , x:: RationalPoly ) = false
22
22
Base.:(== )(x:: RationalPoly , α:: Dict ) = false
23
23
24
- function right_term_eq (p:: AbstractPolynomial , t)
24
+ function right_term_eq (p:: AbstractPolynomial , t; comp = ( == ) )
25
25
if iszero (p)
26
26
iszero (t)
27
27
else
28
28
# terms/nterms ignore zero terms
29
- nterms (p) == 1 && leading_term (p) == t
29
+ nterms (p) == 1 && comp ( leading_term (p), t)
30
30
end
31
31
end
32
- right_term_eq (p:: _APL , t) = right_term_eq (polynomial (p), t)
32
+ right_term_eq (p:: _APL , t; comp = ( == )) = right_term_eq (polynomial (p), t; comp )
33
33
34
- left_constant_eq (α, v:: AbstractVariable ) = false
35
- right_constant_eq (v:: AbstractVariable , α) = false
36
- function _term_constant_eq (t:: AbstractTermLike , α)
34
+ left_constant_eq (α, v:: AbstractVariable ; comp = ( == ) ) = false
35
+ right_constant_eq (v:: AbstractVariable , α; comp = ( == ) ) = false
36
+ function _term_constant_eq (t:: AbstractTermLike , α; comp = ( == ) )
37
37
if iszero (t)
38
38
iszero (α)
39
39
else
40
- α == coefficient (t) && isconstant (t)
40
+ comp (α, coefficient (t) ) && isconstant (t)
41
41
end
42
42
end
43
- left_constant_eq (α, t:: AbstractTermLike ) = _term_constant_eq (t, α)
44
- right_constant_eq (t:: AbstractTermLike , α) = _term_constant_eq (t, α)
45
- left_constant_eq (α, p:: _APL ) = right_term_eq (p, α)
46
- right_constant_eq (p:: _APL , α) = right_term_eq (p, α)
43
+ function left_constant_eq (α, t:: AbstractTermLike ; comp = (== ))
44
+ return _term_constant_eq (t, α; comp)
45
+ end
46
+ function right_constant_eq (t:: AbstractTermLike , α; comp = (== ))
47
+ return _term_constant_eq (t, α; comp)
48
+ end
49
+ left_constant_eq (α, p:: _APL ; comp = (== )) = right_term_eq (p, α; comp)
50
+ right_constant_eq (p:: _APL , α; comp = (== )) = right_term_eq (p, α; comp)
47
51
48
52
function Base.:(== )(mono:: AbstractMonomial , v:: AbstractVariable )
49
53
return isone (degree (mono)) && variable (mono) == v
@@ -58,17 +62,28 @@ function Base.:(==)(mono::AbstractMonomialLike, t::AbstractTerm)
58
62
return isone (coefficient (t)) && mono == monomial (t)
59
63
end
60
64
61
- function Base.:( == )( t1:: AbstractTerm , t2:: AbstractTerm )
65
+ function _compare_term ( t1:: AbstractTerm , t2:: AbstractTerm , comp )
62
66
c1 = coefficient (t1)
63
67
c2 = coefficient (t2)
64
68
if iszero (c1)
65
69
iszero (c2)
66
70
else
67
- c1 == c2 && monomial (t1) == monomial (t2)
71
+ comp (c1, c2) && comp ( monomial (t1), monomial (t2) )
68
72
end
69
73
end
74
+
75
+ Base.:(== )(t1:: AbstractTerm , t2:: AbstractTerm ) = _compare_term (t1, t2, == )
70
76
Base.:(== )(p:: AbstractPolynomial , t:: AbstractTerm ) = right_term_eq (p, t)
71
77
Base.:(== )(t:: AbstractTerm , p:: AbstractPolynomial ) = right_term_eq (p, t)
78
+ function Base. isequal (t1:: AbstractTerm , t2:: AbstractTerm )
79
+ return _compare_term (t1, t2, isequal)
80
+ end
81
+ function Base. isequal (p:: AbstractPolynomial , t:: AbstractTerm )
82
+ return right_term_eq (p, t; comp = isequal)
83
+ end
84
+ function Base. isequal (t:: AbstractTerm , p:: AbstractPolynomial )
85
+ return right_term_eq (p, t; comp = isequal)
86
+ end
72
87
73
88
function compare_terms (p1:: AbstractPolynomial , p2:: AbstractPolynomial , isz, op)
74
89
i1 = 1
@@ -110,13 +125,24 @@ end
110
125
function Base.:(== )(p1:: AbstractPolynomial , p2:: AbstractPolynomial )
111
126
return compare_terms (p1, p2, iszero, == )
112
127
end
128
+ function Base. isequal (p1:: AbstractPolynomial , p2:: AbstractPolynomial )
129
+ return compare_terms (p1, p2, iszero, isequal)
130
+ end
113
131
114
132
Base.:(== )(p:: RationalPoly , q:: RationalPoly ) = p. num * q. den == q. num * p. den
115
133
# Solve ambiguity with (::PolyType, ::Any)
116
134
Base.:(== )(p:: _APL , q:: RationalPoly ) = p * q. den == q. num
117
135
Base.:(== )(q:: RationalPoly , p:: _APL ) = p == q
118
136
Base.:(== )(α, q:: RationalPoly ) = α * q. den == q. num
119
137
Base.:(== )(q:: RationalPoly , α) = α == q
138
+ function Base. isequal (p:: RationalPoly , q:: RationalPoly )
139
+ return isequal (p. num * q. den, q. num * p. den)
140
+ end
141
+ # Solve ambiguity with (::PolyType, ::Any)
142
+ Base. isequal (p:: _APL , q:: RationalPoly ) = isequal (p * q. den, q. num)
143
+ Base. isequal (q:: RationalPoly , p:: _APL ) = isequal (p, q)
144
+ Base. isequal (α, q:: RationalPoly ) = isequal (α * q. den, q. num)
145
+ Base. isequal (q:: RationalPoly , α) = isequal (α, q)
120
146
121
147
# α could be a JuMP affine expression
122
148
isapproxzero (α; ztol:: Real = 0.0 ) = false
0 commit comments