키스킷 0.33 릴리즈 노트
0.33.1
테라 0.19.1
Prelude
키스킷 테라 0.19.1 는 버그 수정 릴리스로, 제어 흐름 빌더 인터페이스, 조건부 게이트 및 최신 테라 오브젝트의 QPY 직렬화에 의해 구성된 회로와 관련된 0.19.0 의 일부 문제를 해결합니다.
지원 중단 노트
-
느슨한 함수
qiskit.circuit.measure.measure()및qiskit.circuit.reset.reset()는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 다음 메소드로 액세스해야 합니다QuantumCircuit:from qiskit import QuantumCircuit circuit = QuantumCircuit(1, 1) # Replace this deprecated form ... from qiskit.circuit.measure import measure measure(circuit, 0, 0) # ... with either of the next two lines: circuit.measure(0, 0) QuantumCircuit.measure(circuit, 0, 0)
버그 수정
-
회로 변환 기능의 오류 수정
circuit_to_gate()및circuit_to_instruction()(및 관련 회로 메서드QuantumCircuit.to_gate()및QuantumCircuit.to_instruction()) 레지스터가 없는 비트 또는 둘 이상의 레지스터에 비트가 있는 회로에서 작동할 때 발생하는 오류를 수정했습니다. 이전에는 생성된 게이트 또는 명령어에 필요한 비트 수가 잘못 계산되어 변환 중에 예외가 발생하는 경우가 많았습니다. -
빌더 인터페이스에서 생성된 제어 흐름 연산에서
QuantumCircuit.copy()를 호출하면 오류가 발생하는 문제를 수정했습니다. 예를 들어, 이전에는 오류가 발생했지만 이제 성공적으로 반환됩니다:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.if_test((creg, 0)): circ.h(0) if_else_instruction, _, _ = circ.data[0] true_body = if_else_instruction.params[0] true_body.copy() -
이제 제어 흐름 빌더 인터페이스에서 중첩된 제어 흐름 범위의 조건으로
ClassicalRegister를 중첩된 제어 흐름 범위의 조건으로 사용할 수 있습니다. 이전에는 이렇게 하면 즉시 오류가 발생하지는 않지만 내부 회로 블록에 올바른 레지스터가 정의되지 않아 나중에 내부 블록과 함께 작동하는 로직이 실패할 수 있었습니다.예를 들어, 이전에는 클래식 레지스터에 조건부 내부 블록을 그리려고 할 때 서랍이 실패했지만 이제는 이 예제에서와 같이 성공합니다:
from qiskit import QuantumCircuit from qiskit.circuit import QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(10)) as a: circ.ry(a, 0) with circ.if_test((creg, 1)): circ.break_loop() print(circ.draw(cregbundle=False)) print(circ.data[0][0].blocks[0].draw(cregbundle=False)) -
직렬화에 대한
qpy_serialization지원 수정QuantumCircuit객체를 직렬화하는ParameterVector또는ParameterVectorElement을 매개변수로 사용하는 객체를 직렬화할 수 있도록 수정했습니다. 이전에는ParameterVectorElement매개변수가 QPY 직렬화를 위한Parameter로 취급되어 QPY 직렬화에서ParameterVector컨텍스트가 손실되어 출력 순서인parameters의 출력 순서가 잘못될 수 있었습니다.이 문제를 해결하려면 새로운 QPY 형식 버전인 버전 3이 필요했습니다. 이 새로운 형식 버전에는
qpy_serialization문서에 설명된ParameterVectorElement클래스의 표현이 포함되어 있으며, 이는 PARAMETER_VECTOR_ELEMENT에 설명되어 있습니다. -
객체 직렬화에 대한
qpy_serialization지원 수정PauliEvolutionGate객체 직렬화 지원을 수정했습니다. 이전에는PauliEvolutionGate는 직렬화를 위한 사용자 정의 게이트로 취급되어 원래의 정의와 이름이 같은Gate객체와 동일한 정의와 이름을 가진PauliEvolutionGate. 그러나 이렇게 하면 원래 상태의PauliEvolutionGate. 이 문제가 수정되어 이번 릴리스부터 회로에서 aPauliEvolutionGate는 이제 QPY 직렬화 전반에 걸쳐 1:1로 유지됩니다. 유일한 한계는 사용자 정의 클래스를 지원하지 않는다는 것입니다EvolutionSynthesis클래스를 지원하지 않는다는 것입니다. 에서 제공되는 클래스만qiskit.synthesis에서 사용할 수 있는 클래스만PauliEvolutionGate와 함께 사용할 수 있습니다.이 문제를 해결하려면 새로운 QPY 형식 버전인 버전 3이 필요했습니다. 이 새로운 형식 버전에는 다음이 포함됩니다.
PauliEvolutionGate에 설명된 클래스qpy_serializationPAULI_EVOLUTION 의 설명서. -
qiskit.circuit.measure.measure()및qiskit.circuit.reset.reset()두 개의 느슨한 함수가 사용 중단 기간 없이 실수로 제거되었습니다. 이 메서드들은 복원되었지만 더 이상 사용되지 않는 것으로 표시되어 있습니다QuantumCircuit.measure()및QuantumCircuit.reset()로 각각 표시되며 향후 릴리스에서 제거될 예정입니다.
기타 참고사항
-
새로운 제어 흐름 빌더 인터페이스는 다양한 컨텍스트 관리자와 헬퍼 개체를 사용하여 작업을 수행합니다. 이는 공개 API의 일부로 간주되어서는 안 되며, 경고 없이 변경 및 제거될 수 있습니다. 빌더 인터페이스의 사용에는 안정성이 보장되어 있는데, 그 이유는
QuantumCircuit.for_loop(),while_loop()와if_test()에 의해 설명되는 동작은 표준 지원 중단 정책의 적용을 받지만, 이를 적용하는 데 사용되는 실제 객체는 그렇지 않습니다. 현재 위치에 존재하거나 메서드나 속성이 첨부된 객체(예:IfContext또는ControlFlowBuilderBlock)에 의존해서는 안 됩니다.이전에는 0.19.0 릴리스에서 명확하지 않았습니다. 이제 이러한 모든 객체는 문서 문자열에 경고가 추가되어 이를 명시합니다. 앞으로는 그 위치와 지원 구현 방식이 상당히 달라질 가능성이 높습니다.
에어 0.9.1
변경 없음
이그니스 0.7.0
변경 없음
IBM Q 제공자 0.18.2
버그 수정
- 서킷 메타데이터에서
Parameter을 전달할 때 작업이 계속 충돌하는 문제에 대한 수정이 #1065에서 제공되었습니다. - 직렬화 중인 회로가
BlueprintCircuit인 경우qiskit.providers.ibmq.runtime.RuntimeEncoder이 추가 decompose()를 수행하는 문제에 대해 #1094에서 제공된 수정 사항.
0.33.0
이번 릴리스는 키스킷에서 키스킷 아쿠아 프로젝트에 대한 지원이 공식적으로 종료됨을 의미합니다. 원래 0.25.0 릴리스에서 더 이상 사용되지 않았으며, 해당 릴리스에서 문서화된 대로 qiskit-aqua 패키지가 키스킷 메타패키지에서 제거되었으므로 pip install qiskit 에는 더 이상 qiskit-aqua 이 포함되지 않습니다. 그러나 파이썬 패키징의 제한으로 인해 이전 버전의 키스킷을 이번 릴리스(또는 향후 릴리스)로 업그레이드할 때 pip install -U qiskit 을 사용하여 기존 설치( qiskit-aqua )를 자동으로 제거할 수 없습니다. 이전 버전에서 업그레이드하는 경우 pip uninstall qiskit-aqua 을 사용하여 수동으로 Qiskit Aqua를 제거하거나 새로운 파이썬 환경에서 설치하는 것이 좋습니다.
qiskit-aqua 에서 제공하던 애플리케이션 모듈이 여러 개의 새로운 패키지로 분리되었습니다: qiskit-optimization, qiskit-nature, qiskit-machine-learning, 그리고 qiskit-finance 입니다. 이러한 패키지는 표준 pip 설치 명령(예: pip install qiskit-nature)을 통해 자체적으로 설치할 수 있습니다 또는 나머지 키스킷 메타패키지를 선택적 추가 기능으로 제공(예 pip install 'qiskit[finance,optimization]' 또는 pip install 'qiskit[all]'). 핵심 알고리즘과 운영자 흐름은 이제 키스킷 테라의 일부로 qiskit.algorithms 와 qiskit.opflow 에서 확인할 수 있습니다. 기존 아쿠아 사용법에 따라 애플리케이션 패키지를 사용하거나 키스킷 테라의 새로운 모듈을 사용해야 합니다. 키스킷 아쿠아에서 마이그레이션하는 방법에 대한 자세한 내용은 아쿠아 마이그레이션 가이드를 참조하세요.
이번 릴리스에서는 키스킷 이그니스 프로젝트도 공식적으로 더 이상 사용되지 않습니다. 따라서 향후 릴리스에서 qiskit-ignis 패키지는 키스킷 메타패키지에서 제거될 것이며, 이는 향후 릴리스에서 pip install qiskit 에 더 이상 qiskit-ignis 이 포함되지 않음을 의미합니다. 키스킷 이그니스는 키스킷 실험 프로젝트에 의해 대체되어 활발한 개발이 중단되었습니다. 더 이상 사용되지 않지만 중요한 버그 수정 및 호환성 수정은 계속 진행되어 사용자에게 Ignis에서 마이그레이션할 수 있는 충분한 기회를 제공할 것입니다. 사용 중단 기간(이번 릴리스부터 3개월 이내)이 지나면 프로젝트는 폐기되어 보관됩니다. 키스킷 이그니스에서 키스킷 실험으로 전환하는 방법에 대한 자세한 내용은 마이그레이션 가이드를 참조하세요.
테라 0.19.0
Prelude
키스킷 테라 0.19 릴리즈의 주요 내용은 다음과 같습니다:
- 추상적인 키스킷/하드웨어 인터페이스의 새로운 버전으로, 다음과 같은 형태의
BackendV2새로운 데이터 구조와 함께 제공되는Target를 사용하여 백엔드에서 트랜스파일러에 대한 제약 조건을 더 잘 모델링할 수 있습니다. - 트랜스파일러 패스에 대한 확장 가능한 플러그인 인터페이스로
UnitarySynthesis트랜스파일러 패스에 대한 확장 가능한 플러그인 인터페이스로, 사용자나 다른 패키지가 새로운 방법으로 키스킷 테라의 합성 루틴을 확장할 수 있습니다. - 제어 흐름 명령어,
for및while루프와if/else문을 표현하기 위한QuantumCircuit. 키스킷 에어의 시뮬레이터는 곧 이 새로운 명령어로 작동할 수 있게 되어 더욱 동적인 양자 프로그램을 작성할 수 있게 될 것입니다. - 진화하는 OpenQASM 3 사양에 대한 예비 지원. 새로운
qiskit.qasm3모듈을 사용하여QuantumCircuit를 OpenQASM 3으로 직렬화할 수 있습니다.
이번 릴리스는 키스킷에서 Python 3.6 에 대한 지원이 종료됨을 의미합니다. 이번 키스킷 테라 릴리스와 0.19.x 시리즈의 모든 후속 버그 수정 릴리스는 Python 3.6 과 함께 작동하는 마지막 릴리스가 될 것입니다. 키스킷 테라의 다음 마이너 릴리스( 0.20.0 )부터는 최소 요구되는 Python 버전은 3.7 입니다.
항상 그렇듯이 이번 릴리스에는 더 많은 기능과 수정 사항이 포함되어 있으며, 아래에서 자세한 내용을 확인할 수 있습니다.
새 기능
-
QuantumCircuit.decompose()와 해당 트랜스파일러 패스Decompose는 이제 선택적으로 게이트 이름 모음이 포함된 매개변수를 허용합니다. 이 파라미터를 지정하면 이름이 일치하는 게이트만 분해됩니다. 유닉스 셸 스타일의 와일드카드 일치를 지원합니다. 예를 들어,qc.decompose(["h", "r[xz]"])는
h,rx또는rz게이트를 분해하지만 (예를 들어)x게이트는 그대로 둡니다. -
최적화 프로그램에
termination_checker인수를 추가했습니다SPSA최적화 프로그램에 추가했습니다. 이를 통해 사용자는 사용자 지정 종료 기준을 구현할 수 있습니다.import numpy as np from qiskit.algorithms.optimizers import SPSA def objective(x): return np.linalg.norm(x) + .04*np.random.rand(1) class TerminationChecker: def __init__(self, N : int): """ Callback to terminate optimization when the average decrease over the last N data points is smaller than the specified tolerance. """ self.N = N self.values = [] def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool: """ Returns: True if the optimization loop should be terminated. """ self.values.append(value) if len(self.values) > self.N: last_values = self.values[-self.N:] pp = np.polyfit(range(self.N), last_values, 1) slope = pp[0] / self.N if slope > 0: return True return False maxiter = 400 spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10)) parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5])) -
새로운 버전의
Backend인터페이스의 새 버전을 추가했습니다,BackendV2. 이 새 버전은 이전 버전에서 크게 변경된 사항입니다,BackendV1백엔드의 속성(예: 큐비트 수 등)에 대한 사용자 액세스 패턴과 백엔드가 트랜스파일러에 제약 조건을 나타내는 방식을 모두 변경합니다. 메서드를 통한 회로 실행은run()메서드를 통한) 회로 실행은 변경되지 않습니다. 별도의 백엔드 대신BackendV2백엔드를 사용하는 대신configuration(),properties()및defaults()메서드를 구성하는BackendConfiguration,BackendProperties및PulseDefaults객체를 각각 생성하는BackendV1인터페이스에서와 같이, 이러한 출력 객체에 포함된 어트리뷰트를 직접BackendV2객체의 어트리뷰트로 직접 액세스할 수 있습니다. 예를 들어, 다음과 같은 백엔드의 큐비트 수를 얻으려면BackendV1를 사용하면 됩니다:num_qubits = backend.configuration().n_qubits와 함께
BackendV2를 사용하면 됩니다:num_qubits = backend.num_qubits이와 관련된 또 다른 변경 사항은 추상 클래스에 노출되는 어트리뷰트 수가 하드웨어/공급업체에 구애받지 않도록 설계되었다는 것입니다
BackendV2클래스가 하드웨어/벤더에 구애받지 않는 필수 또는 선택 필드의 집합으로 설계되어 현재 키스킷의 나머지 부분들이 모든 백엔드에서 사용할 수 있다는 것입니다. 추상 클래스의 서브 클래스BackendV2클래스의 서브클래스는 정의된 것 외에 추가 어트리뷰트와 메서드에 대한 지원을 추가할 수 있지만BackendV2에 정의된 것 이외의 속성과 메서드를 추가할 수 있지만, 키스킷 전체에서 보편적으로 지원되지는 않습니다.공급자 작성자에게 주로 중요한 또 다른 중요한 변경 사항은 공급자 작성자가
BackendV2가 특정 백엔드의 속성을 트랜스파일러에 노출하는 방식입니다. 와BackendV2를 사용하면Target객체를 통해 이루어집니다. 를 통해 노출되는Target속성을 통해 노출되는target속성을 통해 노출되는 는 특정 백엔드에서 회로를 실행하기 위한 제약 조건 집합을 나타내는 데 사용됩니다. 여기에는 이전에 노출된 정보의 하위 집합인BackendConfiguration,BackendProperties및PulseDefaults클래스가 적극적으로 사용할 수 있는 정보 집합을 포함합니다. 사용할 공급자를 마이그레이션할 때BackendV2사용하도록 마이그레이션할 때(또는 새 공급자 패키지를 생성할 때) 백엔드 객체의 구성은 주로 백엔드를 위한Target객체를 생성하는 것입니다. -
새로운
Target클래스를 추가했습니다transpiler모듈에 새 클래스를 추가했습니다. 클래스는Target클래스는 컴파일러에 대한 백엔드의 제약 조건을 나타내도록 설계되었습니다. 클래스는Target클래스는 백엔드와 함께 사용하기 위한 것으로BackendV2백엔드와 함께 사용되며 백엔드가 앞으로 트랜스파일러에 대한 제약 조건을 모델링하는 방식입니다. 이전에 대상 장치를 제어하는 데 사용되었던 개별 필드를transpile()대상 디바이스(예:basis_gates,coupling_map,instruction_durations, 등)를 단일 데이터 구조로 결합합니다. 또한 이기종 게이트 세트 표현, 멀티비트 게이트 연결, 동일한 게이트의 조정된 변형 등 기존에 제공되던 기능에 추가 기능을 추가했습니다. 현재 트랜스파일러는 이러한 제약 조건을 모두 고려하지 않지만, 시간이 지남에 따라 추가 기능을 활용할 수 있도록 확장할 예정입니다. -
이제
Options클래스는 이제 유효성 검사기 지정에 대한 선택적 지원을 제공합니다. 이를 통해Backend작성자는 사용자가 제공한 필드 값에 대한 기본 유효성 검사를 선택적으로 지정할 수 있습니다Options객체의 필드에 대한 기본 유효성 검사를 지정할 수 있습니다. 예를 들어, 다음과 같이 정의된Options로 정의된 객체가 있다면from qiskit.providers.Options options = Options(shots=1024)를 사용하여 샷에 유효성 검사기를 1에서 4096 사이로 설정할 수 있습니다:
options.set_validator('shots', (1, 4096))유효성 검사기를 설정한 상태에서
update_options()메서드를 호출하면shots가 업데이트되는 경우 제안된 새 값이 유효한 범위 내에 있는지 확인합니다. -
새로운 트랜스파일러 분석 패스를 추가했습니다,
ContainsInstruction를qiskit.transpiler.passes모듈에 새로운 트랜스파일러 분석 패스를 추가했습니다. 이 패스는 회로에 특정 명령어가 포함되어 있는지 확인하는 데 사용됩니다. 초기화 시 단일 매개변수, 즉 명령어의 이름을 받아 회로에 해당 명령어가 포함되어 있는지 여부를 확인하고 속성 세트에서 부울을 설정합니다. 예를 들어,from qiskit.transpiler.passes import ContainsInstruction from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() property_set = {} # Contains Hadamard contains_h = ContainsInstruction("h") contains_h(circuit, property_set) assert property_set["contains_h"] == True # Not contains SX contains_sx = ContainsInstruction("sx") contains_sx(circuit, property_set) assert property_set["contains_sx"] == False -
유틸리티 함수 추가
qiskit.utils.detach_prefix()의 대응하는 유틸리티 함수apply_prefix(). 새 함수는 주어진 실수 값에서 스케일링된 값과 접두사의 튜플을 반환합니다. 예를 들어1.3e8값은(130, "M")으로 변환되어130 MHz과 같은 사용자 친화적인 형식으로 값을 표시하는 데 사용할 수 있습니다. -
이제
BIPMapping객체를 구성할 때objective옵션에"gate_error"및"balanced"값을 사용할 수 있으며, 기본값은"balanced"입니다."gate_error"오브젝트를 사용하려면BackendPropertiesbackend_prop인스턴스를 전달해야 하며, 여기에는 목표 계산에 사용되는 2q-gate 게이트 오류가 포함되어 있습니다."balanced"객체는 주어진 경우BackendProperties인스턴스를 사용하지만, 그렇지 않으면 새 매개변수default_cx_error_rate에 지정된 대로 CX 오류율을 가정합니다. 밸런스드 오브젝트의 게이트 에러와 깊이 구성 요소의 상대적 가중치는 새로운depth_obj_weight파라미터로 제어할 수 있습니다. -
초기화 시 설정된
VQE클래스의 모든 어트리뷰트를 이제 게터와 세터로 액세스할 수 있습니다. 또한ansatz및optimizer속성의 기본값은None을 지정하여 재설정할 수 있습니다:vqe = VQE(my_ansatz, my_optimizer) vqe.ansatz = None # reset to default: RealAmplitudes ansatz vqe.optimizer = None # reset to default: SLSQP optimizer -
새로운 메서드 추가
PauliList.group_qubit_wise_commuting()를 분할하는 새로운 메서드PauliList를 상호 큐비트 단위로 커뮤팅하는Pauli연산자 집합으로 분할하는 새로운 메서드를 추가했습니다. 예를 들어,from qiskit.quantum_info import PauliList, Pauli pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")]) pauli_list.group_qubit_wise_commuting() -
새로운 커플링 맵 생성자 메서드가 추가되었습니다
CouplingMap.from_hexagonal_lattice()메서드를 추가했습니다. 예를 들어 2x2 육각형 격자 결합 맵을 만들 수 있습니다:from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_hexagonal_lattice(2, 2) cmap.draw() -
새로운 가짜 백엔드 클래스는
qiskit.test.mock에서 확인할 수 있습니다. 여기에는ibmq_brooklyn,ibmq_manila,ibmq_jakarta,ibmq_lagos의 모의 버전이 포함됩니다. 다른 가짜 백엔드와 마찬가지로 보정 데이터의 스냅샷(예:backend.defaults())이 포함됩니다 및 오류 데이터(예:backend.properties()) 실제 시스템에서 가져온 것으로 로컬 테스트, 컴파일 및 시뮬레이션에 사용할 수 있습니다. -
추가
OperatorBase.is_hermitian()메서드를 추가하여 연산자가 헤르미티안인지 여부를 확인합니다.NumPyEigensolver및NumPyMinimumEigensolver를 사용하여eigh또는eigsh연산자가 Hermitian인 경우 고유값 문제를 해결합니다. -
새로운 생성자 메서드 추가
PassManagerConfig.from_backend(). 사용자 옵션과 백엔드 구성으로PassManagerConfig객체를 사용자 옵션과 백엔드 구성으로 구성합니다. 이 기능을 사용하면 사전 설정된 패스매니저를 더 쉽게 구축할 수 있습니다. 예를 들어,from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.test.mock import FakeMelbourne pass_manager = level_1_pass_manager( PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42) ) -
새로운 트랜스파일러 패스
PulseGates가 추가되어 명령 스케줄 맵에서 사용자가 제공한 캘리브레이션을 자동으로 추출하고 게이트 스케줄을 주어진(트랜스파일된) 양자 회로에 펄스 게이트로 연결합니다.트랜스파일러 패스는
PulseGates트랜스파일러 패스는 0에서 3까지의 모든 최적화 레벨에 적용됩니다. 최종 사용자가 명시적으로backend.defaults().instruction_schedule_map을 재정의하지 않는 한 게이트 구현은 업데이트되지 않습니다. 이 패스를 사용하면 사용자가 하드웨어에서 실행되는 모든 회로에 대해 개별적으로QuantumCircuit.add_calibration()를 개별적으로 호출하지 않아도 됩니다.이 새로운 패스를 보완하기 위해 일정이 추가되었습니다
InstructionScheduleMap에 메타데이터 필드"publisher"로 암시적으로 업데이트되었습니다. 백엔드에서 보정된 게이트 스케줄에는 이미 알려진 스케줄의 보정으로 회로가 재정의되는 것을 방지하기 위한 특수 게시자 종류가 있습니다. 일반적으로 이 메타데이터는 자동으로 적용되므로 최종 사용자는 이 메타데이터를 관리할 필요가 없습니다. 전화InstructionScheduleMap.has_custom_gate()을 호출하여 맵에 사용자 지정 게이트 보정이 있는지 확인할 수 있습니다.실행 중인 모든 회로에 사용자 지정 게이트 구현을 적용하는 방법을 알아보려면 아래 코드 예제를 참조하세요.
from qiskit.test.mock import FakeGuadalupe from qiskit import pulse, circuit, transpile backend = FakeGuadalupe() with pulse.build(backend, name="x") as x_q0: pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0)) backend.defaults().instruction_schedule_map.add("x", (0,), x_q0) circs = [] for _ in range(100): circ = circuit.QuantumCircuit(1) circ.sx(0) circ.rz(1.57, 0) circ.x(0) circ.measure_active() circs.append(circ) circs = transpile(circs, backend) circs[0].calibrations # This returns calibration only for x gate인스트럭션 스케줄 맵은 변경 가능한 객체라는 점에 유의하세요. 항목 중 하나를 재정의하고 다른 실험에 해당 백엔드를 사용하면 실수로 게이트 정의가 업데이트될 수 있습니다.
backend = FakeGuadalupe() instmap = backend.defaults().instruction_schedule_map instmap.add("x", (0, ), my_x_gate_schedule) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) qc = transpile(qc, backend) # This backend uses custom X gate특정 실험의 게이트 정의를 업데이트하려면 먼저 인스트럭션 스케줄 맵을 딥카피하여 트랜스파일러에 직접 전달해야 합니다.
-
BIPMapping의 생성자에 새로운 옵션qubit_subset을 도입했습니다. 이 옵션을 사용하면 매핑 중에 사용할 물리적 큐비트(장치의coupling_map)를 한 줄로 지정할 수 있습니다:mapped_circ = BIPMapping( coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]), qubit_subset=[1, 3, 4] )(circ)이전에는 동일한 작업을 수행하려면 사용할 큐비트만 포함된 축소된
coupling_map을 제공하고, 결과 회로를 원본coupling_map에 임베드한 다음QuantumCircuit._layout을 적절히 업데이트해야 했습니다:reduced_coupling = coupling_map.reduce(qubit_to_use) mapped = BIPMapping(reduced_coupling)(circ) # skip the definition of fill_with_ancilla() # recover circuit on original coupling map layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)}) for reg in mapped.qregs: layout.add_register(reg) property_set = {"layout": fill_with_ancilla(layout)} recovered = ApplyLayout()(mapped, property_set) # recover layout overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()}) for reg in mapped.qregs: overall_layout.add_register(reg) recovered._layout = fill_with_ancilla(overall_layout) -
의 생성자에
ignore_pauli_phase및copy인수를 추가했습니다SparsePauliOp.ignore_pauli_phase는 입력의phase속성을 읽지 못하게 합니다PauliList속성을 읽지 못하도록 하는데, 이는 내부 ZX 규칙에서PauliList가 이미 내부 ZX 규칙에서 모든 위상이 0인 것으로 알려져 있는 경우 더 성능이 좋습니다.copy를 명시적으로 설정하면 사용자가 입력 데이터의 복사를 피할 수 있습니다copy=False. -
다음 작업의 성능이 향상되었습니다
SparsePauliOp작업의 성능이 향상되었습니다:simplify()( #7122 참조)compose()( #7126 참조)_add()( #7138 참조)from_list()및__init__()( #7138의 다른 논의 참조).
-
메서드를 추가했습니다
SparsePauliOp.sum()메서드를 추가하여 많은SparsePauliOps. 이 방법은 인스턴스를 루프에 함께 추가하는 것보다 훨씬 더 나은 성능을 제공합니다. 예를 들어, 이전에는 여러 개의SparsePauliOp를 함께 추가하는 것입니다:from qiskit.quantum_info import SparsePauliOp, random_pauli_list sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000] total = sparse_ops[0] for op in sparse_ops[1:]: total += op이제 이 작업을 훨씬 더 효율적으로 수행할 수 있습니다(속도와 타이핑 모두에서!) 로 설정합니다:
SparsePauliOp.sum(sparse_ops) -
의 기본 클래스인
ParametricPulse의 생성자에limit_amplitude인수를 추가했습니다Gaussian,GaussianSquare,Drag및Constant를 추가하여 펄스 단위로 진폭 제한 1을 비활성화할 수 있도록 했습니다.limit_amplitude=False를 사용하면 개별 펄스가 유니티를 초과하는 진폭을 가질 수 있습니다PulseError. 자세한 내용은 #6544를 참조하세요. -
사용
QuantumCircuit.draw()또는circuit_drawer()를 사용하면 이제 파일 이름 확장자에서 유추된 이미지 형식의 파일이 생성됩니다(예:latex서랍):import qiskit circuit = qiskit.QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw('latex', filename='./file.jpg')이렇게 하면 회로 도면이 JPEG 형식으로 저장됩니다. 이전에는 이미지가 항상 PNG 형식이었습니다. 자세한 내용은 #6448을 참조하세요.
이제 예를 들어 지원되지 않는 파일 이름 확장자가 있는 경우:
circuit.draw('latex', filename='./file.spooky')를 입력하면 파일 이름 확장자를 지원되는 이미지 형식으로 변경하기 위해
ValueError가 발생합니다. -
에
filename매개변수를 추가했습니다plot_gate_map()및plot_coupling_map()에 매개변수를 추가하여 결과 이미지를 파일로 저장할 수 있습니다. -
대략적인 양자 컴파일러와 그에 상응하는 단일 합성 플러그인 구현을 소개했습니다. 주요 AQC 클래스는
AQC를 사용하여 단일 행렬을 대략적인 회로로 컴파일하는 독립 실행형 버전입니다. 플러그인은 다음에 의해 호출될 수 있습니다transpile()unitary_synthesis_method인수가'aqc'으로 설정된 경우 참조qiskit.transpiler.synthesis.aqc를 참조하세요. -
에
filter_function인수를 추가했습니다QuantumCircuit.depth()및QuantumCircuit.size()인수를 추가하여 몇 가지 기준에 따라 회로 동작을 분석할 수 있습니다.예를 들어, 2큐비트 게이트의 수를 구하려면 다음과 같이 할 수 있습니다:
circuit.size(lambda x: x[0].num_qubits == 2)또는 0번째 큐비트에 작용하는 T 게이트의 깊이를 얻습니다:
circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1]) -
새로운 트랜스파일러 패스를 추가했습니다,
CollectMultiQBlocks를qiskit.transpiler.passes모듈에 새로운 트랜스파일러 패스를 추가했습니다. 이 패스는 큐비트 그룹에 작용하는 중단 없는 게이트 시퀀스를 수집하는 데 사용됩니다. 기존 패스와 유사한 기능을 제공하지만Collect2qBlocks패스와 유사한 기능을 제공하지만, 해당 패스는 2큐비트 블록을 찾도록 설계 및 최적화되었지만 이 새로운 패스는 모든 크기의 블록을 찾을 수 있습니다. -
에 새로운 제어 흐름 작업을 위한 빌더 인터페이스가 있습니다
QuantumCircuit와 같은 새로운ForLoopOp,IfElseOp및WhileLoopOp. 인터페이스는 동일한 회로 방식, 즉QuantumCircuit.for_loop(),QuantumCircuit.if_test()와QuantumCircuit.while_loop()는body매개변수가 지정되지 않으면 컨텍스트 관리자를 반환하도록 오버로드되어 있습니다. 이러한 컨텍스트 관리자 중 하나를 입력하면 스코프가 회로에 푸시되고 모든 게이트 호출(및 기타 스코프)과 이들이 사용하는 리소스를 캡처하여 마지막에 관련 작업을 빌드합니다. 예를 들어, 이제 할 수 있습니다:qc = QuantumCircuit(2, 2) with qc.for_loop(range(5)) as i: qc.rx(i * math.pi / 4, 0)이렇게 하면
ForLoopOpqc를 생성하며, 이는 큐비트 0이 루프 본문 내에서 사용되는 유일한 리소스임을 알 수 있습니다. 이러한 컨텍스트 관리자는 중첩할 수 있으며 너비를 올바르게 결정합니다. 사용할 수 있습니다QuantumCircuit.break_loop()과QuantumCircuit.continue_loop()를 사용할 수 있으며, 컨텍스트 내에서 중첩되어 있어도 포함 루프에 맞는 너비로 확장됩니다QuantumCircuit.if_test()블록에 중첩되더라도 확장됩니다.컨텍스트 매니저는
if_test()컨텍스트 관리자는 원하는 경우 다음과 같이else블록을 만드는 데 사용할 수 있는 체인 관리자를 제공합니다:qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) with qc.if_test((creg, 0)) as else_: qc.x(1) with else_: qc.z(1)관리자는
if및else본문이 동일한 리소스 집합에 정의되어 있는지 확인합니다. -
새로운 트랜스파일러 패스 도입
InverseCancellation를 일반화하는CXCancellation패스를 일반화하여 셀프 인버스 게이트 또는 게이트-인버스 쌍을 취소할 수 있습니다. 초기화하여 사용할 수 있습니다InverseCancellation를 초기화하고 취소할 게이트를 전달하여 사용할 수 있습니다:from qiskit.transpiler.passes import InverseCancellation from qiskit import QuantumCircuit from qiskit.circuit.library import HGate from qiskit.transpiler import PassManager qc = QuantumCircuit(2, 2) qc.h(0) qc.h(0) pass_ = InverseCancellation([HGate()]) pm = PassManager(pass_) new_circ = pm.run(qc) -
의 생성자
RZXCalibrationBuilder의 생성자에는 두 개의 새로운 kwarginstruction_schedule_map와qubit_channel_mapping이 있는데, 각각 각 큐비트에 대한InstructionScheduleMap와 각 큐비트에 대한 채널 이름 목록을 각각 받습니다. 이러한 새로운 인수는 백엔드 대상에서 필요한 정보를 직접 지정하는 데 사용됩니다.BaseBackend또는BackendV1객체를backend인수와 함께 직접 전달해야 합니다. -
큐비트로만 구성된 상태의
Statevector는 이제 케트 표기법( LaTeX )을 사용하여 큐비트로만 구성된 상태를 그릴 수 있습니다. 케트 표기법에서는 상태 벡터의 항목이 분수나 2의 제곱근과 같은 정확한 요소가 그대로 그려지도록 처리됩니다. 특정 규칙은convention키워드 인수를"ket"또는"vector"로 적절히 전달하여 선택할 수 있습니다:import math from qiskit.quantum_info import Statevector sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)]) sv.draw("latex", convention="ket") sv.draw("latex", convention="vector") -
새로운 트랜스파일러 패스
EchoRZXWeylDecomposition를 추가하여 사용자가 카탄의 분해 기능을 활용하여 임의의 2쿼비트 게이트를 에코된 RZX 게이트로 분해할 수 있도록 했습니다. 다른 트랜스파일러 패스와 함께 사용하면 임의의 회로를 동일한 유니티를 구현하는 RZX 게이트 기반 및 펄스 효율 회로로 트랜스파일링하는 데 사용할 수 있습니다. -
그리고
SPSA및QNSPSA옵티마이저 클래스는 이제 반복과 초기 보정 모두에 대해 가능한 한 많은 회로 평가를 일괄 처리할 수 있습니다. 이 기능은 생성자에서max_evals_groupedkwarg를 설정하여 활용할 수 있습니다VQE를 사용할 때SPSA또는QNSPSA를optimizer매개변수로 설정합니다. 예를 들어,from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms.optimizers import QNSPSA from qiskit.test.mock import FakeMontreal backend = FakeMontreal() ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz") qnspsa = QNSPSA(fidelity, maxiter=5) vqe = VQE( ansatz=ansatz, optimizer=qnspsa, max_evals_grouped=100, quantum_instance=backend, ) -
이번 릴리스에서는 사용자 정의 RZX 게이트 세트를 대상으로 하는 2큐비트 게이트의 분해 방법을 소개합니다. 트랜스파일러 사용자는
basis_gates목록에'rzx'을 포함시켜 {RZX(pi/2),RZX(pi/4), andRZX(pi/6)} 에 대한 디분해를 활성화할 수 있습니다transpile(). 양자 정보 패키지 사용자는 메서드 자체의XXDecomposer클래스에서 찾을 수 있습니다. -
트랜스파일러 패스 추가
Optimize1qGatesSimpleCommutation를 추가하여 재합성 기회를 발견하기 위해 단일 큐비트 게이트를 이동하는 전략에 따라 회로를 최적화합니다. -
에
max_job_tries매개변수를 추가하여QuantumInstance에 매개변수를 추가하여 백엔드에서 작업이 실행되는 횟수를 제한합니다. 이전에는 백엔드에서 작업이 취소되거나 오류가 발생하더라도 결과 제출 및 가져오기가 무한정 시도되었습니다. 기본값은 이제 50이며,max_job_tries=-1을 설정하여 이전 동작을 구현할 수 있습니다. 6872 및 6821 수정. -
함수에 대한
latex출력 메서드circuit_drawer()함수와QuantumCircuit.draw()메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 라텍스 서랍과 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능의 호환성을 위해 추가되었습니다. -
함수에 대한
"mpl"출력 메서드circuit_drawer()함수와QuantumCircuit.draw()메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능인"mpl"서랍의 호환성을 위해 추가되었습니다. -
함수에 대한
text출력 메서드circuit_drawer()함수와QuantumCircuit.draw()메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 텍스트 서랍과 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능의 호환성을 위해 추가되었습니다. -
새로운 분석 트랜스파일러 패스가 추가되었습니다,
GatesInBasis가qiskit.transpiler.passes. 이 패스는 트랜스파일 대상에DAGCircuit에 구성된 베이시스의 모든 게이트가 설정되어 있는지 여부를 확인합니다. 의 모든 게이트가 구성된 기준 세트에 있는 경우 속성 세트의"all_gates_in_basis"속성을True으로 설정하고, 그렇지 않은 경우DAGCircuit의 모든 게이트가 구성된 기준 집합에 있는 경우False, 그렇지 않은 경우 로 설정합니다. 예를 들어,from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import GatesInBasis # Instatiate Pass basis_gates = ["cx", "h"] basis_check_pass = GatesInBasis(basis_gates) # Build circuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() # Run pass on circuit property_set = {} basis_check_pass(circuit, property_set=property_set) assert property_set["all_gates_in_basis"] -
두 개의 새로운 생성자 메서드가 추가되었습니다,
from_heavy_hex()과from_heavy_square()를 추가했습니다CouplingMap클래스에 이러한 생성자 메서드는CouplingMap에 설명된 대로 무거운 육각형 또는 무거운 정사각형 그래프를 생성하는 데 사용됩니다 , 2020.예를 들어,
from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_hex(5) cmap.draw()from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_square(5) cmap.draw() -
이제
HHL알고리즘은 행렬의 고유값이 음수일 때 해를 찾을 수 있습니다. 이를 활성화하기 위해 알고리즘은 이제 값의 부호를 나타내는 큐비트를 추가하고, 헬퍼 알고리즘(ExactReciprocal이 새로운 정보를 처리하도록 업데이트되었습니다. 자세한 내용은 #6971을 참조하세요. -
두 개의 새로운 클래스를 추가했습니다,
CompleteMeasFitter과TensoredMeasFitter모듈에qiskit.utils.mitigation모듈에 이 클래스는measurement_error_mitigation_clskwarg의 값으로만 사용됩니다QuantumInstance클래스의 값으로만 사용됩니다. 이러한 클래스의 인스턴스화 및 사용(또는qiskit.utils.mitigationmeasurement_error_mitigation_cls)의 인스턴스화 및 사용은 내부 비공개 API로 취급되어야 하며 의존해서는 안 됩니다. -
클래스의
ListOp클래스의qiskit.opflow의 클래스에는 이제coeffs속성이 있는데, 이 속성은 연산자 목록의 계수 목록을 반환하며, 전체 계수(ListOp.coeff)가 목록에 곱셈으로 분포되어 있습니다. 참고ListOp객체는 중첩될 수 있으며(oplist의ListOp객체에 포함됨) 중첩될 수 있으며, 이러한 경우 coeffs 메서드가 호출되면 예외가 발생합니다. 메서드는ListOp.coeffs메서드는 중첩되지 않는 클래스의coeffs속성 메서드에 대해 편리하게 덕 타입을 지정합니다PauliSumOp클래스의 -
이제
Statevector클래스는 이제 구독할 수 있습니다. 이제 사용자는 인덱스에서 n번째 계수를 검색할 수 있습니다Statevector를statevec[n]로 검색할 수 있습니다. -
추가
Statevector.inner메서드를 추가하여Statevector인스턴스의 내부 곱을 계산하는 메서드를 추가했습니다. 예를 들어,statevec_inner_other = statevec.inner(other)는
statevec의 내부 제품을other로 반환합니다.statevec은 반드시Statevector여야 하지만other은 Numpy 배열과 같이Statevector배열로 구성할 수 있습니다. -
에 새 매개 변수
add_bits를 추가했습니다QuantumCircuit.measure_all(). 기본적으로True으로 설정되어 측정값을 저장하기 위해 큐비트 수와 동일한 크기의 새ClassicalRegister를 추가하여 측정값을 저장하는 이전 동작을 유지합니다.False로 설정하면 측정값이 기존의 클래식 비트에 저장됩니다. 예를 들어 다음과 같은 기존 클래식 비트로 회로를 만든 경우입니다:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(2) cr = ClassicalRegister(2, "meas") circuit = QuantumCircuit(qr, cr)circuit.measure_all(add_bits=False)을 호출하면 기존 클래식 레지스터cr가 회로에 추가된Measurement객체의 출력 대상으로 사용됩니다. -
ParameterExpression는 이제 잠재적으로 바인딩되지 않은 매개변수가 있더라도 숫자 변환을 기본 심볼 라이브러리에 위임합니다. 이를 통해 다음과 같은 표현식을 변환할 수 있습니다:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> float(x - x + 2.3) 2.3에서 기본 표현식에 고정 값이 있지만
x매개 변수가 아직 바인딩되지 않은 경우입니다. -
모든 최적화 프로그램에
Optimizer.minimize()메서드를 모든 옵티마이저에 추가했습니다:Optimizer및 파생 클래스. 이 메서드는 SciPy’sminimize()함수의 서명을 모방하고OptimizerResult.예를 들면 다음과 같습니다
import numpy as np from qiskit.algorithms.optimizers import COBYLA def loss(x): return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3 initial_point = np.array([0, 0]) optimizer = COBYLA() result = optimizer.minimize(loss, initial_point) optimal_parameters = result.x minimum_value = result.fun num_function_evals = result.nfev -
회로 라이브러리에
PauliEvolutionGate를 회로 라이브러리(qiskit.circuit.library)는 (합 또는 합의 합)의 시간 진화를 수행하는 게이트를 정의합니다Paulis. 이 게이트의 합성은 다음에 의해 수행됩니다EvolutionSynthesis에 의해 수행되며 게이트 자체에서 분리됩니다. 현재 사용 가능한 합성 방법은 다음과 같습니다:LieTrotter첫 번째 주문 트로터화SuzukiTrotter고차 트로터화MatrixExponential정확한 매트릭스 기반 진화
예를 들어,
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparsePauliOp from qiskit.synthesis import SuzukiTrotter operator = SparsePauliOp.from_list([ ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1) ]) time = 0.12 # evolution time synth = SuzukiTrotter(order=4, reps=2) evo = PauliEvolutionGate(operator, time=time, synthesis=synth) circuit = QuantumCircuit(3) circuit.append(evo, range(3)) -
새로운 기능
plot_coupling_map()이 도입되어 기존 함수인plot_gate_map()의 기능을 확장한 새로운 함수가 도입되었습니다:num_qubit,qubit_coordinates,coupling_map(backend대신)을 사용하여 임의의 큐비트 커플링 맵을 플로팅할 수 있습니다. -
키스킷 테라가 이제 시리얼라이제이션에 대한 초기 지원을 제공합니다
QuantumCircuit를 OpenQASM 3 :from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) print(qasm3.dumps(qc))이번 초기 릴리스에서는 명명된 레지스터, 기본 내장 명령어(측정, 배리어, 리셋 등), 사용자 정의 게이트, 사용자 정의 명령어(서브루틴), 이번 릴리스에 도입된 새로운 제어 흐름 구성에 대한 지원이 제한됩니다:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 import math composite_circ_qreg = QuantumRegister(2) composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ") composite_circ.h(0) composite_circ.x(1) composite_circ.cx(0, 1) composite_circ_gate = composite_circ.to_gate() qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") qc = QuantumCircuit(qr, cr) with qc.for_loop(range(4)) as i: qc.rx(i * math.pi / 4, 0) qc.cx(0, 1) qc.barrier() qc.append(composite_circ_gate, [0, 1]) qc.measure([0, 1], [0, 1]) print(qasm3.dumps(qc)) -
클래스는
QDrift클래스가 합성 메서드로 재구성되었습니다PauliEvolutionGate의 합성 메서드로 재구성되었습니다TrotterizationBase.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis import QDrift from qiskit.opflow import X, Y, Z qdrift = QDrift(reps=2) operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3) time = 2.345 # evolution time evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift) circuit = QuantumCircuit(3) circuit.append(evolution_gate, range(3)) -
QPY 직렬화는 이제 다음과 같은
global_phase어트리뷰트를 표현할 수 있게 되었습니다QuantumCircuitint객체의 속성을 표현할 수 있게 되었습니다,Parameter객체 또는ParameterExpression객체입니다. 이전 버전의 QPY는global_phasefloat.이를 위해서는 추가 유형을 표현하기 위해 이번 릴리스에 도입된 QPY 형식 버전 2가 필요합니다.
-
새로운
find_bit()메서드가 추가되었습니다QuantumCircuit클래스에 새로운 메서드가 추가되어, 주어진 회로에서 제공된 인덱스와 레지스터를Bit의 인덱스와 레지스터를 조회할 수 있는 메서드가 추가되었습니다. 이 메서드는 0)Bit의 인덱스가 포함된 두 요소namedtuple를 반환합니다qubits(a의 경우Qubit) 또는clbits(a의 경우Clbit)와 1) 각 회로를 포함하는 length-2 튜플 목록(Register를 포함하는Bit및Bit을 찾을 수 있는Register의 인덱스가 포함된 튜플 목록을 반환합니다.예를 들어,
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit reg1 = QuantumRegister(3, 'foo') qubit = Qubit() reg2 = QuantumRegister(2, 'bar') qc = QuantumCircuit(reg1, [qubit], reg2) print(qc.find_bit(reg1[2])) print(qc.find_bit(qubit))를 생성할 수 있습니다:
BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)]) BitLocations(index=3, registers=[]) -
세 가지 새로운
Instruction서브클래스가 동적 회로에서 제어 흐름 연산을 지원하기 위해 추가되었습니다:WhileLoopOp,ForLoopOp와IfElseOp. 또한 두 개의 하위 클래스BreakLoopOp와ContinueLoopOp가 추가되어 각각 루프 컨텍스트의 다음 반복을 중단하고 계속하는 것을 지원합니다.독립형으로 만들거나
Instruction로 생성하거나 각각의 메서드를 통해 기존QuantumCircuit인스턴스에 추가할 수 있습니다,QuantumCircuit.while_loop(),for_loop(),if_test(),if_else(),break_loop()및continue_loop(). -
기존 측정 오류 완화기를 구현하는
BaseReadoutMitigator추상 베이스 클래스를 추가했습니다. 이러한 개체는 측정 오류를 완화하기 위한 것입니다Counts측정 오류가 있는 백엔드에서 회로를 실행한 후 반환되는 객체입니다.읽기 완화기 클래스에는 두 가지 주요 메서드가 있습니다:
expectation_value()노이즈가 많은 객체에서 대각선 연산자의 완화 된 기대값과 표준 오차를 계산합니다Counts객체에서 계산합니다.quasi_probabilities()를 사용하여 표준 오차를 포함한 오류 완화QuasiDistribution표준 오차를 포함한 오류를 계산합니다.
현재
qiskit.algorithms모듈과QuantumInstance클래스는 여전히 키스킷 이그니스에서 마이그레이션된 레거시 완화자를 사용한다qiskit.utils.mitigation. 향후 릴리스에서 새로운 완화기 클래스를 사용하도록 모듈을 업그레이드하고 레거시 완화 코드는 더 이상 사용되지 않도록 할 계획입니다. -
추가
LocalReadoutMitigator클래스를 추가하여 로컬 측정 오류의 측정 판독 오류 완화를 수행합니다. 로컬 측정 오류는 단일 큐비트 측정 오류의 텐서 곱으로 설명되는 오류입니다.이 클래스는 단일 큐비트 측정 오류 할당 행렬 목록으로 초기화하거나 백엔드 속성에서 판독 오류 정보를 사용하여 백엔드에서 초기화할 수 있습니다.
완화는 로컬 할당 행렬 반전을 사용하여 구현되며, -qubit 완화의 경우 의 복잡도와
QuasiDistribution및 기대값을 사용합니다. -
추가
CorrelatedReadoutMitigator클래스를 추가하여 상호 연관된 측정 오류의 측정 판독 오류 완화를 수행합니다. 이 클래스는 오류 확률을 나타내는 단일 측정 오류 할당 행렬로 초기화할 수 있습니다. 완화는 할당 행렬의 반전을 통해 구현되며, 완화 복잡도는 의QuasiDistribution의 완화 복잡도와 기대값을 갖습니다. -
어트리뷰트와
QuasiDistribution.stddev_upper_bound속성과 kwarg를 클래스의 생성자에 추가했습니다QuasiDistribution클래스의 생성자에 준확률 추정치의 표준 오차를 저장하는 데 사용되는 어트리뷰트와 kwarg를 추가했습니다. 이것은BaseReadoutMitigator클래스에서 표준 오차를 완화된 준확률로 저장하는 데 사용됩니다. -
메소드를 추가했습니다
shots()메서드에qiskit.result.Counts메서드를 추가하여 카운트에서 모든 결과의 합계를 반환합니다. -
알고리즘 클래스를 실행할 때
Grover알고리즘 클래스를 실행할 때 최적의 전력을 알고 있고 단일 회로만 실행되는 경우, 더 이상AmplificationProblem.is_good_state콜백 함수를 더 이상 설정할 필요가 없으며 Grover 검색이 가장 가능성이 높은 비트 문자열을 반환합니다. 일반적으로 Grover 연산자의 최적 파워를 알 수 없는 경우, 알고리즘은Grover알고리즘은 다양한 거듭제곱(즉, 반복)을 검사하고is_good_state함수를 적용하여 좋은 비트스트링이 측정되었는지 확인합니다. 예를 들어 이제 다음과 같은 작업을 실행할 수 있습니다:from qiskit.algorithms import Grover, AmplificationProblem from qiskit.providers.aer import AerSimulator from qiskit.quantum_info import Statevector # Fixed Grover power: 2. grover = Grover(iterations=2, quantum_instance=AerSimulator()) # The ``is_good_state`` argument not required here since Grover search # will be run only once, with a power of 2. problem = AmplificationProblem(Statevector.from_label("111")) # Run Grover search and print the best measurement result = grover.amplify(problem) print(result.top_measurement) # should print 111 -
메서드 추가
remove_cregs()메서드를 클래스DAGCircuit클래스에 메서드를 추가하여 기존 레지스터 제거를 지원합니다. -
메서드 추가
remove_clbits()메서드를 클래스DAGCircuit클래스에 메서드를 추가하여 유휴 클래식 비트 제거를 지원합니다. 제거된 비트를 참조하는 모든 기존 레지스터도 제거됩니다. -
새로운 메서드를 추가했습니다,
replace_block_with_op()메서드를DAGCircuit클래스에 메서드를 추가했습니다. 이 방법은 DAG의 노드 블록을 단일 작업으로 대체하는 데 사용됩니다. 표준 예제는ConsolidateBlocks노드 블록을 동등한UnitaryGate노드로 대체하는 패스입니다. -
새로운 분석 트랜스파일러 패스를 추가했습니다,
Collect1qRuns를qiskit.transpiler.passes모듈에 추가했습니다. 이 패스는 단일 큐비트에서 작동하는 중단 없는 게이트 시퀀스를 찾는 데 사용됩니다. 이는Collect2qBlocks및CollectMultiQBlocks와 유사하지만 다중 큐비트 블록이 아닌 단일 큐비트 실행에 최적화되어 있습니다. -
이제 다양한 트랜스필레이션 내부에서 내부 회로 표현을 작업할 때 retworkx 0.10 의 새로운 기능을 사용합니다. 이로 인해 통화 속도가 약 10
40% 향상될 수 있습니다40% 향상되며, 최적화 수준이 높을수록 효과가 더 커집니다. 자세한 내용은 #6302를 참조하세요.transpile호출 속도가 약 10 -
트랜스파일러의
UnitarySynthesis트랜스파일러 패스qiskit.transpiler.passes의 생성자에는 새로운 kwarg 가 있습니다(min_qubits). 이 값을 지정하면 단일 합성을 실행할 최소 크기UnitaryGate오브젝트인int값으로 설정할 수 있습니다. 의UnitaryGate가QuantumCircuit가 더 적은 수의 큐비트를 사용하면 해당 패스 인스턴스에서 건너뛰게 됩니다. -
Eigensolver및MinimumEigensolver인터페이스는 이제 각각의compute_eigenvalues()및compute_minimum_eigenvalue()메서드에서aux_operators매개변수에 대해Dict[str, Optional[OperatorBase]]유형을 지원합니다. 이 경우 보조 고유값도aux_operators사전에서 제공하는 것과 동일한 키로 사전에 저장됩니다. 주 연산자와 통근하지 않는 연산자에 해당하는 키는 삭제됩니다. -
그리고
BasisTranslator,GateDirection및CheckGateDirection트랜스파일러 패스는 생성자에 새로운targetkwarg가 있으며, 이를 사용하여 패스의 대상으로Target객체를 패스의 대상으로 설정하는 데 사용할 수 있습니다. 설정된 경우target_basis(패스의 경우) 또는 (BasisTranslator패스) 또는coupling_map(GateDirection및CheckGateDirection패스) 인자 대신 사용됩니다. -
에 두 개의 트랜스파일러 스테이지를 허용합니다
QuantumInstance에 두 개의 트랜스파일러 스테이지를 허용합니다. 하나는 파라미터화된 회로용이고 다른 하나는 바인딩된 회로(즉, 자유 파라미터가 없는)에만 사용됩니다. 언바운드 및 바운드 회로에 대한 패스가 있는 양자 인스턴스가CircuitSampler로 전달되면 샘플러는 매개변수화된 회로에 언바운드 패스를 한 번 적용하고 캐시한 다음 향후 모든 평가에 바운드 패스만 적용하려고 시도합니다.이를 통해 다음과 같은 변형 알고리즘을 사용할 수 있습니다
VQE와 같은 가변 알고리즘을 사용하여 파라미터화된 회로에 대해 커스텀 패스 매니저를 한 번 실행하고, 각 반복에서 바인딩된 회로에 대해 다른 커스텀 패스 매니저를 사용하여 트랜스파일러를 다시 한 번 실행할 수 있습니다. 모든 패스가 매개변수화된 회로를 지원하는 것은 아니므로(예를 들어Optimize1qGatesDecomposition는 바인딩된 회로 파라미터에서만 작동합니다.)예를 들어, 이 기능을 사용하면 VQE에서 다음과 같이 펄스 효율적인 CX 분해를 사용할 수 있습니다
from qiskit.algorithms import VQE from qiskit.opflow import Z from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passes import ( Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition, RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator ) from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from qiskit.test.mock import FakeBelem from qiskit.utils import QuantumInstance # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend backend = FakeBelem() # Build the pass manager for the parameterized circuit rzx_basis = ['rzx', 'rz', 'x', 'sx'] coupling_map = CouplingMap(backend.configuration().coupling_map) config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map) pre = level_1_pass_manager(config) # Build a pass manager for the CX decomposition (works only on bound circuits) post = PassManager([ # Consolidate consecutive two-qubit operations. Collect2qBlocks(), ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']), # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates. EchoRZXWeylDecomposition(backend), # Attach scaled CR pulse schedules to the RZX gates. RZXCalibrationBuilderNoEcho(backend), # Simplify single-qubit gates. UnrollCustomDefinitions(std_eqlib, rzx_basis), BasisTranslator(std_eqlib, rzx_basis), Optimize1qGatesDecomposition(rzx_basis), ]) quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post) vqe = VQE(quantum_instance=quantum_instance) result = vqe.compute_minimum_eigenvalue(Z ^ Z) -
외부 패키지에 포함된 대체 합성 기술을 트랜스파일러 패스와 함께 원활하게 사용할 수 있는 새로운 단일 합성 플러그인 인터페이스가 도입되었습니다
UnitarySynthesis트랜스파일러 패스. 사용자는 호출할 때 사용할 플러그인을 선택할 수 있습니다transpile()unitary_synthesis_method를 호출할 때 사용할 플러그인을 선택할 수 있습니다. 설치된 플러그인의 전체 목록은qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names()함수에서 확인할 수 있습니다. 예를 들어special_synth라는 이름의 합성 플러그인이 포함된 패키지를 설치한 경우 이 플러그인을 함께 사용할 수 있습니다:from qiskit import transpile transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)이렇게 하면 모든
UnitarySynthesis를special_synth플러그인을 내보내는 외부 패키지에 포함된 메서드로 대체합니다.플러그인 인터페이스는 키스킷 외부의 패키지가 합성 플러그인을 포함한다고 광고할 수 있는 setuptools 진입점을 중심으로 구축되었습니다. 새 플러그인 작성에 대한 자세한 내용은
qiskit.transpiler.passes.synthesis.plugin모듈 문서를 참조하세요. -
새로운 트랜스파일러 패스가 추가되었습니다,
VF2Layout. 이 패스는 레이아웃 할당 문제를 하위 그래프 동형화 문제로 모델링하고 rustworkx의 VF2 알고리즘 구현을 사용하여 완벽한 레이아웃(추가 라우팅이 필요하지 않은 레이아웃)이 존재하는 경우 이를 찾습니다. 이 새로운 패스가 노출하는 기능은 기존 패스와 매우 유사하지만CSPLayout와 매우 유사하지만VF2Layout훨씬 더 빠릅니다.
알려진 문제점
-
"latex"서랍의"ket"규칙은Statevector.draw()는 큐비트로만 구성된 상태에만 유효합니다. 일부 공간이 2보다 큰 상태를 사용하는 경우convention="vector"을 전달하거나 다른 서랍을 사용해야 합니다. -
OpenQASM 3 내보내기 기능은 베타 상태이며, 키스킷 테라의 일부 기능은
QuantumCircuit의 일부 기능은 아직 지원되지 않습니다. 특히, 기존 매개 변수를 사용하여 사용자 지정 서브루틴을 내보내려고 하면 오류가 표시될 수 있으며, 펄스 보정된 연산을 OpenPulse. -
를 실행할 때
BasisTranslator인수를target로 설정하여 단독으로 실행할 때Target객체에서 일부 단일 큐비트 게이트가 겹치지 않는 큐비트 세트에만 적용될 수 있는 경우, 출력 회로가 큐비트에 대해 허용되지 않는 연산을 잘못 포함할 수 있습니다Target. 예를 들어, 달리는 경우from qiskit.circuit import QuantumCircuit, Parameter from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler import PassManager, Target, InstructionProperties from qiskit.transpiler.passes import BasisTranslator gmap = Target() # U gate in qubit 0. theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lambda') u_props = { (0,): InstructionProperties(duration=5.23e-8, error=0.00038115), } gmap.add_instruction(UGate(theta, phi, lam), u_props) # Rz gate in qubit 1. phi = Parameter("phi") rz_props = { (1,): InstructionProperties(duration=0.0, error=0), } gmap.add_instruction(RZGate(phi), rz_props) # X gate in qubit 1. x_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(XGate(), x_props) # SX gate in qubit 1. sx_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(SXGate(), sx_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115), } gmap.add_instruction(CXGate(), cx_props) bt_pass = BasisTranslator(sel, target_basis=None, target=gmap) qc = QuantumCircuit(2) qc.iswap(0, 1) output = bt_pass(qc)output는RZGate와SXGate를 가질 수 있지만, 이는 금지되어 있습니다. 이 문제를 해결하려면 일반적으로 기본 번역기를 두 번째로 실행하면 됩니다(예output = bt_pass(output))를 사용하여 이를 수정할 수 있습니다. 이것은 함수 실행의 출력에 영향을 미치지 않으며transpile()함수를 실행하는 출력에는 영향을 미치지 않으며 패스 자체를 실행하는 경우에만 문제가 됩니다.
업그레이드 주의사항
-
이 버전부터
from qiskit import *은 하위 모듈을 가져오지 않고 선택한 개체 목록만 가져옵니다.from qiskit import *을 사용하여 현재 네임스페이스에 속하지 않는 객체를 참조하는 기존 코드가 손상될 수 있습니다. 참고로import *은 잘못된 관행으로 간주되며 프로덕션 코드에서 사용해서는 안 됩니다. 키스킷은 이러한 나쁜 관행의 영향을 완화하기 위해qiskit/__init__.py에서__all__을 설정합니다. 코드에서name '<something>' is not defined이 발생하면from qiskit import <something>을 추가하고 다시 시도하세요. -
최적화 레벨 0, 1, 2, 3에 대한 사전 설정 패스 관리자는 다음과 같이 생성됩니다
level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()및level_3_pass_manager()에 의해 각각 생성된 프리셋 패스 매니저는 더 이상 무조건TimeUnitConversion. 이전에는 프리셋 패스 관리자가 트랜스파일러와 회로에 대한 입력에 관계없이 항상 이 패스를 실행했습니다. 이제 이 패스는scheduling_method파라미터가 설정되어 있거나 회로에 명령어가 포함된 경우에만 실행됩니다Delay명령어가 포함되어 있고instruction_durations파라미터가 설정된 경우에만 실행됩니다. 이 변경은 런타임 성능을 위해 이루어졌습니다transpile()을 실행하는 경우 지연, 타이밍 또는 스케줄링이 사용되지 않고 게이트 수가 많은 회로에서TimeUnitConversion가 트랜실레이션에서 가장 큰 병목 현상이 될 수 있기 때문입니다. -
BIPMapping의 기본 방법은 이제depth가 아닌balanced입니다. 이 새로운 목표는 일반적으로 회로 깊이와 게이트 오류를 모두 고려하기 때문에 더 나은 결과를 얻을 수 있습니다. -
클래스의
sort_parameters_by_nameVQE클래스는 키스킷 테라 0.18 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 새로운 매개변수 순서가 더 자연스러운 정렬 순서이기 때문에 대안이 제공되지 않습니다. -
회로 서랍
QuantumCircuit.draw()및circuit_drawer()를latex옵션과 함께 사용하면 이제 파일 확장자가 지정된 형식으로 이미지가 저장됩니다(파일 이름이 제공된 경우). 이전에는 항상 PNG 형식으로 저장했습니다. 이제 이미지 형식을 알 수 없는 경우ValueError을 반환합니다. 이는 이미지를 다른 형식으로 더 쉽게 저장할 수 있도록 하기 위한 것입니다. -
핵심 종속성
retworkx의 버전 요구 사항이 0.9 에서 0.10.1 으로 상향 조정되었습니다. 이를 통해 다양한 트랜스필레이션 패스에서 여러 가지 성능 향상이 가능합니다. -
0.15.0 릴리스의 일부로 더 이상 사용되지 않는
conditionkwarg는DAGCircuit.apply_operation_back()와DAGCircuit.apply_operation_front(). 대신 추가되는 인스턴스에condition속성을Instruction인스턴스에 추가되는DAGCircuit를 사용하여Instruction.c_if(). -
DAGCircuit.extend_back()메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 동일한 기능을 제공하는DAGCircuit.compose()메서드를 사용하면 보다 일반적이고 동일한 기능을 제공할 수 있습니다. -
DAGCircuit.compose_back()메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 동일한 기능을 제공하는DAGCircuit.compose()메서드를 사용하면 보다 일반적이고 동일한 기능을 제공할 수 있습니다. -
edge_mapkwarg의DAGCircuit메서드compose()가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 이 방법은 이전에edge_map에서 제공한 사전 매핑을 사용하는 대신qubits및clbitskwarg를 사용하여 작성할 비트의 위치 순서를 지정합니다. -
DAGCircuit.twoQ_gates()메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신DAGCircuit.two_qubit_ops()를 사용해야 합니다. -
DAGCircuit.threeQ_or_more_gates()메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신DAGCircuit.multi_qubit_ops()메서드를 사용해야 합니다. -
클래스의 생성자에 대한 첫 번째 위치 인수에 대한 명명된 액세스
SingleQubitUnitaryu클래스의 생성자 첫 번째 위치 인수에 대한 명명된 액세스가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 대신 첫 번째 위치 인수는unitary_matrix이라는 이름을 사용하여 설정할 수 있습니다(또는 이름 대신 위치로만 설정). -
메서드의 첫 번째 위치 인자에 대한 네임드 액세스
QuantumCircuit메서드squu의 첫 번째 위치 인자에 대한 명명된 액세스가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 대신 첫 번째 위치 인수는unitary_matrix이라는 이름을 사용하여 설정할 수 있습니다(또는 이름 대신 위치로만 설정). -
qiskit.qasm.node모듈의 QASM 노드 클래스의qasm()메서드에 대해 사용되지 않는proc및nested_scopekwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다. -
qiskit.qasm.node모듈의 QASM 노드 클래스의latex()메서드에 대해 사용되지 않는proc및nested_scopekwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다. -
qiskit.qasm.node모듈의 QASM 노드 클래스의real()메서드에 대해 사용되지 않는proc및nested_scopekwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다. -
의 출력은
Statevector.draw()"latex"의 출력은 이제 큐비트로만 구성된 상태를 플로팅하는 경우 새로운"ket"규칙을 따릅니다. 케트 레이블을 표시하고 0이 아닌 요소만 표시하기 때문에 특히 교육적인 맥락에서 출력을 더 명확하게 읽을 수 있도록 변경되었습니다. -
실행 시
execute()와 함께BackendV1백엔드로 실행할 때shots,max_credits,meas_level,meas_return,memory_slot_size의 기본값은 이제 타겟 백엔드의options속성에 설정된 기본값이 됩니다. 이전에는 이러한 기본값이 레거시 백엔드로 호출할 때 기본값과 일치하도록 설정되었습니다execute()BaseBackend를 호출할 때 기본값과 일치하도록 설정되었습니다. 예를 들어,from qiskit.test.mock import FakeMumbai from qiskit import QuantumCircuit, execute circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() backend = FakeMumbai() backend.set_options(shots=4096) execute(qc, backend)이제
4096샷으로 실행됩니다. 이전 릴리스에서는1024로 실행되었지만. -
Matplotlib 의 최소 지원 버전이 2.1.0 에서 3.3.0 로 상향되었습니다. 이제 Matplotlib - 기반 시각화 기능(예:
'mpl'백엔드)을 사용하는 경우 Matplotlib 3.3.0 을 설치해야 합니다circuit_drawer()함수 또는plot_bloch_vector()함수를 사용하는 경우 첫 번째는 Matplotlib 의 최신 버전에서 이전 릴리즈와 호환되던 3D 시각화 관련 API 사용이 중단되었기 때문이고, 두 번째는 matplotlib의 업스트림 종속성으로 인해 테스트 진행을 더욱 어렵게 만드는 호환성 문제로 인해 Matplotlib 의 이전 버전을 설치하는 것이 점점 더 어려워지고 있기 때문입니다. -
의 난수 생성기 내부 사용이 조정되었습니다
random_circuit()의 난수 생성기 내부 사용이 조정되어 시드가 고정되어 있어도 이전 버전과 출력이 변경됩니다. 이는 사용되는 큐비트 수에 따른 런타임 스케일링을 크게 개선하기 위해 수행되었습니다. 이전 버전에서 동일한 출력에 의존하는 경우 이전 버전에서 생성된 임의 회로를 새 릴리스에서 다시 생성하는 대신qpy_serialization.dump()을 사용하여 저장한 다음qpy_serialization.load()을 사용하여 저장된 회로를 로드하는 것이 좋습니다. -
*(__mul__)의 경우dot()메서드의 경우@(__matmul__)compose()메서드(BaseOperator의 모든 연산자 클래스의 부모인qiskit.quantum_info와 같은 클래스 포함)Operator및Pauli)는 더 이상 지원되지 않습니다. 이러한 연산자의 사용은 이전에 0.17.0 릴리스에서 더 이상 사용되지 않았습니다. 대신dot()및compose()메서드를 직접 사용하거나&연산자(__and__)를 사용할 수 있습니다compose(). 예를 들어, 이전에 같은 연산자를 사용했다면:from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a @ op_b로 변경해야 합니다:
from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a.compose(op_b)또는:
new_op = op_a & op_b -
펄스 프로그램 명령어의 피연산자에 파라미터를 할당하는 다양한 방법이 제거되었으며, 키스킷 테라 0.17 에서 더 이상 사용되지 않습니다. 주요 내용은 다음과 같습니다.
pulse.Instruction의assign()메서드입니다.- 의
assign()메서드,Channel의 기반이 되는AcquireChannel,SnapshotChannel,MemorySlot및RegisterSlot. pulse.Gaussian,pulse.GaussianSquare,pulse.Drag,pulse.Constant의 기반이 되는ParametricPulse의assign()및assign_parameters()메서드입니다.
이러한 매개변수는 펄스 프로그램(
pulse.Schedule및pulse.ScheduleBlock)에서 지정해야 하며 펄스 프로그램 명령의 피연산자가 아닙니다. -
pulse.Instruction의flatten()방법과qiskit.pulse.Schedule는 키스킷 테라 0.17 의 사용 중단 공지에 따라 제거되어 더 이상 존재하지 않습니다. 이 변환은qiskit.pulse.transforms.canonicalization.flatten()에서 독립형 함수로 정의됩니다. -
qiskit.pulse.interfaces.ScheduleComponent는 키스킷 테라 0.15 의 사용 중단 공지에 따라 제거되어 더 이상 존재하지 않습니다. 대체 수업은 제공되지 않습니다. -
레거시 펄스 드로어 인수가
pulse.Waveform.draw()에서 제거되었습니다,Schedule.draw()와ScheduleBlock.draw()에서 제거되었으며, 키스킷 테라 0.16 의 사용 중단 공지에 따라 더 이상 존재하지 않습니다. 이제 이러한 그리기 메서드는 V2 펄스 드로어 인수만 지원합니다. 자세한 내용은 메서드 문서를 참조하세요. -
키스킷 테라 0.14 의 사용 중단 공지에 따라
qiskit.pulse.reschedule모듈이 제거되었으며 이 가져오기 경로는 더 이상 존재하지 않습니다. 대신qiskit.pulse.transforms대신 사용하세요. -
키스킷 테라 0.17 의 사용 중단 공지에 따라 보호된 메서드
Schedule._children()가 제거되고 보호된 인스턴스 변수로 대체되었습니다. 이것은 이제 공개 속성으로 제공됩니다Schedule.children. -
타임슬롯 관련 메서드와 프로퍼티가 제거되어 더 이상 존재하지 않습니다
ScheduleBlock키스킷 테라의 사용 중단 공지에 따라 0.17. 이 표현에는 인스트럭션 시간 개념이 없으므로t0, 시간 슬롯 정보는 변환된 후Schedule. 이 변환 이후 해당 속성이 제공되었지만 더 이상 지원되지 않습니다. 다음 속성이 제거됩니다:timeslotsstart_timestop_timech_start_timech_stop_timeshiftinsert
-
정렬 펄스 스케줄 변환은 키스킷 테라의 사용 중단 공지 0.17 에 따라 제거되었으며 더 이상 존재하지 않습니다. 이러한 변환은 일정 블록의
AlignmentKind컨텍스트에서 통합 및 구현됩니다. 다음과 같은 명시적 변환 함수가 제거됩니다:qiskit.pulse.transforms.align_equispacedqiskit.pulse.transforms.align_funcqiskit.pulse.transforms.align_leftqiskit.pulse.transforms.align_rightqiskit.pulse.transforms.align_sequential
-
키스킷 테라의 사용 중단 공지 0.17 에 따라 중복 펄스 빌더 명령이 제거되었으며 더 이상 존재하지 않습니다.
pulse.builder.call_schedule와pulse.builder.call_circuit이pulse.builder.call(). -
모든 키스킷 사용 중단 경고가 표시되게 했던 내부 필터 재정의가 제거되었습니다. 즉, 이제 이 동작은 더 이상 사용되지 않는 표준 Python 동작으로 되돌아가고, 메인 스크립트 파일, 인터프리터 세션 또는 Jupyter 노트북의 코드에 의해 트리거된 경우에만
DeprecationWarning이 표시되어야 합니다. 내부 키스킷 함수가 더 이상 사용되지 않는 동작을 호출하는 경우 사용자에게 경고가 표시되지 않습니다. 라이브러리를 작성하는 경우 기본 경고 필터를 비활성화한 상태로 실행하거나 항상 비활성화한 상태로 실행되는 테스트를 만들어야 합니다. 자세한 내용은 경고에 대한 Python 문서, 특히 사용 중단 테스트 섹션을 참조하세요. -
특정 경고는 여러 곳에서 트리거되더라도 한 번만 발령되곤 했습니다. 이 동작이 제거되었으므로 더 이상 사용되지 않는 함수를 호출할 경우 이전보다 더 많은 경고가 표시될 수 있습니다. 더 이상 사용되지 않는 함수 호출은 향후 키스킷 릴리스에서 제거될 예정이므로 제안된 버전으로 변경해야 합니다.
-
더 이상 사용되지 않는
qiskit.schemas모듈과 스키마에서 jsonschema 유효성 검사기를 빌드하는qiskit.validation모듈이 제거되었습니다. 이 기능은 0.17.0 릴리스에서 더 이상 사용되지 않으며 IBM 퀀텀 API 페이로드 스키마 전용 리포지토리로 대체되었습니다.이전에
qiskit.schemas에 패키징된 스키마 파일 또는 그 위에 구축된 유효성 검사기에 의존하고 있었다면 해당 저장소를 사용하고 그 저장소에 포함된 스키마 파일에서 유효성 검사기를 만들어야 합니다. -
qiskit.qobj.validate_qobj_against_schema및qiskit.qobj.common.validator함수와 메서드의validatekwargQasmQobj.to_dict(),PulseQobj.to_dict()및Qobj.to_dict()함수가 제거되었습니다. 이는 0.17.0 릴리스에서 더 이상 사용되지 않습니다. 이러한 함수를 사용하는 경우 IBM Quantum API 페이로드 스키마 전용 리포지토리의 jsonschema 파일을 사용하여Qobj개체에 대한 jsonschema 유효성 검사 함수를 수동으로 빌드해야 합니다. -
fastjsonschema및jsonschema패키지는 더 이상 qiskit-terra의 요구 사항 목록에 없습니다. Jsonschema의 내부 사용이 제거되었으며 더 이상 qiskit-terra를 사용할 필요가 없습니다. -
함수에서 발생하는 예외는
assemble()함수에 잘못된 매개변수가 전달되었을 때 발생하는 예외가PulseQobj가SchemaValidationError에서QiskitError. 이는SchemaValidationError클래스가 더 이상 사용되지 않는 나머지qiskit.schemas및qiskit.validation과 함께 제거되었기 때문에 필요했습니다. 이것은 또한 이미 오류를 발생시키고 있는assemble()에서 이미 발생했던QiskitError. -
트랜스파일러 최적화 레벨 3의 기본 라우팅 패스 및 레이아웃 패스가 사용하도록 변경되었습니다
SabreSwap와SabreLayout로 각각 변경되었습니다. 이는 세이버 패스를 사용하는 것이StochasticSwap와DenseLayout를 기본값으로 사용하는 것보다 더 나은 결과를 얻을 수 있기 때문입니다. 이 변경 사항은 실행 시 결과의 품질을 개선합니다transpile()또는execute()optimization_level함수를3으로 설정하여 실행할 때 결과의 품질이 향상됩니다. 일반적으로 개선되었지만 어떤 이유로든 이전 동작을 유지해야 하는 경우routing_method="stochastic"및layout_method="dense"을 호출할 때 명시적으로 설정하면 됩니다transpile()를optimization_level=3로 대체할 수 있습니다. -
의 반환 유형이
pauli_basis()의 반환 유형이PauliTable에서PauliList로 변경될 예정입니다. 새 동작으로 즉시 전환하려면 키워드 인수pauli_list=True를 전달합니다. -
속성의
name속성이SingleQubitUnitary게이트 클래스의 속성이unitary에서squ로 변경되었습니다. 이는 두 게이트가 동일하지 않고 구현이 동일하지 않기 때문에(그리고 서로 바꿔서 사용할 수 없기 때문에)UnitaryGate클래스 이름(unitary)과 충돌을 피하기 위해 필요했습니다. -
설치에 필요한 Symengine의 최소 버전이 0.8.0 으로 증가했습니다. 이는 실행 시
numpy.float16및numpy.float32값 처리와 관련된 일부 문제를 수정하기 위해 필요했습니다bind()에 매개변수를 바인딩하기 위해ParameterExpression. -
새로운 종속성 하역기가 요구 사항 목록에 추가되었습니다. 이것은 단일 합성 플러그인 인터페이스를 빌드하는 데 사용되므로 qiskit-terra에 필요합니다.
지원 중단 노트
-
gate속성 및 초기화 매개변수인qiskit.transpiler.passes.Decompose는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 단일 게이트 대신 새 매개변수gates_to_decompose에 게이트 이름 목록을 전달해야 합니다. 새로운 양식에서는 분해 대상으로 둘 이상의 게이트를 선택할 수 있어 더 유연하고 게이트 집합을 분해하기 위해 패스를 여러 번 다시 실행할 필요가 없기 때문에 이러한 작업을 수행했습니다. -
보정과 관련하여 트랜스파일러 패스가 크게 개편되었습니다. 가져오기 경로입니다:
from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEcho는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 가져오기 경로입니다:
from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templates도 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 새 가져오기 경로를 사용해야 합니다:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates -
클래스는
DAGNode클래스는 독립형 클래스로서 더 이상 사용되지 않으며 앞으로는 부모 클래스인DAGOpNode,DAGInNode및DAGOutNode. 이 사용 중단의 일부로, 다음 kwarg 및 관련 어트리뷰트도 사용 중단됩니다DAGNode도 더 이상 사용되지 않습니다:type,op, 및wire입니다. -
의 생성자에서
RZXCalibrationBuilder의 생성자에서 백엔드를 첫 번째 위치 인자로 전달하거나backendkwarg라는 이름으로 전달하는 것은 더 이상 사용되지 않으며 향후 릴리스에서 더 이상 작동하지 않습니다. 대신 aInstructionScheduleMap는instruction_schedule_mapkwarg에 직접 전달해야 하며, 각 큐비트에 대한 채널 이름 목록은qubit_channel_mapping에 직접 전달해야 합니다. 예를 들어 패스를 다음과 같이 호출하는 경우입니다:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() cal_pass = RZXCalibrationBuilder(backend)대신 다음과 같이 호출해야 합니다:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = self.backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )이 변경은 일반적으로 백엔드 객체는 피클 직렬화가 불가능하고 여러 회로를 한 번에 컴파일할 때 내부의 여러 프로세스와 함께 사용하면
transpile()내부의 여러 프로세스와 함께 사용할 때 깨질 수 있기 때문입니다. -
클래스의
label속성MCMT및 하위 클래스MCMTVChain는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 두 클래스의 생성자에 있는labelkwarg도 메서드의labelkwarg와 함께 더 이상 사용되지 않습니다MCMT.control(). 현재label속성은 둘 이상의 타겟 큐비트로 구성된 경우 제어 대상의 이름을 지정하는 데 사용되지만, 이는 사용자가 지정할 수 있는 것이 아니며 잘 알려진 연산 이름을 사용할 경우 잘못된 MCMT 게이트가 발생할 수 있습니다. 사용 중단 후에는label속성을 더 이상 사용자가 지정할 수 없습니다. 그러나 다음을 통해 제어 대상의 생성된 이름을 얻을 수 있습니다MCMT.data[0][0].base_gate.name -
클래스의
subgraph()메서드는CouplingMap클래스의 메서드는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신reduce()메서드를 사용해야 하는데, 출력의 노드 목록 순서를 유지한다는 점을 제외하면 동일한 작업을 수행합니다CouplingMap(subgraph()은 목록 순서를 유지하지 않음). -
의 인스턴스 생성
InstructionSetcircuit_cregs키워드 인수를 사용하여 인스턴스를 생성하는 것은 더 이상 사용되지 않습니다. 일반적으로 이러한 클래스는 사용자가 직접 생성할 필요는 없지만(내부적으로 사용됨), 필요한 경우resource_requester키워드 인자로 호출 가능을 전달해야 합니다. 예를 들어,from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers)) -
qiskit-ignis에서 측정 완화 클래스qiskit.ignis.mitigation.CompleteMeasFitter및qiskit.ignis.mitigation.TensoredMeasFitter을 생성자의measurement_error_mitigation_clskwarg 값으로 사용하는 것은 더 이상 사용되지 않습니다QuantumInstance클래스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신qiskit.utils.mitigation,CompleteMeasFitter및TensoredMeasFitter를 사용해야 합니다.qiskit-ignis프로젝트는 현재 사용되지 않으며 가까운 시일 내에 더 이상 지원되지 않을 예정이므로 이러한 조치가 필요했습니다.qiskit-ignis의 동급 클래스와 달리 다음 버전의qiskit.utils.mitigation의 버전은 함께 사용할 때만 지원되며QuantumInstance(즉,measurement_error_mitigation_clskwarg를 사용하는 인스턴스가 아닌 클래스로서)와 함께 사용할 때만 지원되며 독립적으로 사용하기 위한 것이 아닙니다. -
Optimizer.optimize()모든 옵티마이저(Optimizer및 파생 클래스)는 이제 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신Optimizer.minimize()메서드를 사용하여 SciPy’sminimize()함수의 서명을 모방해야 합니다.현재 최적화 호출을 최소화 호출로 바꾸려면 다음을 수행하면 됩니다
xopt, fopt, nfev = optimizer.optimize( num_vars, objective_function, gradient_function, variable_bounds, initial_point, )다음 항목으로 바꾸십시오.
result = optimizer.minimize( fun=objective_function, x0=initial_point, jac=gradient_function, bounds=variable_bounds, ) xopt, fopt, nfev = result.x, result.fun, result.nfev -
qiskit.util모듈을 가져오면 이제DeprecationWarning. 대신 사용자는 다음에서 동일한 기능을 모두 가져와야 합니다qiskit.utils.util모듈은 Terra 0.17 이후 더 이상 사용되지 않지만 이전에는 경고를 표시하지 않았습니다. 테라 0.20 에서 삭제됩니다. -
table속성은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 그 이유는SparsePauliOp가 내부적으로PauliTable대신PauliList을 사용하도록 업데이트되었기 때문입니다. 이는 성능을 크게 개선하기 위한 것입니다. 이제 다음을 사용하여PauliList데이터에 액세스해야 합니다SparsePauliOp.paulis속성을 사용하여 데이터에 액세스해야 합니다.
버그 수정
-
많은 레이아웃 메서드가 3개 이상의 큐비트 게이트를 무시하여 예기치 않은 레이아웃 할당 결정을 내리던 버그가 수정되었습니다. 트랜스파일러 패스
Unroll3qOrMore가 호출될 때 모든 사전 설정 패스 관리자에서 레이아웃 패스보다 먼저 실행됩니다transpile()가 호출될 때 실행됩니다. 수정 #7156. -
이제 분해된 회로는 조립된 회로의 캘리브레이션을 상속받습니다
QasmQobj및 실험을 상속합니다. 5348 수정. -
인스턴스의
ansatz또는optimizer속성을VQE속성을None로 설정하면 버그가 발생하는 문제를 수정했습니다. 자세한 내용은 #7093을 참조하세요. -
의 추가를 수정했습니다
PauliList를qargs로 수정했습니다. 피연산자의 큐비트 수가 다른 경우 런타임 오류를 발생시키는 데 사용되는 메서드입니다. -
지원되지 않는 게이트의 클래스로 그라데이션을 계산하려고 할 때 오류가 발생하는 문제를 수정했습니다
CircuitGradient클래스로 그라데이션을 계산하려고 할 때 오류가 발생하는 문제를 수정했습니다. 이 버그 수정은 주어진 게이트를 요청된 그라데이션 메서드에 대해 지원되는 게이트 집합으로 트랜스파일합니다. 6918 수정. -
오류 완화 사용 시 보정 결과 제거
execute()메서드에서QuantumInstance. 수정 #7129. -
실행 시 더 이상 사용되지 않는 경고가 표시되는 문제를 수정했습니다
QuantumCircuit.draw()또는circuit_drawer()sympy 1.9 가 설치된 상태에서 Sympy 함수expr_free_symbols()를 언급할 때 표시되는 사용 중단 경고를 수정했습니다. 회로 서랍은 이전에 기호 상수의 인스턴스를 찾을 때 이 방법을 사용했습니다. -
mpl회로 서랍에 대한axkwarg 및stylekwarg의figwidth옵션이 제대로 확장되지 않던 문제를 수정했습니다. 이제 사용자는 Matplotlib 하위 플롯에서mpl회로 드로어에ax를 전달하면 해당 하위 플롯의 경계 내에 회로가 그려집니다. 또는styledict kwarg에서figwidth(인치)를 설정하면 도면이 설정한 너비(인치)로 조정됩니다. 수정 #6367. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및draw()메서드의QuantumCircuit.latex서랍 옵션을 사용하여 레지스터 대신 클래식 비트를 대상으로 하는measure명령어를 표시할 때 서랍이 실패합니다. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및draw()메서드의QuantumCircuit.mpl,latex,text의 세 가지 서랍 옵션 중 하나에서 레지스터가 없는 클래식 비트에 조건이 지정된 클래식 조건의 게이트가 발생하면 서랍이 실패합니다. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및draw()메서드의QuantumCircuit.mpl,latex,text의 3가지 서랍 옵션 중 하나에서 클래식 조건이 있는 게이트가measure와 동일한 클래식 비트에 조건이 있고 측정값이 목표로 하는 비트에 레지스터가 없는 경우 서랍은 실패합니다. -
C3SXGate이제 올바른 분해 및 행렬 표현이 가능합니다. 이전에는 의도한SXGate().control(3)이 아닌SdgXGate().control(3)과 동일했습니다. -
qiskit.test.mock.utils.ConfigurableFakeBackend의 회원name이backend_name로 변경되었습니다. 이것은 부모 추상으로부터 상속된name()메서드와의 충돌을 피하기 위한 것입니다BackendV1클래스에서 상속된 메서드와의 충돌을 피하기 위해서입니다. 이렇게 하면ConfigurableFakeBackend이 예상되는 모든 것과 호환됩니다BackendV1객체를 기대하는 모든 것과 호환됩니다. 그러나 이전에name속성을 직접 사용했다면 이제 메서드로 호출하거나backend_name속성에 액세스해야 합니다. -
회로를 포함하는 회로에서
QuantumCircuit.decompose()를 포함하는 회로에서Instruction누구definition속성이 비어 있는 회로를 호출하면 명령어가 0 연산으로 분해되지 않고 그대로 유지되는 문제를 수정했습니다. 예를 들어 회로가 있습니다:from qiskit.circuit import QuantumCircuit empty = QuantumCircuit(1, name="decompose me!") circuit = QuantumCircuit(1) circuit.append(empty.to_gate(), [0])이전에는
circuit.decompose()으로 전화해도 회로가 변경되지 않았습니다. 이제 분해는empty을 0개의 인스트럭션으로 올바르게 분해합니다. 자세한 내용은 #6997을 참조하세요. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및draw()메서드의QuantumCircuit.mpl또는latex옵션을 사용하여 기존condition이 포함된measure인스트럭션을 표시하는 경우,condition정보가measure표시를 덮어쓰는 경우가 있습니다. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및draw()메서드의QuantumCircuit.mpl서랍은 16진수 표기법을 사용하여condition값을 표시하는 반면,text및latex서랍은 10진수 표기법을 사용했습니다. 이제 세 서랍 모두 16진법 표기법을 사용합니다. -
호어 옵티마이저 트랜스필레이션 패스에서 게이트를 이전 및 후속 게이트와 개별적으로 결합하여 아이덴티티를 형성할 수 있는 경우 게이트를 두 번 제거하려고 시도할 수 있던 버그를 수정했습니다. 자세한 내용은 #7271을 참조하세요.
-
표준 메서드를 사용하여 명령어를 조건부로 만들기
InstructionSet.c_if()메서드를 사용하여 명령어를 조건부로 만드는 것은 이제 명령어의 일부인QuantumCircuit에서 사용하는 번호 체계와 일치합니다. 이전에는 겹치는 두 개의ClassicalRegister가 겹치는 경우Clbit가 겹치면 번호 매기기가 잘못되었습니다. 자세한 내용은 #7246을 참조하세요. -
표준 메서드를 사용하여 명령어를 조건부로 만들면
InstructionSet.c_if()메서드를 사용하여 명령어를 조건부로 만들면 이제 회로에ClassicalRegister가 없어도 성공합니다. 자세한 내용은 #7250을 참조하세요. -
표준 메서드를 사용하여 조건부 명령어 만들기
InstructionSet.c_if()메서드를 사용할 때Clbit에 포함된ClassicalRegister를 사용하면 이제 레지스터가 아닌 비트에 조건이 올바르게 생성됩니다. 자세한 내용은 #7255를 참조하세요. -
표준 메서드를 사용하여 조건부 명령어를 만들려고 하면
InstructionSet.c_if()메서드를 사용하여 명령어를 조건부로 만들려고 하면 이제 회로에 클래식 리소스가 없는 경우 오류가 올바르게 발생합니다. 자세한 내용은 #7255를 참조하세요. -
블로흐 구체에 벡터가 첨부된 경우 렌더링에 실패하는 Matplotlib 3.5 과의 호환성 문제를 수정했습니다
plot_bloch_vector. 자세한 내용은 #7272를 참조하세요. -
레이어를 추가할 때
NLocal.add_layer()메서드가 레이어를 잘못 추가하는 문제를 수정했습니다NLocal객체가 이미 빌드된 경우 메서드가 레이어를 잘못 추가하는 문제를 수정했습니다. -
피클링 관련 문제 수정
InstructionScheduleMapPython 객체를 사용할 때 발생하는 문제를 수정했습니다 3.6. 자세한 내용은 #6944를 참조하세요. -
심엔진에서 복잡한 값의 펄스 매개변수 할당이 수정되었습니다. 예를 들면 다음과 같습니다.
from qiskit import circuit, pulse import numpy as np amp = circuit.Parameter("amp") phase = circuit.Parameter("phase") with pulse.build() as sched: pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0)) sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)0.18.0 릴리스에서
symengine사용이 도입된 후 할당된 진폭은ParameterExpression(0.1*exp(1.57*I))으로 표시되었습니다. 이제 올바르게 평가되어7.96327e-05 + 0.0999999683j로 표시됩니다. -
다른 연산자가
QAOA.construct_circuit()를 사용하면 동일한 수의 큐비트를 가진 다른 연산자가 매번 동일한 회로를 생성하는 문제를 수정했습니다. 자세한 내용은 #7223을 참조하세요. -
다음 문제를 수정했습니다
QAOAAnsatz의 ID가PauliSumOp.from_list([("III", 1)])과 같이PauliSumOp인 경우 매개변수 수가 올바르지 않은 문제를 수정했습니다. 자세한 내용은 #7225를 참조하세요. -
메서드가
QuantumCircuit.qasm()메서드가 잘못된 식별자가 포함된 OpenQASM 2 인스트럭션을 반환할 수 있는 버그를 수정했습니다.UnitaryGate에서도 동일한 버그가 수정되었습니다. -
레지스터리스 비트를 표시하려고 하면
mpl및latex회로 서랍에 오류가 발생하던 문제를 수정했습니다.text서랍의 등록되지 않은 비트 번호 표시에서_선행이 제거되었습니다. 수정 #6732. -
1비트 레지스터의 경우, 이제 모든 회로 서랍에 레지스터 이름만 표시되고
0첨자가 더 이상 표시되지 않습니다. 수정 #5784. -
암시적 레지스터의 명명 충돌을 수정했습니다
QuantumCircuit.qasm에서 레지스터리스 큐비트와 클럭비트를 처리할 때 암시적 레지스터의 이름 충돌을 수정했습니다. 이전에는 레지스터리스 큐비트와 클럭 비트가 충돌에도 불구하고qreg와creg에 모두regless라고 불렀습니다. 이제 회로의 사용자 정의 레지스터 이름과 충돌하지 않는 별도의 결정론적으로 생성된 이름을 갖게 됩니다. -
측정, 조건부 게이트, 업데이트와 같은 클럭 비트 연산이 있는 회로의 스케줄링 문제를 수정했습니다
ASAPSchedule,ALAPSchedule및AlignMeasures. 업데이트된 스케줄러는 모든 clbit I/O 작업에 시간이 걸리지 않는다고 가정하고,measure은 마지막에 측정값을 clbit에 쓰고,c_if은 처음에 조건부 값을 clbit에서 읽습니다. 수정 #7006. -
근사화할 함수가 상수일 때
PiecewiseChebyshev에서 근사화할 함수가 상수일 때 발생하는 문제를 수정했습니다. 이러한 경우 이제 다음과 같은 함수를 사용하는 대신 상수를f_x인수로 직접 전달해야 합니다:from qiskit.circuit.library.arithmetic import PiecewiseChebyshev PiecewiseChebyshev(1.0, degree=3)자세한 내용은 #6707을 참조하세요.
-
HHL알고리즘 인스턴스가 기본값인QuantumInstance(기본값)없이 인스턴스가 구성되면 나중에 인스턴스를 읽거나 설정하기 위해 게터 및 세터 속성을 사용하려고 시도하면 실패합니다. 이제 게터와 세터가 예상대로 작동합니다. -
메서드는 이제
QuantumCircuit.qasm()메서드는 이제circuit.data에 있는 원본 명령어가 아니라 회로에 있는 명령어 사본의 이름을 편집합니다. 자세한 내용은 #6952를 참조하세요. -
버그를 수정했습니다
PauliSumOp.permute()의 버그를 수정했습니다:QiskitError: 'Pauli string label "" is not valid.'순열에 같은 수의 폴리 항이 있는 경우.
X ^ Y ^ Z에서permute([2, 1, 0])을 호출하면 더 이상 오류가 발생하지 않고 이제Z ^ Y ^ X이 반환됩니다. -
에서 믹서 매개변수의 매개변수 범위가
QAOAAnsatz의 믹서 매개변수 바운드가 설정되지 않던 버그를 수정했습니다. -
통과 시 최종 작업(장벽 및 조치)의 결정이 수정되었습니다
RemoveFinalMeasurements와 메서드remove_final_measurements()클래스의QuantumCircuit의 메서드에서 출력 노드 바로 앞의 노드만 고려하던 것을 수정했습니다. -
패스에서 최종 연산 결정이 수정되었습니다
RemoveFinalMeasurements와 메서드의remove_final_measurements()클래스의QuantumCircuit에서 다른 회로 연산이 뒤따라오더라도 장벽을 최종 연산으로 잘못 간주할 수 있는 문제를 수정했습니다. -
패스에서 멀티비트 클래식 레지스터 제거 수정
RemoveFinalMeasurements와 메서드remove_final_measurements()클래스의QuantumCircuit에서 다른 비트가 유휴 상태인 경우에도 모든 비트에 대한 최종 측정이 이루어지지 않는 한 클래식 레지스터가 제거되지 않도록 수정했습니다. 이제 최종 측정값과 장벽을 제거한 결과 유휴 상태가 되는 기존 레지스터는 항상 제거됩니다. 클래식 비트는 제거된 레지스터에 의해서만 참조되거나 전혀 참조되지 않고 제거로 인해 유휴 상태가 된 경우 제거됩니다. 이 수정은 또한 기본 비트가 공유되는 레지스터의 적절한 처리를 추가합니다. -
관련 문제를 수정했습니다
RemoveFinalMeasurements의 문제를 수정했습니다DAGCircuit가 유효하지 않게 되는 문제를 수정했습니다. 자세한 내용은 #7196을 참조하세요. -
메서드 관련 문제 수정
remove_final_measurements()클래스의 메서드QuantumCircuit메서드 관련 문제를 수정했습니다QuantumCircuit.clbits가 올바르지 않게 호출되던 문제를 수정했습니다. 자세한 내용은 #7089를 참조하세요. -
에서 빈 0 연산자를 테이퍼링할 때
qiskit.opflow에서 0 연산자를 줄이면 코드가 0임을 감지하여 경고를 기록하고 원래 연산자를 반환합니다. 이러한 연산자는 키스킷 네이처를 사용할 때 보조 연산자에서 흔히 볼 수 있으며, 위의 동작은 테이퍼링된 0이 아닌 연산자가 테이퍼링된 0 연산자와 다른 수의 큐비트이기 때문에VQE예외를 발생시켰습니다(테이퍼링이 입력 연산자를 변경하지 않고 반환했기 때문에). 이제 코드가 0 연산자를 올바르게 테이퍼링하여 큐비트 수가 예상대로 줄어들고 테이퍼링된 0이 아닌 연산자와 일치하도록 합니다(예: 3큐비트로 테이퍼링하는 경우`0*"IIII"`은0*"I"이 됩니다). -
메서드 관련 문제를 수정했습니다
draw()메서드 및circuit_drawer()함수에서 사용자 설정 파일(예:settings.conf)을 통해 사용자 정의 스타일을 설정하는 문제를 수정했습니다 는 함수/메서드의stylekwarg가 설정되지 않은 경우circuit_mpl_style필드의 설정 값을 무시합니다.
기타 참고사항
-
에 대해 캐스팅된 문자열
qiskit.circuit.ParameterExpression에 캐스팅된 문자열은 더 이상 완전한 정밀도를 갖지 않습니다. 이렇게 하면 플로트에 바인딩된 매개변수를 인쇄할 때 0s 후행이 제거됩니다. 이는 QASM 직렬화 및 회로 텍스트 서랍에 영향을 미칩니다:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> str(x.bind({x:0.5})) '0.5' # instead of '0.500000000000000' -
의
QAOAAnsatz는 QAOA 문헌의 표준 표기법과 같이 비용 연산자에는γ, 믹서 연산자에는β매개변수 기호를 사용하도록 업데이트되었습니다.
에어 0.9.1
변경 없음
이그니스 0.7.0
Prelude
이 릴리스에서는 키스킷 이그니스 프로젝트가 더 이상 사용되지 않으며, 키스킷 실험 프로젝트가 이를 대체하여 활발한 개발이 중단되었습니다. 더 이상 사용되지 않지만 중요한 버그 수정 및 호환성 수정은 계속 진행되어 사용자에게 Ignis에서 마이그레이션할 수 있는 충분한 기회를 제공할 것입니다. 사용 중단 기간(이번 릴리스부터 3개월 이내)이 지나면 프로젝트는 폐기되어 보관됩니다.
새 기능
-
에서 피팅 루틴을 사용하도록 인증 프로토콜을 업데이트했습니다 https://arxiv.org/abs/2103.06603.
AccreditationFitter이제 FullAccreditation (이전 프로토콜) 및 MeanAccreditation (새 프로토콜) 메서드를 사용할 수 있습니다. 또한 데이터 입력이 결과 객체 AppendResult 또는 문자열 목록 AppendStrings 을 사용하도록 변경되었습니다.qiskit.ignis.verification.QOTPCorrectString()도 추가되었습니다. -
증후군 그래프를 빠르게 분석할 수 있는 옵션이 추가되었습니다.
RepetitionCode에는 이제 무차별 대입 방식을 계속 사용할 수 있는 새로운 부울 인수brute가 추가되었습니다. 이를 용이하게 하기 위해 도우미 클래스RepetitionCodeSyndromeGenerator를 추가했습니다. -
RepetitionCode에는 이제 키워드 인수resets과delay가 있습니다. 전자는 측정 후 리셋 게이트 삽입 여부를 결정합니다. 후자를 사용하면 각 측정 후 지연(해당되는 경우 재설정)을 위해 시간(dt)을 지정할 수 있습니다.RepetitionCode의syndrome_measurement()메서드에 이제 키워드 인수final와delay가 추가되었습니다. 전자는 글로벌resets에 따라 리셋 게이트를 추가할지, 아니면 최종 증후군 측정에 적합한 동작으로 덮어쓸지 결정합니다. 후자를 사용하면 각 측정 후 지연(해당되는 경우 재설정)을 위해 시간(dt)을 지정할 수 있습니다. -
RepetitionCode클래스는 이제 x 기준 상태를 사용한 인코딩을 지원합니다.RepetitionCode객체를 생성할 때xbasis키워드 인수를 설정하여 사용할 수 있습니다.
업그레이드 주의사항
-
RepetitionCode의syndrome_measurement()메서드에서 키워드 인수reset가 제거되었습니다. 이것은 클래스에 대한 글로벌resets키워드 인수와syndrome_measurement에 대한 키워드 인수final로 대체됩니다. 이전에는 최종 리셋 게이트를 피하기 위해reset=False을 사용하여 최종 측정 라운드를 추가했다면, 이제final=True을 사용해야 합니다. -
update_u_gates()에서ParametrizedSchedule을 제거합니다.ParametrizedSchedule는 키스킷-테라 0.17.0 의 일부로 더 이상 사용되지 않으며 다음 릴리스에서 제거될 예정입니다. 이 함수는 이제 할당되지 않은Parameter객체를 포함하는Schedule프로그램으로 u 게이트를 업데이트합니다.
지원 중단 노트
-
AccreditationFitter의 메서드, 즉 bound_variation_distance 및 single_proocol_run을 더 이상 사용하지 않습니다 -
키스킷 이그니스 프로젝트는 전체적으로 더 이상 사용되지 않으며 향후 프로젝트가 폐기되고 보관될 예정입니다. 더 이상 사용되지 않는 동안에는 프로젝트에 호환성 수정과 중요한 버그 수정만 이루어집니다. 키스킷 이그니스를 사용하는 대신 키스킷 실험을 사용하도록 마이그레이션해야 합니다. 마이그레이션 가이드를 참조하세요:
https://github.com/qiskit-community/qiskit-ignis#migration-guide