Decoders#

A decoder in PECOS is simply a function or other callable that takes the measurement outcomes from error extractions (syndromes) as input and returns a QuantumCircuit, which is used as a recovery operation to mitigate errors. Decoder classes and functions are in the decoders namespace.

The MWPM2D class is an available decoder class, which I will discuss next.

MWPM2D#

One of the standard decoders used for surface codes is the minimum-weight-perfect-matching (MWPM) decoder [Den+02]. The MWPM2D class implements the 2D version of this decoder for Surface4444 and SurfaceMedial4444, that is, it decodes syndromes for a single round of error extraction:

>>> import pecos as pc
>>> depolar = pc.error_gens.DepolarModel(model_level="code_capacity")
>>> surface = pc.qeccs.Surface4444(distance=3)
>>> logic = pc.circuits.LogicalCircuit()
>>> logic.append(surface.gate("ideal init |0>"))
>>> logic.append(surface.gate("I", num_syn_extract=1))
>>> circ_runner = pc.circuit_runners.Standard(seed=1)
>>> state = pc.simulators.SparseSim(surface.num_qudits)
>>> decode = pc.decoders.MWPM2D(surface).decode
>>> meas, err = circ_runner.run_logic(state, logic, error_gen=depolar, error_params={"p": 0.1})
>>> meas  
{(1, 0): {7: {3: 1, 5: 1, 9: 1, 15: 1}}}
>>> err  
{(1, 0): {0: {'after': QuantumCircuit([{'Y': {4}, 'X': {10}}])}}}
>>> decode(meas)  
QuantumCircuit([{'X': {10}, 'Y': {4}}])
decodes syndromes for a single round of error extraction:
>>> import pecos as pc
>>> depolar = pc.error_gens.DepolarModel(model_level="code_capacity")
>>> surface = pc.qeccs.Surface4444(distance=3)
>>> logic = pc.circuits.LogicalCircuit()
>>> logic.append(surface.gate("ideal init |0>"))
>>> logic.append(surface.gate("I", num_syn_extract=1))
>>> circ_runner = pc.circuit_runners.Standard(seed=1)
>>> state = pc.simulators.SparseSim(surface.num_qudits)
>>> decode = pc.decoders.MWPM2D(surface).decode
>>> meas, err = circ_runner.run_logic(state, logic, error_gen=depolar, error_params={"p": 0.1})
>>> meas  
{(1, 0): {7: {3: 1, 5: 1, 9: 1, 15: 1}}}
>>> err  
{(1, 0): {0: {'after': QuantumCircuit([{'Y': {4}, 'X': {10}}])}}}
>>> decode(meas)  
QuantumCircuit([{'X': {10}, 'Y': {4}}])
decodes syndromes for a single round of error extraction:
>>> import pecos as pc
>>> depolar = pc.error_gens.DepolarModel(model_level="code_capacity")
>>> surface = pc.qeccs.Surface4444(distance=3)
>>> logic = pc.circuits.LogicalCircuit()
>>> logic.append(surface.gate("ideal init |0>"))
>>> logic.append(surface.gate("I", num_syn_extract=1))
>>> circ_runner = pc.circuit_runners.Standard(seed=1)
>>> state = pc.simulators.SparseSim(surface.num_qudits)
>>> decode = pc.decoders.MWPM2D(surface).decode
>>> meas, err = circ_runner.run_logic(state, logic, error_gen=depolar, error_params={"p": 0.1})
>>> meas  
{(1, 0): {7: {3: 1, 5: 1, 9: 1, 15: 1}}}
>>> err  
{(1, 0): {0: {'after': QuantumCircuit([{'Y': {4}, 'X': {10}}])}}}
>>> decode(meas)  
QuantumCircuit([{'X': {10}, 'Y': {4}}])
decodes syndromes for a single round of error extraction:
>>> import pecos as pc
>>> depolar = pc.error_gens.DepolarModel(model_level="code_capacity")
>>> surface = pc.qeccs.Surface4444(distance=3)
>>> logic = pc.circuits.LogicalCircuit()
>>> logic.append(surface.gate("ideal init |0>"))
>>> logic.append(surface.gate("I", num_syn_extract=1))
>>> circ_runner = pc.circuit_runners.Standard(seed=1)
>>> state = pc.simulators.SparseSim(surface.num_qudits)
>>> decode = pc.decoders.MWPM2D(surface).decode
>>> meas, err = circ_runner.run_logic(state, logic, error_gen=depolar, error_params={"p": 0.1})
>>> meas  
{(1, 0): {7: {3: 1, 5: 1, 9: 1, 15: 1}}}
>>> err  
{(1, 0): {0: {'after': QuantumCircuit([{'Y': {4}, 'X': {10}}])}}}
>>> decode(meas)  
QuantumCircuit([{'X': {10}, 'Y': {4}}])
decodes syndromes for a single round of error extraction:
>>> import pecos as pc
>>> depolar = pc.error_gens.DepolarGen(model_level="code_capacity")
>>> surface = pc.qeccs.Surface4444(distance=3)
>>> logic = pc.circuits.LogicalCircuit()
>>> logic.append(surface.gate("ideal init |0>"))
>>> logic.append(surface.gate("I", num_syn_extract=1))
>>> circ_runner = pc.circuit_runners.Standard(seed=1)
>>> state = pc.simulators.SparseSim(surface.num_qudits)
>>> decode = pc.decoders.MWPM2D(surface).decode
>>> meas, err = circ_runner.run_logic(state, logic, error_gen=depolar, error_params={"p": 0.1})
>>> meas  
{(1, 0): {7: {3: 1, 5: 1, 9: 1, 15: 1}}}
>>> err  
{(1, 0): {0: {'after': QuantumCircuit([{'Y': {4}, 'X': {10}}])}}}
>>> decode(meas)  
QuantumCircuit([{'X': {10}, 'Y': {4}}])