@@ -265,12 +265,9 @@ vvextrema(A; dims=:, init=(typemax, typemin)) =
265
265
266
266
# reduction over all dims
267
267
@generated function vvmapreduce (f:: F , op:: OP , init:: I , A:: AbstractArray{T, N} , :: Colon ) where {F, OP, I, T, N}
268
- # fsym = F.instance
269
268
opsym = OP. instance
270
269
initsym = I. instance
271
- # Tₒ = Base.promote_op(opsym, Base.promote_op(fsym, T), Int)
272
270
quote
273
- # ξ = $initsym($Tₒ)
274
271
ξ = $ initsym (Base. promote_op ($ opsym, Base. promote_op (f, $ T), Int))
275
272
@turbo for i ∈ eachindex (A)
276
273
ξ = $ opsym (f (A[i]), ξ)
@@ -584,162 +581,6 @@ end
584
581
map_quote ()
585
582
end
586
583
587
-
588
- # ###############
589
- # function vvmapreduce2(f::F, op::OP, init::I, A::AbstractArray{T, N}, dims::NTuple{M, Int}) where {F, OP, I, T, N, M}
590
- # Dᴬ = size(A)
591
- # Dᴮ′ = ntuple(d -> d ∈ dims ? 1 : Dᴬ[d], Val(N))
592
- # B = similar(A, Base.promote_op(op, Base.promote_op(f, T), Int), Dᴮ′)
593
- # _vvmapreduce2!(f, op, init, B, A, dims)
594
- # return B
595
- # end
596
- # # reduction over all dims
597
- # @generated function vvmapreduce2(f::F, op::OP, init::I, A::AbstractArray{T, N}, ::Colon) where {F, OP, I, T, N}
598
- # fsym = F.instance
599
- # opsym = OP.instance
600
- # initsym = I.instance
601
- # # Tₒ = Base.promote_op(opsym, Base.promote_op(fsym, T), Int)
602
- # quote
603
- # # ξ = $initsym($Tₒ)
604
- # ξ = $initsym(Base.promote_op($opsym, Base.promote_op(f, $T), Int))
605
- # @turbo for i ∈ eachindex(A)
606
- # ξ = $opsym(f(A[i]), ξ)
607
- # end
608
- # return ξ
609
- # end
610
- # end
611
-
612
- # function staticdim_mapreduce2_quote(OP, I, static_dims::Vector{Int}, N::Int)
613
- # A = Expr(:ref, :A, ntuple(d -> Symbol(:i_, d), N)...)
614
- # Bᵥ = Expr(:call, :view, :B)
615
- # Bᵥ′ = Expr(:ref, :Bᵥ)
616
- # rinds = Int[]
617
- # nrinds = Int[]
618
- # for d = 1:N
619
- # if d ∈ static_dims
620
- # push!(Bᵥ.args, Expr(:call, :firstindex, :B, d))
621
- # push!(rinds, d)
622
- # else
623
- # push!(Bᵥ.args, :)
624
- # push!(nrinds, d)
625
- # push!(Bᵥ′.args, Symbol(:i_, d))
626
- # end
627
- # end
628
- # reverse!(rinds)
629
- # reverse!(nrinds)
630
- # if !isempty(nrinds)
631
- # block = Expr(:block)
632
- # loops = Expr(:for, Expr(:(=), Symbol(:i_, nrinds[1]),
633
- # Expr(:call, :indices, Expr(:tuple, :A, :B), nrinds[1])), block)
634
- # # loops = Expr(:for, :($(Symbol(:i_, nrinds[1])) = indices((A, B), $(nrinds[1]))), block)
635
- # for i = 2:length(nrinds)
636
- # # for d ∈ @view(nrinds[2:end])
637
- # newblock = Expr(:block)
638
- # push!(block.args,
639
- # Expr(:for, Expr(:(=), Symbol(:i_, nrinds[i]),
640
- # Expr(:call, :indices, Expr(:tuple, :A, :B), nrinds[i])), newblock))
641
- # # push!(block.args, Expr(:for, :($(Symbol(:i_, d)) = indices((A, B), $d)), newblock))
642
- # block = newblock
643
- # end
644
- # rblock = block
645
- # # Pre-reduction
646
- # ξ = Expr(:(=), :ξ, Expr(:call, Symbol(I.instance), Expr(:call, :eltype, :Bᵥ)))
647
- # push!(rblock.args, ξ)
648
- # # Reduction loop
649
- # for d ∈ rinds
650
- # newblock = Expr(:block)
651
- # push!(block.args, Expr(:for, Expr(:(=), Symbol(:i_, d), Expr(:call, :axes, :A, d)), newblock))
652
- # # push!(block.args, Expr(:for, :($(Symbol(:i_, d)) = axes(A, $d)), newblock))
653
- # block = newblock
654
- # end
655
- # # Push to inside innermost loop
656
- # setξ = Expr(:(=), :ξ, Expr(:call, Symbol(OP.instance),
657
- # Expr(:call, :f, A), :ξ))
658
- # push!(block.args, setξ)
659
- # setb = Expr(:(=), Bᵥ′, :ξ)
660
- # push!(rblock.args, setb)
661
- # return quote
662
- # Bᵥ = $Bᵥ
663
- # @turbo $loops
664
- # return B
665
- # end
666
- # else
667
- # # Pre-reduction
668
- # ξ = Expr(:(=), :ξ, Expr(:call, Symbol(I.instance), Expr(:call, :eltype, :Bᵥ)))
669
- # # Reduction loop
670
- # block = Expr(:block)
671
- # loops = Expr(:for, Expr(:(=), Symbol(:i_, rinds[1]),
672
- # Expr(:call, :axes, :A, rinds[1])), block)
673
- # # loops = Expr(:for, :($(Symbol(:i_, rinds[1])) = axes(A, $(rinds[1]))), block)
674
- # for i = 2:length(rinds)
675
- # newblock = Expr(:block)
676
- # push!(block.args, Expr(:for, Expr(:(=), Symbol(:i_, rinds[i]),
677
- # Expr(:call, :axes, :A, rinds[i])), newblock))
678
- # # push!(block.args, Expr(:for, :($(Symbol(:i_, d)) = axes(A, $d)), newblock))
679
- # block = newblock
680
- # end
681
- # # Push to inside innermost loop
682
- # setξ = Expr(:(=), :ξ, Expr(:call, Symbol(OP.instance),
683
- # Expr(:call, :f, A), :ξ))
684
- # push!(block.args, setξ)
685
- # return quote
686
- # Bᵥ = $Bᵥ
687
- # $ξ
688
- # @turbo $loops
689
- # Bᵥ[] = ξ
690
- # return B
691
- # end
692
- # end
693
- # end
694
-
695
- # function branches_mapreduce2_quote(OP, I, N::Int, M::Int, D)
696
- # static_dims = Int[]
697
- # for m ∈ 1:M
698
- # param = D.parameters[m]
699
- # if param <: StaticInt
700
- # new_dim = _dim(param)::Int
701
- # push!(static_dims, new_dim)
702
- # else
703
- # # tuple of static dimensions
704
- # t = Expr(:tuple)
705
- # for n ∈ static_dims
706
- # push!(t.args, :(StaticInt{$n}()))
707
- # end
708
- # q = Expr(:block, :(dimm = dims[$m]))
709
- # qold = q
710
- # # if-elseif statements
711
- # ifsym = :if
712
- # for n ∈ 1:N
713
- # n ∈ static_dims && continue
714
- # tc = copy(t)
715
- # push!(tc.args, :(StaticInt{$n}()))
716
- # qnew = Expr(ifsym, :(dimm == $n), :(return _vvmapreduce2!(f, op, init, B, A, $tc)))
717
- # for r ∈ m+1:M
718
- # push!(tc.args, :(dims[$r]))
719
- # end
720
- # push!(qold.args, qnew)
721
- # qold = qnew
722
- # ifsym = :elseif
723
- # end
724
- # # else statement
725
- # tc = copy(t)
726
- # for r ∈ m+1:M
727
- # push!(tc.args, :(dims[$r]))
728
- # end
729
- # push!(qold.args, Expr(:block, :(return _vvmapreduce2!(f, op, init, B, A, $tc))))
730
- # return q
731
- # end
732
- # end
733
- # return staticdim_mapreduce2_quote(OP, I, static_dims, N)
734
- # end
735
-
736
- # @generated function _vvmapreduce2!(f::F, op::OP, init::I, B::AbstractArray{Tₒ, N}, A::AbstractArray{T, N}, dims::D) where {F, OP, I, Tₒ, T, N, M, D<:Tuple{Vararg{Integer, M}}}
737
- # branches_mapreduce2_quote(OP, I, N, M, D)
738
- # end
739
- # @generated function _vvmapreduce2!(f::F, op::OP, init::I, B::AbstractArray{Tₒ, N}, A::AbstractArray{T, N}, dims::Tuple{}) where {F, OP, I, Tₒ, T, N}
740
- # :(copyto!(B, A); return B)
741
- # end
742
-
743
584
# ###########################################################################################
744
585
745
586
"""
0 commit comments