Skip to content

Commit

Permalink
Merge pull request #107 from chensgit169/master
Browse files Browse the repository at this point in the history
Make registers iterable, fix some typos
  • Loading branch information
Zhaoyilunnn committed Nov 6, 2023
2 parents a0063c1 + 68e571d commit 9330977
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 13 deletions.
25 changes: 20 additions & 5 deletions quafu/circuits/classical_register.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,31 @@ def __init__(self, num: int = 0, name: str = None):
self.num = num
self.cbits = {i: 0 for i in range(num)}
self.pos_start = 0

def __getitem__(self, item):
"""Get mapped global pos"""
return self.pos_start + item
if item < self.num:
return self.pos_start + item
else:
raise IndexError('Index out of range:', item)

def __iter__(self):
self._i = 0
return self

def __next__(self):
if self._i < self.num:
x = self._i
self._i += 1
return self.__getitem__(x)
else:
raise StopIteration

def __len__(self):
return self.num

@property
def value(self, item:int=None):
def value(self, item: int = None):
"""Get value stored in register"""
if item is None:
return self.cbits
Expand All @@ -43,7 +58,7 @@ def __add__(self, other: "ClassicalRegister"):
creg = ClassicalRegister(name=self.name)
creg.cbits = {
**{self.cbits},
**{i + len(self): cbit for i, cbit in other.cbits.item()},
**{i + len(self): cbit for i, cbit in other.cbits.items()},
}
creg.num = self.num + other.num
creg.pos_start = self.pos_start
Expand Down
24 changes: 21 additions & 3 deletions quafu/circuits/quantum_circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
from .classical_register import ClassicalRegister
from ..exceptions import CircuitError

import copy


class QuantumCircuit(object):
"""
Expand Down Expand Up @@ -371,11 +373,27 @@ def wrap_to_gate(self, name: str):
"""
Wrap the circuit to a subclass of QuantumGate, create by metaclass.
"""
# TODO: error check
from quafu.elements.quantum_element.quantum_gate import customize_gate

gate_structure = []
qubit_mapping = {q: i for i, q in enumerate(self.used_qubits)}
for gate in self.gates:
if isinstance(gate, QuantumGate):
gate = copy.deepcopy(gate)
# TODO: handel control pos
if isinstance(gate.pos, int):
gate.pos = qubit_mapping[gate.pos]
else:
gate.pos = [qubit_mapping[p] for p in gate.pos]
gate_structure.append(gate)
else:
raise ValueError()

# TODO: error check

customized = customize_gate(cls_name=name.lower(),
qubit_num=self.num,
gate_structure=self.gates)
qubit_num=len(self.used_qubits),
gate_structure=gate_structure)
return customized

def id(self, pos: int) -> "QuantumCircuit":
Expand Down
23 changes: 20 additions & 3 deletions quafu/circuits/quantum_register.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from collections import OrderedDict


class Qubit:
"""
Expand Down Expand Up @@ -56,10 +58,25 @@ class QuantumRegister:

def __init__(self, num: int = 0, name: str = None):
self.name = name
self.qubits = {i: Qubit(logic_pos=i, reg_name=name) for i in range(num)}
self.qubits = OrderedDict({i: Qubit(logic_pos=i, reg_name=name) for i in range(num)})

def __getitem__(self, item):
return self.qubits[item]
if item < len(self.qubits):
return self.qubits[item]
else:
raise IndexError('Index out of range:', item)

def __iter__(self):
self._i = 0
return self

def __next__(self):
if self._i < len(self):
x = self._i
self._i += 1
return self.qubits[x]
else:
raise StopIteration

def __len__(self):
return len(self.qubits)
Expand All @@ -68,7 +85,7 @@ def __add__(self, other: "QuantumRegister"):
qreg = QuantumRegister(name=self.name)
qreg.qubits = {
**{self.qubits},
**{i + len(self): qubit for i, qubit in other.qubits.item()},
**{i + len(self): qubit for i, qubit in other.qubits.items()},
}
return QuantumRegister(len(self) + len(other), name=self.name)

Expand Down
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,3 @@ scikit-build>=0.16.1
pybind11>=2.10.3
graphviz>=0.14.2
ply~=3.11
Pillow~=10.0.0
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
"pybind11>=2.10.3",
"graphviz>=0.14.2",
"ply~=3.11",
"Pillow~=10.0.0"
]

setup(
Expand Down

0 comments on commit 9330977

Please sign in to comment.