@@ -108,13 +108,12 @@ end
108108 if tree. degree == 0
109109 return @inline (f_leaf (tree))
110110 elseif tree. degree == 1
111- return op (@inline (f_branch (tree)), _tree_mapreduce (f_leaf, f_branch, op, tree. l))
111+ l = _tree_mapreduce (f_leaf, f_branch, op, tree. l)
112+ return @inline (op (@inline (f_branch (tree)), l))
112113 else
113- return op (
114- @inline (f_branch (tree)),
115- _tree_mapreduce (f_leaf, f_branch, op, tree. l),
116- _tree_mapreduce (f_leaf, f_branch, op, tree. r),
117- )
114+ l = _tree_mapreduce (f_leaf, f_branch, op, tree. l)
115+ r = _tree_mapreduce (f_leaf, f_branch, op, tree. r)
116+ return @inline (op (@inline (f_branch (tree)), l, r))
118117 end
119118end
120119
@@ -123,9 +122,12 @@ function mapreduce(f::F, op::G, tree::Node; init=nothing) where {F<:Function,G<:
123122 if tree. degree == 0
124123 return @inline (f (tree))
125124 elseif tree. degree == 1
126- return op (@inline (f (tree)), mapreduce (f, op, tree. l; init))
125+ l = mapreduce (f, op, tree. l; init)
126+ return @inline (op (@inline (f (tree)), l))
127127 else
128- return op (op (@inline (f (tree)), mapreduce (f, op, tree. l; init)), mapreduce (f, op, tree. r; init))
128+ l = mapreduce (f, op, tree. l; init)
129+ r = mapreduce (f, op, tree. r; init)
130+ return @inline (op (op (@inline (f (tree)), l), r))
129131 end
130132end
131133# ! format: on
@@ -315,8 +317,8 @@ Note that this will *not* preserve loops in graphs.
315317function copy_node (tree:: N ; preserve_sharing:: Bool = false ) where {T,N<: Node{T} }
316318 return tree_mapreduce (
317319 t -> t. constant ? Node (; val= t. val:: T ) : Node (T; feature= t. feature),
318- t -> t . op ,
319- (op , c... ) -> Node (op, c... ),
320+ identity ,
321+ (p , c... ) -> Node (p . op, c... ),
320322 tree;
321323 preserve_sharing,
322324 result_type= N,
0 commit comments