Skip to content

Commit

Permalink
parameterless support
Browse files Browse the repository at this point in the history
  • Loading branch information
1ucian0 committed Mar 3, 2023
1 parent 4045b35 commit 9422e4f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
6 changes: 3 additions & 3 deletions qiskit/transpiler/passes/optimization/unroll_forloops.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def run(self, dag):
DAGCircuit: Transformed DAG.
"""
for forloop_op in dag.op_nodes(ForLoopOp):
(indexset, loop_parameter, body) = forloop_op.op.params
(indexset, loop_param, body) = forloop_op.op.params

# skip unrolling if it results in bigger than max_target_depth
if self.max_target_depth > 0 and len(indexset) * body.depth() > self.max_target_depth:
Expand All @@ -57,8 +57,8 @@ def run(self, dag):

unrolled_dag = circuit_to_dag(body).copy_empty_like()
for index_value in indexset:
bound_body_dag = circuit_to_dag(body.bind_parameters({loop_parameter: index_value}))
unrolled_dag.compose(bound_body_dag, inplace=True)
bound_body = body.bind_parameters({loop_param: index_value}) if loop_param else body
unrolled_dag.compose(circuit_to_dag(bound_body), inplace=True)
dag.substitute_node_with_dag(forloop_op, unrolled_dag)

return dag
Expand Down
22 changes: 22 additions & 0 deletions test/python/transpiler/test_unroll_forloops.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,28 @@ def test_range(self):

self.assertEqual(result, expected)

def test_parameterless_range(self):
"""Check simples unrolling case when there is not parameter"""
qreg, creg = QuantumRegister(5, "q"), ClassicalRegister(2, "c")

body = QuantumCircuit(3, 1)
indexset = range(0, 10, 2)

body.h([0, 1, 2])

circuit = QuantumCircuit(qreg, creg)
circuit.for_loop(indexset, None, body, [1, 2, 3], [1])

expected = QuantumCircuit(qreg, creg)
for _ in indexset:
expected.h([1, 2, 3])

passmanager = PassManager()
passmanager.append(UnrollForLoops())
result = passmanager.run(circuit)

self.assertEqual(result, expected)

def test_skip_continue_loop(self):
"""Unrolling should not be done when a `continue;` in the body"""
parameter = Parameter("x")
Expand Down

0 comments on commit 9422e4f

Please sign in to comment.