Source code for blueqat.circuit_funcs.circuit_to_unitary

# Copyright 2019-2026 The Blueqat Developers
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This module provides a feature to convert a quantum circuit to a unitary matrix."""

import typing
from typing import Any

import numpy as np
from blueqat import Circuit


[docs] def circuit_to_unitary(circ: Circuit, *runargs: Any, **runkwargs: Any) -> np.ndarray: """Convert a quantum circuit into its corresponding unitary matrix representation. This function simulates the circuit for all computational basis states to construct the full unitary matrix. Args: circ (Circuit): The quantum circuit to be converted. *runargs: Positional arguments passed to circuit execution backend. **runkwargs: Keyword arguments passed to circuit execution backend. Returns: np.ndarray: The unitary matrix representing the total circuit operation. """ runkwargs.setdefault('returns', 'statevector') runkwargs.setdefault('ignore_global', False) n_qubits = circ.n_qubits if n_qubits == 0: return np.array([[1.0 + 0.0j]], dtype=np.complex128) vecs = [] # Loop over all computational basis states (from |00...0> to |11...1>) for i in range(1 << n_qubits): bitmask = tuple(k for k in range(n_qubits) if (1 << k) & i) # Initialize circuit with the correct size to maintain consistency c = Circuit(n_qubits) if bitmask: c.x[bitmask] c += circ vecs.append(c.run(*runargs, **runkwargs)) # Column vectors correspond to outputs, transpose to form the matrix correctly return np.array(vecs).T