@@ -8,16 +8,10 @@ import ..NodeModule:
88 constructorof,
99 with_type_parameters,
1010 with_max_degree,
11- preserve_sharing,
12- max_degree,
1311 default_allocator,
1412 get_children,
1513 set_children!,
1614 unsafe_get_children,
17- tree_mapreduce,
18- count_nodes,
19- set_node!,
20- any,
2115 copy_node
2216
2317export ArrayNode
@@ -215,13 +209,17 @@ function ArrayNode{T,D}(
215209 tree. nodes. degree[idx] = 0
216210 tree. nodes. constant[idx] = true
217211 tree. nodes. val[idx] = val
212+ # Clear children for leaf node
213+ tree. nodes. children[idx] = ntuple (_ -> UInt16 (0 ), Val (D))
218214 return ArrayNode {T,D,typeof(tree.nodes)} (tree, idx)
219215 end
220216
221217 if ! isnothing (feature)
222218 tree. nodes. degree[idx] = 0
223219 tree. nodes. constant[idx] = false
224220 tree. nodes. feature[idx] = feature
221+ # Clear children for leaf node
222+ tree. nodes. children[idx] = ntuple (_ -> UInt16 (0 ), Val (D))
225223 return ArrayNode {T,D,typeof(tree.nodes)} (tree, idx)
226224 end
227225
@@ -273,6 +271,7 @@ function ArrayNode{T,D}(
273271 tree. nodes. degree[idx] = 0
274272 tree. nodes. constant[idx] = true
275273 tree. nodes. val[idx] = zero (T)
274+ tree. nodes. children[idx] = ntuple (_ -> UInt16 (0 ), Val (D))
276275 return ArrayNode {T,D,typeof(tree.nodes)} (tree, idx)
277276end
278277
455454
456455Base. copy (n:: ArrayNode ) = copy_node (n)
457456
458- # tree_mapreduce implementation
459- function tree_mapreduce (
460- f:: F ,
461- op:: G ,
462- tree:: ArrayNode{T,D,S} ,
463- result_type:: Type{RT} = Undefined;
464- f_on_shared:: H = (result, is_shared) -> result,
465- break_sharing:: Val{BS} = Val (false ),
466- ) where {F<: Function ,G<: Function ,H<: Function ,T,D,S,RT,BS}
467- return tree_mapreduce (f, f, op, tree, result_type; f_on_shared, break_sharing)
468- end
469-
470- function tree_mapreduce (
471- f_leaf:: F1 ,
472- f_branch:: F2 ,
473- op:: G ,
474- tree:: ArrayNode{T,D,S} ,
475- result_type:: Type{RT} = Undefined;
476- f_on_shared:: H = (result, is_shared) -> result,
477- break_sharing:: Val{BS} = Val (false ),
478- ) where {F1<: Function ,F2<: Function ,G<: Function ,H<: Function ,T,D,S,RT,BS}
479- # ArrayNode doesn't preserve sharing, so we can use simple recursion
480- if tree. degree == 0
481- return f_leaf (tree)
482- else
483- # Apply to children
484- degree = tree. degree
485- children_results = ntuple (Val (Int (degree))) do i
486- child = get_children (tree, Val (degree))[i]
487- tree_mapreduce (
488- f_leaf, f_branch, op, child, result_type; f_on_shared, break_sharing
489- )
490- end
491-
492- # Reduce children results
493- self_result = f_branch (tree)
494- return op (self_result, children_results... )
495- end
496- end
497-
498457end # module
0 commit comments