Source code for shor.quantum
from typing import List, Union
import numpy as np
from shor.errors import CircuitError
from shor.gates import _Gate
from shor.layers import Qbits, _Layer
from shor.operations import Measure, _Operation
[docs]class QuantumCircuit(object):
def __init__(self):
self.layers: List[_Layer] = []
[docs] def add(self, layer_or_circuit: Union[_Layer, "QuantumCircuit"]):
if isinstance(layer_or_circuit, _Layer):
self.layers.append(layer_or_circuit)
elif isinstance(layer_or_circuit, QuantumCircuit):
self.layers.extend(layer_or_circuit.layers)
else:
raise TypeError("QuantumCircuit class cannot add the type: {}".format(type(layer_or_circuit)))
return self
[docs] def draw(self):
# Use the qiskit drawing function, may want to replace in future.
from shor.transpilers.qiskit import to_qiskit_circuit
return to_qiskit_circuit(self).draw()
[docs] def initial_state(self) -> np.ndarray:
initial_qubits = []
for qbit_layer in filter(lambda layer: type(layer) == Qbits, self.layers):
initial_qubits.extend([qbit_layer.state] * qbit_layer.num)
return initial_qubits
[docs] def to_gates(self, include_operations=False) -> List[_Gate]:
gates = []
for layer in self.layers:
operation_or_gates = [layer] if include_operations and isinstance(layer, _Operation) else layer.to_gates()
gates.extend(operation_or_gates)
return gates
[docs] def measure_bits(self):
measure_bits = []
for m in filter(lambda l: type(l) == Measure, self.layers):
measure_bits.extend(m.qbits)
if not measure_bits:
raise CircuitError("No measurement found. Valid quantum circuits must contain a 'Measurement' operation")
return measure_bits
def __add__(self, other):
return self.add(other)
[docs] def run(self, num_shots: int, provider=None, **kwargs):
if provider is None:
from shor.providers import Aer
provider = Aer()
return provider.run(self, num_shots)
# Aliases
Circuit = QC = QuantumCircuit