@@ -43,7 +43,7 @@ function turn_to_poly(expr, var)
4343 expr = unwrap (expr)
4444 ! iscall (expr) && return (expr, Dict ())
4545
46- args = arguments (expr)
46+ args = copy ( parent ( arguments (expr)) )
4747
4848 sub = 0
4949 broken = Ref (false )
@@ -53,12 +53,12 @@ function turn_to_poly(expr, var)
5353 arg_oper = operation (arg)
5454
5555 if arg_oper === (^ )
56- tp = trav_pow (args, i , var, broken, sub)
56+ args[i], tp = trav_pow (args[i] , var, broken, sub)
5757 sub = isequal (tp, false ) ? sub : tp
5858 continue
5959 end
6060 if arg_oper === (* )
61- sub = trav_mult (arg, var, broken, sub)
61+ args[i], sub = trav_mult (arg, var, broken, sub)
6262 continue
6363 end
6464 isequal (add_sub (sub, arg, var, broken), false ) && continue
@@ -77,16 +77,17 @@ function turn_to_poly(expr, var)
7777
7878 new_var = gensym ()
7979 new_var = (@variables $ new_var)[1 ]
80+ expr = maketerm (typeof (expr), operation (expr), args, metadata (expr))
8081 return ssubs (expr, Dict (sub => new_var)), Dict {Any, Any} (new_var => sub)
8182end
8283
8384"""
84- trav_pow(args, index , var, broken, sub)
85+ trav_pow(arg , var, broken, sub)
8586
86- Traverses an argument passed from ``turn_to_poly`` if it
87- satisfies ``oper === (^)``. Returns sub if changed from 0
88- to a new transcendental function or its value is
89- kept the same, and false if these 2 cases do not occur.
87+ Traverses an argument `arg` passed from ``turn_to_poly`` if it satisfies
88+ ``oper === (^)``. Returns the new `arg` and ` sub` if `sub` is changed from 0 to a new
89+ transcendental function or its value is kept the same, or else `false` if these 2 cases
90+ do not occur.
9091
9192# Arguments
9293- args: The original arguments array of the expression passed to ``turn_to_poly``
@@ -97,20 +98,20 @@ kept the same, and false if these 2 cases do not occur.
9798
9899# Examples
99100```jldoctest
100- julia> trav_pow([ unwrap(9^x)], 1 , x, Ref(false), 3^x)
101- 3^x
101+ julia> trav_pow(unwrap(9^x), x, Ref(false), 3^x)
102+ (9^x, 3^x)
102103
103- julia> trav_pow([ unwrap(x^2)], 1 , x, Ref(false), 3^x)
104- false
104+ julia> trav_pow(unwrap(x^2), x, Ref(false), 3^x)
105+ (x^2, false)
105106```
106107"""
107- function trav_pow (args, index , var, broken, sub)
108- args_arg = arguments (args[index] )
108+ function trav_pow (arg , var, broken, sub)
109+ args_arg = arguments (arg )
109110 base = args_arg[1 ]
110111 power = args_arg[2 ]
111112
112113 # case 1: log(x)^2 .... 9^x = 3^2^x = 3^2x = (3^x)^2
113- ! isequal (add_sub (sub, base, var, broken), false ) && power isa Integer && return base
114+ ! isequal (add_sub (sub, base, var, broken), false ) && power isa Integer && return arg, base
114115
115116 # case 2: int^f(x)
116117 # n_func_occ may not be strictly 1, we could attempt attracting it after solving
@@ -122,21 +123,20 @@ function trav_pow(args, index, var, broken, sub)
122123 sub = isequal (sub, 0 ) ? new_b : sub
123124 if ! isequal (sub, new_b)
124125 broken[] = true
125- return false
126+ return arg, false
126127 end
127128 new_b = term (^ , new_b, p)
128- args[index] = new_b
129- return sub
129+ return new_b, sub
130130 end
131131
132- return false
132+ return arg, false
133133end
134134
135135"""
136136 trav_mult(arg, var, broken, sub)
137137
138138Traverses an argument passed from ``turn_to_poly`` if it
139- satisfies ``oper === (*)``. Returns sub whether its changed from 0
139+ satisfies ``oper === (*)``. Returns the new `arg` and ` sub` if its changed from 0
140140to a new transcendental function or its value is
141141kept the same, but changes broken if these 2 cases do not occur. It
142142traverses the * argument by sub_arg and compares it to sub using
@@ -151,32 +151,33 @@ the function ``add_sub``
151151# Examples
152152```jldoctest
153153julia> trav_mult(unwrap(9*log(x)), x, Ref(false), log(x))
154- log(x)
154+ (9log(x), log(x) )
155155
156156julia> trav_mult(unwrap(9*log(x)^2), x, Ref(false), log(x))
157- log(x)
157+ (9( log(x)^2), log(x) )
158158
159159# value of broken is changed here to true
160160julia> trav_mult(unwrap(9*log(x+1)), x, Ref(false), log(x))
161- log(x)
161+ (9log(x + 1), log(x) )
162162```
163163"""
164164function trav_mult (arg, var, broken, sub)
165- args_arg = arguments (arg)
165+ args_arg = copy ( parent ( arguments (arg)) )
166166 for (i, arg2) in enumerate (args_arg)
167167 ! iscall (arg2) && continue
168168
169169 oper = operation (arg2)
170170 if oper === (^ )
171- tp = trav_pow (args_arg, i , var, broken, sub)
171+ args_arg[i], tp = trav_pow (args_arg[i] , var, broken, sub)
172172 sub = isequal (tp, false ) ? sub : tp
173173 continue
174174 end
175175
176176 isequal (add_sub (sub, arg2, var, broken), false ) && continue
177177 sub = arg2
178178 end
179- return sub
179+ arg = maketerm (typeof (arg), operation (arg), args_arg, metadata (arg))
180+ return arg, sub
180181end
181182
182183"""
0 commit comments