OpenQASM 3
qiskit.qasm3
키스킷은 양자 프로그램의 OpenQASM 3 표현을 변환하기 위한 몇 가지 도구와 QuantumCircuit 클래스. 이러한 기능은 OpenQASM 3에 표현된 동적 회로 기능에 대한 키스킷의 지원이 증가함에 따라 계속 발전할 것입니다.
OpenQASM 로 내보내기 3
높은 수준의 기능은 간단합니다 dump() 과 dumps()이며, 각각 파일(파일 이름으로 지정)과 Python 문자열로 내보냅니다.
dump
qiskit.qasm3.dump(circuit, stream, **kwargs)
객체를 직렬화 QuantumCircuit 객체를 파일 형식의 객체로 OpenQASM 3 스트림으로 직렬화합니다.
매개변수
- circuit (QuantumCircuit) – 직렬화할 회로.
- stream (TextIOBase) – 스트림과 같은 객체를 사용하여 OpenQASM 3 직렬화를 덤프합니다
- **kwargs - 생성자 인수를 위한
Exporter생성자의 인수입니다.
리턴 유형
없음
dumps
qiskit.qasm3.dumps(circuit, **kwargs)
객체를 직렬화합니다 QuantumCircuit 객체를 OpenQASM 3 문자열로 직렬화합니다.
매개변수
- circuit (QuantumCircuit) – 직렬화할 회로.
- **kwargs - 생성자 인수를 위한
Exporter생성자의 인수입니다.
리턴
OpenQASM 3 직렬화
리턴 유형
이 두 내보내기 함수는 모두 기본 클래스를 둘러싼 일회용 래퍼입니다 Exporter 클래스를 둘러싼 일회용 래퍼입니다. 단일 세션에서 여러 회로를 덤프하는 등 더 복잡한 내보내기가 필요한 경우에는 전체 인터페이스를 사용하는 것이 더 편리하거나 빠를 수 있습니다.
수출자
class qiskit.qasm3.Exporter(includes=('stdgates.inc', ), basis_gates=('U', ), disable_constants=False, alias_classical_registers=None, allow_aliasing=None, indent=' ', experimental=<ExperimentalFeatures: 0>, annotation_handlers=None, implicit_defcals=None)
베이스: object
QASM3 내보내기 메인 클래스.
매개변수
-
includes (Sequence[str]) –
로 내보낼 파일명을 지정합니다.
참고현재 표준 라이브러리 파일
stdgates.inc만이 내보내기가 정의하는 게이트를 알고 있다는 점에서 제대로 이해됩니다. 다른 포함을 지정할 수 있지만 내보내기가 별도의gate정의를 출력하지 않도록basis_gates인수에 해당 인수가 정의하는 게이트의 이름을 전달해야 합니다. -
basis_gates (Sequence[str]) – 백엔드의 기본 정의된 게이트 집합입니다.
-
disable_constants (bool) – 경우
True, 숫자 매개변수 값에 대해 항상 부동소수점 상수를 출력합니다.False(기본값)인 경우 OpenQASM 3개의 상수(pi,euler,tau)의 배수에 가까운 값이 대신 출력되어 출력의 정확도가 향상될 수 있습니다. -
alias_classical_registers (bool | None) –
True이면 비트가 둘 이상의 레지스터에 포함될 수 있습니다. 그렇다면 레지스터는 "별칭" 정의를 사용하여 배출되며, 이는 OpenQASM 3의 소비자에게는 잘 지원되지 않을 수 있습니다.관련 참조매개변수
allow_aliasingallow_aliasing값은 여기에 지정된 모든 값을 재정의하고 이 매개변수를 대체합니다. -
allow_aliasing (bool | None) –
True이면 비트가 둘 이상의 레지스터에 포함될 수 있습니다. 그렇다면 레지스터는 "별칭" 정의를 사용하여 배출되며, 이는 OpenQASM 3의 소비자에게는 잘 지원되지 않을 수 있습니다. 기본값은False또는alias_classical_registers값입니다.0.25.0 버전에서 추가되었습니다. -
indent (str) – 들여쓰기 블록 내의 각 레벨에 사용할 들여쓰기 문자열입니다. 빈 문자열로 설정하여 들여쓰기를 비활성화할 수 있습니다.
-
experimental (ExperimentalFeatures) – 내보내기 중에 활성화할 실험적 기능을 설정합니다. 참조
ExperimentalFeatures를 참조하세요. -
annotation_handlers (dict[str, OpenQASM3Serializer] | None) – 네임스페이스와 어노테이션 직렬화기 간의 매핑. 객체가
Annotation발견되면, 이 매핑에서 주석의namespace속성과 일치하는 가장 구체적인 네임스페이스가 해당 객체를 직렬화하는 데 사용됩니다. -
Instruction.nameimplicit_defcals (dict[str, DefcalInstruction] | None) – s를 관련DefcalInstruction객체에 매핑하는 것. 입력 회로에 키 이름이 포함된 모든 명령어는, 주어진DefcalInstruction정의에 해당하는 문이defcal존재하는 것처럼 출력되어야 한다. 키 이름과 는DefcalInstruction.name일치할 필요가 없습니다. 이defcal이름은OpenQASM3의 키워드와 중복되어서는 안 됩니다.
dump
dumps
이러한 모든 인터페이스는 실패 시 QASM3ExporterError 를 발생시킵니다.
QASM3ExporterError
exception qiskit.qasm3.QASM3ExporterError(*message)
베이스: QASM3Error
OpenQASM 3 내보내기를 실행하는 동안 오류가 발생했습니다.
오류 메시지를 설정합니다.
시범 기능
OpenQASM 3 언어는 하드웨어 기능이 향상됨에 따라 계속 발전하고 있으므로 키스킷이 안정적으로 목표로 삼을 수 있는 최종 구문은 아직 없습니다. 진화하는 언어를 표현하기 위해 정식 표준화 이전에 기능을 출시하는 경우가 있으며, OpenQASM 3 디자인 위원회의 검토 과정이 진행됨에 따라 변경이 필요할 수 있습니다. 기본적으로 내보내기는 언어의 표준화된 기능만 지원합니다. 이러한 초기 릴리스 기능을 사용하려면 experimental 키워드 인수의 dump() 및 dumps(). 사용 가능한 기능 플래그는 다음과 같습니다:
ExperimentalFeatures
class qiskit.qasm3.ExperimentalFeatures(*values)
베이스: Flag
OpenQASM 3 익스포터가 지원하는 실험적 기능에 대한 플래그입니다.
이는 실험적이며 OpenQASM 3 사양에서 아직 공식적으로 받아들이지 않았기 때문에 구문이 확정되지 않았을 수 있으므로 변경될 가능성이 더 높습니다.
SWITCH_CASE_V1
기본값: 1
에서 제안한 대로 스위치 케이스 문 내보내기를 지원한다 https://github.com/openqasm/openqasm/pull/463 에서 bfa787aa3078.
여기에는 출력 형식이 있습니다:
switch (i) {
case 0:
case 1:
x $0;
break;
case 2: {
z $0;
}
break;
default: {
cx $0, $1;
}
break;
}이는 안정화된 switch 문의 구문과 다릅니다. 이 플래그를 전달하지 않으면 구문 분석기는 대신 안정화된 구문을 사용하여 출력하며, 위와 동일한 예제가 렌더링됩니다:
switch (i) {
case 0, 1 {
x $0;
}
case 2 {
z $0;
}
default {
cx $0, $1;
}
}여러 실험적 기능을 사용하려면 flag1 | flag2 과 같이 | 연산자를 사용하여 플래그를 결합해야 합니다.
예를 들어 switch 지원의 초기 시맨틱을 사용하여 내보내기를 수행합니다:
from qiskit import qasm3, QuantumCircuit, QuantumRegister, ClassicalRegister
# Build the circuit
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.x(1)
with case(case.DEFAULT):
qc.x(2)
# Export to an OpenQASM 3 string.
qasm_string = qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)실험적 플래그로 활성화된 모든 기능은 당연히 일시적입니다. 플래그를 제거해야 하는 경우, 표준 키스킷 사용 중단 정책에 따라 플래그가 제거됩니다. 이러한 실험적 플래그는 합리적인 기간 동안 그대로 유지될 것입니다.
그러나 OpenQASM 3 언어 사양이 플래그의 기반이 되는 제안을 변경하는 경우 이러한 실험적 플래그를 사용하여 생성된 OpenQASM 3 코드의 소비자에 대한 지원 기간을 보장할 수 없습니다. 이 플래그를 사용하여 생성된 OpenQASM 3 코드를 사용하는 모든 도구는 키스킷이 해당 플래그를 계속 제공하는 동안 해당 지원을 업데이트하거나 제거할 수 있습니다. 프로그램의 장기 저장을 위해 실험적인 OpenQASM 3 코드에 의존해서는 안 됩니다.
OpenQASM 에서 가져오기 3
OpenQASM 3에서 가져오기를 위한 키스킷 지원이 초기 단계에 있기 때문에 현재는 두 가지 높은 수준의 기능만 제공되며, 구현이 크게 변경될 것으로 예상됩니다. 두 가지 기능은 load() 과 loads()의 직접적인 대응 함수인 dump() 와 dumps()의 직접적인 대응 함수이며, 각각 지정된 파일에서 간접적으로 프로그램을 로드하고 지정된 문자열에서 직접 로드합니다.
아직 탐색 릴리스 기간이지만 두 기능을 사용하려면 qiskit_qasm3_import 패키지를 설치해야 합니다. 예를 들어 qasm3-import 을 추가하여 키스킷을 설치하면 됩니다:
pip install qiskit[qasm3-import]이 기능은 결국 키스킷에 통합되어 더 이상 선택적 가져오기가 필요하지 않게 될 것으로 예상하지만, 아직 이에 대한 일정은 정해지지 않았습니다.
load
qiskit.qasm3.load(filename, *, num_qubits=None, annotation_handlers=None)
filename 파일에서 OpenQASM 3 프로그램을 로드합니다.
매개변수
- filename (str) – 프로그램을 로드할 파일명을 입력합니다.
- num_qubits (int | None) – 키워드 인수는 물리적/가상 큐비트 수를 제공합니다.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – 키가 (상위) 네임스페이스이고, 값이 해당 네임스페이스의 하위 네임스페이스를 처리할 수 있는 직렬화기인 매핑입니다. 필요합니다
qiskit_qasm3_import>=0.6.0.
리턴
OpenQASM 3 프로그램의 회로도입니다.
리턴 유형
레이즈
QASM3ImporterError - OpenQASM 3 파일이 유효하지 않거나, 또는 QuantumCircuit.
annotation_handlers 인수를 사용합니다. 이를 위해서는 qiskit_qasm3_import>=0.6.0 이 필요합니다.
loads
qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)
주어진 문자열에서 OpenQASM 3 프로그램을 로드합니다.
예제
Num_qubits 인수를 사용하거나 사용하지 않고 OpenQASM3 문자열을 양자 회로에 로드합니다.
from qiskit import qasm3
# An OpenQASM 3 program that only uses 2 physical qubits.
prog = '''
OPENQASM 3.0;
include "stdgates.inc";
h $0;
cx $0, $1;
'''
# The importer can be supplied with the number of qubits in the target backend.
# so the result is full width.
qc = qasm3.loads(prog, num_qubits=5)
assert qc.num_qubits == 5매개변수
- program (str) – OpenQASM 3 프로그램입니다.
- num_qubits (int | None) – 물리적/가상 큐비트 수를 제공합니다.
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – 키가 (상위) 네임스페이스이고, 값이 해당 네임스페이스의 하위 네임스페이스를 처리할 수 있는 직렬화기인 매핑입니다. 필요합니다
qiskit_qasm3_import>=0.6.0.
리턴
OpenQASM 3 프로그램의 회로도입니다.
리턴 유형
레이즈
- QASM3ImporterError - OpenQASM 3 파일이 유효하지 않거나, 또는
QuantumCircuit. - ValueError - qasm3_ckt 의 큐비트 수가 num_qubits보다 큰 경우.
annotation_handlers 인수를 사용합니다. 이를 위해서는 qiskit_qasm3_import>=0.6.0 이 필요합니다.
이 두 함수 모두 실패 시 QASM3ImporterError 를 발생시킵니다.
QASM3ImporterError
exception qiskit.qasm3.QASM3ImporterError(*message)
베이스: QASM3Error
OpenQASM 3 가져오기 중에 오류가 발생했습니다.
오류 메시지를 설정합니다.
예를 들어, OpenQASM 3을 사용하여 양자 프로그램을 정의한 다음 loads() 를 사용하여 직접 QuantumCircuit:
import qiskit.qasm3
program = """
OPENQASM 3.0;
include "stdgates.inc";
input float[64] a;
qubit[3] q;
bit[2] mid;
bit[3] out;
let aliased = q[0:1];
gate my_gate(a) c, t {
gphase(a / 2);
ry(a) c;
cx c, t;
}
gate my_phase(a) c {
ctrl @ inv @ gphase(a) c;
}
my_gate(a * 2) aliased[0], q[{1, 2}][0];
measure q[0] -> mid[0];
measure q[1] -> mid[1];
while (mid == "00") {
reset q[0];
reset q[1];
my_gate(a) q[0], q[1];
my_phase(a - pi/2) q[1];
mid[0] = measure q[0];
mid[1] = measure q[1];
}
if (mid[0]) {
let inner_alias = q[{0, 1}];
reset inner_alias;
}
out = measure q;
"""
circuit = qiskit.qasm3.loads(program)
circuit.draw("mpl")
실험적 임포트 인터페이스
위에 제공된 가져오기 함수는 OpenQASM 프로젝트 자체의 ANTLR 기반 참조 파서를 사용하며, 이는 성능 좋은 파서라기보다는 언어 참조를 위한 것입니다. 확장 프로그램( qiskit-qasm3-import )을 설치해야 사용할 수 있습니다.
키스킷은 핵심 키스킷 패키지의 일부로 제공되는 Rust로 작성된 네이티브 파서를 개발 중입니다. 이 구문 분석기는 아직 초기 실험 단계에 있으므로 일부 기능이 누락되어 있고 인터페이스가 변경 및 확장되고 있지만, 현재 지원하는 OpenQASM 3의 하위 집합에 대해 일반적으로 훨씬 더 성능이 뛰어나며 내부적으로 구문 분석 실패에 대한 오류 진단이 더 잘 이루어집니다.
위의 기본 인터페이스와 유사한 기능을 갖춘 실험용 인터페이스를 바로 사용할 수 있습니다:
load_experimental
qiskit.qasm3.load_experimental(pathlike_or_filelike, /, *, custom_gates=None, include_path=None)
OpenQASM 3 프로그램을 소스 파일에서 QuantumCircuit.
이 네이티브 버전의 OpenQASM 3 임포터는 현재 실험 중입니다. 일반적으로 load()보다 훨씬 빠르지만 지원되는 기능 세트가 줄어들며 시간이 지남에 따라 확장될 예정입니다.
매개변수
- pathlike_or_filelike (str |os.PathLike |io.TextIOBase) – 프로그램 소스입니다. 파일 경로 또는 열린 텍스트 스트림 객체로 지정할 수 있습니다. 스트림이 이미 열려 있는 경우 Python 공간에서 소비되는 반면 파일 이름은 Rust 공간에서 열리고 소비되며, 시스템과 스트림이 기본적으로 버퍼링되는 방식에 따라 성능 특성이 약간 다를 수 있습니다.
- custom_gates (Iterable[CustomGate]) – Python 생성자를 사용하여 특정 명명된 게이트에 사용할 수 있습니다. 제공되지 않는 경우, 키스킷은 OpenQASM 3.0 표준 라이브러리 파일
stdgates.inc에 정의된 게이트에 대해 자체 표준 라이브러리 생성자를 사용합니다. - include_path (Iterable[str]) –
include문을 확인할 때 검색할 경로를 지정합니다. 지정하지 않으면 키스킷은stdgates.inc만 포함하는 위치를 가리키도록 준비합니다. 경로는 시퀀스 순서대로 시도됩니다.
리턴
구성된 회로 객체입니다.
리턴 유형
레이즈
.QASM3ImporterError - 구문 분석 또는 의미 분석 중에 오류가 발생한 경우. 구문 분석 오류의 경우 가독성을 높이기 위해 대부분의 오류 메시지가 터미널에 인쇄되고 서식이 지정됩니다.
loads_experimental
qiskit.qasm3.loads_experimental(source, /, *, custom_gates=None, include_path=None)
문자열에서 OpenQASM 3 프로그램을 QuantumCircuit.
이 네이티브 버전의 OpenQASM 3 임포터는 현재 실험 중입니다. 일반적으로 loads()보다 훨씬 빠르지만 지원되는 기능 세트가 줄어들며 시간이 지남에 따라 확장될 예정입니다.
매개변수
- source (str) – 프로그램 소스를 Python 문자열로 지정합니다.
- custom_gates (Iterable[CustomGate]) – Python 생성자를 사용하여 특정 명명된 게이트에 사용할 수 있습니다. 제공되지 않는 경우, 키스킷은 OpenQASM 3.0 표준 라이브러리 파일
stdgates.inc에 정의된 게이트에 대해 자체 표준 라이브러리 생성자를 사용합니다. - include_path (Iterable[str]) –
include문을 확인할 때 검색할 경로를 지정합니다. 지정하지 않으면 키스킷은stdgates.inc만 포함하는 위치를 가리키도록 준비합니다. 경로는 시퀀스 순서대로 시도됩니다.
리턴
구성된 회로 객체입니다.
리턴 유형
레이즈
.QASM3ImporterError - 구문 분석 또는 의미 분석 중에 오류가 발생한 경우. 구문 분석 오류의 경우 가독성을 높이기 위해 대부분의 오류 메시지가 터미널에 인쇄되고 서식이 지정됩니다.
이 두 기능은 모두 실험적이기 때문에 사용 시 ExperimentalWarning 를 발행하며, 인터페이스는 키스킷 1.x 릴리스 시리즈 내에서 변경될 수 있습니다. 특히 네이티브 구문 분석기가 기본 버전으로 승격될 수 있습니다 load() 와 loads(). 실험적 인터페이스 사용에 따른 위험을 감수할 의향이 있다면 다음과 같이 경고 기능을 비활성화할 수 있습니다:
import warnings
from qiskit.exceptions import ExperimentalWarning
warnings.filterwarnings("ignore", category=ExperimentalWarning, module="qiskit.qasm3")이 두 함수를 사용하면 포함 경로를 경로의 이터러블로 지정하고 특정 게이트에 사용할 사용자 정의 Python 생성자를 지정할 수 있습니다. 이러한 사용자 정의 생성자는 CustomGate 객체를 사용하여 지정됩니다:
CustomGate
class qiskit.qasm3.CustomGate(constructor, name, num_params, num_qubits)
베이스: object
선언될 수 있는 특정 게이트를 나타내는 Python -space 객체를 구성하는 방법에 대해 Python space에서 받은 정보입니다.
constructor
각도(angles)를 위치 인수로 받아 num_params 게이트를 나타내는 객체를 Gate 반환하는 호출 가능한 Python 객체입니다.
name
OpenQASM 3 프로그램에 표시되는 게이트 이름입니다. 이것은 키스킷이 게이트에 부여하는 이름과 반드시 동일하지는 않습니다.
num_params
게이트에 필요한 각도형 파라미터의 개수입니다.
num_qubits
게이트가 작동하는 큐비트 수입니다.
가 지정되지 custom_gates 않은 경우, Qiskit은 OpenQASM 3 표준 라이브러리 파일에 정의된 게이트에 대해 표준 라이브러리의 stdgates.inc 게이트 객체를 사용하려고 시도합니다. 이 모듈에는 다음과 같은 게이트 시퀀스가 제공되므로, 이를 기반으로 작업을 진행하고 싶으시다면:
qiskit.qasm3.STDGATES_INC_GATES
객체의 튜플 CustomGate 객체의 튜플은 stdgates.inc include 파일에 사용할 키스킷 생성자를 지정합니다.