Iterable Demuxing#

demux(input, ctrl_qv, output=None, ctrl_method=None, permit_mismatching_size=False, parallelize_qc=False)[source]#

This functions allows moving an input value into an iterable output, where the position is specified by a QuantumFloat. Demux is short for demultiplexer and is a standard component in classical electrical circuitry.

Demux can either move qubit states into a QuantumVariable or QuantumVariables into QuantumArrays.

This function can also be used to “in-place demux” the 0-th entry of an iterable to the position specified by ctrl_qv. For more information on this, check the second example.

Parameters
inputQubit or QuantumVariable

The input value that is supposed to be moved.

ctrl_qvQuantumFloat

The QuantumFloat specifying to which output the input should be moved.

outputQuantumVariable or QuantumArray, optional

The output object, where the input should end up. By default, a new object (QuantumVariable or QuantumArray) is created. Note that when this parameter is given, it is guaranteed, that the 0-th entry will be moved to the desired position, the other entries can also be permuted away from their original position.

ctrl_methodstring, optional

The ctrl_method string passed to the control environment to generate controlled swaps.

permit_mismatching_sizebool, optional

If set to False, an exception will be raised, if the state-space dimension of ctrl_qv` is differing from the amount of outputs. The default is False.

parallelize_qcbool, optional

If set to True, this option reduces (de)allocates additional qubits to reduce the depth. The default is False.

Returns
outputQuantumVariable or QuantumArray

The output object with the input signal placed at the index specified by ctrl_qv.

Raises
Exception

Tried to demux with mismatchingly sized control input.

Examples

We create a QuantumBool and demux it into a QuantumArray

from qrisp import *

qb = QuantumBool()
qb.flip()

index = QuantumFloat(2)

h(index[1])

res_array = demux(qb, index)
>>> print(multi_measurement([index, res_array]))
{(0, OutcomeArray([1., 0., 0., 0.])): 0.5, (2, OutcomeArray([0., 0., 1., 0.])): 0.5}

Demux can also be used to move the 0-th entry of a QuantumArray in-place.

qa = QuantumArray(shape = 4, qtype = qb)

qa[0].flip()

demux(qa[0], index, qa)
>>> print(multi_measurement([index, qa]))
{(0, OutcomeArray([1., 0., 0., 0.])): 0.5, (2, OutcomeArray([0., 0., 1., 0.])): 0.5}

For low-level manipulations, demux can move information within QuantumVariables.

qf = QuantumVariable(4)

qf[:] = "1000"

demux(qf[0], index, qf)
>>> print(multi_measurement([index, qf]))
{(0, '1000'): 0.5, (2, '0010'): 0.5}