From b4e5ae83e1eed5d13f378c2b436fed2a36f802a2 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 11:04:09 -0400 Subject: [PATCH 01/16] Add repeat rrules --- src/rulesets/Base/array.jl | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 3b3996373..cd9ecf927 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -103,3 +103,36 @@ function rrule(::typeof(fill), value::Any, dims::Int...) end return fill(value, dims), fill_pullback end + +##### +##### `repeat` +##### + +function rrule(::typeof(repeat), x::AbstractVector, m::Integer) + function repeat_pullback(Ȳ) + return (NO_FIELDS, dropdims(sum(reshape(Ȳ, length(x), :); dims=2); dims=2), DoesNotExist()) + end + return repeat(x,m), repeat_pullback +end + +function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) + function repeat_pullback(Ȳ) + Ȳ′ = reshape(Ȳ, size(x,1), m, size(x,2), n) + return (NO_FIELDS, reshape(sum(Ȳ′; dims=(2,4)), size(x)), DoesNotExist(), DoesNotExist()) + end + + return repeat(x,m,n), repeat_pullback + end + +function rrule(::typeof(repeat), xs, inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) + function repeat_pullback(Ȳ) + Ȳ′ = zero(xs) + S = size(xs) + for (dest_idx, val) ∈ pairs(IndexCartesian(), Ȳ) + src_idx = [mod1(div(dest_idx[dim] - 1, inner[dim]) + 1, S[dim]) for dim ∈ 1:length(S)] + Ȳ′[src_idx...] += val + end + return (NO_FIELDS, Ȳ′, ntuple(_->DoesNotExist(),length(inner)),ntuple(_->DoesNotExist(),length(outer))) + end + return repeat(xs, inner, outer), repeat_pullback +end \ No newline at end of file From 0778cd3d2540b7e45824f7efd565b4978db6e2d1 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 11:13:08 -0400 Subject: [PATCH 02/16] No kwargs sensitivities (don't DoesNotExist) --- src/rulesets/Base/array.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index cd9ecf927..b78818d30 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -132,7 +132,7 @@ function rrule(::typeof(repeat), xs, inner=ntuple(_->1, ndims(xs)), outer=ntuple src_idx = [mod1(div(dest_idx[dim] - 1, inner[dim]) + 1, S[dim]) for dim ∈ 1:length(S)] Ȳ′[src_idx...] += val end - return (NO_FIELDS, Ȳ′, ntuple(_->DoesNotExist(),length(inner)),ntuple(_->DoesNotExist(),length(outer))) + return (NO_FIELDS, Ȳ′) end - return repeat(xs, inner, outer), repeat_pullback + return repeat(xs, inner = inner, outer = outer), repeat_pullback end \ No newline at end of file From 779b8a3dae86f880cdbe514f39eb76a1949c8508 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 11:27:45 -0400 Subject: [PATCH 03/16] Tests, fix kwargs(?) --- src/rulesets/Base/array.jl | 4 ++-- test/rulesets/Base/array.jl | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index b78818d30..83130b90c 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -124,7 +124,7 @@ function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) return repeat(x,m,n), repeat_pullback end -function rrule(::typeof(repeat), xs, inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) +function rrule(::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) function repeat_pullback(Ȳ) Ȳ′ = zero(xs) S = size(xs) @@ -134,5 +134,5 @@ function rrule(::typeof(repeat), xs, inner=ntuple(_->1, ndims(xs)), outer=ntuple end return (NO_FIELDS, Ȳ′) end - return repeat(xs, inner = inner, outer = outer), repeat_pullback + return repeat(xs; inner = inner, outer = outer), repeat_pullback end \ No newline at end of file diff --git a/test/rulesets/Base/array.jl b/test/rulesets/Base/array.jl index 16e6e265d..41205082f 100644 --- a/test/rulesets/Base/array.jl +++ b/test/rulesets/Base/array.jl @@ -35,3 +35,9 @@ end test_rrule(fill, 44.0, 4; check_inferred=false) test_rrule(fill, 2.0, (3, 3, 3) ⊢ DoesNotExist()) end + +@testset "repeat" begin + test_rrule(repeat, randn(5), 3) + test_rrule(repeat, randn(3,3), 2) + test_rrule(repeat, randn(5,4,3); inner=(2,2,1), outer=(1,1,3)) +end \ No newline at end of file From e97e3c6a405c629e5371b19b00be7fc3dc41bb44 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 11:34:09 -0400 Subject: [PATCH 04/16] Use fkwargs --- test/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rulesets/Base/array.jl b/test/rulesets/Base/array.jl index 41205082f..93e4271c7 100644 --- a/test/rulesets/Base/array.jl +++ b/test/rulesets/Base/array.jl @@ -39,5 +39,5 @@ end @testset "repeat" begin test_rrule(repeat, randn(5), 3) test_rrule(repeat, randn(3,3), 2) - test_rrule(repeat, randn(5,4,3); inner=(2,2,1), outer=(1,1,3)) + test_rrule(repeat, randn(5,4,3); fkwargs=(inner=(2,2,1), outer=(1,1,3))) end \ No newline at end of file From d4ba6582e9aa4981973a0be7c3ae369638739ae5 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 11:39:07 -0400 Subject: [PATCH 05/16] Version bump --- Project.toml | 2 +- src/rulesets/Base/array.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index d300c1475..9a732804b 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ChainRules" uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "0.7.61" +version = "0.7.62" [deps] ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 83130b90c..cd34ad671 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -135,4 +135,4 @@ function rrule(::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple return (NO_FIELDS, Ȳ′) end return repeat(xs; inner = inner, outer = outer), repeat_pullback -end \ No newline at end of file +end From a3c4f131d6f4258a3ceb217e2edf32913855c619 Mon Sep 17 00:00:00 2001 From: Will Kimmerer Date: Fri, 30 Apr 2021 12:25:39 -0400 Subject: [PATCH 06/16] Update src/rulesets/Base/array.jl Co-authored-by: Miha Zgubic --- src/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index cd34ad671..668a863f7 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -112,7 +112,7 @@ function rrule(::typeof(repeat), x::AbstractVector, m::Integer) function repeat_pullback(Ȳ) return (NO_FIELDS, dropdims(sum(reshape(Ȳ, length(x), :); dims=2); dims=2), DoesNotExist()) end - return repeat(x,m), repeat_pullback + return repeat(x, m), repeat_pullback end function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) From e1e28435cc3556a6dddbcc32d30836e8d41963a7 Mon Sep 17 00:00:00 2001 From: Will Kimmerer Date: Fri, 30 Apr 2021 12:25:59 -0400 Subject: [PATCH 07/16] Update src/rulesets/Base/array.jl Co-authored-by: Miha Zgubic --- src/rulesets/Base/array.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 668a863f7..525cf4861 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -120,8 +120,7 @@ function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) Ȳ′ = reshape(Ȳ, size(x,1), m, size(x,2), n) return (NO_FIELDS, reshape(sum(Ȳ′; dims=(2,4)), size(x)), DoesNotExist(), DoesNotExist()) end - - return repeat(x,m,n), repeat_pullback + return repeat(x, m, n), repeat_pullback end function rrule(::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) From db385a61f90fd1e3748c2a639a540c51b342a3d0 Mon Sep 17 00:00:00 2001 From: Will Kimmerer Date: Fri, 30 Apr 2021 12:26:13 -0400 Subject: [PATCH 08/16] Update src/rulesets/Base/array.jl Co-authored-by: Miha Zgubic --- src/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 525cf4861..3429103ca 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -117,7 +117,7 @@ end function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) function repeat_pullback(Ȳ) - Ȳ′ = reshape(Ȳ, size(x,1), m, size(x,2), n) + Ȳ′ = reshape(Ȳ, size(x, 1), m, size(x, 2), n) return (NO_FIELDS, reshape(sum(Ȳ′; dims=(2,4)), size(x)), DoesNotExist(), DoesNotExist()) end return repeat(x, m, n), repeat_pullback From f9f154826826ae1fa919e89f70eb828b74fd21cb Mon Sep 17 00:00:00 2001 From: Will Kimmerer Date: Fri, 30 Apr 2021 12:26:23 -0400 Subject: [PATCH 09/16] Update src/rulesets/Base/array.jl Co-authored-by: Miha Zgubic --- src/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 3429103ca..1a5a0930d 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -123,7 +123,7 @@ function rrule(::typeof(repeat), x::AbstractVecOrMat, m::Integer, n::Integer=1) return repeat(x, m, n), repeat_pullback end -function rrule(::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) +function rrule(::typeof(repeat), xs::AbstractArray; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) function repeat_pullback(Ȳ) Ȳ′ = zero(xs) S = size(xs) From bdb1eb9ffe8bb0b361d4af2d89e88d9e1583c2f6 Mon Sep 17 00:00:00 2001 From: Will Kimmerer Date: Fri, 30 Apr 2021 12:26:34 -0400 Subject: [PATCH 10/16] Update src/rulesets/Base/array.jl Co-authored-by: Miha Zgubic --- src/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 1a5a0930d..798b65007 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -133,5 +133,5 @@ function rrule(::typeof(repeat), xs::AbstractArray; inner=ntuple(_->1, ndims(xs) end return (NO_FIELDS, Ȳ′) end - return repeat(xs; inner = inner, outer = outer), repeat_pullback + return repeat(xs; inner=inner, outer=outer), repeat_pullback end From 15b758a8c5e7cf51665df14ddd3aca2d62cc7914 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:31:08 -0400 Subject: [PATCH 11/16] add frules and rule for zero-dim --- src/rulesets/Base/array.jl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 798b65007..8d20f5821 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -135,3 +135,20 @@ function rrule(::typeof(repeat), xs::AbstractArray; inner=ntuple(_->1, ndims(xs) end return repeat(xs; inner=inner, outer=outer), repeat_pullback end + +function rrule(::typeof(repeat), x::AbstractArray{<:Real, 0}, m::Integer) + repeat_pullback(Ȳ) = (NO_FIELDS, similar(x, eltype(Ȳ)) .= sum(Ȳ), DoesNotExist()) + return repeat(x, m), repeat_pullback +end + +function frule((_,Δx), ::typeof(repeat), x, m::Integer) + return repeat(x, m), repeat(Δx, m) +end + +function frule((_,Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) + return repeat(xs; inner=inner, outer=outer), repeat(Δxs; inner=inner, outer=outer) +end + +function frule((_,Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) + return repeat(x,m), repeat(fill(Δx,m)) +end From 09c8f2eb6461456433e7291c65fe9d2875c63f47 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:37:49 -0400 Subject: [PATCH 12/16] 1 error on fill(4.0) rrule --- test/rulesets/Base/array.jl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/test/rulesets/Base/array.jl b/test/rulesets/Base/array.jl index 93e4271c7..0215bf222 100644 --- a/test/rulesets/Base/array.jl +++ b/test/rulesets/Base/array.jl @@ -38,6 +38,15 @@ end @testset "repeat" begin test_rrule(repeat, randn(5), 3) - test_rrule(repeat, randn(3,3), 2) - test_rrule(repeat, randn(5,4,3); fkwargs=(inner=(2,2,1), outer=(1,1,3))) -end \ No newline at end of file + test_rrule(repeat, randn(5), 3, 3) + test_rrule(repeat, randn(3, 3), 2) + test_rrule(repeat, randn(5, 5), 2,5) + test_rrule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) + test_rrule(repeat, fill(4.0), 3) + test_frule(repeat, randn(5), 3) + test_frule(repeat, randn(5), 3,3) + test_frule(repeat, randn(3, 3), 2) + test_frule(repeat, randn(3, 3), 2,5) + test_frule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) + test_frule(repeat, fill(4.0), 3) +end From c4d38eec721ab91d30d1fee6f7bb5849fc574113 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:39:18 -0400 Subject: [PATCH 13/16] Formatting --- src/rulesets/Base/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 8d20f5821..205ac70f2 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -150,5 +150,5 @@ function frule((_,Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), ou end function frule((_,Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) - return repeat(x,m), repeat(fill(Δx,m)) + return repeat(x, m), repeat(fill(Δx,m)) end From f55670d955400c9e7de5b355426c279ec436ee81 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:41:06 -0400 Subject: [PATCH 14/16] More formatting --- src/rulesets/Base/array.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index 205ac70f2..b65448e04 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -141,14 +141,14 @@ function rrule(::typeof(repeat), x::AbstractArray{<:Real, 0}, m::Integer) return repeat(x, m), repeat_pullback end -function frule((_,Δx), ::typeof(repeat), x, m::Integer) +function frule((_, Δx), ::typeof(repeat), x, m::Integer) return repeat(x, m), repeat(Δx, m) end -function frule((_,Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) +function frule((_, Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) return repeat(xs; inner=inner, outer=outer), repeat(Δxs; inner=inner, outer=outer) end -function frule((_,Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) +function frule((_, Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) return repeat(x, m), repeat(fill(Δx,m)) end From eabd344c13456fc07c4b0f894f153ca7c66b7502 Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:48:21 -0400 Subject: [PATCH 15/16] Rm frules --- src/rulesets/Base/array.jl | 12 ------------ test/rulesets/Base/array.jl | 7 +------ 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index b65448e04..d42a88453 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -140,15 +140,3 @@ function rrule(::typeof(repeat), x::AbstractArray{<:Real, 0}, m::Integer) repeat_pullback(Ȳ) = (NO_FIELDS, similar(x, eltype(Ȳ)) .= sum(Ȳ), DoesNotExist()) return repeat(x, m), repeat_pullback end - -function frule((_, Δx), ::typeof(repeat), x, m::Integer) - return repeat(x, m), repeat(Δx, m) -end - -function frule((_, Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) - return repeat(xs; inner=inner, outer=outer), repeat(Δxs; inner=inner, outer=outer) -end - -function frule((_, Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) - return repeat(x, m), repeat(fill(Δx,m)) -end diff --git a/test/rulesets/Base/array.jl b/test/rulesets/Base/array.jl index 0215bf222..b15ebd7ba 100644 --- a/test/rulesets/Base/array.jl +++ b/test/rulesets/Base/array.jl @@ -43,10 +43,5 @@ end test_rrule(repeat, randn(5, 5), 2,5) test_rrule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) test_rrule(repeat, fill(4.0), 3) - test_frule(repeat, randn(5), 3) - test_frule(repeat, randn(5), 3,3) - test_frule(repeat, randn(3, 3), 2) - test_frule(repeat, randn(3, 3), 2,5) - test_frule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) - test_frule(repeat, fill(4.0), 3) + end From 7e31be8a6b9d1a77779e96db66819bc86de61d7c Mon Sep 17 00:00:00 2001 From: Wimmerer Date: Fri, 30 Apr 2021 12:54:41 -0400 Subject: [PATCH 16/16] Add frules and tests --- src/rulesets/Base/array.jl | 12 ++++++++++++ test/rulesets/Base/array.jl | 22 ++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/rulesets/Base/array.jl b/src/rulesets/Base/array.jl index d42a88453..b65448e04 100644 --- a/src/rulesets/Base/array.jl +++ b/src/rulesets/Base/array.jl @@ -140,3 +140,15 @@ function rrule(::typeof(repeat), x::AbstractArray{<:Real, 0}, m::Integer) repeat_pullback(Ȳ) = (NO_FIELDS, similar(x, eltype(Ȳ)) .= sum(Ȳ), DoesNotExist()) return repeat(x, m), repeat_pullback end + +function frule((_, Δx), ::typeof(repeat), x, m::Integer) + return repeat(x, m), repeat(Δx, m) +end + +function frule((_, Δxs), ::typeof(repeat), xs; inner=ntuple(_->1, ndims(xs)), outer=ntuple(_->1, ndims(xs))) + return repeat(xs; inner=inner, outer=outer), repeat(Δxs; inner=inner, outer=outer) +end + +function frule((_, Δx), ::typeof(repeat), x::AbstractArray{<:Real,0}, m::Integer) + return repeat(x, m), repeat(fill(Δx,m)) +end diff --git a/test/rulesets/Base/array.jl b/test/rulesets/Base/array.jl index b15ebd7ba..f6692fcfd 100644 --- a/test/rulesets/Base/array.jl +++ b/test/rulesets/Base/array.jl @@ -37,11 +37,21 @@ end end @testset "repeat" begin - test_rrule(repeat, randn(5), 3) - test_rrule(repeat, randn(5), 3, 3) - test_rrule(repeat, randn(3, 3), 2) - test_rrule(repeat, randn(5, 5), 2,5) - test_rrule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) - test_rrule(repeat, fill(4.0), 3) + @testset "rrule" begin + test_rrule(repeat, randn(5), 3) + test_rrule(repeat, randn(5), 3, 3) + test_rrule(repeat, randn(3, 3), 2) + test_rrule(repeat, randn(5, 5), 2,5) + test_rrule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) + test_rrule(repeat, fill(4.0), 3) + end + @testset "frule" begin + test_frule(repeat, randn(5), 3) + test_frule(repeat, randn(5), 3,3) + test_frule(repeat, randn(3, 3), 2) + test_frule(repeat, randn(3, 3), 2,5) + test_frule(repeat, randn(5, 4, 3); fkwargs=(inner=(2, 2, 1), outer=(1, 1, 3))) + test_frule(repeat, fill(4.0), 3) + end end