Skip to main content
IBM Quantum Platform

OpenQASM 3

qiskit.qasm3

키스킷은 양자 프로그램의 OpenQASM 3 표현을 변환하기 위한 몇 가지 도구와 QuantumCircuit 클래스. 이러한 기능은 OpenQASM 3에 표현된 동적 회로 기능에 대한 키스킷의 지원이 증가함에 따라 계속 발전할 것입니다.


OpenQASM 로 내보내기 3

높은 수준의 기능은 간단합니다 dump()dumps()이며, 각각 파일(파일 이름으로 지정)과 Python 문자열로 내보냅니다.

dump

qiskit.qasm3.dump(circuit, stream, **kwargs)

GitHub

객체를 직렬화 QuantumCircuit 객체를 파일 형식의 객체로 OpenQASM 3 스트림으로 직렬화합니다.

매개변수

  • circuit (QuantumCircuit) – 직렬화할 회로.
  • stream (TextIOBase) – 스트림과 같은 객체를 사용하여 OpenQASM 3 직렬화를 덤프합니다
  • **kwargs - 생성자 인수를 위한 Exporter 생성자의 인수입니다.

리턴 유형

없음

dumps

qiskit.qasm3.dumps(circuit, **kwargs)

GitHub

객체를 직렬화합니다 QuantumCircuit 객체를 OpenQASM 3 문자열로 직렬화합니다.

매개변수

  • circuit (QuantumCircuit) – 직렬화할 회로.
  • **kwargs - 생성자 인수를 위한 Exporter 생성자의 인수입니다.

리턴

OpenQASM 3 직렬화

리턴 유형

str

이 두 내보내기 함수는 모두 기본 클래스를 둘러싼 일회용 래퍼입니다 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)

GitHub

베이스: 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_aliasing

    allow_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 이름은 OpenQASM 3의 키워드와 중복되어서는 안 됩니다.

dump

dump(circuit, stream)

GitHub

회로를 OpenQASM 3으로 변환하여 결과를 파일 또는 텍스트 스트림으로 덤프합니다.

dumps

dumps(circuit)

GitHub

회로를 OpenQASM 3으로 변환하여 결과를 문자열로 반환합니다.

이러한 모든 인터페이스는 실패 시 QASM3ExporterError 를 발생시킵니다.

QASM3ExporterError

exception qiskit.qasm3.QASM3ExporterError(*message)

GitHub

베이스: QASM3Error

OpenQASM 3 내보내기를 실행하는 동안 오류가 발생했습니다.

오류 메시지를 설정합니다.

시범 기능

OpenQASM 3 언어는 하드웨어 기능이 향상됨에 따라 계속 발전하고 있으므로 키스킷이 안정적으로 목표로 삼을 수 있는 최종 구문은 아직 없습니다. 진화하는 언어를 표현하기 위해 정식 표준화 이전에 기능을 출시하는 경우가 있으며, OpenQASM 3 디자인 위원회의 검토 과정이 진행됨에 따라 변경이 필요할 수 있습니다. 기본적으로 내보내기는 언어의 표준화된 기능만 지원합니다. 이러한 초기 릴리스 기능을 사용하려면 experimental 키워드 인수의 dump()dumps(). 사용 가능한 기능 플래그는 다음과 같습니다:

ExperimentalFeatures

class qiskit.qasm3.ExperimentalFeatures(*values)

GitHub

베이스: 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)

GitHub

filename 파일에서 OpenQASM 3 프로그램을 로드합니다.

매개변수

  • filename (str) – 프로그램을 로드할 파일명을 입력합니다.
  • num_qubits (int | None) – 키워드 인수는 물리적/가상 큐비트 수를 제공합니다.
  • annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – 키가 (상위) 네임스페이스이고, 값이 해당 네임스페이스의 하위 네임스페이스를 처리할 수 있는 직렬화기인 매핑입니다. 필요합니다 qiskit_qasm3_import>=0.6.0.

리턴

OpenQASM 3 프로그램의 회로도입니다.

리턴 유형

QuantumCircuit

레이즈

QASM3ImporterError - OpenQASM 3 파일이 유효하지 않거나, 또는 QuantumCircuit.

2.1 버전에서 추가됨

annotation_handlers 인수를 사용합니다. 이를 위해서는 qiskit_qasm3_import>=0.6.0 이 필요합니다.

loads

qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)

GitHub

주어진 문자열에서 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 프로그램의 회로도입니다.

리턴 유형

QuantumCircuit

레이즈

2.1 버전에서 추가됨

annotation_handlers 인수를 사용합니다. 이를 위해서는 qiskit_qasm3_import>=0.6.0 이 필요합니다.

이 두 함수 모두 실패 시 QASM3ImporterError 를 발생시킵니다.

QASM3ImporterError

exception qiskit.qasm3.QASM3ImporterError(*message)

GitHub

베이스: 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 만 포함하는 위치를 가리키도록 준비합니다. 경로는 시퀀스 순서대로 시도됩니다.

리턴

구성된 회로 객체입니다.

리턴 유형

QuantumCircuit

레이즈

.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 만 포함하는 위치를 가리키도록 준비합니다. 경로는 시퀀스 순서대로 시도됩니다.

리턴

구성된 회로 객체입니다.

리턴 유형

QuantumCircuit

레이즈

.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 파일에 사용할 키스킷 생성자를 지정합니다.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.