OpenQASM 2
qiskit.qasm2
키스킷은 키스킷 포맷으로 파싱하고 OpenQASM 2로 다시 내보내는 OpenQASM 2.0 프로그램과의 상호 운용을 지원합니다.
OpenQASM 2는 단순한 언어이며, 키스킷 객체의 일반적인 직렬화에는 적합하지 않습니다. 여러분이 찾고 있는 것이라면, 아래에서 대안에 대한 논의를 참조하세요.
구문 분석 API
이 모듈에는 두 개의 공용 함수가 포함되어 있으며, 두 함수 모두 QuantumCircuitOpenQASM 를 생성합니다. load() 는 파일 이름을 받고 loads() 은 프로그램 자체를 문자열로 받습니다. 둘의 내부는 매우 유사하므로 거의 동일한 API를 제공합니다.
load
qiskit.qasm2.load(filename, *, include_path=('.',), include_input_directory='append', custom_instructions=(), custom_classical=(), strict=False)
파일에서 OpenQASM 2 프로그램을 구문 분석하여 QuantumCircuit. 지정된 경로는 ASCII 또는 UTF-8 인코딩되어야 하며 OpenQASM 2 프로그램이 포함되어야 합니다.
내부 클래식 표현식 파서는 재귀적이며, 어떤 표현식을 평가하는 데 지나치게 깊은 재귀가 필요한 경우 를 RecursionError 발생시킵니다. sys.setrecursionlimit()이 최대 깊이는 를 사용하여 조정할 수 있으며, 실제 제한값은 이 값의 10분의 1입니다.
매개변수
- filename (str |PathLike) – OpenQASM 2 파일의 경로.
- include_path (Iterable[str |PathLike]) – 문장을
include평가할 때 검색할 디렉터리의 순서. - include_input_directory (Literal['append', 'prepend'] | None) – 입력 파일의 디렉토리를 추가할지 여부
include_path, 그렇다면 마지막 검색 결과에 추가 할지, 아니면 첫 번째 검색 결과에 추가할지 결정합니다. 이 디렉터리를 완전히 추가하지 않으려면None을 전달하세요. - custom_instructions (Iterable[CustomInstruction]) – 회로 구성 과정에서 특정 게이트나 불투명 명령어에 사용해야 할 사용자 정의 생성자가 있는지 여부. 자세한 내용은 ‘사용자 지정 지침 지정’을 참조하세요.
- custom_classical (Iterable[CustomClassical]) – 고전식 표현식을 파싱하는 과정에서 사용해야 할 사용자 정의 고전식 함수. 자세한 내용은 ‘사용자 정의 클래식 함수 지정’을 참조하십시오.
- strict (bool) – 엄격 모드로 실행할지 여부를 설정합니다.
리턴
동일한 OpenQASM 2 프로그램을 나타내는 회로 개체입니다.
리턴 유형
loads
qiskit.qasm2.loads(string, *, include_path=('.',), custom_instructions=(), custom_classical=(), strict=False)
OpenQASM 2 프로그램을 문자열에서 QuantumCircuit.
내부 클래식 표현식 파서는 재귀적이며, 어떤 표현식을 평가하는 데 지나치게 깊은 재귀가 필요한 경우 를 RecursionError 발생시킵니다. sys.setrecursionlimit()이 최대 깊이는 를 사용하여 조정할 수 있으며, 실제 제한값은 이 값의 10분의 1입니다.
매개변수
- string (str) – OpenQASM 2 프로그램을 문자열로 작성합니다.
- include_path (Iterable[str |PathLike]) – 문장을
include평가할 때 검색할 디렉터리의 순서. - custom_instructions (Iterable[CustomInstruction]) – 회로 구성 과정에서 특정 게이트나 불투명 명령어에 사용해야 할 사용자 정의 생성자가 있는지 여부. 자세한 내용은 ‘사용자 지정 지침 지정’을 참조하세요.
- custom_classical (Iterable[CustomClassical]) – 고전식 표현식을 파싱하는 과정에서 사용해야 할 사용자 정의 고전식 함수. 자세한 내용은 ‘사용자 정의 클래식 함수 지정’을 참조하십시오.
- strict (bool) – 엄격 모드로 실행할지 여부를 설정합니다.
리턴
동일한 OpenQASM 2 프로그램을 나타내는 회로 개체입니다.
리턴 유형
이 두 로드 함수 모두 include 문에서 파일을 검색할 때 사용할 디렉터리 이름의 이터러블인 include_path 인수를 받습니다. 디렉터리는 인덱스 0부터 시도되며 첫 번째 일치 항목이 사용됩니다. qelib1.inc 가져오기는 특별하게 취급되며, 항상 포함 경로를 찾기 전에 발견되며 OpenQASM 2 언어를 설명하는 문서의 내용을 정확하게 포함합니다. 이 포함 파일의 게이트는 키스킷에 정의된 회로 라이브러리 게이트 객체에 매핑됩니다.
사용자 지정 지침 지정
사용자 지정 명령에 대한 정보 이터러블을 custom_instructions 인자로 전달하여 OpenQASM 2 언어의 퀀텀 컴포넌트를 확장할 수 있습니다. 이 지침과 호환되는 정의가 있는 파일에서는 다른 처리 방식 대신 constructor 이 사용됩니다 qiskit.qasm2 대신 사용됩니다. 이러한 지침은 선택적으로 opaque 또는 gate 선언이 필요 없는 builtin 로 표시할 수 있지만 호환되는 선언은 자동으로 무시합니다. 어느 쪽이든, 구문 분석된 프로그램에서 정의된 명령어와 다른 수의 매개 변수 또는 큐비트를 가진 사용자 지정 명령어를 제공하는 것은 오류입니다. 인자 이터러블의 각 요소는 특정 데이터 클래스여야 합니다:
CustomInstruction
class qiskit.qasm2.CustomInstruction(name, num_params, num_qubits, constructor, builtin=False)
베이스: object
구문 분석 중에 정의해야 하는 사용자 지정 명령어에 대한 정보입니다.
name, num_params 및 num_qubits 필드는 설명이 필요 없습니다. constructor 필드는 서명 *args -> Instruction, 여기서 num_params args 각각은 부동 소수점 값인 호출 가능한 객체여야 합니다. 대부분의 내장된 키스킷 게이트 클래스는 이러한 형태를 가지고 있습니다.
마지막 builtin 필드가 있습니다. 이 옵션은 선택 사항이며, true로 설정하면 포함된 OpenQASM 2 파일에 정의가 없더라도 구문 분석 내에서 명령어를 정의하고 사용할 수 있게 됩니다.
예제
수입자에게, OpenQASM 2 내보내기 과정에서 동일한 객체로부터 생성된 것으로 알려진 문장을 해석할 gate 때 Qiskit의 ECRGate 및 RZXGate 객체를 사용하도록 지시하십시오:
from qiskit import qasm2
from qiskit.circuit import QuantumCircuit, library
qc = QuantumCircuit(2)
qc.ecr(0, 1)
qc.rzx(0.3, 0, 1)
qc.rzx(0.7, 1, 0)
qc.rzx(1.5, 0, 1)
qc.ecr(1, 0)
# This output string includes `gate ecr q0, q1 { ... }` and `gate rzx(p) q0, q1 { ... }`
# statements, since `ecr` and `rzx` are neither built-in gates nor in ``qelib1.inc``.
dumped = qasm2.dumps(qc)
# Tell the importer how to interpret the `gate` statements, which we know are safe
# because we controlled the input OpenQASM 2 source.
custom = [
qasm2.CustomInstruction("ecr", 0, 2, library.ECRGate),
qasm2.CustomInstruction("rzx", 1, 2, library.RZXGate),
]
loaded = qasm2.loads(dumped, custom_instructions=custom)매개변수
이는 OpenQASM 2 프로그램의 글로벌 단계 규칙에서 모호한 부분을 해결하려고 할 때 특히 유용할 수 있습니다. 자세한 내용은 OpenQASM 2단계 규칙을 참조하세요.
사용자 정의 클래식 함수 지정
위의 퀀텀 확장과 마찬가지로, 이터러블을 custom_classical 인자로 로더에 전달하여 기존 표현식(게이트에 대한 인자)에 수행된 처리를 확장할 수도 있습니다. 여기에는 name (유효한 OpenQASM 2 식별자), 필요한 파라미터의 수 num_params , 함수를 구현하는 호출 가능( Python )이 필요합니다. Python 콜러블은 num_params 위치 부동 소수점 인수를 받을 수 있어야 하며, 부동 소수점 또는 정수(부동 소수점으로 변환됨)를 반환해야 합니다. 기본 제공 기능은 재정의할 수 없습니다.
CustomClassical
class qiskit.qasm2.CustomClassical(name, num_params, callable, /)
베이스: object
수학 표현식으로 정의해야 하는 사용자 지정 클래식 함수에 대한 정보입니다.
지정된 콜러블은 num_params 플로트를 취하고 플로트를 반환하는 Python 함수여야 합니다. 이름은 OpenQASM 2 프로그램에서 이를 참조하는 식별자입니다. 이는 정의된 게이트와 충돌할 수 없습니다.
Strict 모드
두 로더 함수 모두 선택 사항인 '엄격' 모드가 있습니다. 기본적으로 이 구문 분석기는 공식 사양보다 조금 더 완화되어 매개변수 목록에서 후행 쉼표, 불필요한 (빈 문) 세미콜론, OPENQASM 2.0; 버전 문을 생략할 수 있으며, 오류를 발생시키지 않고 몇 가지 다른 품질 개선 사항을 허용합니다. strict=True 에서 사양 문자 모드를 사용할 수 있습니다.
수출 API
Python 의 다른 직렬화 모듈과 마찬가지로 이 모듈은 두 가지 공용 함수를 제공합니다: dump() 과 dumps()는 각각 QuantumCircuit 를 받아 각각 대표적인 OpenQASM 2 프로그램을 파일형 객체로 작성하거나 문자열을 반환합니다.
dump
qiskit.qasm2.dump(circuit, filename_or_stream, /)
회로를 OpenQASM 2 프로그램으로 파일 또는 스트림에 덤프합니다.
매개변수
- circuit (QuantumCircuit) – 를
QuantumCircuit를 내보낼 수 있습니다. - filename_or_stream (PathLike |TextIOBase) – 경로와 유사한 객체(아마도 또는
strpathlib.Path)이거나, 이미 열린 텍스트 모드 스트림입니다.
레이즈
QASM2ExportError - 회로가 OpenQASM 로 표현할 수 없는 경우 2.
dumps
qiskit.qasm2.dumps(circuit, /)
회로를 OpenQASM 2 프로그램으로 문자열로 내보냅니다.
매개변수
circuit (QuantumCircuit) – 를 QuantumCircuit 를 내보낼 수 있습니다.
리턴
회로를 나타내는 OpenQASM 2 문자열입니다.
레이즈
QASM2ExportError - 회로가 OpenQASM 로 표현할 수 없는 경우 2.
리턴 유형
오류
이 모듈은 다음에서 파생되는 일반 오류 유형을 정의합니다 QiskitError 에서 파생되는 일반 에러 유형을 정의합니다. 이 모듈은 상호 운용 계층에서 발생하는 오류에 대해 특별히 신경 쓸 때 캐치로 사용할 수 있습니다.
QASM2Error
exception qiskit.qasm2.QASM2Error(*message)
베이스: QiskitError
OpenQASM 2 상호 운용 계층에서 발생하는 일반적인 오류입니다.
오류 메시지를 설정합니다.
잘못된 OpenQASM 2 파일로 인해 렉서 또는 구문 분석기가 실패하는 경우, 변환 함수는 실패가 무엇이고 파일에서 어디에서 발생했는지 설명하는 메시지와 함께 보다 구체적인 오류를 발생시킵니다.
QASM2ParseError
exception qiskit.qasm2.QASM2ParseError(*message)
베이스: QASM2Error
OpenQASM 2 파일을 구문 분석하지 못하여 오류가 발생했습니다.
오류 메시지를 설정합니다.
OpenQASM 2.0 으로 표현할 수 없는 구조로 인해 내보내기에 실패하면 사용자 지정 오류도 발생하게 됩니다.
QASM2ExportError
exception qiskit.qasm2.QASM2ExportError(*message)
베이스: QASM2Error
키스킷 객체를 OpenQASM 2 양식으로 변환하지 못해서 발생한 오류입니다.
오류 메시지를 설정합니다.
예
수출 예시
간단한 QuantumCircuit 을 OpenQASM 2 문자열로 내보냅니다:
import qiskit.qasm2
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
print(qiskit.qasm2.dumps(qc))OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];주어진 파일 이름에 QuantumCircuit 을 지정된 파일 이름에 추가합니다:
qiskit.qasm2.dump(qc, "myfile.qasm")마찬가지로 일반 os.PathLike 인스턴스를 파일 이름으로 사용할 수 있습니다:
import pathlib
qiskit.qasm2.dump(qc, pathlib.Path.home() / "myfile.qasm")이미 열려 있는 스트림에 텍스트를 덤프할 수도 있습니다:
import io
with io.StringIO() as stream:
qiskit.qasm2.dump(qc, stream)구문 분석 예제
를 사용하여 loads() 를 사용하여 OpenQASM 2 프로그램을 문자열로 가져오려면 QuantumCircuit:
import qiskit.qasm2
program = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0], q[1];
measure q -> c;
"""
circuit = qiskit.qasm2.loads(program)
circuit.draw() ┌───┐ ┌─┐
q_0: ┤ H ├──■──┤M├───
└───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
└───┘ ║ └╥┘
c: 2/═══════════╩══╩═
0 1프로그램이 파일에 저장된 경우 다음을 사용하여 동일한 작업을 수행할 수 있습니다 load() 대신 파일 이름을 인수로 전달하면 동일한 결과를 얻을 수 있습니다:
import qiskit.qasm2
circuit = qiskit.qasm2.load("myfile.qasm")OpenQASM 2 파일은 include 문을 통해 다른 OpenQASM 2 파일을 포함할 수 있습니다. include_path 인수를 사용하여 이러한 파일을 찾는 데 사용되는 검색 경로에 영향을 줄 수 있습니다 load() 와 loads(). 기본적으로 현재 작업 디렉터리만 검색됩니다.
import qiskit.qasm2
program = """
include "other.qasm";
// ... and so on
"""
circuit = qiskit.qasm2.loads(program, include_path=("/path/to/a", "/path/to/b", "."))의 경우 load() 의 경우에만 추가 인수 include_input_directory 를 사용하여 'append', 'prepend' 또는 포함 경로에 로드된 파일의 디렉터리를 무시(None)할 수 있습니다. 기본적으로 이 디렉터리는 검색 경로에 추가되므로 마지막에 시도되지만 이를 변경할 수 있습니다.
import qiskit.qasm2
filenames = ["./subdirectory/a.qasm", "/path/to/b.qasm", "~/my.qasm"]
# Search the directory of each file before other parts of the include path.
circuits = [
qiskit.qasm2.load(filename, include_input_directory="prepend") for filename in filenames
]
# Override the include path, and don't search the directory of each file unless it's in the
# absolute path list.
circuits = [
qiskit.qasm2.load(
filename,
include_path=("/usr/include/qasm", "~/qasm/include"),
include_input_directory=None,
)
for filename in filenames
]때로는 임포터가 주어진 명명된 명령어에 대해 생성하는 객체에 Gate 영향을 주고 싶을 수도 있습니다. 문장으로 include "qelib1.inc"; 정의된 게이트는 자동으로 적절한 Qiskit 회로 라이브러리 게이트와 연결되지만, 이를 확장할 수도 있습니다:
from qiskit.circuit import Gate
from qiskit.qasm2 import loads, CustomInstruction
class MyGate(Gate):
def __init__(self, theta):
super().__init__("my", 2, [theta])
class Builtin(Gate):
def __init__(self):
super().__init__("builtin", 1, [])
program = """
opaque my(theta) q1, q2;
qreg q[2];
my(0.5) q[0], q[1];
builtin q[0];
"""
customs = [
CustomInstruction(name="my", num_params=1, num_qubits=2, constructor=MyGate),
# Setting 'builtin=True' means the instruction doesn't require a declaration to be usable.
CustomInstruction("builtin", 0, 1, Builtin, builtin=True),
]
circuit = loads(program, custom_instructions=customs)마찬가지로, 게이트에 대한 인수를 설명하는 동안 사용되는 새로운 클래식 함수를 프로그램의 본문에 추가할 수 있으며(상수로 접혀서 나오는), 정의된 게이트의 본문 내에(필요에 따라 계산되는) 추가할 수도 있습니다. 여기에서는 수학적으로는 이지만 각도 사분면과 무한대를 올바르게 처리하는 atan2(y, x) 의 Python 버전과 사용자 지정 add_one 함수를 제공합니다:
import math
from qiskit.qasm2 import loads, CustomClassical
program = """
include "qelib1.inc";
qreg q[2];
rx(atan2(pi, 3 + add_one(0.2))) q[0];
cx q[0], q[1];
"""
def add_one(x):
return x + 1
customs = [
# `atan2` takes two parameters, and `math.atan2` implements it.
CustomClassical("atan2", 2, math.atan2),
# Our `add_one` takes only one parameter.
CustomClassical("add_one", 1, add_one),
]
circuit = loads(program, custom_classical=customs)OpenQASM 2상 규칙
언어로서 OpenQASM 2에는 전체 프로그램의 전역 단계나 특정 게이트 정의를 지정할 수 있는 방법이 없습니다. 즉, 언어의 파서가 특정 게이트를 예상과 다른 전역 단계로 해석할 수 있습니다. 예를 들어, 사실상 표준 라이브러리인 OpenQASM 2 qelib1.inc 에는 다음과 같이 u1 및 rz 의 정의가 포함되어 있습니다:
gate u1(lambda) q {
U(0, 0, lambda) q;
}
gate rz(phi) a {
u1(phi) a;
}즉, rz 은 u1 의 직접 별칭으로 보입니다. 그러나 u1 의 해석은 언어를 설명하는 논문의 방정식 (3) 에 다음과 같이 명시되어 있습니다
여기서 기호는 글로벌 단계까지만 동등함을 나타냅니다. OpenQASM 2를 구문 분석할 때 이러한 게이트 간의 구분을 처리하는 방법을 선택해야 합니다. u1 은 rz 과 단계가 다르다고 산문에서 정의되어 있지만 언어는 이를 표현하도록 설계되지 않았습니다.
U1GateRZGateQiskit의 기본 설정은 표준 라이브러리의 rz 사용을 로 해석하고, 의 u1 사용을 위상이 다른 ``로 해석하는 것입니다. 헤더 파일의 문장을 gate 문자 그대로 해석했을 때 암시되는 위상 규칙을 사용하고 싶다면, Qiskit이 회로를 구성하는 방식을 재정의하기 위해 를 사용할 CustomInstruction 수 있습니다.
표준 qelib1.inc 포함의 경우 차이점이 하나뿐이므로 위상 규칙을 전환하는 데 필요한 오버라이드는 다음과 같습니다:
from qiskit import qasm2
from qiskit.circuit.library import PhaseGate
from qiskit.quantum_info import Operator
program = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[1];
rz(pi / 2) q[0];
"""
custom = [
qasm2.CustomInstruction("rz", 1, 1, PhaseGate),
]U1Gate여기서는 Qiskit의 PhaseGate 클래스를 사용하여 명령을 rz 표현할 것이며, 이는 (위상을 포함하여) 다음과 동일합니다:
Operator(qasm2.loads(program, custom_instructions=custom))Operator([[1.000000e+00+0.j, 0.000000e+00+0.j],
[0.000000e+00+0.j, 6.123234e-17+1.j]],
input_dims=(2,), output_dims=(2,))레거시 호환성
QuantumCircuit.from_qasm_str() 및 from_qasm_file() 를 사용하여 원시 사양에 몇 가지를 추가했습니다. 키스킷은 원래 일종의 직렬화 형식으로 OpenQASM 2를 사용하려고 시도했고, 키스킷이 확장됨에 따라 그 동작을 확장했습니다. 모든 기본값에서 새 구문 분석기는 사양을 더 엄격하게 구현합니다.
특히 기존 수입업체의 경우 더욱 그렇습니다:
-
포함_경로를 사용하는 것이 효과적입니다:
<qiskit>/qasm/libs여기서<qiskit>은 설치된qiskit패키지의 루트입니다;- 현재 작업 디렉토리입니다.
-
에 정의된 추가 지침이 있습니다
qelib1.inc:csx a, bCSXGate게이트 제어, 이에 상응하는.cu(theta, phi, lambda, gamma) c, tCUGate.에 해당하는 제어된 의 4매개변수 버전.rxx(theta) a, bRXXGate축을 중심으로 한 2-큐비트 회전으로, 이는 에 해당한다.rzz(theta) a, bRZZGate축을 중심으로 한 2-큐비트 회전으로, 이는 에 해당한다.rccx a, b, c이중 제어형 게이트이지만, 표준 Toffoli 게이트에 비해 상대적인 위상 차이가 있는 게이트입니다.
RCCXGate이는 Qiskit 게이트와 일치해야 하지만, 레거시 변환기는 실제로 이 유형을 출력하지 않습니다.rc3x a, b, c, d3중 제어 방식의 게이트이지만, 표준 정의에 비해 상대적 위상 차이가 존재합니다.
RC3XGate...에 해당합니다.c3x a, b, c, dC3XGate에 해당하는 3중 제어형 게이트.c3sqrtx a, b, c, dC3SXGate에 해당하는 3중 제어형 게이트.c4x a, b, c, d, e4중 제어 방식의 게이트.,
C4XGate에 해당하는. -
이름에 대해
opaque또는gate정의가 제공된 경우delay, 호출할 때마다Delay명령어를 출력하려고 합니다. 작동하려면opaque delay(t) q;와 호환되는 정의가 필요하며, 여기서t은dt단위로 제공됩니다. 매개변수와 큐비트가 정확히 하나가 아니거나 매개변수가 정수값이 아닌 경우 임포터는 구성 시 오류를 발생시킵니다. -
추가 과학 계산기 기능
asin,acos및atan을 사용할 수 있습니다. -
구문 분석된 문법은 새 임포터의 엄격한 모드와 사실상 동일합니다.
다음에서 이 동작을 에뮬레이트할 수 있습니다 load() 와 loads() 포함_경로를 적절하게 설정하고( qiskit.__file__ 변수를 검사하여 설치된 위치를 찾아보세요), 관심 있는 각 사용자 지정 게이트의 CustomInstruction 인스턴스 목록을 전달하면 됩니다. 작업을 더 쉽게 하기 위해 키스킷의 레거시 변환기 동작과 동일한 구성의 구성 요소 하나를 포함하는 세 개의 튜플을 사용할 수 있도록 합니다.
qiskit.qasm2.LEGACY_CUSTOM_INSTRUCTIONS
qelib1.inc 이 포함되어 있고 delay 인스트럭션의 정의가 있는 경우 키스킷의 레거시 내장 변환기가 사용하는 추가 사용자 정의_인스트럭션을 포함하는 튜플입니다. qelib1.inc 및 delay 의 페이퍼 버전에 있는 게이트는 모두 OpenQASM 2 프로그램 내에 호환 가능한 선언문이 있어야 하지만, 키스킷의 레거시 추가 사항은 이 파서가 보는 인클루드 파일에 실제로 존재하지 않기 때문에 모두 빌트인으로 표시되어 있습니다.
qiskit.qasm2.LEGACY_CUSTOM_CLASSICAL
키스킷의 레거시 내장 변환기가 문서에서 지정한 것 외에 추가로 사용하는 사용자 정의_classical 함수를 포함하는 튜플입니다. 이것이 세 가지 기본 역삼각형 함수입니다: , 및 입니다.
qiskit.qasm2.LEGACY_INCLUDE_PATH
레거시 키스킷 변환기에서 사용하는 정확한 포함_경로를 포함하는 튜플입니다.
키스킷의 레거시 버전 qelib1.inc 및 delay 명령어에 정의된 모든 게이트에서, 게이트가 실제로 어떻게 정의되고 사용되는지에 상관없이 레거시 임포터는 항상 사용자 정의 객체를 출력하려고 시도합니다. 이렇게 하면 구문 분석에 성공한 후에도 회로 구성 중에 오류가 발생할 수 있습니다. 이 버그가 있는 동작을 에뮬레이트할 수 있는 방법은 없습니다 qiskit.qasm2include "qelib1.inc"; 문이나 custom_instructions 인자만 내장된 키스킷 명령어가 사용되도록 할 수 있으며, 이 명령어들의 서명은 서로 일치합니다.
위의 레거시 호환성 설정을 사용하여 load() 및 loads() 로 가져온 회로는, 사용자 정의 게이트가 아닌qelib1.inc 게이트가 정의되어 있지 않은 한, Qiskit의 레거시 임포터로 생성된 회로와 동일하게 비교되어야 합니다. 사용자 정의 게이트는 새로운 임포터에서 약간 다른 방식으로 처리되며, 검사해 보면 동등한 definition 필드를 가지고 있어야 하지만, 이 모듈은 (대부분의 Qiskit 객체와 마찬가지로) 구문 분석 중에 즉시 객체를 생성하는 대신, 요청이 있을 때 정의 내용을 지연 로딩하기 위해 사용자 정의 클래스를 사용합니다. Qiskit의 게이트 비교 규칙에 따르면 이 두 객체는 서로 다른 것으로 간주되지만, 특정 백엔드에서 이를 통과시키면 transpile() 동일한 출력 회로가 생성되어야 합니다.
대안
이 모듈의 구문 분석기 구성 요소는 별도의 PyPI 패키지로 시작되었습니다: qiskit-qasm2. 이 패키지(버전 0.5.3 )는 키스킷 테라 0.24 에 공급되었습니다. 이후 두 패키지 간의 변경 사항은 반드시 동기화되지 않을 수 있습니다.
OpenQASM 사양의 최신 버전인 3.0 버전이 있으며, 이 버전은 https://openqasm.com. 여기에는 고급 클래식 프로그래밍을 위한 훨씬 더 많은 기능이 포함됩니다. 키스킷은 이미 OpenQASM 3에 대한 초보적인 지원을 제공하고 있습니다 qiskit.qasm3 를 참조하세요.
OpenQASM 2는 키스킷의 직렬화 언어에 적합하지 않습니다 QuantumCircuit. 이 모듈은 일반적인 직렬화 형식이 아닌 상호 운용성을 목적으로 제공됩니다. 필요한 경우 대신 qiskit.qpy 를 사용하는 것이 좋습니다.