Skip to content

Commit 38ef14a

Browse files
committed
refactor: remove redundant parts of interface
1 parent 8d5b3a7 commit 38ef14a

File tree

1 file changed

+0
-165
lines changed

1 file changed

+0
-165
lines changed

src/ArrayNode.jl

Lines changed: 0 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -337,8 +337,6 @@ function get_children(n::ArrayNode{T,D,S}, ::Val{d}) where {T,D,S,d}
337337
end, Val(Int(d)))
338338
end
339339

340-
get_children(n::ArrayNode, d::Integer) = get_children(n, Val(d))
341-
342340
function 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

385383
Base.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-
550385
end # module

0 commit comments

Comments
 (0)