Skip to content

Commit

Permalink
add is_crossing_free for parts of arcdiags
Browse files Browse the repository at this point in the history
incl. tests
  • Loading branch information
lgoettgens committed Aug 25, 2022
1 parent 238af21 commit 30b0cb8
Show file tree
Hide file tree
Showing 2 changed files with 174 additions and 72 deletions.
92 changes: 67 additions & 25 deletions src/ArcDiagram.jl
Original file line number Diff line number Diff line change
Expand Up @@ -40,36 +40,78 @@ function Base.show(io::IO, ::MIME"text/plain", a::ArcDiagram)
print(io, symbols[pair_ids[a.nUpper+1:a.nUpper+a.nLower]])
end

function is_crossing_free(a::ArcDiagram)
for i in 1:a.nUpper+a.nLower, j in 1:a.nUpper+a.nLower
if i == j
continue
elseif i >= a.adjacency[i]
continue
elseif j >= a.adjacency[j]
continue
end
i, j = min(i, j), max(i, j)
# now i < j
if a.adjacency[i] <= a.nUpper
if (j < a.adjacency[i]) != (a.adjacency[j] < a.adjacency[i])
function is_crossing_free(a::ArcDiagram; part=:everything::Symbol)
if part == :everything
for i in 1:a.nUpper+a.nLower, j in 1:a.nUpper+a.nLower
if i == j
continue
elseif i >= a.adjacency[i]
continue
elseif j >= a.adjacency[j]
continue
end
i, j = min(i, j), max(i, j)
# now i < j
if a.adjacency[i] <= a.nUpper
if (j < a.adjacency[i]) != (a.adjacency[j] < a.adjacency[i])
return false
end
elseif i > a.nUpper
if (j < a.adjacency[i]) != (a.adjacency[j] < a.adjacency[i])
return false
end
elseif a.adjacency[j] <= a.nUpper
continue
elseif a.nUpper < j
if j < a.adjacency[i] < a.adjacency[j]
return false
end
elseif a.adjacency[i] > a.adjacency[j]
return false
end
elseif i > a.nUpper
end
return true
elseif part == :upper
for i in 1:a.nUpper, j in 1:a.nUpper
if i == j
continue
elseif i >= a.adjacency[i]
continue
elseif j >= a.adjacency[j]
continue
elseif a.adjacency[i] > a.nUpper
continue
elseif a.adjacency[j] > a.nUpper
continue
end
i, j = min(i, j), max(i, j)
# now i < j
if (j < a.adjacency[i]) != (a.adjacency[j] < a.adjacency[i])
return false
end
elseif a.adjacency[j] <= a.nUpper
continue
elseif a.nUpper < j
if j < a.adjacency[i] < a.adjacency[j]
end
return true
elseif part == :lower
for i in 1:a.nLower, j in 1:a.nLower
i += a.nUpper
j += a.nUpper
if i == j
continue
elseif i >= a.adjacency[i]
continue
elseif j >= a.adjacency[j]
continue
end
i, j = min(i, j), max(i, j)
# now i < j
if (j < a.adjacency[i]) != (a.adjacency[j] < a.adjacency[i])
return false
end
elseif a.adjacency[i] > a.adjacency[j]
return false
end
return true
else
error("Unknown part")
end
return true
end


Expand Down Expand Up @@ -119,9 +161,9 @@ function iter_possible_adjacencies(
return Iterators.flatten(Iterators.map(c -> c[1], choices)), sum(c -> c[2], choices; init=0)
end

function pbw_arc_diagrams(l::Int, d::Int)
indep_sets = [1:l, l+1:2*l, [[2 * l + 2 * i - 1, 2 * l + 2 * i] for i in 1:d]...]
return all_arc_diagrams(2 * l, 2 * d; indep_sets)
function pbw_arc_diagrams(e::Int, d::Int)
indep_sets = [1:e, e+1:2*e, [[2 * e + 2 * i - 1, 2 * e + 2 * i] for i in 1:d]...]
return all_arc_diagrams(2 * e, 2 * d; indep_sets)
end


Expand Down Expand Up @@ -253,7 +295,7 @@ struct SoDeformArcBasis{C <: RingElement} <: DeformBasis{C}
begin
@debug "Basis generation deg $(d), $(debug_counter = (debug_counter % len) + 1)/$(len), $(floor(Int, 100*debug_counter / len))%"
arcdiag_to_basiselem__so_outpowers_stdmod(diag, dimV, e, d, sp.alg(0), sp.basisL)
end for diag in diag_iter # if is_crossing_free(diag), unsure if this is still correct
end for diag in diag_iter if is_crossing_free(diag, part=:upper)
)
push!(lens, len)
push!(iters, iter)
Expand Down
154 changes: 107 additions & 47 deletions test/ArcDiagram-test.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,54 +23,114 @@ all_arc_diagrams = PD.all_arc_diagrams
end

@testset "is_crossing_free" begin
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 4, 3, 6, 5])) == true # AA,CCEE
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 5, 6, 3, 4])) == false # AA,CDCD
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 6, 5, 4, 3])) == true # AA,CDDC
@test is_crossing_free(ArcDiagram(2, 4, [3, 4, 1, 2, 6, 5])) == true # AB,ABEE
@test is_crossing_free(ArcDiagram(2, 4, [3, 5, 1, 6, 2, 4])) == false # AB,ADBD
@test is_crossing_free(ArcDiagram(2, 4, [3, 6, 1, 5, 4, 2])) == true # AB,ADDB
@test is_crossing_free(ArcDiagram(2, 4, [4, 3, 2, 1, 6, 5])) == false # AB,BAEE
@test is_crossing_free(ArcDiagram(2, 4, [4, 5, 6, 1, 2, 3])) == false # AB,CABC
@test is_crossing_free(ArcDiagram(2, 4, [4, 6, 5, 1, 3, 2])) == false # AB,CACB
@test is_crossing_free(ArcDiagram(2, 4, [5, 3, 2, 6, 1, 4])) == false # AB,BDAD
@test is_crossing_free(ArcDiagram(2, 4, [5, 4, 6, 2, 1, 3])) == false # AB,CBAC
@test is_crossing_free(ArcDiagram(2, 4, [5, 6, 4, 3, 1, 2])) == true # AB,CCAB
@test is_crossing_free(ArcDiagram(2, 4, [6, 3, 2, 5, 4, 1])) == false # AB,BDDA
@test is_crossing_free(ArcDiagram(2, 4, [6, 4, 5, 2, 3, 1])) == false # AB,CBCA
@test is_crossing_free(ArcDiagram(2, 4, [6, 5, 4, 3, 2, 1])) == false # AB,CCBA

@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 4, 3, 6, 5])) == true # AAC,CEE
@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 5, 6, 3, 4])) == false # AAC,DCD
@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 6, 5, 4, 3])) == true # AAC,DDC
@test is_crossing_free(ArcDiagram(3, 3, [3, 4, 1, 2, 6, 5])) == false # ABA,BEE
@test is_crossing_free(ArcDiagram(3, 3, [3, 5, 1, 6, 2, 4])) == false # ABA,DBD
@test is_crossing_free(ArcDiagram(3, 3, [3, 6, 1, 5, 4, 2])) == false # ABA,DDB
@test is_crossing_free(ArcDiagram(3, 3, [4, 3, 2, 1, 6, 5])) == true # ABB,AEE
@test is_crossing_free(ArcDiagram(3, 3, [4, 5, 6, 1, 2, 3])) == true # ABC,ABC
@test is_crossing_free(ArcDiagram(3, 3, [4, 6, 5, 1, 3, 2])) == false # ABC,ACB
@test is_crossing_free(ArcDiagram(3, 3, [5, 3, 2, 6, 1, 4])) == false # ABB,DAD
@test is_crossing_free(ArcDiagram(3, 3, [5, 4, 6, 2, 1, 3])) == false # ABC,BAC
@test is_crossing_free(ArcDiagram(3, 3, [5, 6, 4, 3, 1, 2])) == false # ABC,CAB
@test is_crossing_free(ArcDiagram(3, 3, [6, 3, 2, 5, 4, 1])) == true # ABB,DDA
@test is_crossing_free(ArcDiagram(3, 3, [6, 4, 5, 2, 3, 1])) == false # ABC,BCA
@test is_crossing_free(ArcDiagram(3, 3, [6, 5, 4, 3, 2, 1])) == false # ABC,CBA

@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 4, 3, 6, 5])) == true # AACC,EE
@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 5, 6, 3, 4])) == true # AACD,CD
@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 6, 5, 4, 3])) == false # AACD,DC
@test is_crossing_free(ArcDiagram(4, 2, [3, 4, 1, 2, 6, 5])) == false # ABAB,EE
@test is_crossing_free(ArcDiagram(4, 2, [3, 5, 1, 6, 2, 4])) == false # ABAD,BD
@test is_crossing_free(ArcDiagram(4, 2, [3, 6, 1, 5, 4, 2])) == false # ABAD,DB
@test is_crossing_free(ArcDiagram(4, 2, [4, 3, 2, 1, 6, 5])) == true # ABBA,EE
@test is_crossing_free(ArcDiagram(4, 2, [4, 5, 6, 1, 2, 3])) == false # ABCA,BC
@test is_crossing_free(ArcDiagram(4, 2, [4, 6, 5, 1, 3, 2])) == false # ABCA,CB
@test is_crossing_free(ArcDiagram(4, 2, [5, 3, 2, 6, 1, 4])) == true # ABBD,AD
@test is_crossing_free(ArcDiagram(4, 2, [5, 4, 6, 2, 1, 3])) == false # ABCB,AC
@test is_crossing_free(ArcDiagram(4, 2, [5, 6, 4, 3, 1, 2])) == true # ABCC,AB
@test is_crossing_free(ArcDiagram(4, 2, [6, 3, 2, 5, 4, 1])) == false # ABBD,DA
@test is_crossing_free(ArcDiagram(4, 2, [6, 4, 5, 2, 3, 1])) == false # ABCB,CA
@test is_crossing_free(ArcDiagram(4, 2, [6, 5, 4, 3, 2, 1])) == false # ABCC,BA
@testset "is_crossing_free(part=:everywhere)" begin
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 4, 3, 6, 5])) == true # AA,CCEE
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 5, 6, 3, 4])) == false # AA,CDCD
@test is_crossing_free(ArcDiagram(2, 4, [2, 1, 6, 5, 4, 3])) == true # AA,CDDC
@test is_crossing_free(ArcDiagram(2, 4, [3, 4, 1, 2, 6, 5])) == true # AB,ABEE
@test is_crossing_free(ArcDiagram(2, 4, [3, 5, 1, 6, 2, 4])) == false # AB,ADBD
@test is_crossing_free(ArcDiagram(2, 4, [3, 6, 1, 5, 4, 2])) == true # AB,ADDB
@test is_crossing_free(ArcDiagram(2, 4, [4, 3, 2, 1, 6, 5])) == false # AB,BAEE
@test is_crossing_free(ArcDiagram(2, 4, [4, 5, 6, 1, 2, 3])) == false # AB,CABC
@test is_crossing_free(ArcDiagram(2, 4, [4, 6, 5, 1, 3, 2])) == false # AB,CACB
@test is_crossing_free(ArcDiagram(2, 4, [5, 3, 2, 6, 1, 4])) == false # AB,BDAD
@test is_crossing_free(ArcDiagram(2, 4, [5, 4, 6, 2, 1, 3])) == false # AB,CBAC
@test is_crossing_free(ArcDiagram(2, 4, [5, 6, 4, 3, 1, 2])) == true # AB,CCAB
@test is_crossing_free(ArcDiagram(2, 4, [6, 3, 2, 5, 4, 1])) == false # AB,BDDA
@test is_crossing_free(ArcDiagram(2, 4, [6, 4, 5, 2, 3, 1])) == false # AB,CBCA
@test is_crossing_free(ArcDiagram(2, 4, [6, 5, 4, 3, 2, 1])) == false # AB,CCBA

@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 4, 3, 6, 5])) == true # AAC,CEE
@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 5, 6, 3, 4])) == false # AAC,DCD
@test is_crossing_free(ArcDiagram(3, 3, [2, 1, 6, 5, 4, 3])) == true # AAC,DDC
@test is_crossing_free(ArcDiagram(3, 3, [3, 4, 1, 2, 6, 5])) == false # ABA,BEE
@test is_crossing_free(ArcDiagram(3, 3, [3, 5, 1, 6, 2, 4])) == false # ABA,DBD
@test is_crossing_free(ArcDiagram(3, 3, [3, 6, 1, 5, 4, 2])) == false # ABA,DDB
@test is_crossing_free(ArcDiagram(3, 3, [4, 3, 2, 1, 6, 5])) == true # ABB,AEE
@test is_crossing_free(ArcDiagram(3, 3, [4, 5, 6, 1, 2, 3])) == true # ABC,ABC
@test is_crossing_free(ArcDiagram(3, 3, [4, 6, 5, 1, 3, 2])) == false # ABC,ACB
@test is_crossing_free(ArcDiagram(3, 3, [5, 3, 2, 6, 1, 4])) == false # ABB,DAD
@test is_crossing_free(ArcDiagram(3, 3, [5, 4, 6, 2, 1, 3])) == false # ABC,BAC
@test is_crossing_free(ArcDiagram(3, 3, [5, 6, 4, 3, 1, 2])) == false # ABC,CAB
@test is_crossing_free(ArcDiagram(3, 3, [6, 3, 2, 5, 4, 1])) == true # ABB,DDA
@test is_crossing_free(ArcDiagram(3, 3, [6, 4, 5, 2, 3, 1])) == false # ABC,BCA
@test is_crossing_free(ArcDiagram(3, 3, [6, 5, 4, 3, 2, 1])) == false # ABC,CBA

@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 4, 3, 6, 5])) == true # AACC,EE
@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 5, 6, 3, 4])) == true # AACD,CD
@test is_crossing_free(ArcDiagram(4, 2, [2, 1, 6, 5, 4, 3])) == false # AACD,DC
@test is_crossing_free(ArcDiagram(4, 2, [3, 4, 1, 2, 6, 5])) == false # ABAB,EE
@test is_crossing_free(ArcDiagram(4, 2, [3, 5, 1, 6, 2, 4])) == false # ABAD,BD
@test is_crossing_free(ArcDiagram(4, 2, [3, 6, 1, 5, 4, 2])) == false # ABAD,DB
@test is_crossing_free(ArcDiagram(4, 2, [4, 3, 2, 1, 6, 5])) == true # ABBA,EE
@test is_crossing_free(ArcDiagram(4, 2, [4, 5, 6, 1, 2, 3])) == false # ABCA,BC
@test is_crossing_free(ArcDiagram(4, 2, [4, 6, 5, 1, 3, 2])) == false # ABCA,CB
@test is_crossing_free(ArcDiagram(4, 2, [5, 3, 2, 6, 1, 4])) == true # ABBD,AD
@test is_crossing_free(ArcDiagram(4, 2, [5, 4, 6, 2, 1, 3])) == false # ABCB,AC
@test is_crossing_free(ArcDiagram(4, 2, [5, 6, 4, 3, 1, 2])) == true # ABCC,AB
@test is_crossing_free(ArcDiagram(4, 2, [6, 3, 2, 5, 4, 1])) == false # ABBD,DA
@test is_crossing_free(ArcDiagram(4, 2, [6, 4, 5, 2, 3, 1])) == false # ABCB,CA
@test is_crossing_free(ArcDiagram(4, 2, [6, 5, 4, 3, 2, 1])) == false # ABCC,BA

end

@testset "is_crossing_free(part=:upper)" begin
@test all(diag -> is_crossing_free(diag, part=:upper), all_arc_diagrams(0, 6))
@test all(diag -> is_crossing_free(diag, part=:upper), all_arc_diagrams(1, 5))
@test all(diag -> is_crossing_free(diag, part=:upper), all_arc_diagrams(2, 4))
@test all(diag -> is_crossing_free(diag, part=:upper), all_arc_diagrams(3, 3))

@test length([diag for diag in all_arc_diagrams(4, 2) if !is_crossing_free(diag, part=:upper)]) == 1 # ABAB,EE

@test is_crossing_free(ArcDiagram(5, 1, [2, 1, 4, 3, 6, 5]), part=:upper) == true # AACCE,E
@test is_crossing_free(ArcDiagram(5, 1, [2, 1, 5, 6, 3, 4]), part=:upper) == true # AACDC,D
@test is_crossing_free(ArcDiagram(5, 1, [2, 1, 6, 5, 4, 3]), part=:upper) == true # AACDD,C
@test is_crossing_free(ArcDiagram(5, 1, [3, 4, 1, 2, 6, 5]), part=:upper) == false # ABABE,E
@test is_crossing_free(ArcDiagram(5, 1, [3, 5, 1, 6, 2, 4]), part=:upper) == false # ABADB,D
@test is_crossing_free(ArcDiagram(5, 1, [3, 6, 1, 5, 4, 2]), part=:upper) == true # ABADD,B
@test is_crossing_free(ArcDiagram(5, 1, [4, 3, 2, 1, 6, 5]), part=:upper) == true # ABBAE,E
@test is_crossing_free(ArcDiagram(5, 1, [4, 5, 6, 1, 2, 3]), part=:upper) == false # ABCAB,C
@test is_crossing_free(ArcDiagram(5, 1, [4, 6, 5, 1, 3, 2]), part=:upper) == false # ABCAC,B
@test is_crossing_free(ArcDiagram(5, 1, [5, 3, 2, 6, 1, 4]), part=:upper) == true # ABBDA,D
@test is_crossing_free(ArcDiagram(5, 1, [5, 4, 6, 2, 1, 3]), part=:upper) == true # ABCBA,C
@test is_crossing_free(ArcDiagram(5, 1, [5, 6, 4, 3, 1, 2]), part=:upper) == true # ABCCA,B
@test is_crossing_free(ArcDiagram(5, 1, [6, 3, 2, 5, 4, 1]), part=:upper) == true # ABBDD,A
@test is_crossing_free(ArcDiagram(5, 1, [6, 4, 5, 2, 3, 1]), part=:upper) == false # ABCBC,A
@test is_crossing_free(ArcDiagram(5, 1, [6, 5, 4, 3, 2, 1]), part=:upper) == true # ABCCB,A

for diag in all_arc_diagrams(6, 0)
@test is_crossing_free(diag, part=:upper) == is_crossing_free(diag)
end
end

@testset "is_crossing_free(part=:lower)" begin
@test all(diag -> is_crossing_free(diag, part=:lower), all_arc_diagrams(6, 0))
@test all(diag -> is_crossing_free(diag, part=:lower), all_arc_diagrams(5, 1))
@test all(diag -> is_crossing_free(diag, part=:lower), all_arc_diagrams(4, 2))
@test all(diag -> is_crossing_free(diag, part=:lower), all_arc_diagrams(3, 3))

@test length([diag for diag in all_arc_diagrams(2, 4) if !is_crossing_free(diag, part=:lower)]) == 1 # AA,CDCD

@test is_crossing_free(ArcDiagram(1, 5, [2, 1, 4, 3, 6, 5]), part=:lower) == true # A,ACCEE
@test is_crossing_free(ArcDiagram(1, 5, [2, 1, 5, 6, 3, 4]), part=:lower) == false # A,ACDCD
@test is_crossing_free(ArcDiagram(1, 5, [2, 1, 6, 5, 4, 3]), part=:lower) == true # A,ACDDC
@test is_crossing_free(ArcDiagram(1, 5, [3, 4, 1, 2, 6, 5]), part=:lower) == true # A,BABEE
@test is_crossing_free(ArcDiagram(1, 5, [3, 5, 1, 6, 2, 4]), part=:lower) == false # A,BADBD
@test is_crossing_free(ArcDiagram(1, 5, [3, 6, 1, 5, 4, 2]), part=:lower) == true # A,BADDB
@test is_crossing_free(ArcDiagram(1, 5, [4, 3, 2, 1, 6, 5]), part=:lower) == true # A,BBAEE
@test is_crossing_free(ArcDiagram(1, 5, [4, 5, 6, 1, 2, 3]), part=:lower) == false # A,BCABC
@test is_crossing_free(ArcDiagram(1, 5, [4, 6, 5, 1, 3, 2]), part=:lower) == true # A,BCACB
@test is_crossing_free(ArcDiagram(1, 5, [5, 3, 2, 6, 1, 4]), part=:lower) == true # A,BBDAD
@test is_crossing_free(ArcDiagram(1, 5, [5, 4, 6, 2, 1, 3]), part=:lower) == false # A,BCBAC
@test is_crossing_free(ArcDiagram(1, 5, [5, 6, 4, 3, 1, 2]), part=:lower) == true # A,BCCAB
@test is_crossing_free(ArcDiagram(1, 5, [6, 3, 2, 5, 4, 1]), part=:lower) == true # A,BBDDA
@test is_crossing_free(ArcDiagram(1, 5, [6, 4, 5, 2, 3, 1]), part=:lower) == false # A,BCBCA
@test is_crossing_free(ArcDiagram(1, 5, [6, 5, 4, 3, 2, 1]), part=:lower) == true # A,BCCBA

for diag in all_arc_diagrams(0, 6)
@test is_crossing_free(diag, part=:lower) == is_crossing_free(diag)
end
end
end

@testset "all_arc_diagrams" begin
Expand Down

0 comments on commit 30b0cb8

Please sign in to comment.