Skip to content

commutation analysis lead to numpy.core._exceptions._ArrayMemoryError with large mct #10488

@MattePalte

Description

@MattePalte

Environment

  • Qiskit Terra version: 0.43.1 meta package, terra 0.24.1
  • Python version: 3.10
  • Operating system: docker continuumio/miniconda3

What is happening?

When transpiling (level 2) a circuit with a large multi-cx gate (see doc: here) with a large numebr of qubits (e.g. 28) the commutation analysis pass crashes.

How can we reproduce the issue?

Run this python script:

from qiskit import QuantumCircuit, transpile
qc = QuantumCircuit(29)
qc.mct(list(range(28)), qc.num_qubits - 1)
transpile(qc, optimization_level=2)

Produces this output and error:

Traceback (most recent call last):
  File "myfile.py", line 7, in <module>                       transpile(qc, optimization_level=2)
  File "...qiskit/compiler/transpiler.py", line 380, in transpile                    _serial_transpile_circuit(
  File "...qiskit/compiler/transpiler.py", line 462, in _serial_transpile_circuit    result = pass_manager.run(circuit, callback=callback, output_name=outpu
t_name)                                                                      File "...qiskit/transpiler/passmanager.py", line 537, in run                       return super().run(circuits, output_name, callback)
  File "...qiskit/transpiler/passmanager.py", line 231, in run                       return self._run_single_circuit(circuits, output_name, callback)
  File "...qiskit/transpiler/passmanager.py", line 292, in _run_single_circuit       result = running_passmanager.run(circuit, output_name=output_name, call
back=callback)                                                               File "...qiskit/transpiler/runningpassmanager.py", line 125, in run                dag = self._do_pass(pass_, dag, passset.options)
  File "...qiskit/transpiler/runningpassmanager.py", line 169, in _do_pass           dag = self._do_pass(required_pass, dag, options)
  File "...qiskit/transpiler/runningpassmanager.py", line 173, in _do_pass           dag = self._run_this_pass(pass_, dag)
  File "...qiskit/transpiler/runningpassmanager.py", line 227, in _run_this_pass     pass_.run(FencedDAGCircuit(dag))
  File "...qiskit/transpiler/passes/optimization/commutation_analysis.py", line 75, in run                                                                      does_commute = self.comm_checker.commute(
  File "...qiskit/circuit/commutation_checker.py", line 136, in commute              operator_2 = Operator(op2, input_dims=(2,) * len(qarg2), output_dims=(2
,) * len(qarg2))                                                             File "...qiskit/quantum_info/operators/operator.py", line 85, in __init__          self._data = self._init_instruction(data).data
  File "...qiskit/quantum_info/operators/operator.py", line 610, in _init_instruction                                                                           op = Operator(np.eye(dimension))
  File "...numpy/lib/twodim_base.py", line 215, in eye                               m = zeros((N, M), dtype=dtype, order=order)
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 2.00 EiB for a
n array with shape (536870912, 536870912) and data type float64

What should happen?

I would expect the optimizer to skip the pass if too large to optimize and leave it unoptimized.

Any suggestions?

I would skip the optimization pass when the number of qubits is too large (precise threshold to be determined based on ram memory of the current machine).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions