OpenQASM 2 그리고 Qiskit SDK
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 다음 버전 이상을 사용하는 것이 좋습니다.
qiskit[all]~=2.5.2
키스킷 SDK는 양자 프로그램의 OpenQASM 표현을 변환하기 위한 몇 가지 도구와 QuantumCircuit 클래스.
OpenQASM 2 프로그램을 Qiskit으로 가져오기
두 가지 함수는 OpenQASM 2 프로그램을 키스킷으로 가져옵니다.
이들은 qasm2.load()는 파일 이름을, 그리고 qasm2.loads()는 OpenQASM 2 프로그램을 문자열로 받습니다.
import qiskit.qasm2
qiskit.qasm2.load(filename, include_path=('.',), include_input_directory='append', custom_instructions=(), custom_classical=(), strict=False)
qiskit.qasm2.loads(program, include_path=('.',), custom_instructions=(), custom_classical=(), strict=False)자세한 내용은 OpenQASM 2 키스킷 API를 참조하세요.
간단한 프로그램 가져오기
대부분의 OpenQASM 2 프로그램의 경우 단일 인수로 qasm2.load 및 qasm2.loads 을 사용하면 됩니다.
예시: OpenQASM 2 프로그램을 문자열로 가져오기
OpenQASM 2 프로그램을 문자열로 가져오려면 qasm2.loads() 을 사용하여 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()Output:
┌───┐ ┌─┐
q_0: ┤ H ├──■──┤M├───
└───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
└───┘ ║ └╥┘
c: 2/═══════════╩══╩═
0 1
예시: 파일에서 OpenQASM 2 프로그램을 임포트하기
load() 을 사용하여 파일에서 OpenQASM 2 프로그램을 가져오려면 QuantumCircuit:
import qiskit.qasm2
circuit = qiskit.qasm2.load("myfile.qasm")OpenQASM 링크: Qiskit 게이트를 사용한 2게이트
기본적으로 키스킷의 OpenQASM 2 임포터는 "qelib1.inc" 파일을 사실상 표준 라이브러리로 취급합니다.
가져오기는 이 파일을 OpenQASM 2를 정의하는 원본 문서에 포함된 것으로 설명된 게이트가 정확히 포함된 것으로 취급합니다.
키스킷은 회로 라이브러리에 내장된 게이트를 사용하여 "qelib1.inc" 에 있는 게이트를 표현합니다.
프로그램에서 수동으로 정의된 게이트 OpenQASM 2 gate 문은 기본적으로 커스텀 키스킷 Gate 서브클래스로 구성됩니다.
임포터에 특정 클래스를 사용하도록 지시할 수 있습니다 Gategate 클래스를 사용하도록 임포터에 지시할 수 있습니다.
이 메커니즘을 사용하여 추가 게이트 이름을 명시적인 정의가 필요 없는 "기본 제공"으로 처리할 수도 있습니다.
"qelib1.inc" 외부에서 gate 문에 사용할 게이트 클래스를 지정하면 일반적으로 결과 회로가 더 효율적으로 작업할 수 있습니다.
Qiskit SDKv1.0 기준, Qiskit의 OpenQASM 2 익스포터 ( Qiskit 회로를 OpenQASM 2로 내보내기 참조)는 여전히 실제보다 더 많은 게이트가 있는 "qelib1.inc" 것처럼 동작합니다.
이는 임포터의 기본 설정으로는 당사 임포터로 내보낸 프로그램을 가져올 수 없을 수도 있음을 의미합니다.
이 문제를 해결하기 위해 기존 내보내기 도구로 작업하는 구체적인 예시를 참조하십시오.
이 불일치는 키스킷의 레거시 동작이며, 이후 키스킷 릴리스에서 해결될 예정입니다.
사용자 지정 인스트럭션에 대한 정보를 OpenQASM 2 임포터에 전달하려면 qasm2.CustomInstruction 클래스를 사용합니다.
여기에는 네 가지 필수 정보가 순서대로 있습니다:
- OpenQASM 2 프로그램에서 사용되는 게이트의 이름입니다
- 게이트가 취하는 각도 매개변수의 수입니다
- 게이트가 작동하는 큐비트 수입니다
- 게이트의 Python 생성자 클래스 또는 함수는 게이트 파라미터(큐비트 제외)를 개별 인수로 받습니다
임포터가 지정된 사용자 지정 명령어와 일치하는 gate 정의를 발견하면 해당 사용자 지정 정보를 사용하여 게이트 객체를 재구성합니다.
사용자 지정 명령의 name 과 일치하지만 매개변수 수와 큐비트 수가 모두 일치하지 않는 gate 문이 발견되면 임포터는 불일치를 나타내는 QASM2ParseError를 발생시켜 제공된 정보와 프로그램 간의 불일치를 나타냅니다.
또한 다섯 번째 인수 builtin 를 True 로 선택적으로 설정하여 명시적으로 정의하지 않더라도 OpenQASM 2 프로그램 내에서 게이트를 자동으로 사용할 수 있도록 할 수 있습니다.
임포터가 기본 제공 사용자 지정 명령어에 대한 명시적인 gate 정의를 발견하면 이를 자동으로 수락합니다.
이전과 마찬가지로 동일한 이름의 명시적 정의가 제공된 사용자 지정 명령과 호환되지 않으면 QASM2ParseError 가 발생합니다.
이는 구형 OpenQASM 2 내보내기 및 하드웨어의 '기본 게이트'를 내장 명령어로 취급하는 다른 특정 퀀텀 플랫폼과의 호환성에 유용합니다.
키스킷은 키스킷의 OpenQASM 2 내보내기 기능의 레거시 버전에서 생성된 OpenQASM 2 프로그램과 작업하기 위한 데이터 속성을 제공합니다.
이것은 qasm2.LEGACY_CUSTOM_INSTRUCTIONS에 custom_instructions 인자로 지정할 수 있습니다 qasm2.load() 및 qasm2.loads().
예시: Qiskit의 레거시 익스포터로 생성된 프로그램 가져오기
이 OpenQASM 2 프로그램은 원래 버전( "qelib1.inc" )에는 없는 게이트를 선언하지 않고 사용하지만 키스킷 라이브러리의 표준 게이트입니다.
를 사용하여 qasm2.LEGACY_CUSTOM_INSTRUCTIONS 를 사용하여 임포터에게 키스킷의 OpenQASM 2 익스포터가 이전에 사용한 것과 동일한 게이트 세트를 사용하도록 쉽게 지시할 수 있습니다.
from qiskit import qasm2
program = """
OPENQASM 2.0;
include "qelib1.inc";
qreg q[4];
creg c[4];
h q[0];
cx q[0], q[1];
// 'rxx' is not actually in `qelib1.inc`,
// but Qiskit used to behave as if it were.
rxx(0.75) q[2], q[3];
measure q -> c;
"""
circuit = qasm2.loads(
program,
custom_instructions=qasm2.LEGACY_CUSTOM_INSTRUCTIONS,
)예시: OpenQASM 2 프로그램을 가져올 때 특정 게이트 클래스를 사용하십시오
키스킷은 일반적으로 OpenQASM 2 gate 문에 있는 정의가 키스킷 표준 라이브러리 게이트와 정확히 일치하는지 확인할 수 없습니다.
대신, 키스킷은 제공된 정확한 정의를 사용하여 사용자 정의 게이트를 선택합니다.
이는 기본 제공 표준 게이트 중 하나 또는 사용자 정의 사용자 지정 게이트를 사용하는 것보다 효율성이 떨어질 수 있습니다.
특정 클래스로 gate 문을 수동으로 정의할 수 있습니다.
from qiskit import qasm2
from qiskit.circuit import Gate
from qiskit.circuit.library import RZXGate
# Define a custom gate that takes one qubit and two angles.
class MyGate(Gate):
def __init__(self, theta, phi):
super().__init__("my", 1, [theta, phi])
custom_instructions = [
# Link the OpenQASM 2 name 'my' with our custom gate.
qasm2.CustomInstruction("my", 2, 1, MyGate),
# Link the OpenQASM 2 name 'rzx' with Qiskit's
# built-in RZXGate.
qasm2.CustomInstruction("rzx", 1, 2, RZXGate),
]
program = """
OPENQASM 2.0;
gate my(theta, phi) q {
U(theta / 2, phi, -theta / 2) q;
}
gate rzx(theta) a, b {
// It doesn't matter what definition is
// supplied, if the parameters match;
// Qiskit will still use `RZXGate`.
}
qreg q[2];
my(0.25, 0.125) q[0];
rzx(pi) q[0], q[1];
"""
circuit = qasm2.loads(
program,
custom_instructions=custom_instructions,
)예시: OpenQASM 2 프로그램에서 새로운 내장 게이트 정의하기
builtin=True 인수가 설정되어 있으면 사용자 정의 게이트에 관련 정의가 필요하지 않습니다.
from qiskit import qasm2
from qiskit.circuit import Gate
# Define a custom gate that takes one qubit and two angles.
class MyGate(Gate):
def __init__(self, theta, phi):
super().__init__("my", 1, [theta, phi])
custom_instructions = [
qasm2.CustomInstruction("my", 2, 1, MyGate, builtin=True),
]
program = """
OPENQASM 2.0;
qreg q[1];
my(0.25, 0.125) q[0];
"""
circuit = qasm2.loads(
program,
custom_instructions=custom_instructions,
)사용자 정의 클래식 함수 정의
OpenQASM 2에는 게이트 인자에 사용할 수 있는 몇 가지 기본 제공 클래식 함수가 포함되어 있습니다.
custom_classical 인수를 사용하여 더 많은 함수로 언어를 확장할 수 있습니다 qasm2.load() 및 qasm2.loads()와 함께 qasm2.CustomClassical 클래스를 추가할 수 있습니다.
사용자 지정 클래식 함수를 정의하려면 제공해야 합니다:
- OpenQASM 2 프로그램에 표시되는 함수 이름
- 허용하는 부동 소수점 인수의 수입니다
- 함수를 평가하는 호출 가능한 Python 객체입니다
정의된 모든 사용자 정의 클래식 함수는 임포터에 의해 OpenQASM 2 언어에 내장된 것으로 취급됩니다. OpenQASM 2 언어 내에는 새로운 함수를 정의하는 공식적인 방법이 없으며, 이것은 키스킷 확장입니다.
예시: 사용자 정의 클래식 명령어 사용
여기에서는 두 가지 사용자 지정 클래식 함수를 제공합니다.
첫 번째는 간단하며 입력에 하나를 추가하기만 하면 됩니다.
두 번째는 수학 연산 을 사분면 인식 방식으로 표현하는 함수 math.atan2 입니다.
import math
from qiskit import qasm2
program = """
include "qelib1.inc";
qreg q[2];
rx(arctan(pi, 3 + add_one(0.2))) q[0];
cx q[0], q[1];
"""
def add_one(x):
return x + 1
customs = [
# Our `add_one` takes only one parameter.
qasm2.CustomClassical("add_one", 1, add_one),
# `arctan` takes two parameters, and `math.atan2` implements it.
qasm2.CustomClassical("arctan", 2, math.atan2),
]
circuit = qasm2.loads(program, custom_classical=customs)Strict 모드
기본적으로 이 구문 분석기는 공식 사양보다 더 완화되어 있습니다.
매개변수 목록의 후행 쉼표, 불필요한 (빈 문) 세미콜론, OPENQASM 2.0; 버전 문 생략, 기타 오류 발생 없이 여러 가지 품질 개선 사항을 허용합니다.
그러나 strict=True 에서 "사양 문자" 모드를 사용할 수 있습니다.
Qiskit 회로를 OpenQASM 2로 내보내기
키스킷은 또한 QuantumCircuit 를 OpenQASM 2.
함수를 사용하여 qasm2.dump() 함수를 사용하고 qasm2.dumps() 함수를 사용하여 문자열에 씁니다.
이 함수들은 현재 매우 간단한 인터페이스를 가지고 있습니다 qasm2.dump()의 경우에만 출력을 쓸 위치를 받습니다.
키스킷의 OpenQASM 2 내보내기는 여전히 레거시, 비표준 버전의 "qelib1.inc" include 파일을 가정합니다.
이 문제는 Qiskit의 이후 릴리스에서 해결될 예정이지만, 그동안 Qiskit으로 만든 OpenQASM 2 프로그램을 다시 가져와야 하는 경우 위의 예를 사용하여 가져오기 프로그램에 레거시 게이트에 대한 정보를 알리세요.
예시: 회로를 OpenQASM 2로 내보내기
from qiskit import QuantumCircuit, qasm2
# Define any circuit.
circuit = QuantumCircuit(2, 2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0, 1], [0, 1])
# Export to a string.
program = qasm2.dumps(circuit)
# Export to a file.
qasm2.dump(circuit, "my_file.qasm")다음 단계
- IBM 퀀텀 컴포저 가이드에서 OpenQASM 코드를 생성하는 방법을 알아보세요.
- OpenQASM 2 키스킷 API 참조를 참조하세요.
- ‘프로그램 확인’ 항목을 다시 한 번 확인해 주세요.
- OpenQASM 라이브 사양을 참조하세요.