qrisp.qaoa.constrained_mixer_gen#
- constrained_mixer_gen(constraint_oracle, winner_state_amount)[source]#
Generates a customized mixer function that leaves arbitrary constraints intact. The constraints are specified via a
constraint_oraclefunction, which is taking a QuantumVariable or QuantumArray and apply a phase \(\phi\) (specified by the keyword argumentphase) to the states that are allowed by the constraints.Additionally the amount of winner states needs to be known. For this the user needs to provide the function
winner_state_amount, that returns the number of winner states for a given qubit amount. This number can be an approximation, however faulty values can cause leakage into the state-space that is forbidden by the constraints.For more details regarding implementation specifics please check the corresponding tutorial.
- Parameters:
- constraint_oraclefunction
A function of a QuantumVariable or QuantumArray. Also needs to support the keyword argument
phase. This function should apply the phase specified by the keyword argument to the allowed states.- winner_state_amountfunction
A function of a QuantumVariable or QuantumArray, that returns the amount of winner states for that QuantumVariable.
- Returns:
- constrained_mixerfunction
A mixer function that does not leave the allowed space specified by the oracle.
Examples
We create a mixer function that only mixes among the states where the first and the last qubit disagree. In more mathematical terms - they satisfy the following constraint function.
\[f: \mathbb{F}_2^n \rightarrow \mathbb{F}_2, x \rightarrow (x_{n-1} \neq x_0)\]from qrisp.qaoa import constrained_mixer_gen from qrisp import QuantumVariable, auto_uncompute, cx, p @auto_uncompute def constraint_oracle(qarg, phase): predicate = QuantumBool() cx(qarg[0], predicate) cx(qarg[-1], predicate) p(phase, predicate) def winner_state_amount(qarg): return 2**(len(qarg) - 1) mixer = constrained_mixer_gen(constraint_oracle, winner_state_amount)
To test the mixer, we create a QuantumVariable:
import numpy as np beta = np.pi qv = QuantumVariable(3) qv[:] = "101" mixer(qv, beta) print(qv) #Yields: {'101': 1.0} #Leaves forbidden states invariant qv = QuantumVariable(3) qv[:] = "100" mixer(qv, beta) print(qv) #Yields: {'100': 0.25, '110': 0.25, '001': 0.25, '011': 0.25} #Only mixes among allowed states