@@ -94,7 +94,7 @@ function tree_mapreduce(
9494 f_on_shared:: H = (result, is_shared) -> result,
9595 break_sharing:: Val{BS} = Val (false ),
9696) where {F1<: Function ,F2<: Function ,G<: Function ,H<: Function ,RT,BS}
97- sharing = preserve_sharing (typeof (tree)) && ! break_sharing
97+ sharing = preserve_sharing (typeof (tree)) && ! BS
9898
9999 RT == Undefined &&
100100 sharing &&
@@ -110,7 +110,9 @@ function tree_mapreduce(
110110 end
111111end
112112
113- struct TreeMapreducer{D,ID,F1<: Function ,F2<: Function ,G<: Function ,H<: Function }
113+ struct TreeMapreducer{
114+ D,ID<: Union{Nothing,Dict} ,F1<: Function ,F2<: Function ,G<: Function ,H<: Function
115+ }
114116 max_degree:: Val{D}
115117 id_map:: ID
116118 f_leaf:: F1
@@ -119,43 +121,32 @@ struct TreeMapreducer{D,ID,F1<:Function,F2<:Function,G<:Function,H<:Function}
119121 f_on_shared:: H
120122end
121123
122- @generated function (mapreducer:: TreeMapreducer{MAX_DEGREE,ID} )(
123- tree:: AbstractNode
124- ) where {MAX_DEGREE,ID}
125- base_expr = quote
126- d = tree. degree
127- Base. Cartesian. @nif (
128- $ (MAX_DEGREE + 1 ),
129- d_p_one -> (d_p_one - 1 ) == d,
130- d_p_one -> if d_p_one == 1
131- mapreducer. f_leaf (tree)
132- else
133- mapreducer. op (
134- mapreducer. f_branch (tree),
135- Base. Cartesian. @ntuple (
136- d_p_one - 1 , i -> mapreducer (tree. children[i][])
137- ). .. ,
138- )
139- end
124+ function (mapreducer:: TreeMapreducer{2,Nothing} )(tree:: AbstractNode )
125+ if tree. degree == 0
126+ return mapreducer. f_leaf (tree)
127+ elseif tree. degree == 1
128+ return mapreducer. op (mapreducer. f_branch (tree), mapreducer (tree. l))
129+ else
130+ return mapreducer. op (
131+ mapreducer. f_branch (tree), mapreducer (tree. l), mapreducer (tree. r)
140132 )
141133 end
142- if ID <: Nothing
143- # No sharing of nodes (is a tree, not a graph)
144- return base_expr
134+ end
135+ function (mapreducer:: TreeMapreducer{2,Dict} )(tree:: AbstractNode )
136+ key = objectid (tree)
137+ is_cached = haskey (mapreducer. id_map, key)
138+ if is_cached
139+ return mapreducer. f_on_shared (@inbounds (mapreducer. id_map[key]), true )
145140 else
146- # Otherwise, we need to cache results in `id_map`
147- # according to `objectid` of the node
148- return quote
149- key = objectid (tree)
150- is_cached = haskey (mapreducer. id_map, key)
151- if is_cached
152- return mapreducer. f_on_shared (@inbounds (mapreducer. id_map[key]), true )
153- else
154- res = $ base_expr
155- mapreducer. id_map[key] = res
156- return mapreducer. f_on_shared (res, false )
157- end
141+ result = if tree. degree == 0
142+ mapreducer. f_leaf (tree)
143+ elseif tree. degree == 1
144+ mapreducer. op (mapreducer. f_branch (tree), mapreducer (tree. l))
145+ else
146+ mapreducer. op (mapreducer. f_branch (tree), mapreducer (tree. l), mapreducer (tree. r))
158147 end
148+ mapreducer. id_map[key] = result
149+ return mapreducer. f_on_shared (result, false )
159150 end
160151end
161152
0 commit comments