The Parity Decoder

After obtaining a ParityOSOutput object and running the compiled problem on a quantum computer or simulator, an important step is the decoding. The read-out of the physical system results in a physical configuration where each qubit has the value +1 or -1. This physical configuration has to then be decoded to a logical configuration, in order to find the solution of the optimization problem that was submitted to ParityOS. The ParityOSOutput can make this transformation from the physical configuration to the logical configuration.

Basic example

Here is an example of how to use the ParityDecoder to decode a compiled problem with qubits at the coordinates (0, 0), (0, 1) and (1, 0), which form a single triangle constraint:

(0, 1)
  |   \
  |      \
(0, 0) -- (1, 0)

We assume that the ParityOSOutput containing this compiled problem is stored in a variable called parityos_output. The decoding of a physical configuration, as a dictionary going from a qubit to it’s read-out value can then be done as follows:

physical_configuration = {Qubit((0, 0)): 1, Qubit((0, 1)) : -1, Qubit((1, 0)): -1}
logical_configuration = parityos_output.decode(physical_configuration)

The resulting logical_configuration will also be a dictionary going from qubit to +1 or -1, but using the qubits from the optimization problem.

Error correction

If the physical configuration that is given to the decode method does not satisfy the physical constraints, classical error correction will be applied to find the closest physical state that does satisfy all constraints. This corrected physical configuration will then be decoded into a logical configuration and returned.

Note

The method that does error correction can also be accessed independently from the decode method, by calling error_correct(...) on a physical configuration.

Reduced read-out

The decoder can also handle an incomplete physical configuration, as long as enough qubit values are given to recover the full physical configuration using the physical constraints. For example, if in the basic example only two out of the three qubits are specified, the decoder will assume that the constraint is satisfied and use it to find the value of the third qubit. To try this out, pass the following physical configuration to the decode method:

physical_configuration = {Qubit((0, 0)): 1, Qubit((0, 1)) : -1}
logical_configuration = parityos_output.decode(physical_configuration)

When passing to the decoder a physical configuration that does not contain all qubit values, it will still try to do error correction using the information it has. However, the fewer qubits values are supplied, the fewer errors can be corrected.

Selecting qubits for read-out

Because read-out is an expensive resource, you may want to read out as few qubits as possible while still being able to decode the resulting configuration. The parityOS output is able to construct such a minimal read-out set of qubits using the method select_reduced_readout_qubits. The result will be a list of qubits that can directly be passed to the decode method after read-out and result in a logical configuration. Note that in this case, the decoder cannot apply any error correction, as there is no redundancy in the read-out.