11
22base_term (a:: Any ) = false
33base_term (a:: Real ) = true
4+ base_term (a:: Num ) = base_term (a. val)
45function base_term (a:: BasicSymbolic )
56 exprtype (a)== SYM && return true
67 exprtype (a)== TERM && return varterm (a) || (a. f== getindex)
78 return false
89end
910
10- function isfactor (a:: BasicSymbolic )
11+ function isfactor (a:: BasicSymbolic ; split_div :: Bool = false )
1112 if exprtype (a)== SYM
1213 return true
1314 elseif exprtype (a)== TERM
@@ -32,7 +33,12 @@ function isfactor(a::BasicSymbolic)
3233 ~ (base_term (key)) && return false
3334 end
3435 return true
35- elseif exprtype (a)== DIV
36+ elseif exprtype (a)== DIV && split_div== true
37+ ~ (typeof (a. num)<: Real ) && return false
38+ ~ (isone (a. num)) && return false
39+ ~ (base_term (a. den)) && return false
40+ return true
41+ elseif exprtype (a)== DIV && split_div== false
3642 ~ (base_term (a. num)) && return false
3743 ~ (base_term (a. den)) && return false
3844 return true
@@ -47,13 +53,13 @@ function factor!(a...)
4753 @warn """ Use of "!" is deprecated as of v0.2.0. Please call `factor()` instead."""
4854 return factor (a... )
4955end
50- factor (ex:: Num ) = factor (ex. val)
51- factor (ex:: Num , eqs:: Vector{Equation} ) = factor (ex. val, eqs= eqs)
56+ factor (ex:: Num ; split_div :: Bool = false ) = factor (ex. val, split_div = split_div )
57+ factor (ex:: Num , eqs:: Vector{Equation} ; split_div :: Bool = false ) = factor (ex. val, eqs= eqs, split_div = split_div )
5258
53- function factor (old_ex:: BasicSymbolic ; eqs = Equation[])
59+ function factor (old_ex:: BasicSymbolic ; eqs = Equation[], split_div :: Bool = false )
5460 ex = deepcopy (old_ex)
5561 binarize! (ex)
56- if isfactor (ex)
62+ if isfactor (ex, split_div = split_div )
5763 index = findall (x -> isequal (x. rhs,ex), eqs)
5864 if isempty (index)
5965 newsym = gensym (:aux )
@@ -87,12 +93,12 @@ function factor(old_ex::BasicSymbolic; eqs = Equation[])
8793 new_terms[eqs[index[1 ]]. lhs] = 1
8894 end
8995 else
90- factor (val* key, eqs= eqs)
96+ factor (val* key, eqs= eqs, split_div = split_div )
9197 new_terms[eqs[end ]. lhs] = 1
9298 end
9399 end
94100 new_add = SymbolicUtils. Add (Real, ex. coeff, new_terms)
95- factor (new_add, eqs= eqs)
101+ factor (new_add, eqs= eqs, split_div = split_div )
96102 return eqs
97103 elseif exprtype (ex)== MUL
98104 new_terms = Dict {Any, Number} ()
@@ -112,57 +118,93 @@ function factor(old_ex::BasicSymbolic; eqs = Equation[])
112118 new_terms[eqs[index[1 ]]. lhs] = 1
113119 end
114120 else
115- factor (key^ val, eqs= eqs)
121+ factor (key^ val, eqs= eqs, split_div = split_div )
116122 new_terms[eqs[end ]. lhs] = 1
117123 end
118124 end
119125 new_mul = SymbolicUtils. Mul (Real, ex. coeff, new_terms)
120- factor (new_mul, eqs= eqs)
126+ factor (new_mul, eqs= eqs, split_div = split_div )
121127 return eqs
122128 elseif exprtype (ex)== DIV
123- if base_term (ex. num)
124- new_num = ex. num
125- else
126- factor (ex. num, eqs= eqs)
127- new_num = eqs[end ]. lhs
128- end
129- if base_term (ex. den)
130- new_den = ex. den
129+ if split_div
130+ if isone (Num (ex. num))
131+ if base_term (ex. den)
132+ new_den = ex. den
133+ else
134+ factor (ex. den, eqs= eqs, split_div= split_div)
135+ new_den = eqs[end ]. lhs
136+ end
137+ new_div = SymbolicUtils. Div (1 , new_den)
138+ factor (new_div, eqs= eqs, split_div= split_div)
139+ return eqs
140+ else
141+ new_terms = Dict {Any, Number} ()
142+ coeff = 1
143+ if base_term (ex. num)
144+ if typeof (ex. num)<: Real
145+ coeff = ex. num
146+ else
147+ new_terms[ex. num] = 1
148+ end
149+ else
150+ factor (ex. num, eqs= eqs, split_div= split_div)
151+ new_terms[eqs[end ]. lhs] = 1
152+ end
153+ if base_term (ex. den)
154+ new_terms[1 / ex. den] = 1
155+ else
156+ factor (1 / ex. den, eqs= eqs, split_div= split_div)
157+ new_terms[eqs[end ]. lhs] = 1
158+ end
159+ new_mul = SymbolicUtils. Mul (Real, coeff, new_terms)
160+ factor (new_mul, eqs= eqs, split_div= split_div)
161+ return eqs
162+ end
131163 else
132- factor (ex. den, eqs= eqs)
133- new_den = eqs[end ]. lhs
164+ if base_term (ex. num)
165+ new_num = ex. num
166+ else
167+ factor (ex. num, eqs= eqs, split_div= split_div)
168+ new_num = eqs[end ]. lhs
169+ end
170+ if base_term (ex. den)
171+ new_den = ex. den
172+ else
173+ factor (ex. den, eqs= eqs, split_div= split_div)
174+ new_den = eqs[end ]. lhs
175+ end
176+ new_div = SymbolicUtils. Div (new_num, new_den)
177+ factor (new_div, eqs= eqs, split_div= split_div)
178+ return eqs
134179 end
135- new_div = SymbolicUtils. Div (new_num, new_den)
136- factor (new_div, eqs= eqs)
137- return eqs
138180 elseif exprtype (ex)== POW
139181 if base_term (ex. base)
140182 new_base = ex. base
141183 else
142- factor (ex. base, eqs= eqs)
184+ factor (ex. base, eqs= eqs, split_div = split_div )
143185 new_base = eqs[end ]. lhs
144186 end
145187 if base_term (ex. exp)
146188 new_exp = ex. exp
147189 else
148- factor (ex. exp, eqs= eqs)
190+ factor (ex. exp, eqs= eqs, split_div = split_div )
149191 new_exp = eqs[end ]. lhs
150192 end
151193 new_pow = SymbolicUtils. Pow (new_base, new_exp)
152- factor (new_pow, eqs= eqs)
194+ factor (new_pow, eqs= eqs, split_div = split_div )
153195 return eqs
154196 elseif exprtype (ex)== TERM
155197 new_args = []
156198 for arg in ex. arguments
157199 if base_term (arg)
158200 push! (new_args, arg)
159201 else
160- factor (arg, eqs= eqs)
202+ factor (arg, eqs= eqs, split_div = split_div )
161203 push! (new_args, eqs[end ]. lhs)
162204 end
163205 end
164206 new_func = SymbolicUtils. Term (ex. f, new_args)
165- factor (new_func, eqs= eqs)
207+ factor (new_func, eqs= eqs, split_div = split_div )
166208 return eqs
167209 end
168210 return eqs
0 commit comments