키스킷 SDK 1.3 릴리즈 노트
1.3.3
Prelude
키스킷 1.3.3 은 1.3 시리즈의 사소한 버그 수정 릴리스입니다.
버그 수정
-
메서드에서
reverse_bits = True매개변수를 사용할 때 배리어 레이블이 잘못 배치되던 버그가 수정되었습니다QuantumCircuit.draw()메서드에서 이 버그로 인해 배리어 작업의 레이블이 잘못 정렬되어 회로 시각화에 혼란을 초래할 수 있었습니다. 수정 #13609. -
슈퍼 연산자 표현에서 조건이 맞지 않는 헤르미트 행렬에 대해 작은 정규화 계수를 적용했습니다.
-
회로 내 명령어를 포함한
Delay명령어를 비교하려면 이제 단위와 지속 시간 값이 모두 같아야 합니다. 13812 수정. -
의 버그를 수정했습니다
CommutationChecker에서 2큐비트 폴리 회전의 정류 관계를 정류 캐시에 없는 게이트로 확인할 때 실패할 수 있는 버그를 수정했습니다. 예를 들어,import numpy as np from qiskit.circuit.library import RXXGate, RGate from qiskit.circuit.commutation_library import SessionCommutationChecker as scc res = scc.commute(RGate(2, 2), [1], [], RXXGate(np.pi / 2), [0, 1], [])이제 이 동작이 해결되어 정류 관계가 올바르게 계산됩니다. 수정 #13742.
-
버그가 수정되었습니다
QuantumCircuit.qubit_stop_time()및QuantumCircuit.qubit_duration()가 잘못된 시간(기간)을 반환하는 버그를 수정했습니다. 이 문제는 일부 큐비트에는 명령이 있지만 다른 큐비트는 유휴 상태일 때 트리거되었습니다. 8729 수정. -
트랜스파일러 패스의 버그를 수정했습니다
RemoveIdentityEquivalent트랜스파일러 패스에서 글로벌 위상까지 아이덴티티에 가까운 게이트가 회로에서 제거되었지만 회로의 글로벌 위상은 업데이트되지 않는 버그가 수정되었습니다. 특히RemoveIdentityEquivalent이제 매개변수화되지 않은GlobalPhaseGate게이트를 제거합니다. 수정 #13778. -
의 버그를 수정했습니다
random_clifford()에서 전체 클리포드 그룹을 샘플링하지 못하게 하는 버그를 수정했습니다. 수정 #13606. -
언제
SabreLayout를 사용하여 레이아웃과 라우팅을 동시에 수행할 때 (기본 옵션의 경우와 마찬가지로transpile()및generate_preset_pass_manager())의 경우처럼Target또는CouplingMap에 연결이 분리되어 있고 입력 회로가 커플링 맵의 단일 구성 요소에 맞는 경우 라우팅 순열이 올바르게 추적됩니다.이전에는 커플링 맵에서 라우팅된 회로에서 사용하는 큐비트에 간접적으로라도 연결되지 않은 큐비트는 최종 라우팅 순열에 포함되지 않았습니다. 이로 인해 컴파일이 성공한 것처럼 보이더라도 실패 지점에서 멀리 떨어진 곳에서 다음과 같은 놀라운 동작이 발생할 수 있습니다
TranspileLayout.final_index_layout()raisingKeyError.이 버그는 대부분의 경우처럼 완전히 연결된 백엔드에는 영향을 미치지 않았습니다. 13732 수정.
1.3.2
Prelude
키스킷 1.3.2 은 1.3 시리즈의 사소한 버그 수정 릴리스입니다.
합성 업그레이드 노트
- 하이레벨 합성 플러그인에서
LinearFunction의 하이레벨 합성 플러그인은 더 이상 메서드에LinearFunction이외의 객체가run메서드에 전달될 때 더 이상 오류가 발생하지 않습니다. 대신 이제 다른 플러그인과 일관된None을 반환합니다. 이 오류가 발생하면 수동으로 인스턴스 검사를 수행할 수 있습니다.
버그 수정
-
이전에는
CommutationChecker의 정류 관계를 열심히 캐싱하여Instruction를 플로트 전용params을 키로 사용하여 관계를 쿼리했습니다. 명령어의 정의가 단지 속성 이외의 추가 정보에 의존하는 경우 잘못된 결과가 발생할 수 있습니다params어트리뷰트 이외의 추가 정보에 의존하는 경우, 예를 들어PauliEvolutionGate. 이 동작은 이제 수정되었으며, 커뮤테이션 검사기는 키스킷 네이티브 표준 게이트에 대해서만 커뮤테이션을 열심히 캐시합니다. 사용자 지정 게이트의 경우 이러한 변경으로 인해 성능 비용이 발생할 수 있지만 안전하지 않은 캐싱을 방지하여 올바른 결과를 보장합니다. -
의 버그를 수정했습니다
CommutationChecker에서 숫자가 아닌 값을 가진 명령어의 정류 관계를 확인하는 버그가 수정되었습니다params속성의 경우처럼(PauliGate)에서 오류가 발생할 수 있는 버그를 수정했습니다. 수정 #13570. -
의
CommutationChecker의 정류가 올바르게 처리되지 않았습니다CRXGate,CRYGate및CRZGate형식의 회전 각도에 대해 , 을 사용했습니다. 이러한 경우 이러한 게이트는 모든 게이트와 정류하는 것으로 잘못 가정되었습니다. 이제 이 동작이 수정되어 회전 각도가 의 배수인 경우에만 모든 게이트와 올바르게 커뮤트됩니다. -
다음 회로 라이브러리 함수가
num_qubits=1로 호출될 때 오류가 발생하던 버그를 수정했습니다:efficient_su2(),real_amplitudes(),excitation_preserving()및pauli_two_design()(단일 큐비트의 경우, 이 회로에는 2큐비트 게이트가 포함되지 않습니다). 13480 수정. -
"mcmt"라는 이름의 명령어가 하이레벨 합성 루틴에 잘못 전달되어 오류가 발생하던 버그를 수정했습니다MCMTGate에 대한 하이레벨 합성 루틴에 잘못 전달되어 실패 또는 잘못된 결과를 초래하는 버그를 수정했습니다. 이 문제는 예를 들어"mcmt"이라는MCMT회로 을 처리하고 이를 암시적으로 명령으로 변환할 때(예: 다른 회로에 추가할 때) 발생할 수 있습니다. 13563 수정. -
에 대한 기본 제품 공식 합성에서
PauliEvolutionGate연산자의 모든 신원 용어를 올바르게 처리하지 못하는 버그를 수정했습니다. 모든 신원 용어는-evolution_time와 같은 전역 위상을 도입해야 하지만 2배 차이가 나며 매개변수화된 시간 동안 중단될 수 있습니다. 수정 #13625. 수정 #13675. 수정 #13644. -
폴리 진화 합성에 의해 생성된 회로의 불일치를 수정했습니다
SuzukiTrotter또는LieTrotter(기본값) 메서드를 사용하여 생성된 회로의 일관성을 수정했습니다. 파라미터화된 진화 시간의 경우, 결과 회로에는 스퓨리어스 제로 복소수 부분이 있는 파라미터가 포함되어 있어 출력에 영향을 주는ParameterExpression.sympify(). 이제 출력에 실제 값만 올바르게 포함됩니다. 수정 #13642. -
원래 객체의 길이가 1일 때
PauliList.insert()를qubit=True로 대체하여 원래 객체의 길이가 1일 때 잘못된 모양의 위상 속성을 생성하는 버그를 수정했습니다. 수정 #13623. -
의 버그를 수정했습니다
qasm3.Exporter의 버그를 수정하여 단일 게이트 처리 시params필드의 잘못된 처리로 인해 내보내기가 충돌하는 문제를 해결했습니다. 수정 #13362. -
메서드의 버그를 수정했습니다
Target.instruction_supported()메서드에서self.num_qubits==None가 있는 대상이 지원되는 기준 집합과 관계없이 항상False을 반환하는 버그가 수정되었습니다. -
트랜스파일러 패스의 버그를 수정했습니다
UnitarySynthesis트랜스파일러 패스의 버그를 수정했습니다UnitaryGate블록이 올바르게 합성되지 않던 버그를 수정했습니다. 예를 들어, 마지막으로 처리된 블록으로 회로를 덮어쓰거나 그러한 블록 이후의 측정값이 발생할 때 내부 패닉이 발생했습니다. 수정 #13586. -
트랜스파일러 패스의 버그를 수정했습니다
UnitarySynthesis트랜스파일러 패스에서 non-2-qubit 게이트가 사용 가능한 2 큐비트 기준에 포함되어TwoQubitWeylDecomposition가 차원 불일치로 인해 패닉에 빠지는 버그를 수정했습니다. -
초기화할 때
SparsePauliOpY(일반적으로 )을 명시적으로 사용하지 않고coeffs을 사용하면 1에 가까운 계수가 생성되지만 부동 소수점 오류가 발생하는 버그가 수정되었습니다. 이제 계수는 기본적으로 1로 올바르게 설정됩니다. 13522를 수정했습니다.
1.3.1
Prelude
키스킷 1.3.1 은 1.3 시리즈의 사소한 버그 수정 릴리스입니다.
회로 업그레이드 노트
- 이제 게이트에 대한 일반 제어 메서드는 게이트가 이미 지원되는 경우 게이트를 지원되는 기준으로 변환하려고 시도하지 않습니다. 이렇게 하면 제어 게이트의 합성이 약간 변경될 수 있지만 2큐비트 게이트 수가 증가하지는 않습니다.
버그 수정
-
정의가 없는 명령어를
QuantumCircuit.decompose()c_if를 호출하면 오류가 발생하는 버그가 수정되었습니다. 수정 #13493. -
제어 흐름 연산 내부의 연산(예
QuantumCircuit.for_loop()) 를 호출할 때 올바르게 분해되지 않았습니다QuantumCircuit.decompose(). 13544 수정. -
에 대한 기본 정의가 추가되었습니다
FullAdderGate,HalfAdderGate,ModularAdderGate및MultiplierGate게이트에 대한 기본 정의를 추가하여Operator를 이러한 게이트를 포함하는 양자 회로로 구성할 수 있습니다. -
에 필요한 클린 앤실라 큐비트 수를 수정했습니다
FullAdderSynthesisV95,HalfAdderSynthesisV95및ModularAdderSynthesisV95플러그인. -
누락 된 추가
FullAdderSynthesisDefault사용 가능한 깨끗한 아실라 큐비트 수에 따라 최적의 분해를 선택하는FullAdderGate에 가장 적합한 분해를 선택하는 누락된 플러그인을 추가했습니다. -
수정됨
HalfAdderSynthesisDefault및ModularAdderSynthesisDefault플러그인HalfAdderGate과ModularAdderGate를 각각 사용하여 사용 가능한 깨끗한 앤실라 큐비트 수에 따라 최상의 분해를 선택합니다. -
매개변수 할당 중 잘못된 캐싱 동작을 수정하여
EquivalenceLibrary정의가 손상될 수 있는 잘못된 캐싱 동작을 수정했습니다. 이렇게 하면 기준 번역을 병렬로 실행할 때 예기치 않은 문제를 해결할 수 있습니다. 수정 #13504. -
파라미터화된 전역 위상이 있는 회로를 처리할 때 파라미터 할당 중에 전역 위상이 제대로 할당되지 않던 일련의 버그가 수정되었습니다. 이 영향을 받는 알려진 사례는 다음과 같습니다:
- 를 호출한 후 매개변수 할당
QuantumCircuit.decompose()를 호출한 후 파라미터를 할당하면, 분해가 전역 위상을 도입합니다 - 를 통해 DAG로 구성된 회로에 파라미터를 할당합니다
dag_to_circuit() - 로 생성된 회로에 파라미터를 할당하는 경우
pauli_twirl_2q_gates()로 생성된 회로에 파라미터화된 전역 위상을 지정합니다
수정 #13534.
- 를 호출한 후 매개변수 할당
-
1개 이상의 제어 큐비트에 대한
RZGate.control()의 버그가 수정되어 불필요하게 비싼 분해가 사용되었습니다. 13473 수정.
1.3.0
Prelude
키스킷 버전 1.3.0 은 트랜스파일러의 성능과 품질을 크게 개선했습니다. 이번 키스킷 새 버전에는 많은 새로운 기능, 수정 및 개선 사항이 도입되었는데, 주요 내용은 다음과 같습니다:
키스킷의 트랜스필레이션을 위한 핵심 데이터 구조는 내부적으로 Rust로 포팅되었습니다. 여기에는 다음과 같은 구성 요소가 포함됩니다
DAGCircuit,Target,EquivalenceLibrary등과 같은 컴포넌트가 포함됩니다. 이러한 모든 데이터 구조에 대한 공개 API는 변경되지 않았지만 재작성 후 성능이 향상되었습니다.프리셋 패스 매니저에서 사용하는 대부분의 트랜스파일러 패스가 Rust로 포팅되어 벤치마크 실행 시 평균 6x 전체 런타임이 Qiskit 1.2.4 에 비해 개선되었습니다. 특히 재작성을 통해 큰 영향을 받은 패스는 다음과 같습니다
BasisTranslator,CommutationAnalysis,ConsolidateBlocks과UnitarySynthesis. 포팅된 패스의 전체 목록은 기능 릴리스 노트에서 확인할 수 있습니다.컴파일 품질과 회로 구성 속도를 향상시키는 회로 라이브러리가 개선되었습니다. 이제 작업은 다음과 같이 구분됩니다:
- 구조 연산은 고유한 분해를 가지며, a를 반환하는 함수로 표현됩니다
QuantumCircuit를 반환하는 함수로 표현됩니다(예real_amplitudes()). 이러한 함수의 대부분은 Rust에서 빌드되므로 회로 구성 런타임이 훨씬 빨라집니다.- 다른 분해를 사용하여 구현할 수 있는 추상 연산은 다음과 같이 표현됩니다
Gate또는Instruction(예PauliEvolutionGate). 이를 통해 추상적인 양자 회로를 구축하고 컴파일러가 최적의 분해를 선택할 수 있습니다.추상 회로 설명을 사용하는 것은 특히 개선된 트랜스파일러 패스와 함께 사용하면 더욱 강력합니다
HighLevelSynthesis트랜스파일러 패스가 개선되어 유휴 보조 큐비트를 고려하여 주어진 게이트에 대해 사용 가능한 최상의 분해를 찾을 수 있습니다.최소 지원되는 Python 버전은 Python 3.8 이 2024-10에 종료됨에 따라 이제 3.9 입니다. 이번 릴리스에서는 Python 3.13 지원도 공식적으로 추가되었습니다.
회로 기능
-
의 기능이 개선되었습니다
CommutationChecker의 기능을 개선하여 자유 파라미터가 있는 다음 파라미터화된 게이트에 대한 지원을 포함하도록 했습니다:RXXGate,RYYGate,RZZGate,RZXGate,RXGate,RYGate,RZGate,PhaseGate,U1Gate,CRXGate,CRYGate,CRZGate,CPhaseGate. 이전에는 바인딩된 매개변수만 지원되었습니다. -
새로운 기능 추가
quantum_volume()양자 볼륨을 생성하기 위한QuantumCircuit객체를 생성하는 새로운 함수를 추가했습니다. Cross et al. 무작위 모델 회로를 사용한 양자 컴퓨터 검증, Phys. Rev. A 100, 032328 (2019). 이 새로운 함수는 기존QuantumVolume클래스와 다른 점은 하위 클래스 객체를 만드는 대신QuantumCircuit객체를 반환한다는 점에서 기존 클래스와 다릅니다. 두 번째는 이 새로운 함수가 멀티스레드로 구현되고 러스트로 구현되어 출력 회로 ~10x 를 생성하는 속도가QuantumVolume클래스보다 빠르게 생성됩니다. -
인수가 설정된 클래스를 생성할 때 런타임 성능을 개선했습니다
QuantumVolumeclassical_permutation인수가True으로 설정된 클래스의 런타임 성능을 개선했습니다. 내부적으로 이제 이 함수는quantum_volume()함수를 호출하며, 양자 볼륨 회로를 생성할 때 ~10x 더 빠릅니다. -
새로운 회로 조작 기능 추가
pauli_twirl_2q_gates()을 추가하여 주어진 회로에 폴리 회전을 적용할 수 있습니다. 이는 고정된 2쿼비트 게이트 세트를 돌릴 때만 작동하며, 현재는CXGate,ECRGate,CZGate,iSwapGate. 예를 들어from qiskit.circuit import QuantumCircuit, pauli_twirl_2q_gates qc = QuantumCircuit(2) qc.cx(0, 1) twirled_circuit = pauli_twirl_2q_gates(qc, seed=123456) twirled_circuit.draw("mpl")
-
두 개의 -쿼비트 레지스터( )를 제자리에 추가하기 위한 이진 산술 게이트가 추가되었습니다. 그리고
ModularAdderGate는 더하기 모듈로 를 구현하고HalfAdderGate에는 캐리 아웃 큐비트가 포함되며FullAdderGate는 캐리 인 큐비트와 캐리 아웃 큐비트를 모두 포함합니다. 자세한 내용과 예시는 각 문서를 참조하세요.다음과 같은 기존 라이브러리 회로와 달리
CDKMRippleCarryAdder와 같은 기존 라이브러리 회로와 달리 추상 게이트를 처리하면 컴파일러(또는 사용자)가 회로의 컨텍스트에 따라 최적의 게이트 합성을 선택할 수 있습니다. -
를 추가했습니다
MultiplierGate를 두 개의 -쿼비트 레지스터, 즉 로 곱하기 위해 추가했습니다. 자세한 내용과 예제는 클래스 설명서를 참조하세요. -
의 부울 논리 양자 회로는
qiskit.circuit.library의 양자 회로는 이제 다음과 같은Gate객체로 동등하게 표현되어HighLevelSynthesis트랜스파일러 패스 및 플러그인 인프라에서 사용할 수 있습니다.AndGate를 나타내는AND,OrGate를 나타내는OR,BitwiseXorGate를 나타내는XOR,InnerProductGate를 나타내는InnerProduct.
-
의 특수 구현이
__eq__()의 특수 구현이 모든 표준 라이브러리 서킷 게이트에 추가되었습니다. 대부분의 표준 게이트는 이미 이 방법을 특화했지만 일부는 그렇지 않아 예상치 못한 곳에서 상당한 속도 저하를 일으킬 수 있습니다. -
추가
evolved_operator_ansatz(),hamiltonian_variational_ansatz()및qaoa_ansatz()를 회로 라이브러리에 추가하여 연산자 진화에 따른 가변 회로를 구현했습니다.evolved_operator_ansatz()과qaoa_ansatz()는 기능적으로EvolvedOperatorAnsatz및QAOAAnsatz와 기능적으로 동일하지만 일반적으로 성능이 더 뛰어납니다.는 하나의 해밀턴을 가지고
hamiltonian_variational_ansatz()는 하나의 해밀턴을 취하고 이를 통근 조건으로 자동 분할하여 해밀턴의 변형 안사츠를 구현하도록 설계되었습니다. 이 작업은 이미 수동으로 수행할 수 있었지만EvolvedOperatorAnsatz를 사용하여 수동으로 수행할 수 있었지만 이제 더 편리하게 사용할 수 있습니다. -
추가
grover_operator()를 추가하여 그로버 연산자 회로를 구성하고 그로버 알고리즘과 진폭 추정/증폭 등에 사용합니다. 이 함수는GroverOperator와 유사하지만 다중 제어 X 게이트 구현을 선택할 필요가 없고 대신 컴파일러가 최적의 분해를 결정하도록 합니다. 또한 회로를 불투명 게이트로 감싸지 않으며, 투명화에 필요한 분해 횟수가 적기 때문에 더 빠릅니다.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import grover_operator oracle = QuantumCircuit(2) oracle.z(0) # good state = first qubit is |1> grover_op = grover_operator(oracle, insert_barriers=True) grover_op.draw('mpl')
-
새로운 데이터 속성
qiskit.circuit.CONTROL_FLOW_OP_NAMES라는 새로운 데이터 속성을 사용하여 이름별로 주어진Instruction가 제어 흐름 연산인지 이름을 통해 쉽게 확인할 수 있습니다. -
표준 동등성 라이브러리(
SessionEquivalenceLibrary)에는 이제 키스킷의 표준 라이브러리 2q 연속 아이싱 유형 상호 작용(예CPhaseGate,RZZGate,RZXGate등)을 로컬 등가 관계를 사용하여 변환할 수 있습니다. 이전에는 이러한 변환 중 일부가 2-CX 형식을 통해 이루어졌기 때문에 회로 생성 효율이 떨어졌습니다.참고일반적으로
BasisTranslator는 주어진 값에 대해 "최상의" 등가 관계를 찾는다는 보장은 없습니다Target에 대해 "최상의" 등가 관계를 찾는다는 보장은 없지만, 등가 관계가 존재한다면 항상 찾을 수 있습니다. 트랜스파일러에서 더 비싼 재합성 및 게이트 최적화 패스를 사용하여 출력을 개선합니다. 이러한 패스는 현재 연속적으로 파라미터화된 2큐비트 상호작용이 있는 기저 집합에는 이산적인 슈퍼 제어 2큐비트 상호작용에 비해 효과적이지 않습니다. -
에 새로운 인수
"apply_synthesis"를 추가하여Decompose에 트랜스파일러 패스에 하이레벨 합성을 적용하여 합성 루틴으로만 정의된 오브젝트를 분해할 수 있는 인수를 추가했습니다. 예를 들어,from qiskit import QuantumCircuit from qiskit.quantum_info import Clifford from qiskit.transpiler.passes import Decompose cliff = Clifford(HGate()) circuit = QuantumCircuit(1) circuit.append(cliff, [0]) # Clifford has no .definition, it is only defined by synthesis nothing_happened = Decompose()(circuit) # this internally runs the HighLevelSynthesis pass to decompose the Clifford decomposed = Decompose(apply_synthesis=True)(circuit) -
함수를 추가하여
iqp()함수를 추가하여 순간 양자 다항식 시간(IQP) 회로를 구성할 수 있습니다. 기존IQP클래스 외에도 이 함수를 사용하면 임의의 IQP 회로를 구성할 수도 있습니다:from qiskit.circuit.library import random_iqp random_iqp = random_iqp(num_qubits=4) random_iqp.draw('mpl')
-
다중 제어 다중 대상 작업을 게이트로 나타내기 위해
MCMTGate를 추가하여 다중 제어 다중 대상 작업을 게이트로 표현합니다. 기존 회로의 이 게이트 표현은MCMT회로의 게이트 표현을 통해 컴파일러는 회로에 존재하는 보조 큐비트의 수와 상태에 따라 사용 가능한 최상의 구현을 선택할 수 있습니다.원하는 구현은 하이레벨 합성 플러그인을 지정하여 선택할 수 있습니다:
from qiskit import QuantumCircuit, transpile from qiskit.circuit.library import MCMTGate, HGate from qiskit.transpiler.passes import HLSConfig # used for the synthesis config mcmt = MCMTGate(HGate(), num_ctrl_qubits=5, num_target_qubits=3) circuit = QuantumCircuit(20) circuit.append(mcmt, range(mcmt.num_qubits)) config = HLSConfig(mcmt=["vchain"]) # alternatively use the "noaux" method synthesized = transpile(circuit, hls_config=config)또한
MCMTGate는 제어 큐비트의 사용자 지정(즉, 개방형) 제어 상태도 지원합니다. -
회로 라이브러리 현대화의 일환으로 다음과 같은 양자 회로는 각각 객체로 표현되거나
Gate객체로 표현되거나 합성 방법을 사용하여 구성할 수 있습니다:GraphState는GraphStateGate,FourierChecking를 사용하여 구성할 수 있습니다fourier_checking(),UnitaryOverlap를 사용하여 구성할 수 있습니다unitary_overlap(),HiddenLinearFunction를 사용하여 구성할 수 있습니다hidden_linear_function(),PhaseEstimation를 사용하여 구성할 수 있습니다phase_estimation().
-
클래스가
CommutationChecker클래스가 Rust에서 재작성되었습니다. 이 클래스는 이전과 동일한 기능과 공용 API를 유지하지만 대부분의 경우 훨씬 더 빨라졌습니다. -
PauliFeatureMap와ZZFeatureMap는 이제 키가 큐비트 수를 나타내고 값이 서로 얽힌 큐비트를 정의하는 정수 튜플 목록인 사전으로 얽힘을 지정하는 것을 지원합니다. 이를 통해 특정 양자 알고리즘에 맞춘 피처 맵을 보다 유연하게 구성할 수 있습니다. 사용 예:from qiskit.circuit.library import PauliFeatureMap entanglement = { 1: [(0,), (2,)], 2: [(0, 1), (1, 2)], 3: [(0, 1, 2)], } qc = PauliFeatureMap(3, reps=2, paulis=['Z', 'ZZ', 'ZZZ'], entanglement=entanglement, insert_barriers=True) qc.decompose().draw('mpl') -
메서드의
count_ops()메서드QuantumCircuit의 메서드가 Rust에서 다시 작성되었습니다. 이제 3~9배 더 빠르게 실행됩니다. -
회로 라이브러리 기능 추가
pauli_feature_map(),z_feature_map(),zz_feature_map()를 추가하여 폴리 피처 맵 회로를 구성할 수 있습니다. 이 함수는 현재 회로 라이브러리 객체보다 약 8x 빠릅니다,PauliFeatureMap,ZFeatureMap및ZZFeatureMap보다 빠르며 향후 이를 대체할 예정입니다.이 기능은 드롭인 대체 기능으로 사용할 수 있습니다:
from qiskit.circuit.library import pauli_feature_map, PauliFeatureMap fm = pauli_feature_map(20, paulis=["z", "xx", "yyy"]) also_fm = PauliFeatureMap(20, paulis=["z", "xx", "yyy"]).decompose()
기본형 기능
-
레벨 1 데이터에 대한 지원이
BackendSamplerV2에 추가되었으며, 래핑된run()메서드에 옵션 전달에 대한 지원도 추가되었습니다BackendV2. 실행 옵션은options딕셔너리에 전달된"run_options"항목을 사용하여 지정할 수 있습니다BackendSamplerV2."run_options"항목은 인수 이름을 백엔드의run()메서드에 전달할 값에 매핑하는 딕셔너리여야 합니다. 실행 옵션에서"meas_level = 1 "을 설정하면 백엔드의 결과가 비트 배열(레벨 2 형식) 대신 레벨 1 결과로 처리됩니다. -
Estimator및StatevectorEstimator는 입력 회로에 일부 하위 시스템에 대한 리셋이 포함된 경우 확률적 방식으로 기대값을 반환합니다. 이전에는 결과를 재현할 수 없었지만 이제 무작위 시드를 설정하면 재현할 수 있습니다. 예를 들어,from qiskit.primitives import StatevectorEstimator estimator = StatevectorEstimator(seed=123)또는:
from qiskit.primitives import Estimator estimator = Estimator(options={"seed":123})
OpenQASM 기능
- 클래스
qasm3.CustomGate클래스는 이제 프로그래밍 방식으로 검사할 수 있습니다. 그것의constructor,name,num_params및num_qubits는 이제 객체가 생성된 후 Python 에서 볼 수 있습니다. 이를 통해 다음과 같은 제공된 데이터 속성의 내용을 검사할 수 있습니다STDGATES_INC_GATES.
QPY 기능
- 키스킷의 기본 표현을 추가하는 새로운 QPY 형식 버전 13이 추가되었습니다
ParameterExpression객체의 네이티브 표현을 추가했습니다.
양자 정보 특성
-
의 성능은
SparsePauliOp.from_operator()의 성능은 키스킷 1.0 에 도입된 알고리즘 개선 방법을 기반으로 최적화되었습니다. 이제 완전 밀도 행렬의 경우 이전보다 약 5배 빨라졌으며, 모든 폴리 항을 포함하는 10q 연산자를 분해하는 데 약 40ms 이 걸립니다. -
에 새 인수
assume_unitary를 추가했습니다qiskit.quantum_info.Operator.power().True의 경우 슈어의 분해에 기반한 더 빠른 방법을 사용하여Operator을 소수의 거듭제곱으로 올립니다. -
추가
SparsePauliOp.to_sparse_list()연산자를 희소 목록 형식으로 변환하는 기능이 추가되었습니다. 이는SparsePauliOp.from_sparse_list(). 예를 들어,from qiskit.quantum_info import SparsePauliOp op = SparsePauliOp(["XIII", "IZZI"], coeffs=[1, 2]) sparse = op.to_sparse_list() # [("X", [3], 1), ("ZZ", [1, 2], 2)] other = SparsePauliOp.from_sparse_list(sparse, op.num_qubits) print(other == op) # True -
의 성능이
Pauli.to_label()의 성능이 크게 향상되었습니다. -
메서드
Operator.power()에 새로운 매개변수branch_cut_rotation가 추가되었습니다. 루트의 분기 절단점을 이동하는 데 사용할 수 있으며, 이는 주 루트로 선택되는 행렬에 영향을 줄 수 있습니다. 기본적으로 작은 양의 회전으로 설정되어 실 음의 고유값을 갖는 연산자(예: 폴리 연산자)의 근을 수치 정밀도 차이에 대해 보다 안정적으로 만듭니다. -
관찰 가능한 클래스가 새로 추가되었습니다.
SparseObservable와 유사하게 관측값을 용어의 합으로 나타내지만SparsePauliOp와 유사하지만 두 가지 핵심적인 차이점이 있습니다:- 각 완전한 용어는 (사실상) 일련의
(qubit, bit_term)쌍으로 저장되며, 해당 용어의 ID를 거치는 큐비트를 저장하지 않습니다. 이렇게 하면 폴리스 가중 합과 같은 관측값의 메모리 사용량이 크게 개선됩니다 . - 단일 큐비트 용어 알파벳은 연산자 공간에 대해 지나치게 불완전합니다; 폴리 연산자(예
SparsePauliOp)를 나타낼 수 있을 뿐만 아니라 와 같이 폴리 연산자의 고유 상태에 투영할 수도 있습니다. 이러한 프로젝터는 해당 Pauli 연산자와 똑같이 효율적으로 하드웨어에서 측정 할 수 있지만SparsePauliOp는 큐비트에서 를 표현하기 위해 기하급수적인 수의 항이 필요하지만, 반면SparseObservable는 단 하나의 용어만 필요합니다.
사용자에게 익숙한 인터페이스를 사용하여
SparseObservable사용자에게 익숙한 인터페이스를 사용하여SparsePauliOp:from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_sparse_list([ ("XZY", (2, 1, 0), 1.5j), ("+-", (100, 99), 0.5j), ("01", (50, 49), 0.5), ])SparseObservable는 현재 프리미티브의 입력 형식으로 지원되지 않지만(qiskit.primitives), 향후 이러한 인터페이스를 포함하도록 확장할 예정입니다. - 각 완전한 용어는 (사실상) 일련의
합성 기능
-
합성 기능 추가
synth_mcx_gray_code()과synth_mcx_noaux_v24()를 추가하여 다중 제어 X 게이트를 합성할 수 있습니다. 이러한 함수에는 추가적인 앤실라 큐비트가 필요하지 않습니다. -
합성 기능 추가
synth_c3x()과synth_c4x()를 추가하여 각각 3제어 및 4제어 X-게이트를 합성합니다. -
합성 함수 추가
synth_mcx_n_dirty_i15()를 사용하여 더티 보조 큐비트를 사용하여 최대 CX 게이트가 있는 회로를 생성하는 다중 제어 X 게이트를 합성하는 합성 함수(Iten et al. al. (arXiv:1501.06911). -
합성 함수 추가
synth_mcx_n_clean_m15()를 사용하여 클린 보조 큐비트를 사용하여 최대 CX 게이트가 있는 회로를 생성하는 다중 제어 X 게이트를 합성하는 합성 함수( arXiv:1508.03273 )를 추가합니다. -
합성 함수 추가
synth_mcx_1_clean_b95()를 추가하여 단일 클린 보조 큐비트를 사용하여 제어가 있는 다중 제어 X 게이트를 합성하여 최대 CX 게이트가 있는 회로를 생성합니다(Barenco 등, arXiv:quant-ph/9503016 ). -
추가
adder_qft_d00(),adder_ripple_c04()및adder_ripple_v95()를 추가하여 가산기 게이트를 합성합니다,ModularAdderGate,HalfAdderGate및FullAdderGate. -
추가
multiplier_cumulative_h18()및multiplier_qft_r17()를 합성하기 위해MultiplierGate. -
추가
synth_mcmt_vchain()를 추가하여 선형 수의 토폴리 게이트와 k 제어 큐비트에 대한 k-1 보조 큐비트로 다중 제어 다중 타겟 게이트를 합성하는 하이레벨 합성 플러그인MCMTSynthesisVChain. -
에 대한 하이 레벨 합성 플러그인 구조가 추가되었습니다
MCMTGate를 위한 고수준 합성 플러그인 구조가 추가되었습니다MCMTSynthesisNoAux(보조 큐비트 없음), 앞서 언급한MCMTSynthesisVChain(num_control - 1보조 큐비트 사용) 및MCMTSynthesisDefault를 추가하여 컴파일러가 최적의 분해를 선택할 수 있도록 했습니다. -
함수
random_clifford()함수가 Rust로 포팅되어 런타임이 3배 향상되었습니다. -
추가
ProductFormula.expand()를 추가하여 제품 공식의 확장을 스파스 폴리 형식으로 볼 수 있습니다. 예를 들어 해밀턴의 2차 트로터 확장의 형식을 다음과 같이 쿼리할 수 있습니다:from qiskit.quantum_info import SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis.evolution import SuzukiTrotter hamiltonian = SparsePauliOp(["IX", "XI", "ZZ"], coeffs=[-1, -1, 1]) evo = PauliEvolutionGate(hamiltonian, time=3.14) trotter = SuzukiTrotter(order=2) print(trotter.expand(evo))인쇄됩니다
[('X', [0], -3.14), ('X', [1], -3.14), ('ZZ', [0, 1], 6.28), ('X', [1], -3.14), ('X', [0], -3.14)] -
에 대한 플러그인 구조를 추가했습니다
PauliEvolutionGate. 기본 플러그인입니다,PauliEvolutionSynthesisDefault는 이전과 마찬가지로 회로를 구성하지만 내부적으로 Rust를 사용하기 때문에 더 빠릅니다. 회로가 클수록(예를 들어 를 해밀턴 크기, 타임스텝 수 또는 스즈키-트로터 순서)로 증가시킬수록 속도가 빨라집니다. 예를 들어, 10개의 타임스텝과 4차 트로터 공식을 사용하는 100큐비트 하이젠베르크 해밀턴은 이제 ~9.4x 더 빠르게 구성됩니다. 새로운 플러그인,PauliEvolutionSynthesisRustiq, (de) Brugière와 Martiel의 논문 "해밀턴 시뮬레이션 회로의 더 빠르고 더 짧은 합성" 에 설명된 합성 알고리즘을 사용하고 Rustiq 에 구현되어 있습니다. 예를 들어,from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate from qiskit.compiler import transpile from qiskit.transpiler.passes import HLSConfig op = SparsePauliOp(["XXX", "YYY", "IZZ"]) qc = QuantumCircuit(4) qc.append(PauliEvolutionGate(op), [0, 1, 3]) config = HLSConfig(PauliEvolution=[("rustiq", {"upto_phase": False})]) tqc = transpile(qc, basis_gates=["cx", "u"], hls_config=config) tqc.draw(output='mpl')
이 코드 스니펫은 Rustiq 플러그인을 사용하여 양자 회로 qc의 객체를
PauliEvolutionGate객체를 합성합니다. 플러그인은 추가 옵션upto_phase = False과 함께 호출되어 글로벌 위상을 보존하지 않는 대신 더 작은 회로를 얻을 수 있습니다. 지원되는 옵션의 전체 목록은 다음 문서를 참조하세요PauliEvolutionSynthesisRustiq. -
포트
synth_cz_depth_line_mr()를 Rust로 변경합니다. 이 함수는 마슬로프와 로텔러 방식을 기반으로 선형 최인접 이웃(LNN) 연결을 위한 CZ 회로를 합성합니다. 350x350 바이너리 매트릭스에서 Rust 구현은 약 30x 의 속도 향상을 가져옵니다. -
Port
synth_permutation_reverse_lnn_kms()를 Rust로 변경하면 Kutin, Moulton, Smithline 방법을 사용하여 LNN 아키텍처에 대한 역순열을 합성합니다. -
에 새로운 인수
preserve_order를 추가했습니다ProductFormula에 인수를 추가하여 해밀턴의 폴리 항을 곱식 확장 전에 다시 정렬하여 최종 회로 깊이를 압축할 수 있습니다. 이를False으로 설정하면 다음과 같은 형식의 용어가 됩니다
로 재주문됩니다
를 사용하면 첫 번째 부분에서 세 번의 순차적 회전이 아닌 RZZ 및 RYY 회전이 병렬로 적용됩니다.
이 옵션은 플러그인 인터페이스를 통해 설정할 수 있습니다:
from qiskit import QuantumCircuit, transpile
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.synthesis.evolution import SuzukiTrotter
from qiskit.transpiler.passes import HLSConfig
op = SparsePauliOp(["XXII", "IYYI", "IIZZ"])
time, reps = 0.1, 1
synthesis = SuzukiTrotter(order=2, reps=reps)
hls_config = HLSConfig(PauliEvolution=[("default", {"preserve_order": False})])
circuit = QuantumCircuit(op.num_qubits)
circuit.append(PauliEvolutionGate(op, time), circuit.qubits)
tqc = transpile(circuit, basis_gates=["u", "cx"], hls_config=hls_config)
tqc.draw('mpl')
트랜스파일러 기능
-
인수를 추가
matrix_basedCollectCliffords트랜스파일러 패스에 추가합니다. 새 파라미터가matrix_based=True인 경우CollectCliffords트랜스파일러 패스는 특정 파라미터에 대해 클리포드 게이트인 단일 게이트를 수집할 수 있습니다(예RZGate의 배수인 각도를 가진 게이트를 수집할 수 있습니다. -
트랜스파일러 패스는
RemoveIdentityEquivalent트랜스파일러 패스는 이제 최적화 레벨 2와 3에서 프리셋 패스 관리자의 일부로 실행됩니다. 패스는init및optimization단계에서 실행되며, 적용되는 최적화가 두 단계 모두에 유효하고 패스의 실행 속도가 빠르기 때문입니다. -
합성을 위한 여러 하이 레벨 합성 플러그인을 추가했습니다
MCXGate:MCXSynthesisNCleanM15를 기반으로synth_mcx_n_clean_m15().MCXSynthesisNDirtyI15를 기반으로synth_mcx_n_dirty_i15().MCXSynthesis1CleanB95를 기반으로synth_mcx_1_clean_b95().MCXSynthesisNoAuxV24를 기반으로synth_mcx_noaux_v24().MCXSynthesisGrayCode를 기반으로synth_mcx_gray_code().
또한 다음도 리턴됩니다.
MCXSynthesisDefault를 사용하여 사용 가능한 클린 및 더티 앤실라 큐비트 수에 따라 가장 효율적인 합성 방법을 선택할 수 있습니다.
예를 들어 다음 회로의 트랜스필레이션을 생각해 보겠습니다:
from qiskit.circuit import QuantumCircuit from qiskit.compiler import transpile qc = QuantumCircuit(7) qc.x(0) qc.mcx([0, 1, 2, 3], [4]) qc.mcx([0, 1, 2, 3, 4], [5]) qc.mcx([0, 1, 2, 3, 4, 5], [6]) transpile(qc).draw('mpl', fold=-1)
첫 번째 MCX 게이트의 경우, 큐비트
5및6을 클린 부호로 사용할 수 있으며, 사용 가능한 최상의 합성 방법synth_mcx_n_clean_m15이 선택됩니다. 두 번째 MCX 게이트의 경우, qubit6을 클린 앤실라로 사용할 수 있으며,synth_mcx_n_clean_m15방식은 더 이상 적용되지 않으므로synth_mcx_1_clean_b95방식이 선택됩니다. 세 번째 MCX 게이트의 경우 안실라 큐비트가 없으며synth_mcx_noaux_v24방식이 선택됩니다. -
트랜스파일러 패스의
SabreLayout트랜스파일러 패스는layout_trials키워드 인수의 값과는 별개로 기본적으로 추가로 두세 번의 레이아웃 트라이얼을 실행하도록 업데이트되었습니다. 사소한 레이아웃과 그 반대가 모든 백엔드에 포함되어 있습니다DenseLayout1.2.0 에 추가된 평가판과 마찬가지로 모든 백엔드에 포함됩니다. 이 외에도 백엔드가 127, 133 또는 156 큐비트인 경우 IBM 백엔드 무거운 16진수 연결 그래프에서 가장 큰 링이 추가됩니다. 이는 일반적으로 실행되는 백엔드에서 일부 회로에는 좋은 시작점을 제공할 수 있지만, 다른 모든 회로에는 추가적인 '무작위 시험'에 불과합니다. -
의
DAGCircuit가 Rust에서 다시 구현되었습니다. 이 Python 클래스의 재작성은 이전 Python 구현과 완전히 API 호환되어야 합니다. 이 클래스는 이전에 기본 데이터 그래프 구조가 Rust에 존재하는 rustworkx를 사용하여 구현되었지만, 클래스의 구현과 모든 데이터는 Python 에 살아있었습니다. 이 새로운 버전의DAGCircuit는 모든 데이터에 대해 Rust 네이티브 표현을 저장하며, 저장 중인 명령어를 위해 설계된 압축된 쿼비트 및 클럭비트 표현으로 인해 메모리 효율이 더 높습니다. 또한 트랜스파일러 패스를 통해 Rust에서 완전히 조작할 수 있는DAGCircuit를 완전히 조작할 수 있어 성능이 향상됩니다. -
에 새로운 인수
qubits_initially_zero가 추가되었습니다qiskit.compiler.transpile(),generate_preset_pass_manager()에, 그리고PassManagerConfig. 기본값인True으로 설정하면 큐비트가 처음에 상태인 것으로 간주되어 개별 트랜스파일러 패스에 대한 추가 최적화 기회를 제공할 수 있습니다. 특히HighLevelSynthesis트랜스파일러 패스는 회로의 각 게이트에 대해 더 나은 분해를 선택합니다MCXGate상태의 유휴 보조 큐비트를 사용할 수 있을 때 회로의 각 게이트에 대해 더 나은 분해를 선택합니다.그러나 큐비트를 제대로 초기화하지 않는 백엔드에 대한 트랜스파일링이나 더 큰 양자 회로의 하위 회로에서 수동으로 트랜스파일러 패스를 호출하는 경우처럼
qubits_initially_zero을False으로 설정해야 하는 경우가 있습니다. -
트랜스파일러 패스의 생성자는
HighLevelSynthesis트랜스파일러 패스의 생성자는 이제 추가 인수를 허용합니다:qubits_initially_zero.True로 설정하면 패스는 큐비트가 처음에 상태에 있다고 가정합니다. 또한 패스는 실행 내내 깨끗한 보조 큐비트와 더티 보조 큐비트를 추적하고, 이 정보를 kwargsnum_clean_ancillas와num_dirty_ancillas를 사용하여 플러그인에 전달합니다. -
트랜스파일러 패스에서 안실라 큐비트 처리가 개선되었습니다
HighLevelSynthesis트랜스파일러 패스의 큐비트 처리가 개선되었습니다. 예를 들어 회로에 다음과 같은 정의가 있는 사용자 정의 게이트가 있을 수 있습니다MCXGates. 이제 내부의 합성 알고리즘은MCXGate의 합성 알고리즘은 글로벌 회로에서 사용 가능하지만 커스텀 게이트의 정의를 벗어난 앤실라 큐비트를 사용할 수 있습니다. -
새로운 메서드 추가
DAGCircuit.control_flow_op_nodes()메서드를 추가하여DAGOpNode의DAGCircuit를 포함하는ControlFlowOp. 메서드를 사용하고DAGCircuit.op_nodes()메서드를 사용하고ControlFlowOp클래스를 필터로 전달하기 전에도 가능했지만, 이 새로운 함수는 작업을 더 빠르게 수행합니다. -
프리셋 패스 관리자에서 사용되는 대부분의 트랜스파일러 패스는 다음에서 반환하고
generate_preset_pass_manager()에 의해 반환되고 내부적으로 사용되는transpile()에서 반환하고 내부적으로 사용하는 대부분의 패스가 Rust로 포팅되었습니다. 이를 통해 각 패스의 런타임 성능이 크게 향상되어 트랜스파일러의 전반적인 운영 효율성이 크게 개선되었습니다. 이번 릴리스에서 Rust로 포팅된 패스 목록은 다음과 같습니다:ConsolidateBlocksBasisTranslatorCommutationAnalysisCommutativeCancellationElidePermutationsOptimize1qGatesDecompositionUnitarySynthesisGateDirectionCheckGateDirectionRemoveDiagonalGatesBeforeMeasureCheckMapSplit2QUnitariesFilterOpNodesDepthSizeGatesInBasisInverseCancellationBarrierBeforeFinalMeasurements
-
새로운 트랜스파일러 패스를 추가했습니다,
RemoveIdentityEquivalent를 추가하여 일정 허용 오차 범위까지 아이덴티티에 해당하는 게이트를 제거하는 데 사용합니다. 예를 들어 다음과 같은 회로가 있다고 가정해 보겠습니다:
패스를 실행하면
CPhaseGate:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import RemoveIdentityEquivalent qc = QuantumCircuit(2) qc.cp(1e-20, 0, 1) removal_pass = RemoveIdentityEquivalent() result = removal_pass(qc) result.draw("mpl")
-
이제
ConsolidateBlocks패스는 이제 내부적으로Collect2qBlocks패스가 패스 관리자에서 실행되지 않은 경우 내부적으로 실행됩니다. 이전에는Collect2qBlocks또는Collect1qRuns이전에 실행해야 했거나ConsolidateBlocksforConsolidateBlocks실행해야 했습니다. 내부에서 수집을 수행하면 패스로 인한 오버헤드가 줄어듭니다. 만약Collect2qBlocks또는Collect1qRuns가 이전에 실행되는 경우ConsolidateBlocks이전에 실행되는 경우 속성 집합에서 해당 패스에 의해 수집된 실행이 사용되며 패스에 대한 동작은 변경되지 않습니다. -
트랜스파일러 패스에
RemoveDiagonalGatesBeforeMeasure트랜스파일러 패스가 더 많은 대각선 게이트를 포함하도록 업그레이드되었습니다:PhaseGate,CPhaseGate,CSGate,CSdgGate와CCZGate. 또한RemoveDiagonalGatesBeforeMeasure의 코드가 Rust로 포팅되었으며, 이제 20큐비트 회로에서 x20 더 빨라졌습니다.
시각화 기능
- 시각화 함수에는
timeline_drawer()시각화 함수에는 시각화의 객체를 지정하는 데 사용되는 새로운 인수target가 있습니다Target객체를 지정하는 데 사용됩니다. 기본적으로 이 함수는Instruction.duration를 사용하여 주어진 명령의 지속 시간을 가져오지만, 대상을 지정하면 대상 내부의 타이밍 세부 정보를 대신 활용합니다.
알려진 문제점
- 를 포함하는 회로와 함께 QPY 형식 10, 11 또는 12를 사용하는 경우
ParameterExpression를 포함하는 경우, 페이로드를 생성한 환경에 설치된symengine패키지의 버전(qpy.dump())의 버전이 페이로드가 로드된 환경에 설치된symengine의 버전과 일치하지 않으면(qpy.load()), 오류가 발생합니다. 이 오류가 발생하면 오류 메시지에서symengine버전을 설치한 후qpy.load(). QPY 형식 버전 13 이상(또는 10 이전)에서는 이 문제가 발생하지 않습니다. 따라서 회로 또는 회로의 일부로ParameterExpression객체를 직렬화하거나ScheduleBlock객체를 직렬화하는 경우 향후 이 문제를 방지하려면 버전 13을 사용하는 것이 좋습니다.
업그레이드 주의사항
-
이제 다음 클래스에서는 연산을 사용하여 폴리-Y 연산자를 대각선화합니다:
PauliEvolutionGate,EvolvedOperatorAnsatz와PauliFeatureMap. 이전에는 이러한 클래스에서 또는 을 기본 변환으로 사용했습니다. 연산으로 표시되는SXGate는 싱글톤으로 구현된 단일 게이트만 사용하기 때문에 더 효율적입니다.이전 게이트 사용법에 의존하고 있다면, 키스킷 1.2 으로 회로를 빌드한 다음
qpy.dump()로 내보내거나 커스텀TransformationPass를 작성하여 원하는 베이시스 변경 게이트로 변환하는 것을 권장합니다. -
Python 의 최소 지원 버전은 이제 3.9 이며, 이는 이전 최소 지원 버전인 3.8 에서 상향 조정되었습니다. 이 변경은 업스트림 cPython 프로젝트가 더 이상 Python 3.8 을 지원하지 않기 때문에 필요했습니다.
회로 업그레이드 노트
- 클래스는
QuantumVolume클래스는 이전 키스킷 릴리스에서 주어진 시드 값에 대해 다른 단일 행렬과 순열을 가진 회로를 생성합니다. 이는 회로 생성을 위해 새로운 내부 난수 생성기를 사용하여 회로를 더 빠르게 생성하기 때문입니다. 동일한 시드를 가진 정확한 회로가 필요한 경우, 이전 버전의 키스킷을 사용하고flatten=True인수를 사용하여 회로를 생성한 다음 회로를 내보내고qpy.dump()로 내보낸 다음 이 릴리스와 함께 로드하면 됩니다.
기본형 업그레이드 노트
- 를 사용할 때
BackendSamplerV2를 사용하면 래핑된 인스턴스의run()메서드에 회로를 전달하기 전에 회로 메타데이터가 더 이상 지워지지 않습니다BackendV2인스턴스에 전달하기 전에 이전에 이 동작에 의존하고 있었다면 호출하기 전에 메타데이터를 수동으로 지울 수 있습니다BackendSamplerV2.run()를 호출하여circuit.metadata.clear()
QPY 업그레이드 노트
- 함수는 이제
qpy.dump()함수는 이제 기본적으로 포맷 버전 13을 내보냅니다. 즉, 이 함수로 생성된 페이로드는 기본적으로 키스킷 1.3.0 이후 버전과만 호환됩니다. 이전 버전의 키스킷으로 페이로드를 로드해야 하는 경우,version플래그의qpy.dump()를 사용하여 적절한 버전을 내보내세요. 자세한 내용은 QPY 호환성을 참조하세요.
트랜스파일러 업그레이드 노트
-
DAGNode객체(및 그 서브 클래스DAGInNode,DAGOutNode및DAGOpNode)는 더 이상 동일한 기본 객체에 대한 참조를DAGCircuit메서드에서 동일한 기본 객체에 대한 참조를 반환하지 않습니다. 이전에는 반환된 모든 노드가 동일한 객체에 대한 공유 참조가 된다는 보장이 없었습니다. 그러나DAGCircuit를 Rust로 마이그레이션하면, 새로운DAGNode노드가 Python 로 반환될 때 즉시 인스턴스가 생성됩니다. 이러한 객체는==또는__eq__에 의존하는 유사한 검사를 사용하여 동일한 것으로 평가되지만 더 이상 동일한 객체로 식별되지 않습니다. -
반환된
DAGOpNode에서 반환된 인스턴스는DAGCircuit에서 반환된 인스턴스는 더 이상 DAG에 저장된 기본 데이터에 대한 공유 참조가 아닙니다. 이전 릴리스에서는 다음과 같은 작업을 수행할 수 있었습니다:for node in dag.op_nodes(): node.op = new_op하지만 이러한 유형의 돌연변이는 DAG의 내부 캐싱을 중단시키고 데이터 구조를 손상시킬 수 있기 때문에 항상 안전하지 않았습니다. 대신 다음에서 제공하는 API를 사용해야 합니다
DAGCircuit에서 제공하는 API를 사용해야 합니다DAGCircuit.substitute_node()또는DAGCircuit.substitute_node_with_dag(). 예를 들어 위의 코드 블록은 다음과 같습니다:for node in dag.op_nodes(): dag.substitute_node(node, new_op)이는 1.2.0 의 업그레이드 노트와 유사하며, 이 노트에서는 변이가 아닌
DAGOpNode.op속성의 변이에 대해 언급된 것과 유사합니다DAGOpNode자체에 대한 것이 아닙니다. 그러나 1.3 에서는 내부op속성뿐만 아니라 전체 개체로 확장됩니다. 일반적으로 이러한 유형의 돌연변이는 항상 불건전하고 지원되지 않지만, 이전에는 일부 경우에 잠재적으로 작동했을 수 있습니다. -
이제
transpile()는 이제 큐비트가 처음에 상태에 있다고 가정합니다. 이 가정을 피하기 위해qubits_initially_zero인수를False으로 설정할 수 있습니다.
지원 중단 노트
-
모듈과 관련된 모든
qiskit.pulse모듈과 관련된 모든 기능은 이제 더 이상 사용되지 않으며, 키스킷 2.0.0 에서 제거될 예정입니다. 펄스를 지원하는 기본 백엔드 제공업체는 IBM 이며 펄스 수준 액세스는 현재 IBM 의 백엔드 중 일부에서만 지원되며 최신 아키텍처에서는 지원되지 않기 때문입니다. 마찬가지로 펄스 레벨 액세스는 2025년에 제거될 것이라고 발표했습니다. 가장 큰 공급자가 더 이상 펄스 액세스를 지원하는 기능을 사용하지 않으면 키스킷에서 이 기능의 중요성이 크게 줄어들고 패키지의 지속적인 유지 관리 오버헤드와 비교하여 제거될 것입니다.사용 중단에는 모든 펄스 코드가 포함됩니다
qiskit.pulse의 모든 펄스 코드뿐만 아니라 펄스 시각화, 직렬화, 사용자 지정 보정 지원 등 펄스에 의존하거나 펄스와 관련된 기능도 포함됩니다. 자세한 내용은 아래의 사용 중단 섹션을 참조하세요.펄스 패키지 전체와 키스킷의 직접 관련 구성 요소는 펄스 및 저수준 제어 시뮬레이션을 더욱 활성화하기 위해 키스킷 다이내믹스 저장소로 이동될 것입니다. 키스킷 1.x 은
qiskit.pulse가 종료될 때까지 계속 지원합니다.
회로 사용 중단
-
더 이상 사용되지 않는
Instruction.condition속성과Instruction.c_if()메서드가 사용되지 않습니다. 키스킷 데이터 모델에서의 모든 사용과 함께 키스킷 2.0 에서 제거됩니다. 이 기능은 회로의 기존 상태를 설명하는 데 사용할 수 있는IfElseOp클래스로 대체되었으며, 회로의 고전적인 조건을 설명하는 데 사용할 수 있습니다. 예를 들어, 다음과 같은 회로는Instruction.c_if()like:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)다음으로 다시 쓸 수 있습니다.
qc = QuantumCircuit(2, 2) qc.h(0) with qc.if_test((qc.clbits[0], True)): qc.x(0) with qc.if_test((qc.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1)지금은 더 이상 사용되지 않는
ConvertConditionsToIfOps트랜스파일러 패스를 사용하여 기존 회로에서 이 변환을 자동화할 수 있습니다. -
Qiskit Pulse 패키지 사용 중단의 일환으로, 다음 종속성들도 사용 중단됩니다:
qiskit.circuit.QuantumCircuit.calibrationsqiskit.circuit.QuantumCircuit.has_calibration_for()qiskit.circuit.QuantumCircuit.add_calibration()qiskit.dagcircuit.DAGCircuit.calibrationsqiskit.dagcircuit.DAGCircuit.has_calibration_for()qiskit.dagcircuit.DAGCircuit.add_calibration()qiskit.dagcircuit.DAGDependency.calibrations
-
그리고
QuantumCircuit.unit와QuantumCircuit.duration속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 속성은 회로에서 실행할 예상 기간과 해당 기간의 단위를 추적하는 데 사용되었습니다. 그러나 이러한 속성의 값은 올바른 설정으로 트랜스파일러를 실행할 때만 제대로 채워지기 때문에 항상 제한적이었습니다. 지속 시간도 다음 지속 시간의 합에서 가장 긴 경로를 기반으로 한 추측에 불과했습니다DAGCircuit의 길이를 합한 가장 긴 경로를 기반으로 한 추측일 뿐이며 회로의 제어 흐름이나 조건을 제대로 설명하지 못했습니다. -
그리고
DAGCircuit.unit와DAGCircuit.duration속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 속성은 회로에서 실행할 예상 기간과 해당 기간의 단위를 추적하는 데 사용되었습니다. 그러나 이러한 속성의 값은 올바른 설정으로 트랜스파일러를 실행할 때만 제대로 채워지기 때문에 항상 제한적이었습니다. 지속 시간도 다음 지속 시간의 합에서 가장 긴 경로를 기반으로 한 추측에 불과했습니다DAGCircuit의 길이를 합한 가장 긴 경로를 기반으로 한 추측일 뿐이며 회로의 제어 흐름이나 조건을 제대로 설명하지 못했습니다. -
그리고
Instruction.duration와Instruction.unit속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 여기에는unit또는duration인수를 설정하는 것이 포함됩니다qiskit.circuit.Instruction또는 서브클래스에 대한 인수를 설정합니다. 이러한 속성은 개별 인스트럭션에 사용자 지정 실행 기간과 해당 기간의 단위를 첨부하는 데 사용되었습니다. 그러나 게이트 기간의 진실의 출처는BackendV2Target에 백엔드에서 지원되는 각 인스트럭션의 지속 시간이 포함되어 있습니다. 인스트럭션의 지속 시간은 일반적으로 사용자가 조정할 수 있는 것이 아니며 백엔드의 불변 속성입니다. 이전에 이 기능을 사용하여 게이트의 다양한 지속 시간을 실험했다면, 주어진 게이트의InstructionProperties.duration필드를 변경하여Target필드를 변경하여 백엔드에서 인스트럭션에 대한 사용자 지정 기간을 설정할 수 있습니다(단위는 항상 초 단위입니다Target).
제공자 기능 폐기
-
메서드는
BasicSimulator.configuration()메서드는 더 이상 사용되지 않으며 2.0.0 에서 제거될 예정입니다. 이 메서드는 더 이상 사용되지 않는BackendV1모델의 일부인 레거시providers.models.BackendConfiguration인스턴스를 반환했습니다. 이 모델은 다음과 같이 대체되었습니다BackendV2로 대체되었으며, 제약 조건은 백엔드 인스턴스에 직접 저장되거나 기본Target(backend.target).다음은 가장 일반적인
BackendConfiguration속성에 액세스하기 위한 빠른 가이드입니다BackendV2모델에 대한 빠른 가이드입니다:BackendV1 model (deprecated) ------------> BackendV2 model ---------------------------- --------------- backend.configuration().backend_name backend.name backend.configuration().backend_version backend.backend_version backend.configuration().n_qubits backend.num_qubits backend.configuration().num_qubits backend.num_qubits backend.configuration().basis_gates backend.target.operation_names (*) backend.configuration().coupling_map backend.target.build_coupling_map() backend.configuration().local No representation backend.configuration().simulator No representation backend.configuration().conditional No representation backend.configuration().open_pulse No representation backend.configuration().memory No representation backend.configuration().max_shots No representation(*)
Backend.target.operation_names에는basis_gates및 추가 비게이트 명령어가 포함되어 있으며, 일부 구현에서는 출력을 필터링해야 할 수도 있습니다.모델로 마이그레이션하는 방법에 대한 자세한 내용은 이 가이드를 참조하세요
BackendV2모델로 마이그레이션하는 방법에 대한 가이드를 참조하세요. -
Qiskit Pulse 패키지 사용 중단의 일환으로, 클래스
qiskit.providers.BackendV2내 모든 펄스 관련 기능이 사용 중단됩니다. 다음과 같은 방법을 포함합니다:따라서 해당 채널 메서드의
qiskit.providers.BackendV2Converter및qiskit.providers.fake_provider.GenericBackendV2클래스의 해당 채널 메서드도 더 이상 사용되지 않습니다.또한,
pulse_channels및calibrate_instructions인수는BackendV2초기화 메서드의 인수는 더 이상 사용되지 않습니다. -
defaults인수는 함수에서 더 이상 사용되지 않습니다qiskit.providers.convert_to_target()함수에서 사용되지 않습니다.
QPY 사용 중단 사항
- 키스킷 펄스 패키지 사용 중단의 일환으로, 직렬화
qiskit.pulse.ScheduleBlock-기반 페이로드도 더 이상 사용되지 않습니다. 특히 프로그램 인수에qiskit.pulse.ScheduleBlock객체를 프로그램 인수에qiskit.qpy.dump().
트랜스파일러 사용 중단 사항
-
사용 중단됨
StochasticSwap로 대체되었습니다SabreSwap. 예를 들어 트랜스파일 함수에서 클래스를 호출하는 경우 변경 사항은 다음과 같습니다:from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )에:
tqc = transpile( qc, routing_method="sabre", layout_method="sabre", seed_transpiler=12342, target=backend.target )반면 패스 관리자의 경우 변경 사항은 다음과 같습니다:
passmanager = PassManager(StochasticSwap(coupling, 20, 13)) new_qc = passmanager.run(qc)에:
passmanager = PassManager(SabreSwap(backend.target, "basic")) new_qc = passmanager.run(qc) -
트랜스파일러 패스
ConvertConditionsToIfOps는 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이 클래스는 이제 더 이상 사용되지 않습니다Instruction.condition의 기본 데이터 모델이 더 이상 사용되지 않으며 2.0.0 에서 제거될 예정입니다. -
basis_gates인수를 통해 사용자 정의 게이트를 제공하는 것은 더 이상 사용되지 않습니다transpile()와generate_preset_pass_manager(). 이 기능은 키스킷 2.0 에서 제거될 예정입니다. 사용자 정의 게이트는 여전히Target모델에서 계속 지원되며target인수를 통해 제공할 수 있습니다. 인스턴스를 처음부터 빌드하거나Target인스턴스를 처음부터 빌드하거나Target.from_configuration()메서드를 사용하거나custom_name_mapping인수를 사용하여 인스턴스를 빌드할 수 있습니다. 예를 들어,from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
Qiskit Pulse 패키지 사용 중단의 일환으로,
qiskit.transpiler.Target클래스 내 Pulse 관련 기능들이 사용 중단 예정입니다. 주요 내용은 다음과 같습니다.update_from_instruction_schedule_map()has_calibration()get_calibration()instruction_schedule_map()
또한, 다음 트랜스파일러 패스도 더 이상 사용되지 않을 예정입니다:
-
의
inst_map인수는generate_preset_pass_manager(),from_configuration(),PassManagerConfig이니셜라이저 및generate_scheduling()인수는 더 이상 사용되지 않습니다. -
calibration인수는InstructionProperties()초기화 메서드의 인수는 더 이상 사용되지 않습니다. -
다음
transpile()및generate_preset_pass_manager()인수는 사용자 정의 정의에 유리하도록 더 이상 사용되지 않습니다Target:instruction_durations,timing_constraints, 및backend_properties. 이러한 인수는 다음을 사용하여 대상을 빌드하는 데 사용할 수 있습니다Target.from_configuration():Target.from_configuration( ... backend_properties = backend_properties, instruction_durations = instruction_durations, timing_constraints = timing_constraints ) -
메서드
PassManagerConfig.from_backend()는 백엔드 매개변수에서BackendV12.0 유형의 입력을 더 이상 지원하지 않습니다.BackendV1은 더 이상 사용되지 않으며 구현은BackendV2.
기타 지원 중단
-
qiskit.result.mitigation모듈은 더 이상 사용되지 않으며 키스킷 2.0 에서 제거될 예정입니다. 사용 중단에는LocalReadoutMitigator및CorrelatedReadoutMitigator클래스와 관련 유틸리티 함수가 포함됩니다. 이 기능은 mthree 패키지로 대체되었습니다 https://github.com/Qiskit/qiskit-addon-mthree. -
Qiskit Pulse 패키지 사용 중단의 일환으로, 다음 함수와 클래스도 사용 중단됩니다:
버그 수정
-
타이트 루프에서 메서드를 호출할 때 발생하는 성능 회귀를 수정했습니다
QuantumCircuit.assign_parameters()의 성능 회귀를 수정했습니다. 1.2.0 이 메서드를 타이트 루프에서 호출할 때, 각 반복에 매개변수가 많은 회로에서 소수의 매개변수만 바인딩되는 문제가 발생했습니다. 가능하면 모든 할당에 대해 한 번만assign_parameters()를 한 번만 호출하고 모든 할당을 동시에 수행하는 것이 입력 정규화 및 오류 검사 오버헤드에 소요되는 시간을 줄일 수 있습니다. -
의 경우
BasicSimulator의 경우configuration()메서드가 반환하는 구성 인스턴스의basis_gates항목은 이제 예상 유형과 일치하는dict_keys인스턴스 대신 목록이 되어 구성 인스턴스를 딥 복사할 수 있습니다. -
관련 문제를 수정했습니다
DAGCircuit.apply_operation_back()및DAGCircuit.apply_operation_front()의 문제를 수정했습니다Clbitqargs객체를 입력으로 설정하면 자동으로 수락되던 문제를 수정했습니다. 유형 불일치가 올바르게 식별되고 예외가 발생하도록 이 문제가 수정되었습니다. -
에서 누락된 데코레이터를 수정했습니다
C3SXGate에서 데코레이터가 누락되어Gate.to_matrix()가 호출되면 실패하도록 수정했습니다. 이제 게이트 매트릭스가 예상대로 반환됩니다. -
의 버그를 수정했습니다
QuantumCircuit.assign_parameters()에서 이미 정의가 트리거된 표준 게이트에 파라미터를 할당할 때 발생하는 버그를 수정했습니다. 이 경우 새 값이 게이트 인스턴스에 제대로 전파되지 않았습니다. 회로 자체는 여전히 예상대로 컴파일되었지만 개별 연산을 검사하면 여전히 이전 매개변수가 표시되었습니다.예를 들어,
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.2513478 수정.
-
"circular"및"sca"얽힘 관련 버그 수정NLocal회로 및 그 파생물에 대한 버그 수정. 2 큐비트 이상의 얽힘 블록의 경우, 이전에는 원형 얽힘에 일부 연결이 누락되었습니다. 예를 들어 4 큐비트, 블록 크기 3의 경우 이전에 사용했던 코드입니다:[(2, 3, 0), (0, 1, 2), (1, 2, 3)]이었지만 이제는
(3, 0, 1)연결이 올바르게 추가되고 있습니다:[(2, 3, 0), (3, 0, 1), (0, 1, 2), (1, 2, 3)]따라서
"circular"및"sca"인탱글은 레이어당num_qubits인탱글 블록을 사용합니다. -
클리포드 게이트에 더 많은
CollectCliffords트랜스파일러 패스. 특히 게이트ECRGate,DCXGate,iSwapGate,SXGate및SXdgGate게이트를 이 트랜스파일러 패스에 추가했습니다. -
버그를 수정했습니다
QuantumCircuit.decompose()로 합성할 수 있는 오브젝트가HighLevelSynthesis로 합성할 수 있는 오브젝트가 먼저 합성된 후 즉시 분해되던 버그(즉, 한 번이 아닌 두 번 분해되던 버그)를 수정했습니다. 이는 다음과 같은 게이트에 영향을 미쳤습니다MCXGate또는Clifford등과 같은 게이트에 영향을 미쳤습니다. -
의 버그를 수정했습니다
QuantumCircuit.decompose()에서 정의가 없는 하이레벨 객체가"gates_to_decompose"인수를 통해 명시적으로 설정된 경우 분해되지 않던 버그가 수정되었습니다. 예를 들어, 이전에는 다음이 분해를 수행하지 않았지만 이제는 예상대로 작동합니다:from qiskit import QuantumCircuit from qiskit.quantum_info import Clifford from qiskit.transpiler.passes import Decompose cliff = Clifford(HGate()) circuit = QuantumCircuit(1) circuit.append(cliff, [0]) decomposed = Decompose(gates_to_decompose=["clifford"])(circuit) -
이전에는
HighLevelSynthesis트랜스파일러 패스는 명령어가 이미 대상에서 지원되는지 또는 명시적으로 전달된basis_gates의 일부인지 여부에 관계없이 합성 플러그인을 사용할 수 있는 명령어를 합성했습니다. 이제 이 동작이 수정되어 이미 지원되는 명령어가 더 이상 합성되지 않습니다. -
트랜스필레이션 패스
InverseCancellation는 이제ControlFlowOp연산에 존재하는QuantumCircuit. 이전에는 패스가 취소될 수 있는 제어 흐름 블록 내부의 역 게이트 쌍을 무시했습니다. 자세한 내용은 #13437을 참조하세요. -
의 버그를 수정했습니다
Isometry의 버그를 수정하여 불필요한 어설션으로 인해UnitaryGate.control()에 오류를 일으켰던UnitaryGate가 두 큐비트보다 많을 때 오류가 발생하던 버그를 수정했습니다. -
이제
QuantumCircuit.parameters속성은 이제 파라메트릭 회로에서QuantumCircuit.copy_empty_like()를 사용할 때 속성이 올바르게 비워집니다. 이전에는 내부 캐시가 무효화되지 않고 복사되었습니다. 수정 #12617. -
QuantumCircuit.depth()는 이제 피연산자가 없는 연산도 올바르게 처리합니다GlobalPhaseGate. -
QuantumCircuit.depth()는 이제 실시간 표현식에 사용된 변수와 클릿을 깊이 계산의 일부로 계산합니다. -
기존 근사값을 로드할 때
SolovayKitaev트랜스파일러 패스를 기존.npy파일에서 기본 근사치를 로드할 때 수정합니다. 이전에는 게이트 취소 등으로 인해 추가 감소가 가능한 저장된 근사값을 로드하면 런타임 오류가 발생할 수 있었습니다. 또한 저장-재로드 절차 중에 U(2) 게이트 제품 및 SO(3) 표현의 글로벌 위상차가 손실되었습니다. 수정 Qiskit/qiskit#12576. -
가
SparsePauliOp.paulis가 0이 아닌 위상이 있는PauliList로 설정된 경우, 이후 여러 메서드에 대한 호출이 잘못된 결과를 생성하는SparsePauliOp메서드에 대한 후속 호출이 잘못된 결과를 생성하는 버그를 수정했습니다. 이제SparsePauliOp.paulis가 위상이 0이 아닌PauliList로 설정하면 위상이 0이 아닌 위상은SparsePauliOp.coeffs로 흡수되고 입력의 위상PauliList의 위상이 0으로 설정됩니다. -
인수를 사용하여 draw 함수를 호출할 때 펄스 스케줄을 그리지 않던
qiskit.visualization.pulse_v2.interface.draw의 버그를 수정했습니다BackendV2인수로 호출할 때 펄스 스케줄을 그리지 않는 버그를 수정했습니다. V2 백엔드는 하드웨어 채널 주파수를 보고하지 않으므로 생성된 도면에는 '주파수 없음'이 표시됩니다 을 각 채널 라벨 아래에 표시합니다. -
관련 문제를 수정했습니다
dag_drawer()및DAGCircuit.draw()인스턴스를 시각화하려고 할 때DAGCircuit인스턴스를 시각화하려고 할 때Var와이어가 포함된 인스턴스를 시각화하려고 할 때 시각화 도구가 예외를 발생시키는 문제를 수정했습니다. 이 동작이 수정되었으며 예상되는 시각화가 생성됩니다. -
패스는
VF2Layout패스는 연결 제약 조건이 없는Target인스턴스가 제공되면 예외를 발생시킵니다. Aer 0.13 의 타겟이 이에 해당합니다. 이 문제가 이제 해결되었습니다. -
메서드 호출 시 오류 수정
Gate.repeat(). 자세한 내용은 #11990을 참조하세요. -
상태 벡터가 정규화되지 않은 경우
Statevector.expectation_value()가 상태 벡터가 정규화되지 않은 경우 ID 연산자에 대해 잘못된 결과를 생성하는 버그를 수정했습니다. -
생성자
GenericBackendV2는 지정된 백엔드 크기로 할당할 수 없는 베이스 게이트를 허용했기 때문에 잘못된 백엔드를 생성할 수 있었습니다. 즉, 단일 큐비트가 있는 백엔드는 2큐비트 게이트가 있는 베이시스를 받아들여서는 안 됩니다. -
ParameterExpressionPython 의 내장 숫자 유형(예:float및int)의 인스턴스와 동일하게 비교되는 완전 바인딩 인스턴스도 다른 인스턴스의 해시값과 일치하는 해시값을 갖도록 업데이트되었습니다. 이 변경으로 이러한 유형을 사전 키로 상호 교환하여 사용할 수 있습니다. 12488번을 참조하세요. -
OpenQASM 2 파서(
qiskit.qasm2)는 이제 64비트 정수에 맞지 않는 정수가 포함된 조건문을 처리할 수 있습니다. 수정 #12773. -
가져온 OpenQASM 2 프로그램의 사용자 지정 게이트(
gate문에서 비롯된 게이트)는 이제Gate.to_matrix()구현을 갖게 됩니다. 이전에는 행렬 정의가 없었기 때문에 OpenQASM 2를 통한 라운드 트립은 불필요하게 게이트 행렬을 도출하는 기능을 잃을 수 있었습니다. 하지만 행렬은 다음과 같이 내부 게이트 정의의 행렬을 재귀적으로 찾아서 계산한다는 점에 유의하세요Operator가 하는 것처럼 재귀적으로 내부 게이트 정의 행렬을 찾아서 계산하므로 왕복 전보다 성능이 떨어질 수 있습니다. -
이전에는
DAGCircuit.replace_block_with_op()은m큐비트 블록에n-큐비트 연산을 수행할 수 있었기 때문에 DAG가 유효하지 않은 상태가 되었습니다. 이 동작이 수정되었으며, 이 시도를 하면DAGCircuitError. -
수정됨
Operator.power()슈어 형식이 대각선이 아닌 행렬(예: 대부분의 비단일 행렬)에서 정수가 아닌 거듭제곱으로 호출할 때 수정되었습니다. -
Operator.power()는 이제 고유값을 가진 단일 행렬의 소수 행렬 거듭제곱에서 예상되는 원금을 더 안정적으로 반환합니다. 일반적으로 부동 소수점 반올림 효과로 인해 행렬이 분기 컷의 음의 쪽에 고유값을 가질 수 있고(정확한 수학적 관계는 그렇지 않더라도) 다양한 BLAS 호출의 부정확성으로 인해 분기 컷의 잘못된 쪽을 잘못 찾을 수 있기 때문에 이는 까다로운 작업입니다.Operator.power()이제 행렬 연산자의 분기 절단 위치가 에서 약간 복잡한 회전으로 이동합니다. 이것은 문제를 해결하는 것이 아니라 일반적으로 나타나는 연산자 유형에서 눈에 띄지 않는 위치로 이동하는 것일 뿐입니다. 새로운branch_cut_rotation매개변수를 사용하여 이를 보다 효과적으로 제어할 수 있습니다.13305번을 참조하세요.
-
의 프로세스별 비결정성을 수정했습니다
SparsePauliOp.to_matrix(). 합계에서 부동 소수점 연산의 정확한 순서는 이전에는 프로세스마다 달랐지만 이제 동일한 스크립트의 여러 호출 간에 동일하게 적용됩니다. 13413번을 참조하세요. -
Target.has_calibration()는 인스트럭션 속성에None를 사용하여 대상에 추가된 인스트럭션에 대해 예외를 발생시키지 않도록 업데이트되었습니다. 수정 #12525.