Phase polynomial representation of a quantum circuit that only contains
X, CX and Rz gates.
Create a phase polynomial from given circuit. The circuit can only contain
Controlled-X and Rz gates.
Parameters:
-
gates
(DAG)
–
Circuit represented by this polynomial
Source code in QuICT/qcda/optimization/clifford_rz_optimization/phase_poly.py
| def __init__(self, gates):
"""
Create a phase polynomial from given circuit. The circuit can only contain
Controlled-X and Rz gates.
Args:
gates (DAG): Circuit represented by this polynomial
"""
self.phases = {}
self.gates = []
self.size = gates.width()
self._build_poly(gates)
|
get_circuit
get_circuit(epsilon=1e-10) -> Circuit
Generate a circuit of minimal size that implements the phase polynomial
Returns:
-
Circuit ( Circuit
) –
Circuit equivalent to this polynomial
Source code in QuICT/qcda/optimization/clifford_rz_optimization/phase_poly.py
| def get_circuit(self, epsilon=1e-10) -> Circuit:
"""
Generate a circuit of minimal size that implements the phase polynomial
Returns:
Circuit: Circuit equivalent to this polynomial
"""
max_monomial = max(self.phases.keys()) if len(self.phases.keys()) > 0 else 1
circ = Circuit(self.size)
visited = set()
for qubit_ in range(int(np.ceil(log2(max_monomial + 1))) + 1):
if (1 << qubit_) in self.phases:
if abs(self.phases[1 << qubit_]) > epsilon:
Rz(self.phases[1 << qubit_]) | circ(qubit_)
visited.add(1 << qubit_)
monomials = {}
for gate_ in self.gates:
gate_: BasicGate
for qubit_ in chain(gate_.cargs, gate_.targs):
if qubit_ not in monomials:
monomials[qubit_] = 1 << (qubit_ + 1)
if gate_.qasm_name == 'cx':
monomials[gate_.targ] = monomials[gate_.targ] ^ monomials[gate_.carg]
elif gate_.qasm_name == 'x':
monomials[gate_.targ] = monomials[gate_.targ] ^ 1
gate_.copy() | circ(list(chain(gate_.cargs, gate_.targs)))
cur_phase = monomials[gate_.targ] >> 1
cur_sign = -1 if (monomials[gate_.targ] & 1) else 1
if cur_phase in self.phases and cur_phase not in visited:
if abs(self.phases[cur_phase]) > epsilon:
Rz(cur_sign * self.phases[cur_phase]) | circ(gate_.targ)
visited.add(cur_phase)
return circ
|