diff --git a/.github/workflows/downgrade.yml b/.github/workflows/downgrade.yml index 064d6a8..a238738 100644 --- a/.github/workflows/downgrade.yml +++ b/.github/workflows/downgrade.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - version: ['1.10'] + version: ['1.12'] steps: - uses: actions/checkout@v6 - uses: julia-actions/setup-julia@v3 diff --git a/Project.toml b/Project.toml index aabc246..dc23651 100644 --- a/Project.toml +++ b/Project.toml @@ -18,16 +18,16 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [compat] -DocStringExtensions = "0.9" +DocStringExtensions = "0.9.5" Graphs = "1.9" -LinearAlgebra = "1.1" +LinearAlgebra = "1.10" Multigraphs = "0.3.0" Nemo = "0.45.5, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54" Oscar = "1.1.1" PrecompileTools = "1.2" ProgressMeter = "1.11.0" -QECCore = "0.1.1" -QuantumClifford = "0.10.0" +QECCore = "0.1.3" +QuantumClifford = "0.11.3" Random = "1.1" -SparseArrays = "1.1" -julia = "1.10" +SparseArrays = "1.10" +julia = "1.12" diff --git a/README.md b/README.md index d5a8e40..37d555f 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,22 @@ pkg> add https://github.com/QuantumSavory/QuantumExpanders.jl.git To update, just type `up` in the package mode. +The library provides the following methods to construct explicit instances of *Quantum Tanner codes*. +```mermaid +graph TD + QuantumTannerCodes["Quantum Tanner Codes"] --> RandomMethods["Random Methods"] + QuantumTannerCodes --> DeterministicMethods["Deterministic Methods"] + + subgraph "Random construction" + RandomMethods --> RandomQuantumTannerCode["`random_quantum_Tanner_code`"] + end + + subgraph "Deterministic construction" + DeterministicMethods --> QuantumTannerCode["`QuantumTannerCode`"] + DeterministicMethods --> GeneralizedQuantumTannerCode["`GeneralizedQuantumTannerCode`"] + end +``` + - `random_quantum_Tanner_code` constructs a quantum CSS code by instantiating two classical Tanner codes, 𝒞ᶻ and 𝒞ˣ, on the graphs 𝒢₀□ and 𝒢₁□ of a left-right Cayley complex [leverrier2022quantum](https://arxiv.org/pdf/2202.13641). This complex is generated from a group G, and two generating sets A and B of sizes Δ_A and Δ_B, which, @@ -55,7 +71,7 @@ QT code implementation provides a simplified variant of the Panteleev-Kalachev q [panteleev2022asymptoticallygoodquantumlocally](https://arxiv.org/pdf/2111.03654) and is related to the locally testable code of [dinur2022locally](https://arxiv.org/pdf/2111.04808). -Here is the novel `[[360, 61, 10]]` quantum Tanner code constructed from [Morgenstern Ramanujan graphs](https://www.sciencedirect.com/science/article/pii/S0095895684710549) +Here is the novel `[[360, 61, (3, 10)]]` quantum Tanner code constructed from [Morgenstern Ramanujan graphs](https://www.sciencedirect.com/science/article/pii/S0095895684710549) for even prime power q. ```julia @@ -78,17 +94,17 @@ julia> A = alternative_morgenstern_generators(B, FirstOnly()) [o+1 o+1; o 0] [0 o+1; o o+1] -julia> rng = MersenneTwister(21); +julia> rng = MersenneTwister(892529278); -julia> hx, hz = random_quantum_Tanner_code(0.74, SL₂, A, B, rng=rng); +julia> hx, hz = random_quantum_Tanner_code(0.75, SL₂, A, B, rng=rng); (length(group), length(A), length(B)) = (60, 4, 3) length(group) * length(A) * length(B) = 720 [ Info: |V₀| = |V₁| = |G| = 60 [ Info: |E_A| = Δ|G| = 240, |E_B| = Δ|G| = 180 [ Info: |Q| = Δ²|G|/2 = 360 -Hᴬ = [0 1 1 0] -Hᴮ = [1 1 0; 0 1 1] -Cᴬ = [1 0 0 0; 0 1 1 0; 0 0 0 1] +Hᴬ = [1 1 1 0] +Hᴮ = [0 1 1; 1 1 0] +Cᴬ = [1 1 0 0; 1 0 1 0; 0 0 0 1] Cᴮ = [1 1 1] size(Cˣ) = (3, 12) size(Cᶻ) = (2, 12) @@ -99,200 +115,11 @@ julia> c = CSS(hx, hz); julia> import JuMP; import HiGHS; -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(360, 61, 10) -``` - -# Comparison with existing work - -Our method produces quantum Tanner codes with **significantly higher rates** than those reported in recent literature (Leverrier et al., *[Small quantum Tanner codes from left–right Cayley complexes](https://arxiv.org/pdf/2512.20532)*). For example: - -- `[[252, 70, 6]]` → higher rate than `[[252, 2, 20]]` -- `[[392, 96, 5]]` → higher rate than `[[396, 2, 29]]` -- `[[576, 126, 7]]` → higher rate than `[[576, 28, 24]]` - -While [recent work](https://arxiv.org/pdf/2512.20532) showcases codes with high distance, our method achieves higher rates, offering a complementary approach in the quantum Tanner code design. - -## Quantum Tanner codes using other Frobenius groups - -Expanding upon the work of [radebold2025explicit](https://arxiv.org/pdf/2508.05095), which was confined to -[dihedral groups](https://en.wikipedia.org/wiki/Dihedral_group), we have constructed new explicit quantum Tanner -codes based on a broader class of [Frobenius groups](https://en.wikipedia.org/wiki/Frobenius_group). - -### Symmetric Group - -Here is the `[[150, 48, 4]]` using [symmetric group](https://en.wikipedia.org/wiki/Symmetric_group) of order 3. - -```julia -julia> rng = MersenneTwister(43); - -julia> G = symmetric_group(3); - -julia> S = normal_cayley_subset(G); - -julia> hx, hz = random_quantum_Tanner_code(0.65, G, S, S, bipartite=false, use_same_local_code=true, rng=rng); -(length(group), length(A), length(B)) = (6, 5, 5) -length(group) * length(A) * length(B) = 150 -[ Info: |Q| = |G||A||B| = 150 -Hᴬ = [1 1 0 1 1] -Hᴮ = [1 1 0 1 0; 0 0 0 1 0; 1 1 0 1 1] -Cᴬ = [1 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 1 0 0 0 1] -Cᴮ = [1 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 1 0 0 0 1] -size(Cˣ) = (16, 25) -size(Cᶻ) = (1, 25) -r1 = rank(𝒞ˣ) = 96 -r2 = rank(𝒞ᶻ) = 6 - -julia> c = CSS(hx, hz); - -julia> import JuMP; import HiGHS; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(150, 48, 4) -``` - -### Permutation Group - -Here is the `[[36, 16, 3]]` code based on [permutation group](https://en.wikipedia.org/wiki/Permutation_group) -of order 4 that improves upon the `[[36, 8, 3]]` parameters presented in `Table 5` of [radebold2025explicit](@cite), -achieving twice the number of logical qubits while maintaining the same distance. - -```julia -julia> rng = MersenneTwister(52); - -julia> x = cperm([1,2,3,4]); - -julia> G = permutation_group(4, [x]); - -julia> S = normal_cayley_subset(G) -3-element Vector{PermGroupElem}: - (1,2,3,4) - (1,3)(2,4) - (1,4,3,2) - -julia> hx, hz = random_quantum_Tanner_code(0.65, G, S, S, bipartite=false, use_same_local_code=true, rng=rng); -(length(group), length(A), length(B)) = (4, 3, 3) -length(group) * length(A) * length(B) = 36 -[ Info: |Q| = |G||A||B| = 36 -Hᴬ = [1 1 1] -Hᴮ = [1 0 1] -Cᴬ = [1 1 0; 1 0 1] -Cᴮ = [1 1 0; 1 0 1] -size(Cˣ) = (4, 9) -size(Cᶻ) = (1, 9) -r1 = rank(𝒞ˣ) = 16 -r2 = rank(𝒞ᶻ) = 4 - -julia> c = CSS(hx, hz); - -julia> import JuMP; import HiGHS; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(36, 16, 3) -``` - -### Cyclic Group - -Here is the `[[252, 70, 6]]` using [cyclic group](https://en.wikipedia.org/wiki/Cyclic_group) of order 7. - -```julia -julia> rng = MersenneTwister(54); - -julia> G = cyclic_group(7); - -julia> S = normal_cayley_subset(G); - -julia> hx, hz = random_quantum_Tanner_code(0.7, G, S, S, bipartite=false, use_same_local_code=true, rng=rng); -(length(group), length(A), length(B)) = (7, 6, 6) -length(group) * length(A) * length(B) = 252 -[ Info: |Q| = |G||A||B| = 252 -Hᴬ = [1 1 1 1 1 1] -Hᴮ = [1 0 0 1 1 0; 1 1 0 1 1 0; 0 1 1 0 1 0; 1 0 1 1 1 0] -Cᴬ = [1 1 0 0 0 0; 1 0 1 0 0 0; 1 0 0 1 0 0; 1 0 0 0 1 0; 1 0 0 0 0 1] -Cᴮ = [1 1 0 0 0 0; 1 0 1 0 0 0; 1 0 0 1 0 0; 1 0 0 0 1 0; 1 0 0 0 0 1] -size(Cˣ) = (25, 36) -size(Cᶻ) = (1, 36) -r1 = rank(𝒞ˣ) = 175 -r2 = rank(𝒞ᶻ) = 7 - -julia> c = CSS(hx, hz); - -julia> import JuMP; import HiGHS; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(252, 70, 6) -``` - -### Small Groups - -Here is a `[[392, 96, 5]]` code using [quaternion group](https://en.wikipedia.org/wiki/Quaternion_group) of order 8. - -```julia -julia> rng = MersenneTwister(42); - -julia> G = small_group(8, 4); - -julia> describe(G), small_group_identification(G) -("Q8", (8, 4)) - -julia> S = normal_cayley_subset(G); - -julia> hx, hz = random_quantum_Tanner_code(0.72, G, S, S, bipartite=false, use_same_local_code=true, rng=rng); -(length(group), length(A), length(B)) = (8, 7, 7) -length(group) * length(A) * length(B) = 392 -[ Info: |Q| = |G||A||B| = 392 -Hᴬ = [0 1 0 1 1 1 1] -Hᴮ = [1 0 0 1 0 1 0; 0 0 1 0 0 0 1; 0 0 1 0 1 0 1; 0 0 0 1 0 0 1; 1 1 1 1 0 1 0] -Cᴬ = [1 0 0 0 0 0 0; 0 0 1 0 0 0 0; 0 1 0 1 0 0 0; 0 1 0 0 1 0 0; 0 1 0 0 0 1 0; 0 1 0 0 0 0 1] -Cᴮ = [1 0 0 0 0 0 0; 0 0 1 0 0 0 0; 0 1 0 1 0 0 0; 0 1 0 0 1 0 0; 0 1 0 0 0 1 0; 0 1 0 0 0 0 1] -size(Cˣ) = (36, 49) -size(Cᶻ) = (1, 49) -r1 = rank(𝒞ˣ) = 288 -r2 = rank(𝒞ᶻ) = 8 - -julia> c = CSS(hx, hz); - -julia> import JuMP; import HiGHS; - -julia> c = CSS(hx, hz); - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(392, 96, 5) -``` - -Here is a `[[576, 126, 7]]` code using the [direct product](https://en.wikipedia.org/wiki/Direct_product_of_groups) of two cyclic groups (**C₃ × C₃**). - -```julia -julia> rng = MersenneTwister(20); - -julia> G = small_group(9, 2); - -julia> describe(G), small_group_identification(G) -("C3 x C3", (9, 2)) - -julia> S = normal_cayley_subset(G); - -julia> hx, hz = random_quantum_Tanner_code(0.8, G, S, S, bipartite=false, use_same_local_code=true, rng=rng); -(length(group), length(A), length(B)) = (9, 8, 8) -length(group) * length(A) * length(B) = 576 -[ Info: |Q| = |G||A||B| = 576 -Hᴬ = [1 1 1 0 1 1 1 1] -Hᴮ = [0 0 0 1 0 1 1 1; 1 1 0 1 1 1 0 0; 1 0 1 0 1 1 1 1; 1 0 1 0 0 0 1 0; 1 1 1 0 1 1 1 1; 1 0 1 1 1 0 1 0] -Cᴬ = [1 1 0 0 0 0 0 0; 1 0 1 0 0 0 0 0; 0 0 0 1 0 0 0 0; 1 0 0 0 1 0 0 0; 1 0 0 0 0 1 0 0; 1 0 0 0 0 0 1 0; 1 0 0 0 0 0 0 1] -Cᴮ = [1 1 0 0 0 0 0 0; 1 0 1 0 0 0 0 0; 0 0 0 1 0 0 0 0; 1 0 0 0 1 0 0 0; 1 0 0 0 0 1 0 0; 1 0 0 0 0 0 1 0; 1 0 0 0 0 0 0 1] -size(Cˣ) = (49, 64) -size(Cᶻ) = (1, 64) -r1 = rank(𝒞ˣ) = 441 -r2 = rank(𝒞ᶻ) = 9 - -julia> c = CSS(hx, hz); - -julia> import JuMP; import HiGHS; - -julia> c = CSS(hx, hz); +julia> code_n(c), code_k(c) +(360, 61) -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) -(576, 126, 7) +julia> distance(c, DistanceMIPAlgorithm(solver = name ,logical_operator_type = :Z,time_limit = 900)), distance(c, DistanceMIPAlgorithm(solver = name ,logical_operator_type = :X,time_limit = 900)) +(3, 10) ``` ## Support diff --git a/src/quantum_tanner_codes.jl b/src/quantum_tanner_codes.jl index f680d91..e145bfb 100644 --- a/src/quantum_tanner_codes.jl +++ b/src/quantum_tanner_codes.jl @@ -11,22 +11,22 @@ Both A and B are symmetric, A and B are disjoint, and the pair (A, B) satisfies ```jldoctest examples julia> using QuantumExpanders; using Oscar; using Random; -julia> G = symmetric_group(4); +julia> G = dihedral_group(8); -julia> rng = MersenneTwister(68); +julia> rng = MersenneTwister(23); -julia> A, B = find_random_generating_sets(G, 3, 2; rng=deepcopy(rng)) -2-element Vector{Vector{PermGroupElem}}: - [(1,3)(2,4), (1,2,4,3), (1,3,4,2)] - [(2,4), (2,3)] +julia> A, B = find_random_generating_sets(G, 3, 3; rng=deepcopy(rng)) +2-element Vector{Vector{PcGroupElem}}: + [f1*f2, f1*f2*f3, f1*f3] + [f3, f2, f2*f3] julia> A, B = find_random_generating_sets(G, 3; rng=deepcopy(rng)) -2-element Vector{Vector{PermGroupElem}}: - [(1,2,4,3), (1,3,4,2), (1,4)(2,3)] - [(1,4,3), (1,3,4), (1,2)] +2-element Vector{Vector{PcGroupElem}}: + [f1*f2, f1*f2*f3, f1*f3] + [f3, f2, f2*f3] ``` -Here is a new `[[108, 11, 6]]` quantum Tanner code generated using these symmetric generating sets, A and B, as follows: +Here is a new `[[36, 1, 3]]` quantum Tanner code generated using these symmetric generating sets, A and B, as follows: ```jldoctest examples julia> H_A = [1 0 1; 1 1 0]; @@ -42,12 +42,12 @@ julia> classical_code_pair = ((H_A, G_A), (H_B, G_B)); julia> c = QuantumTannerCode(G, A, B, classical_code_pair); julia> code_n(c), code_k(c) -(108, 11) +(36, 1) julia> import JuMP; import HiGHS; julia> distance(c, DistanceMIPAlgorithm(solver=HiGHS)) -6 +3 ``` ### Arguments @@ -367,158 +367,39 @@ sets to construct the underlying expander graphs for the quantum Tanner code. Through random search of classical code pairs that are used for the construction of quantum Tanner codes, we found several new instances of these codes. -Here is an example of `[[54, 11, 4]]` quantum Tanner code from [radebold2025explicit](@cite): - -```jldoctest examples -julia> using QuantumExpanders; using Oscar; using QuantumClifford.ECC; - -julia> F = free_group([:s, :r]); - -julia> s, r = gens(F); - -julia> rels = [s^2, r^6, s*r*s*r]; - -julia> G, epimorphism = quo(F, rels); - -julia> s, r = epimorphism(s), epimorphism(r); - -julia> A = [r, r^3, r^5]; - -julia> B = [s*r^2, s*r^4, s*r^5]; - -julia> H_A = [1 1 1]; - -julia> G_A = [1 1 0; 1 0 1]; - -julia> H_B = [1 1 1; 0 1 1]; - -julia> G_B = [0 1 1]; - -julia> classical_code_pair = ((H_A, G_A), (H_B, G_B)); - -julia> c = QuantumTannerCode(G, A, B, classical_code_pair); - -julia> import HiGHS; import JuMP; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS)) -(54, 11, 4) -``` - -Here is an example of `[[72, 14, 4]]` quantum Tanner code from [radebold2025explicit](@cite): +Here is new `[[36, 8, (3,3)]]` code found via random search: ```jldoctest examples julia> F = free_group([:s, :r]); julia> s, r = gens(F); -julia> rels = [s^2, r^8, s*r*s*r]; +julia> rels = [s^2, r^4, s*r*s*r]; julia> G, epimorphism = quo(F, rels); julia> s, r = epimorphism(s), epimorphism(r); -julia> A = [s, s*r^4, r^4]; +julia> A = [s, r, r^3]; -julia> B = [s*r, s*r^3, s*r^7]; +julia> B = [s*r, s*r^3, r^2]; -julia> H_A = [1 1 1]; +julia> H_A = [1 0 1; 0 1 1]; -julia> G_A = [1 1 0; 1 0 1]; +julia> G_A = [1 1 1]; -julia> H_B = [1 1 1; 1 0 1]; +julia> H_B = [1 1 1]; -julia> G_B = [1 0 1]; +julia> G_B = [1 1 0; 1 0 1]; julia> classical_code_pair = ((H_A, G_A), (H_B, G_B)); julia> c = QuantumTannerCode(G, A, B, classical_code_pair); -julia> import HiGHS; import JuMP; +julia> import JuMP; import HiGHS; julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS)) -(72, 14, 4) -``` - -Here is an example of a new `[[200, 12, 12]]` quantum Tanner code: - -```jldoctest examples -julia> F = free_group([:s, :r]); - -julia> s, r = gens(F); - -julia> rels = [s^2, r^8, s*r*s*r]; - -julia> G, epimorphism = quo(F, rels); - -julia> s, r = epimorphism(s), epimorphism(r); - -julia> A = [s*r^6, r, r^3, r^5, r^7]; - -julia> B = [s*r, s*r^3, s*r^7, r^2, r^6]; - -julia> H_A = [1 1 1 1 1; - 0 1 1 1 1; - 0 1 1 0 0; - 0 1 1 0 1]; - -julia> G_A = [0 1 1 0 0]; - -julia> H_B = [0 1 1 1 0; - 1 1 0 0 0; - 1 1 0 1 1]; - -julia> G_B = [1 1 1 0 0; - 1 1 0 1 1]; - -julia> classical_code_pair = ((H_A, G_A), (H_B, G_B)); - -julia> c = QuantumTannerCode(G, A, B, classical_code_pair); - -julia> import HiGHS; import JuMP; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) -(200, 12, 12) -``` - -Here is an example of a new `[[250, 14, 10]]` quantum Tanner code: - -```jldoctest examples -julia> F = free_group([:s, :r]); - -julia> s, r = gens(F); - -julia> rels = [s^2, r^10, s*r*s*r]; - -julia> G, epimorphism = quo(F, rels); - -julia> s, r = epimorphism(s), epimorphism(r); - -julia> A = [s*r, r, r^3, r^7, r^9]; - -julia> B = [s*r^6, r^2, r^4, r^6, r^8]; - -julia> H_A = [1 0 0 0 0; - 1 1 0 1 1]; - -julia> G_A = [0 0 1 0 0; - 0 1 0 1 0; - 0 1 0 0 1]; - -julia> H_B = [0 1 0 1 0; - 1 1 1 0 1]; - -julia> G_B = [1 0 1 0 0; - 1 1 0 1 0; - 1 0 0 0 1]; - -julia> classical_code_pair = ((H_A, G_A), (H_B, G_B)); - -julia> c = QuantumTannerCode(G, A, B, classical_code_pair); - -julia> import HiGHS; import JuMP; - -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) -(250, 10, 14) +(36, 8, 3) ``` !!! note @@ -544,14 +425,14 @@ julia> SL₂, B = morgenstern_generators(l, i); julia> A = alternative_morgenstern_generators(B, FirstOnly()); -julia> H_A = [0 0 0 1; - 1 1 0 0]; +julia> H_A = [1 1 1 0]; julia> G_A = [1 1 0 0; - 0 0 1 0]; + 1 0 1 0; + 0 0 0 1]; -julia> H_B = [1 0 1; - 0 1 1]; +julia> H_B = [0 1 1; + 1 1 0]; julia> G_B = [1 1 1]; @@ -561,8 +442,8 @@ julia> c = QuantumTannerCode(SL₂, A, B, classical_code_pair); julia> import HiGHS; import JuMP; -julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS)) -(360, 8, 10) +julia> code_n(c), code_k(c), distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)), distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) +(360, 8, 10, 3) ``` ### Fields diff --git a/test/test_quantum_tanner_codes.jl b/test/test_quantum_tanner_codes.jl index 903dbf2..d6d7112 100644 --- a/test/test_quantum_tanner_codes.jl +++ b/test/test_quantum_tanner_codes.jl @@ -14,7 +14,7 @@ using Nemo: zero_matrix, base_ring, transpose, rank @testset "New instances of Quantum Tanner codes using standard dihedral group" begin - # [[36, 9, 2]] + # [[36, 9, (2,1)]] F = free_group([:s, :r]) s, r = gens(F) rels = [s^2, r^4, s*r*s*r] @@ -37,10 +37,11 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 36 == ns && code_k(c) == 9 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 2 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 2 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 # found via random search - # [[36, 8, 3]] + # [[36, 8, (3,3)]] H_A = [1 0 1; 0 1 1] G_A = [1 1 1] @test iszero(mod.(H_A*G_A', 2)) @@ -54,9 +55,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 36 == ns && code_k(c) == 8 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 3 - # [[54, 7, 4]] + # [[54, 7, (4,3)]] F = free_group([:s, :r]) s, r = gens(F) rels = [s^2, r^6, s*r*s*r] @@ -79,9 +81,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 54 == ns && code_k(c) == 7 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 3 - # [[54, 11, 4]] + # [[54, 11, (4,1)]] H_A = [1 1 1] G_A = [1 1 0; 1 0 1] @test iszero(mod.(H_A*G_A', 2)) @@ -95,9 +98,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 54 == ns && code_k(c) == 11 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[54, 12, 3]] + # [[54, 12, (3,1)]] H_A = [1 1 0] G_A = [1 1 0; 0 0 1] @test iszero(mod.(H_A*G_A', 2)) @@ -111,9 +115,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 54 == ns && code_k(c) == 12 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[54, 8, 5]] + # [[54, 8, (5,1)]] H_A = [1 0 1; 1 1 0] G_A = [1 1 1] @test iszero(mod.(H_A*G_A', 2)) @@ -127,9 +132,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 54 == ns && code_k(c) == 8 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 5 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 5 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[72, 16, 4]] + # [[72, 16, (4,1)]] F = free_group([:s, :r]) s, r = gens(F) rels = [s^2, r^8, s*r*s*r] @@ -152,9 +158,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 72 == ns && code_k(c) == 16 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[72, 10, 4]] + # [[72, 10, (4,1)]] H_A = [1 1 1; 0 0 1] G_A = [1 1 0] @test iszero(mod.(H_A*G_A', 2)) @@ -168,9 +175,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 72 == ns && code_k(c) == 10 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[72, 12, 4]] + # [[72, 12, (4,1)]] H_A = [1 0 0; 0 1 1] G_A = [0 1 1] @test iszero(mod.(H_A*G_A', 2)) @@ -184,9 +192,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 72 == ns && code_k(c) == 12 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[72, 14, 4]] + # [[72, 14, (4,1)]] H_A = [1 1 1] G_A = [1 1 0; 1 0 1] @test iszero(mod.(H_A*G_A', 2)) @@ -200,9 +209,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 72 == ns && code_k(c) == 14 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[200, 13, 4]] + # [[200, 13, (4,4)]] F = free_group([:s, :r]) s, r = gens(F) rels = [s^2, r^8, s*r*s*r] @@ -225,9 +235,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 13 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 4 - # [[200, 19, 7]] + # [[200, 19, (7,1)]] H_A = [1 0 1 0 1; 0 0 0 0 1; 1 1 0 1 1; @@ -245,9 +256,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 19 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=900)) == 7 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 7 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[200, 36, 4]] + # [[200, 36, (4,1)]] H_A = [0 1 0 0 0; 1 1 1 0 1; 0 1 0 1 1; @@ -265,9 +277,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 36 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[200, 27, 6]] + # [[200, 27, (6,1)]] H_A = [0 1 0 1 0; 1 0 1 1 0]; G_A = [1 0 1 0 0; @@ -285,7 +298,8 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 27 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 # [[200, 12, 12]] H_A = [1 1 1 1 1; @@ -305,7 +319,8 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 12 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 12 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 12 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 # [[200, 38, 4]] H_A = [0 1 0 1 1; @@ -325,7 +340,8 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 38 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 # [[200, 75, 4]] H_A = [1 1 1 1 1] @@ -345,9 +361,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 200 == ns && code_k(c) == 75 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 1 - # [[250, 14, 6]] + # [[250, 14, (6,4)]] F = free_group([:s, :r]) s, r = gens(F) rels = [s^2, r^10, s*r*s*r] @@ -370,9 +387,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 250 == ns && code_k(c) == 14 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 4 - # [[250, 14, 8]] + # [[250, 14, (8,4)]] A = [r^3, r^-3, r, r^-1, s*r^-2] B = [r^4, r^-4, r^2, r^-2, r^5] @test is_symmetric_gen(A) @@ -384,31 +402,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 250 == ns && code_k(c) == 14 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=900)) == 8 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 8 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z)) == 4 - # [[250, 30, 5]] - A = [s*r, r, r^3, r^7, r^9] - B = [s*r^6, r^2, r^4, r^6, r^8] - H_A = [0 1 1 0 1; - 0 0 1 1 1; - 1 0 1 1 1; - 1 0 1 0 1] - G_A = [0 0 1 0 1] - H_B = [1 0 1 0 0; - 0 1 0 1 0] - G_B = [1 0 1 0 0; - 0 1 0 1 0; - 0 0 0 0 1] - classical_code_pair = ((H_A, G_A), (H_B, G_B)) # found via random search - c = QuantumTannerCode(G, A, B, classical_code_pair) - hx, hz = parity_matrix_x(c), parity_matrix_z(c) - @test iszero(mod.(hx*hz',2)) - stab = parity_checks(c) - ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 30 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 5 - - # [[250, 40, 5]] + # [[250, 40, (1,1)]] H_A = [0 0 0 1 0; 0 0 1 0 1; 0 1 0 0 0; @@ -419,16 +416,8 @@ G_B = [1 0 1 0 0; 0 1 0 1 0; 0 0 0 0 1] - classical_code_pair = ((H_A, G_A), (H_B, G_B)) # found via random search - c = QuantumTannerCode(G, A, B, classical_code_pair) - hx, hz = parity_matrix_x(c), parity_matrix_z(c) - @test iszero(mod.(hx*hz',2)) - stab = parity_checks(c) - ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 40 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 5 - # [[250, 33, 8]] + # [[250, 39, (5,1)]] H_A = [1 1 1 1 0; 1 1 0 1 1; 0 0 0 1 1; @@ -445,10 +434,11 @@ @test iszero(mod.(hx*hz',2)) stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 33 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 8 + @test code_n(c) == 250 == ns && code_k(c) == 39 == ks + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 5 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 - # [[250, 13, 10]] + # [[250, 12, (10,1)]] H_A =[0 1 1 0 1; 1 0 0 0 0; 1 1 1 1 0]; @@ -465,10 +455,11 @@ @test iszero(mod.(hx*hz',2)) stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 13 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 10 + @test code_n(c) == 250 == ns && code_k(c) == 12 == ks + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 9 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 6 - # [[250, 93, 4]] + # [[250, 94, (3,3)]] H_A = [1 1 1 1 1] G_A = [1 1 0 0 0; 1 0 1 0 0; @@ -485,10 +476,11 @@ @test iszero(mod.(hx*hz',2)) stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 93 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 4 + @test code_n(c) == 250 == ns && code_k(c) == 94 == ks + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 3 - # [[250, 39, 4]] + # [[250, 39, (4,1)]] H_A = [1 0 1 1 1; 0 0 1 1 1; 1 0 1 1 0; @@ -506,49 +498,10 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 250 == ns && code_k(c) == 39 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 4 - - # [[250, 10, 14]] - H_A = [1 0 0 0 0; - 1 1 0 1 1]; - G_A = [0 0 1 0 0; - 0 1 0 1 0; - 0 1 0 0 1]; - H_B = [0 1 0 1 0; - 1 1 1 0 1]; - G_B = [1 0 1 0 0; - 1 1 0 1 0; - 1 0 0 0 1] - classical_code_pair = ((H_A, G_A), (H_B, G_B)) # found via random search - c = QuantumTannerCode(G, A, B, classical_code_pair) - hx, hz = parity_matrix_x(c), parity_matrix_z(c) - @test iszero(mod.(hx*hz',2)) - stab = parity_checks(c) - ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 10 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 14 - - # [[250, 39, 10]] - H_A = [1 0 0 0 1; - 1 0 1 0 0; - 1 1 0 0 1; - 0 1 1 0 0] - G_A = [0 0 0 1 0]; - H_B = [0 1 1 1 1; - 1 1 0 0 1]; - G_B = [1 1 1 0 0; - 1 1 0 1 0; - 0 1 0 0 1]; - classical_code_pair = ((H_A, G_A), (H_B, G_B)) # found via random search - c = QuantumTannerCode(G, A, B, classical_code_pair) - hx, hz = parity_matrix_x(c), parity_matrix_z(c) - @test iszero(mod.(hx*hz',2)) - stab = parity_checks(c) - ns, ks = code_n(stab), code_k(stab) - @test code_n(c) == 250 == ns && code_k(c) == 39 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 10 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 - # [[250, 36, 10]] + # [[250, 36, (10,1)]] H_A = [0 1 0 1 1; 0 1 0 1 0; 1 0 0 1 0; @@ -566,10 +519,11 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 250 == ns && code_k(c) == 36 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=300)) == 10 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 10 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 @testset "New codes found via other non-abelian groups" begin - # [[216, 30, 4]] + # [[216, 30, (4,3)]] l = 12 m = 4 F = free_group(["r", "s"]) @@ -592,13 +546,14 @@ stab = parity_checks(c) ns, ks = code_n(stab), code_k(stab) @test code_n(c) == 216 == ns && code_k(c) == 30 == ks - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 3 @test describe(G) == "C12 : C4" end end @testset "New instances of Quantum Tanner codes using Morgenstern generators" begin - # [[360, 8, 10]] + # [[360, 8, (10,3)]] l, i = 1, 2 q = 2^l Δ = q+1 @@ -609,39 +564,44 @@ @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 360 @test code_k(c) == 8 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 10 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 10 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 3 - # [[360, 10, 4]] + # [[360, 10, (4,1)]] classical_code_pair = (([0 0 1 1; 0 1 1 1], [1 0 0 0; 0 0 1 1]), ([1 0 1; 0 1 0], [1 0 1])) # found via random search c = QuantumTannerCode(SL₂, A, B, classical_code_pair) @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 360 @test code_k(c) == 10 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 - # [[360, 10, 6]] + # [[360, 10, (6,1)]] classical_code_pair = (([1 0 1 0; 1 1 0 0], [1 1 1 0; 0 0 0 1]), ([1 1 0; 0 0 1], [1 1 0])) # found via random search c = QuantumTannerCode(SL₂, A, B, classical_code_pair) @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 360 @test code_k(c) == 10 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 - # [[360, 20, 4]] + # [[360, 20, (4,1)]] classical_code_pair = (([1 1 0 0; 0 0 1 1], [1 1 0 0; 0 0 1 1]), ([0 0 1; 1 1 0], [1 1 0])) # found via random search c = QuantumTannerCode(SL₂, A, B, classical_code_pair) @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 360 @test code_k(c) == 20 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 1 - # [[360, 22, 6]] + # [[360, 22, (6,4)]] classical_code_pair = (([1 0 0 1; 0 1 1 0], [0 1 1 0; 1 0 0 1]), ([1 0 1; 1 1 0], [1 1 1])) # found via random search c = QuantumTannerCode(SL₂, A, B, classical_code_pair) @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 360 @test code_k(c) == 22 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X, time_limit=900)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:Z, time_limit=900)) == 4 end @testset "New instances of Quantum Tanner codes using other Frobenius groups" begin @@ -656,7 +616,7 @@ @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 150 @test code_k(c) == 48 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) == 4 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 4 # [[36, 16, 3]] x = cperm([1,2,3,4]) @@ -670,7 +630,7 @@ @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 36 @test code_k(c) == 16 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS)) == 3 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 3 # [[252, 70, 6]] rng = MersenneTwister(54) @@ -683,7 +643,7 @@ @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 252 @test code_k(c) == 70 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) == 6 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 6 # [[392, 96, 5]] rng = MersenneTwister(42) @@ -696,7 +656,7 @@ @test stab_looks_good(parity_checks(c), remove_redundant_rows=true) @test code_n(c) == 392 @test code_k(c) == 96 - @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, time_limit=120)) == 5 + @test distance(c, DistanceMIPAlgorithm(solver=HiGHS, logical_operator_type=:X)) == 5 end @testset "Random Symmetric Generating Tests" begin