(define rv (fn (arr) (get arr :ravel))) (define sh (fn (arr) (get arr :shape))) (apl-test "reduce +/ vector" (rv (apl-reduce apl-add (make-array (list 5) (list 1 2 3 4 5)))) (list 15)) (apl-test "reduce x/ vector" (rv (apl-reduce apl-mul (make-array (list 4) (list 1 2 3 4)))) (list 24)) (apl-test "reduce max/ vector" (rv (apl-reduce apl-max (make-array (list 5) (list 3 1 4 1 5)))) (list 5)) (apl-test "reduce min/ vector" (rv (apl-reduce apl-min (make-array (list 3) (list 3 1 4)))) (list 1)) (apl-test "reduce and/ all true" (rv (apl-reduce apl-and (make-array (list 3) (list 1 1 1)))) (list 1)) (apl-test "reduce or/ with true" (rv (apl-reduce apl-or (make-array (list 3) (list 0 0 1)))) (list 1)) (apl-test "reduce +/ single element" (rv (apl-reduce apl-add (make-array (list 1) (list 42)))) (list 42)) (apl-test "reduce +/ scalar no-op" (rv (apl-reduce apl-add (apl-scalar 7))) (list 7)) (apl-test "reduce +/ shape is scalar" (sh (apl-reduce apl-add (make-array (list 4) (list 1 2 3 4)))) (list)) (apl-test "reduce +/ matrix row sums shape" (sh (apl-reduce apl-add (make-array (list 2 3) (list 1 2 3 4 5 6)))) (list 2)) (apl-test "reduce +/ matrix row sums values" (rv (apl-reduce apl-add (make-array (list 2 3) (list 1 2 3 4 5 6)))) (list 6 15)) (apl-test "reduce max/ matrix row maxima" (rv (apl-reduce apl-max (make-array (list 2 3) (list 3 1 4 1 5 9)))) (list 4 9)) (apl-test "reduce-first +/ vector same as reduce" (rv (apl-reduce-first apl-add (make-array (list 5) (list 1 2 3 4 5)))) (list 15)) (apl-test "reduce-first +/ matrix col sums shape" (sh (apl-reduce-first apl-add (make-array (list 2 3) (list 1 2 3 4 5 6)))) (list 3)) (apl-test "reduce-first +/ matrix col sums values" (rv (apl-reduce-first apl-add (make-array (list 2 3) (list 1 2 3 4 5 6)))) (list 5 7 9)) (apl-test "reduce-first max/ matrix col maxima" (rv (apl-reduce-first apl-max (make-array (list 3 2) (list 1 9 2 8 3 7)))) (list 3 9))