QCHackers / tqec

Design automation software tools for Topological Quantum Error Correction
https://tqec.app
Apache License 2.0
58 stars 15 forks source link

Implement more unit-tests for the backend #229

Open nelimee opened 1 month ago

nelimee commented 1 month ago

Is your feature request related to a problem? Please describe. Running coverage analysis with python -m pytest --cov=tqec . on the tqec library yields the following results

---------- coverage: platform linux, python 3.12.2-final-0 -----------
Name                                                        Stmts   Miss  Cover
-------------------------------------------------------------------------------
src/tqec/__init__.py                                            9      0   100%
src/tqec/_version.py                                            2      0   100%
src/tqec/circuit/__init__.py                                    3      0   100%
src/tqec/circuit/circuit.py                                    35      0   100%
src/tqec/circuit/circuit_test.py                               28      0   100%
src/tqec/circuit/operations/__init__.py                         2      0   100%
src/tqec/circuit/operations/measurement_map.py                 67     13    81%
src/tqec/circuit/operations/measurement_map_test.py            95      0   100%
src/tqec/circuit/operations/operation.py                       83     12    86%
src/tqec/circuit/operations/operation_test.py                  59      0   100%
src/tqec/circuit/operations/transformer.py                     57     44    23%
src/tqec/circuit/schedule.py                                  197     43    78%
src/tqec/enums.py                                              34      7    79%
src/tqec/exceptions.py                                          2      0   100%
src/tqec/noise_models/__init__.py                               7      0   100%
src/tqec/noise_models/after_clifford_depolarization.py         24     17    29%
src/tqec/noise_models/after_reset_flip.py                       9      4    56%
src/tqec/noise_models/base.py                                  15      8    47%
src/tqec/noise_models/before_measure_flip.py                    9      4    56%
src/tqec/noise_models/before_round_data_depolarization.py       7      2    71%
src/tqec/noise_models/idle_qubits.py                           15      9    40%
src/tqec/noise_models/multi_qubit_gates.py                     12      7    42%
src/tqec/plaquette/__init__.py                                  2      0   100%
src/tqec/plaquette/library/__init__.py                          7      0   100%
src/tqec/plaquette/library/empty.py                            11      3    73%
src/tqec/plaquette/library/initialisation.py                   20      5    75%
src/tqec/plaquette/library/measurement.py                      16      7    56%
src/tqec/plaquette/library/pauli.py                            16      8    50%
src/tqec/plaquette/library/utils/detectors.py                   8      4    50%
src/tqec/plaquette/library/utils/pauli.py                      32     25    22%
src/tqec/plaquette/library/xx.py                                7      1    86%
src/tqec/plaquette/library/xxxx.py                              6      1    83%
src/tqec/plaquette/library/zz.py                                7      1    86%
src/tqec/plaquette/library/zzzz.py                              6      1    83%
src/tqec/plaquette/plaquette.py                                27      2    93%
src/tqec/plaquette/qubit.py                                    47     14    70%
src/tqec/plaquette/qubit_test.py                               14      0   100%
src/tqec/position.py                                           17      1    94%
src/tqec/position_test.py                                      10      0   100%
src/tqec/templates/__init__.py                                  6      0   100%
src/tqec/templates/atomic/__init__.py                           2      0   100%
src/tqec/templates/atomic/rectangle.py                         69      4    94%
src/tqec/templates/atomic/rectangle_test.py                   103      0   100%
src/tqec/templates/atomic/square.py                            43     17    60%
src/tqec/templates/atomic/square_test.py                       59      2    97%
src/tqec/templates/base.py                                     57     15    74%
src/tqec/templates/base_test.py                                22      0   100%
src/tqec/templates/composed.py                                115     53    54%
src/tqec/templates/composed_test.py                            18      0   100%
src/tqec/templates/constructions/__init__.py                    2      0   100%
src/tqec/templates/constructions/corner.py                     18     10    44%
src/tqec/templates/constructions/qubit.py                      23     12    48%
src/tqec/templates/display.py                                  64     56    12%
src/tqec/templates/scale.py                                    49      2    96%
src/tqec/templates/scale_test.py                               52      0   100%
src/tqec/templates/shifted.py                                  40      2    95%
src/tqec/templates/shifted_test.py                             37      0   100%
src/tqec/templates/stack.py                                    42      1    98%
src/tqec/templates/stack_test.py                               74      0   100%
-------------------------------------------------------------------------------
TOTAL                                                        1919    417    78%

that clearly show that some code files are missing unit tests.

Describe the solution you'd like

More unit tests on under-tested code.

smburdick commented 1 month ago

Which of these do you consider high priority?

src/tqec/noise_models/after_clifford_depolarization.py         24     17    29%
src/tqec/noise_models/after_reset_flip.py                       9      4    56%
src/tqec/noise_models/base.py                                  15      8    47%
src/tqec/noise_models/before_measure_flip.py                    9      4    56%
src/tqec/noise_models/before_round_data_depolarization.py       7      2    71%
src/tqec/noise_models/idle_qubits.py                           15      9    40%
src/tqec/noise_models/multi_qubit_gates.py                     12      7    42%
src/tqec/templates/composed.py                                115     53    54%
src/tqec/templates/constructions/corner.py                     18     10    44%
src/tqec/templates/constructions/qubit.py                      23     12    48%
src/tqec/templates/display.py                                  64     56    12%
src/tqec/plaquette/library/utils/pauli.py                      32     25    22%
src/tqec/circuit/operations/transformer.py                     57     44    23%
nelimee commented 1 month ago

I would say these in order of priority

src/tqec/plaquette/library/utils/pauli.py                      32     25    22%
src/tqec/circuit/operations/transformer.py                     57     44    23%
src/tqec/templates/composed.py                                115     53    54%
src/tqec/templates/constructions/qubit.py                      23     12    48%
src/tqec/noise_models/after_clifford_depolarization.py         24     17    29%
src/tqec/noise_models/after_reset_flip.py                       9      4    56%
src/tqec/noise_models/base.py                                  15      8    47%
src/tqec/noise_models/before_measure_flip.py                    9      4    56%
src/tqec/noise_models/before_round_data_depolarization.py       7      2    71%
src/tqec/noise_models/idle_qubits.py                           15      9    40%
src/tqec/noise_models/multi_qubit_gates.py                     12      7    42%
src/tqec/templates/display.py                                  64     56    12%
src/tqec/templates/constructions/corner.py                     18     10    44%  << known to be invalid

the first 4 are the most important. Noise models are less important, they did not change since a long time and have been "tested" by generating successfully several Stim circuits since then, so I believe that they are correct.

corner.py is, if I remember correctly, invalid, and might be significantly changed in the future so I think there is no point in writing tests for it.

display.py aims at graphically representing the templates, so it is:

  1. harder to test (we can assert on raw SVG, but that is stricter than what we need),
  2. not central to the code base.