From 442adb876e9dfb15b76cd468c55c1b908bcc7b9d Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Fri, 17 Jul 2026 16:17:58 -0700 Subject: [PATCH] Materialize cylinder snake pattern index lists before indexing Signed-off-by: Sai Asish Y --- src/lattices/snakepattern.jl | 8 ++++---- test/lattices.jl | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/lattices/snakepattern.jl b/src/lattices/snakepattern.jl index b2fde49..12112fd 100644 --- a/src/lattices/snakepattern.jl +++ b/src/lattices/snakepattern.jl @@ -36,7 +36,7 @@ function backandforth_pattern(cylinder::InfiniteCylinder) L = cylinder.L N = cylinder.N iseven(cylinder.N) || error("backandforth only defined for even period") - inds = Iterators.flatten((1:L, reverse((L + 1):(2L))) .+ (L * (i - 1)) for i in 1:2:N) + inds = collect(Iterators.flatten((1:L, reverse((L + 1):(2L))) .+ (L * (i - 1)) for i in 1:2:N)) return pattern(i::Integer) = inds[i] end @@ -52,14 +52,14 @@ function frontandback_pattern(cylinder::InfiniteCylinder) N = cylinder.N if iseven(L) - edge = L / 2 + edge = L ÷ 2 rung = Iterators.flatten(zip(1:edge, (edge + 1):L)) else - edge = (L + 1) / 2 + edge = (L + 1) ÷ 2 rung = Iterators.flatten((Iterators.flatten(zip(1:edge, (edge + 1):L)), edge)) end - inds = Iterators.flatten((rung .+ (L * (i - 1)) for i in 1:N)) + inds = collect(Iterators.flatten((rung .+ (L * (i - 1)) for i in 1:N))) return pattern(i::Integer) = inds[i] end diff --git a/test/lattices.jl b/test/lattices.jl index f5cf09d..b782390 100644 --- a/test/lattices.jl +++ b/test/lattices.jl @@ -243,3 +243,15 @@ end pattern.(linearize_index.(Tuple(y))) end end + +@testset "cylinder snake patterns" begin + for cylinder in (InfiniteCylinder(2, 4), InfiniteCylinder(3, 3)) + n = cylinder.L * cylinder.N + fb = frontandback_pattern(cylinder) + @test map(fb, 1:n) |> sort == collect(1:n) + end + + baf = backandforth_pattern(InfiniteCylinder(2, 4)) + @test map(baf, 1:8) |> sort == collect(1:8) + @test_throws ErrorException backandforth_pattern(InfiniteCylinder(3, 3)) +end