Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Circulant GF(2) permutation matrix-based construction of Bivariate Bicycle quantum LDPC code #352

Draft
wants to merge 10 commits into
base: master
Choose a base branch
from

Conversation

Fe-r-oz
Copy link
Contributor

@Fe-r-oz Fe-r-oz commented Sep 2, 2024

Dear @Krastanov,

In this 2024 paper High-threshold and low-overhead fault-tolerant quantum memory, Bravyi et. al. has introduced a simple BBQLDPC code. In the Table 3, as seen below, these are the code constructions given in the paper.

All these constructions have been tested (especially at the moment, tests have been added to verify the number of logical qubits, k which is calculated on formula: k = n - rank(Hx) - rank(Hz). Please checkout the test section:
Screenshot_select-area_20240902134341

The interface is user-friendly:

julia> using QuantumClifford.ECC: BBQLDPC, parity_checks

julia> parity_checks(BBQLDPC(12, 6, [3, 1, 2], [3, 1, 2]))
# the stabilizer

The documentation is simple so it's easier to follow as well. Python implementation of this code is available at here.

Cross verification between python implementation and this implementation has been done. The matrices are huge, but we can export results from python, import them in julia and compare the results.

Would you like to have a dataset prepared for these given constructions, so we can import them and test for correctness comparison in the test section?

julia> using MAT
julia> using QuantumClifford
julia> using QuantumClifford.ECC: BBQLDPC, parity_checks, naive_encoding_circuit
julia> mat_file_path = "/home/Feroz/Desktop/matrices96.mat";
julia> mat_data = matopen(mat_file_path);
julia> AT = read(mat_data, "AT");
julia> BT = read(mat_data, "BT");
julia> BTT, ATT = parity_checks(BBQLDPC(9, 6, [3, 1, 2], [3, 1, 2]))
([0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0], [0 0 … 0 0; 1 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 1 0])
julia> BTT == BT
true
julia> ATT == AT
true
julia> mat_file_path = "/home/Feroz/Desktop/matrices2814.mat";
julia> mat_data = matopen(mat_file_path);
julia> AT = read(mat_data, "AT");
julia> BT = read(mat_data, "BT");
julia> BTT, ATT = parity_checks(BBQLDPC(28, 14, [26, 6, 8], [7, 9, 20]))
([0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0], [0 0 … 0 0; 0 0 … 0 0; … ; 0 0 … 0 0; 0 0 … 0 0])
julia> BTT == BT
true
julia> ATT == AT
true

There is bounds error as seen in #306.

Near-term use of this BBQLDPC: This pr will be helpful as BBLDPC code is a special case of LiftedProduct code as described the authors as follows: "We note that the code QC(A,B) can be viewed as a special case of the Lifted Product construction [54] based on the abelian group Z_ℓ × Z_m. Here Z_j denotes the cyclic group of order j." Maybe in the near-future, LiftedProduct code can be tested by using BBQLPC as a correctness check.

The aim and objective of the pr is small: to provide a correct and robust construction of BBQLDPC code. I will try to further improve it by adding more tests and incorprate your feedback.

I was very excited as I read the paper, so submitted it. I hope you find this plausible.

Thanks for your time.
...

If you want to submit an unfinished piece of work in order to get comments and discuss, please mark the pull request as a draft and ping the repository maintainer.

Please address only one topic or issue per pull request! Many small PRs are much easier to review and merge than one large PR.

Before merging, all changes and new functionality should be marked in the CHANGELOG file, but feel free to just leave your CHANGELOG notes in the PR description, to avoid merge conflicts with other requests modifying that file. The maintainer will add these CHANGELOG notes for you if you do so.

Before considering your pull request ready for review and merging make sure that all of the following are completed (please keep the clecklist as part of your PR):

  • The code is properly formatted and commented.
  • Substantial new functionality is documented within the docs.
  • All new functionality is tested.
  • All of the automated tests on github pass.

If possible, keep your git history not too wild (rebase and squash commits, keep commits small and semantically separated) so that review is easier.

@Fe-r-oz Fe-r-oz changed the title bivariate bicycle quantum LDPC code bivariate bicycle quantum ldpc code Sep 2, 2024
@Fe-r-oz Fe-r-oz marked this pull request as ready for review September 3, 2024 20:23
@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 4, 2024

Acknowledgement: I am very thankful to Claus from Oscar. He suggested a robust method to calculate the intersection of two kernels, ker(A) ∩ ker(B). This helped to construct a cross-reference check.

Downgrade error is occuring because hom is not present in Nemo's earlier versions. Probably, have to remove 0.42, 0.43, etc. Spell Error is occuring because of using Nemo: hom where hom is homomorphism

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 4, 2024

@royess, two days ago, I completed the BBQLDPC code. This can serve as a correctness check for LiftedProduct code as stated in the Bravyi paper, as BBQLDPC is a special case of the LiftedProduct code. I have also added correctness tests based on techniques suggested by Oscar fellows for this code.

These might be interesting to you: A new QLDPC decoder released today: BPOTF (It's a C++ decoder) and this #14 (comment).

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 5, 2024

@Krastanov, pinging for review. All the code constructions given in the paper I shared have been verified for BBQLDPC code. Furthermore, I have added cross-reference checks as well. To ensure robustness, I have also discussed (#352 (comment)) this with dear Oscar fellows whose guidance have been helpful in designing robust cross-verification test over the last 2 days. The code interface is user-friendly as well.

P.S Downgrade error is occuring because hom is not present in Nemo's earlier versions. Probably, have to remove 0.42, 0.43, etc. Spell Error is occuring because of using Nemo: hom where hom is homomorphism

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 6, 2024

Referring to #353 to monitor progress.

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 9, 2024

Referring to #356 as BB QLDPC can be viewed as a special case of LiftedProduct (please see comment: #352 (comment)) , so this PR serves as a correctness check for the latter codes, if desired.

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 27, 2024

The PR is ready for review. I have added many instances of BBQLDPCs in the test_base_ecc so that their stabilizer correctness, encoding, decoding and syndrome properties are tested. Thank you!

P.S. There were a lot of merge conflicts, therefore had to merge branch into master many times.

@Krastanov
Copy link
Member

@Fe-r-oz , thank you, this is a very useful addition.

@royess , @Fe-r-oz , do you know the proper way to represent the codes added here in terms of a lifted product? That would be a useful cross check.

@Krastanov Krastanov self-requested a review September 27, 2024 18:57
@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 27, 2024

Indeed. Bravyi notes that BBQLDPC can be viewed as a special case of Lifted Product construction based on abelian group ℤⱼ x ℤₘ where ℤⱼ cyclic group of order j Page 7. This implementation can serve as a cross-check to the proper way which is by constructing the code via Lifted Product construction.

@Krastanov
Copy link
Member

Do you know how to implement such a cross-check?

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Sep 27, 2024

I will have to see the literature on the LPCode construction method for these codes for the group theoretic route. The aforementioned paper used, let's say "matrix-based" approach, not the "group based" approach (LPCode construction).

side note: I did pondered about cross checking the matrix-based construction based on the formulas provided in the paper, especially calculating ker(A) ∩ ker(B) which is equal to k.

This manual correctness check uses Oscar hom (homomorphism) for Free Modules by taking intersection of two kernels, compute ker(A) ∩ ker(B) as suggested by Claus. This method for hom is not present in Hecke, Abstract Algebra or Nemo. It's actually presented in Oscar itself: https://github.com/oscar-system/Oscar.jl/blob/master/src/Modules/UngradedModules/FreeModuleHom.jl.

Without Oscar, one will get this error using hom for Free Modules: no method matching hom(::AbstractAlgebra.Generic.FreeModule{FqFieldElem}, ::AbstractAlgebra.Generic.FreeModule{FqFieldElem}, ::FqMatrix). It turns out that this specific method is present in Oscar FreeModuleElem.jl. Just some weeks ago, Nemo used to have this hom method as well, but they had breaking change quite often and have removed it.

Since we don't have Oscar as dependency, this is a manual check:

    using Test
    using QuantumClifford: stab_to_gf2
    using QuantumClifford.ECC
    using Nemo: nullspace, GF, matrix
    using Oscar: hom, free_module, kernel, domain, map, gens
    using QuantumClifford.ECC: AbstractECC, BBQLDPC, parity_checks_x, parity_checks_z

    # According to Lemma 1 from [bravyi2024high](@cite), k = 2·dim(ker(A)∩ker(B)).
    function _formula_k(stab)
        Hx = parity_checks_x(stab)
        n = size(Hx,2)÷2
        A = matrix(GF(2), Hx[:,1:n])
        B = matrix(GF(2), Hx[:,n+1:end])
        k = GF(2)
        hA = hom(free_module(k, size(A, 1)), free_module(k, size(A, 2)), A)
        hB = hom(free_module(k, size(B, 1)), free_module(k, size(B, 2)), B)
        ans = kernel(hA)[1] ∩ kernel(hB)[1]
        k = 2*size(map(domain(hA), gens(ans[1])), 1)
        return k
    end

     @testset "Verify number of logical qubits `k` from  Table 3" begin
        # Refer to [bravyi2024high](@cite) for code constructions
        @test code_k(BBQLDPC(9 , 6 , [3 , 1 , 2] , [3 , 1 , 2]))   == 8   == _formula_k(BBQLDPC(9 , 6 , [3 , 1 , 2] , [3 , 1 , 2]))
        @test code_k(BBQLDPC(15, 3 , [9 , 1 , 2] , [0 , 2 , 7]))   == 8   == _formula_k(BBQLDPC(15, 3 , [9 , 1 , 2] , [0 , 2 , 7]))
        @test code_k(BBQLDPC(12, 12, [3 , 2 , 7] , [3 , 1 , 2]))   == 12  == _formula_k(BBQLDPC(12, 12, [3 , 2 , 7] , [3 , 1 , 2]))
        @test code_k(BBQLDPC(12, 6 , [3 , 1 , 2] , [3 , 1 , 2]))   == 12  == _formula_k(BBQLDPC(12, 6 , [3 , 1 , 2] , [3 , 1 , 2]))
        @test code_k(BBQLDPC(6 , 6 , [3 , 1 , 2] , [3 , 1 , 2]))   == 12  == _formula_k(BBQLDPC(6 , 6 , [3 , 1 , 2] , [3 , 1 , 2]))
        @test code_k(BBQLDPC(30, 6 , [9 , 1 , 2] , [3 , 25, 26]))  == 12  == _formula_k(BBQLDPC(30, 6 , [9 , 1 , 2] , [3 , 25, 26]))
        @test code_k(BBQLDPC(21, 18, [3 , 10, 17], [5 , 3 , 19]))  == 16  == _formula_k(BBQLDPC(21, 18, [3 , 10, 17], [5 , 3 , 19]))
        @test code_k(BBQLDPC(28, 14, [26, 6 , 8] , [7 , 9 , 20]))  == 24  == _formula_k(BBQLDPC(28, 14, [26, 6 , 8] , [7 , 9 , 20]))
    end

    @testset "Verify number of logical qubits `k` from  Table 1" begin
        # Refer to [berthusen2024toward](cite for code constructions
        @test code_k(BBQLDPC(12, 3 , [9 , 1 , 2] , [0 , 1 , 11]))  == 8   == _formula_k(BBQLDPC(12, 3 , [9 , 1 , 2] , [0 , 1 , 11]))
        @test code_k(BBQLDPC(9 , 5 , [8 , 4 , 1] , [5 , 8 , 7]))   == 8   == _formula_k(BBQLDPC(9 , 5 , [8 , 4 , 1],  [5 , 8 , 7]))
        @test code_k(BBQLDPC(12, 5 , [10, 4 , 1] , [0 , 1 , 2]))   == 8   == _formula_k(BBQLDPC(12, 5 , [10, 4 , 1] , [0 , 1 , 2]))
        @test code_k(BBQLDPC(15, 5 , [5 , 2 , 3] , [2 , 7 , 6]))   == 8   == _formula_k(BBQLDPC(15, 5 , [5 , 2 , 3] , [2 , 7 , 6]))
        @test code_k(BBQLDPC(14, 7 , [6 , 5 , 6] , [0 , 4, 13]))   == 12  == _formula_k(BBQLDPC(14, 7 , [6 , 5 , 6] , [0 , 4, 13]))
    end

@Krastanov
Copy link
Member

Oscar can be added to the test-runner without being added as a dependency to the package itself, if it can provide useful testing capabilities

@Fe-r-oz Fe-r-oz changed the title bivariate bicycle quantum ldpc code Circulant GF(2)-matrix-based construction of Bivariate Bicycle quantum LDPC code Sep 29, 2024
@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Oct 2, 2024

Pardon for the delay, Added Oscar to the test-runner. There will be some CI errors which are unrelated:

ERROR: LoadError: InitError: GAP.jl currently does not support multithreaded garbage collection. Please run julia with `--gcthreads=1` for now.

ERROR: LoadError: Windows is not supported, please try the Windows Subsystem for Linux.
For details please check: https://www.oscar-system.org/install/

I didn't add Oscar to deps, only in test-runner but Downgrade gives error. Spell check error is occurring because it see hom as error. Also, reintroducing piracy in 371 introduced 30 broken errors in test summary which are unrelated to this PR: https://github.com/QuantumSavory/QuantumClifford.jl/runs/30774357893?check_suite_focus=true#step:7:373

Plots:

display

display

julia> codes = [circulant_bivariate_bicycle(7,7,[3,5,6],[2,3,5]),
                circulant_bivariate_bicycle(15,3,[9,1,2],[0,2,7]),
                circulant_bivariate_bicycle(9,5,[8,4,1],[5,8,7])]

julia>  mem_errors = 0.00001:0.00005:0.001;

julia> julia> results = zeros(length(codes), length(mem_errors), 2);

julia> for (ic, c) in pairs(codes)
                 for (i,m) in pairs(mem_errors)
                     setup = CommutationCheckECCSetup(m)
                     decoder = TableDecoder(c)
                     r = evaluate_decoder(decoder, setup, 100000)
                     results[ic,i,:] .= r
                 end
        end


julia> for (ic, c) in pairs(codes)
                 for (i,m) in pairs(mem_errors)
                     setup = ShorSyndromeECCSetup(m,0)
                     decoder = TableDecoder(c)
                     r = evaluate_decoder(decoder, setup, 100000)
                     results[ic,i,:] .= r
                 end
         end

@Fe-r-oz Fe-r-oz changed the title Circulant GF(2)-matrix-based construction of Bivariate Bicycle quantum LDPC code Circulant GF(2) permutation matrix-based construction of Bivariate Bicycle quantum LDPC code Oct 3, 2024
@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Oct 5, 2024

Do you know how to implement such a cross-check?

@Krastanov, Thank you for your suggestion. The cross check (#372) has been implemented as well. Code_n and Code_k values match even though the two constructions used vastly different formulas and techniques. I also plotted their Table Decoding graphs which are also similar. Their canonical forms are nonequivalent because this construction applies a circulant permutation matrix to the column space. Permutating the rowspace does not change the canonical forms of matrices as we have seen and tested in the past, but permutating the column space leads to nonequivalent canonical form. Hopefully, this is satisfactory and reasonable.

In this construction, x = Sₗ ⊗ Iₘ permutes the rowspace and y = Iₗ ⊗ Sₘ permutes the column space where Sₘ is the circulant permutation matrix. Also, Added all of the code instances in literature (to my knowledge) to test section, testing their code_nand code_k values based on the formulas given in Bravyi paper: code_k is n - rank(Hx) - rank(Hz), formula_k is 2 * dim(kernel(A) ∩ kernel(B)) == k. Cross checked it with original python implementation as well.

A small test which shows permutating the column space leads to nonequivalent canonical forms:

using LinearAlgebra, Nemo, Test

H = [1 1 0 1 0 0 0;
     1 0 1 0 1 0 0;
     0 1 1 0 0 1 0;
     0 0 0 1 1 1 1]

# permutations over column space
function permute_columns(matrix, perm)
    return matrix[:, perm]
end

col_permutations = [
    [1, 2, 3, 4, 5, 6, 7],
    [2, 1, 3, 4, 5, 6, 7],
    [1, 3, 2, 4, 5, 6, 7],
    [3, 1, 2, 4, 5, 6, 7]
    ]

for (i, perm) in enumerate(col_permutations)
    permuted_H = permute_columns(H, perm)
    rref_H = echelon_form(Nemo.matrix(Nemo.GF(2), permuted_H))
    rref_without_permut = echelon_form(Nemo.matrix(Nemo.GF(2), H))
    @test rref_H == rref_without_permut # gives error because of permutation of column space
end


# permutations over row space: Canonical form is equivalent as expected
row_permutations = [
           [1, 2, 3, 4],
           [2, 1, 3, 4],
           [1, 3, 2, 4],
           [4, 3, 2, 1]
       ]

function permute_rows(matrix, perm)
    return matrix[perm, :]
end

for (i, perm) in enumerate(row_permutations)
    permuted_H = permute_rows(H, perm)
    rref_H = echelon_form(Nemo.matrix(Nemo.GF(2), permuted_H))
    rref_without_permut = echelon_form(Nemo.matrix(Nemo.GF(2), H))
    @test rref_H == rref_without_permut
end

P.S. Thank you for your help is resolving the weird CI errors when adding Oscar to test-runner. That is much appreciated.

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Oct 7, 2024

Experimental WIP: Stacked Model and Bilayered Architecture

Future work: The papers on these codes talk about Toric Layout and Embeddings for these codes for 2D Implementation. Thus, two future features, namely - bivaraite_toric_layout and bivaraite_embedding are also being worked on at the moment for later PR. I have cross checked these features with the original implementation, and implemented these two functionalities as well. But I think the plotting indexing conventions needs to be much polished. I have constructed it using Plots, not Makie/CaireMakie though. I have checked the embedding and toric layout, it matches in calculation, but in plotting, the ancilla seems to be upside down. I think these two features will be useful w.r.t to circuit-level simulation, for these codes.

  • bivaraite_toric_layout : Toric Layout of Bivariate bicycle codes (lemma 3)
  • bivaraite_embedding: 2D Embeddings of the Bivariate Bicycle codes

my_plot11

Copy link
Member

@Krastanov Krastanov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is awesome! Left a few comments in.

@@ -48,15 +48,15 @@ Combinatorics = "1.0"
DataStructures = "0.18"
DocStringExtensions = "0.9"
Graphs = "1.9"
Hecke = "0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34"
Hecke = "0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.34.3"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is this needed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not needed now thanks to Tommy CI Oscar Injection!

This PR was done earlier, why I was trying to add Oscar to test runner, so that's why the weird additions

HostCPUFeatures = "0.1.6"
ILog2 = "0.2.3"
InteractiveUtils = "1.9"
LDPCDecoders = "0.3.1"
LinearAlgebra = "1.9"
MacroTools = "0.5.9"
Makie = "0.20, 0.21"
Nemo = "0.42.1, 0.43, 0.44, 0.45, 0.46, 0.47"
Nemo = "0.42.1, 0.43, 0.44, 0.45, 0.46, 0.47, 0.47.1"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is this needed?


The matrices `x = Sₗ ⊗ Iₘ` and `y = Iₗ ⊗ Sₘ` are used. The BB code is represented by matrices `A` and `B`, defined as: `A = A₁ + A₂ + A₃` and `B = B₁ + B₂ + B₃`. The addition and multiplication operations on binary matrices are performed modulo 2. The check matrices are: `Hx = [A|B]` and `Hz = [B'|A']`. Both `Hx` and `Hz` are `(n/2)×n` matrices.

The ECC Zoo has an [entry for this family](https://errorcorrectionzoo.org/c/qcga).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also needs:

  • explanation of what the l,m,A,B entries are
  • doctest example
  • comparison to using directly the other ways in which this code can already be created in this library
  • "see also" for other codes and constructions
  • a remark in the "see also" that mentions alternative way to construct these same codes


The ECC Zoo has an [entry for this family](https://errorcorrectionzoo.org/c/qcga).
"""
struct circulant_bivariate_bicycle <: AbstractECC
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be named like a struct, not like a function (e.g. CirculantBivariateBicycle)

Comment on lines +14 to +17
(l >= 0 && m >= 0) || error("l and m must be non-negative")
(length(A) == 3 && length(B) == 3) || error("A and B must each have exactly 3 entries")
(all(x -> x >= 0, A) && all(x -> x >= 0, B)) || error("A and B must contain only non-negative integers")
(all(x -> x in 0:max(l, m), A) && all(x -> x in 0:max(l, m), B)) || error("Each element in A and B must be in the range [0, $(max(l, m))].")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you use an explicit throw of an argument error or domain error instead of a generic error

@@ -16,12 +17,15 @@ LDPCDecoders = "3c486d74-64b9-4c60-8b1a-13a564e77efb"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
Nemo = "2edaba10-b0f1-5616-af89-8c11ac63239a"
Oscar = "f1435218-dba5-11e9-1e4d-f1a5fab5fc13"
Polymake = "d720cf60-89b5-51f5-aff5-213f193123e7"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is polymake needed?

PyQDecoders = "17f5de1a-9b79-4409-a58d-4d45812840f7"
Quantikz = "b0d11df0-eea3-4d79-b4a5-421488cbf74b"
QuantumInterface = "5717a53b-5d69-4fa3-b976-0bf2f97ca1e5"
QuantumOpticsBase = "4f57444f-1401-5e15-980d-4471b28d5678"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
Singular = "bcd08a7b-43d2-5ff7-b6d4-c458787f915c"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is Singular needed?

@@ -0,0 +1,53 @@
@testitem "ECC circulant_bivariate_bicycle" begin
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these tests probable also need a subset of tests that verify correctness against the other construction method you have already contributed

A = matrix(GF(2), Hx[:,1:n])
B = matrix(GF(2), Hx[:,n+1:end])
k = GF(2)
hA = hom(free_module(k, size(A, 1)), free_module(k, size(A, 2)), A)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hom needs to be added to the spellchecker (the .typos file)


@article{berthusen2024toward,
title={Toward a 2D local implementation of quantum LDPC codes},
author={Berthusen, Noah and Devulapalli, Dhruv and Schoute, Eddie and Childs, Andrew M and Gullans, Michael J and Gorshkov, Alexey V and Gottesman, Daniel},
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Childs" needs to be added to the spellchecker (the .typos file)

@Fe-r-oz
Copy link
Contributor Author

Fe-r-oz commented Nov 5, 2024

Thank you for your comments. This PR was done before Tommy's CI Injection Oscar approach which greatly simplified things for us.

Before the CI Injection, I was trying to add Oscar into test runner and meeting requirements which was not the right approach.

The tests require hom method for Oscar, this hom method provides homomorphism between free modules for kernel calculation.

So, let's turn this into draft till we have Oscar into the system.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants