@@ -337,8 +337,6 @@ function get_children(n::ArrayNode{T,D,S}, ::Val{d}) where {T,D,S,d}
337337 end , Val (Int (d)))
338338end
339339
340- get_children (n:: ArrayNode , d:: Integer ) = get_children (n, Val (d))
341-
342340function set_children! (n:: ArrayNode{T,D,S} , cs:: Tuple ) where {T,D,S}
343341 tree = getfield (n, :tree )
344342 idx = getfield (n, :idx )
@@ -384,167 +382,4 @@ end
384382
385383Base. copy (n:: ArrayNode ) = copy_node (n)
386384
387- # count_nodes - optimized version that checks if we're at root
388- function count_nodes (n:: ArrayNode )
389- tree = getfield (n, :tree )
390- idx = getfield (n, :idx )
391- # Optimization: if this is the root of the tree, just return total nodes
392- if tree. root_idx == idx
393- return Int (tree. n_nodes)
394- else
395- # Fall back to tree_mapreduce for subtrees
396- return tree_mapreduce (_ -> 1 , + , n, Int)
397- end
398- end
399-
400- # Equality and hash
401- function Base.:(== )(a:: ArrayNode , b:: ArrayNode )
402- a. degree != b. degree && return false
403-
404- if a. degree == 0
405- a. constant != b. constant && return false
406- if a. constant
407- return a. val == b. val
408- else
409- return a. feature == b. feature
410- end
411- else
412- a. op != b. op && return false
413-
414- # Compare children recursively
415- for i in 1 : (a. degree)
416- ca = get_children (a, Val (Int (a. degree)))[i]
417- cb = get_children (b, Val (Int (b. degree)))[i]
418- ca != cb && return false
419- end
420- return true
421- end
422- end
423-
424- function Base. hash (n:: ArrayNode , h:: UInt = zero (UInt))
425- if n. degree == 0
426- if n. constant
427- return hash ((0 , n. val), h)
428- else
429- return hash ((1 , n. feature), h)
430- end
431- else
432- children_hashes = ntuple (
433- i -> begin
434- child = get_children (n, Val (Int (n. degree)))[i]
435- hash (child, h)
436- end , Val (Int (n. degree))
437- )
438- return hash ((n. degree + 1 , n. op, children_hashes), h)
439- end
440- end
441-
442- # set_node! implementation
443- function set_node! (dst:: ArrayNode , src:: ArrayNode )
444- dst_tree = getfield (dst, :tree )
445- src_tree = getfield (src, :tree )
446- dst_idx = getfield (dst, :idx )
447- src_idx = getfield (src, :idx )
448-
449- dst. degree = src. degree
450-
451- if src. degree == 0
452- dst. constant = src. constant
453- if src. constant
454- dst. val = src. val
455- else
456- dst. feature = src. feature
457- end
458- else
459- dst. op = src. op
460-
461- D = max_degree (typeof (dst))
462- child_indices = ntuple (
463- i -> begin
464- if i <= src. degree
465- child_idx = @inbounds src_tree. nodes. children[src_idx][i]
466- if child_idx > 0
467- if dst_tree === src_tree
468- # Same tree
469- child_idx
470- else
471- # Different tree - need to copy
472- copy_subtree! (dst_tree, src_tree, child_idx)
473- end
474- else
475- UInt16 (0 )
476- end
477- else
478- UInt16 (0 )
479- end
480- end ,
481- Val (D),
482- )
483- dst_tree. nodes. children[dst_idx] = child_indices
484- end
485-
486- return nothing
487- end
488-
489- # tree_mapreduce and any
490- function tree_mapreduce (
491- f:: F ,
492- op:: G ,
493- n:: ArrayNode ,
494- (:: Type{RT} )= Any;
495- f_on_shared= nothing ,
496- break_sharing= Val (false ),
497- kwargs... ,
498- ) where {F<: Function ,G<: Function ,RT}
499- tree = getfield (n, :tree )
500- return mapreduce_impl (f, op, tree, getfield (n, :idx ))
501- end
502-
503- @inline function mapreduce_impl (f:: F , op:: G , tree:: ArrayTree{T,D,S} , idx:: UInt16 ) where {F,G,T,D,S}
504- degree = @inbounds tree. nodes. degree[idx]
505- node = ArrayNode {T,D,S} (tree, idx)
506- result = @inline f (node)
507-
508- if degree > 0
509- child_results = ntuple (
510- i -> begin
511- child_idx = @inbounds tree. nodes. children[idx][i]
512- if child_idx > 0
513- mapreduce_impl (f, op, tree, child_idx)
514- else
515- nothing
516- end
517- end , Val (Int (degree))
518- )
519-
520- # Filter out nothings and apply op
521- valid_results = filter (x -> ! isnothing (x), child_results)
522- if ! isempty (valid_results)
523- return op (result, valid_results... )
524- end
525- end
526-
527- return result
528- end
529-
530- function any (f:: F , n:: ArrayNode ) where {F<: Function }
531- tree = getfield (n, :tree )
532- return any_impl (f, tree, getfield (n, :idx ))
533- end
534-
535- function any_impl (f:: F , tree:: ArrayTree{T,D,S} , idx:: UInt16 ) where {F,T,D,S}
536- node = ArrayNode {T,D,S} (tree, idx)
537- f (node) && return true
538-
539- degree = @inbounds tree. nodes. degree[idx]
540- for i in 1 : degree
541- child_idx = @inbounds tree. nodes. children[idx][i]
542- if child_idx > 0 && any_impl (f, tree, child_idx)
543- return true
544- end
545- end
546-
547- return false
548- end
549-
550385end # module
0 commit comments