Skip to main content
IBM Quantum Platform

키스킷 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() raising KeyError.

    이 버그는 대부분의 경우처럼 완전히 연결된 백엔드에는 영향을 미치지 않았습니다. 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, CRYGateCRZGate 형식의 회전 각도에 대해 (4k+2)π(4k + 2)\pi, kZk \in \mathbb Z 을 사용했습니다. 이러한 경우 이러한 게이트는 모든 게이트와 정류하는 것으로 잘못 가정되었습니다. 이제 이 동작이 수정되어 회전 각도가 4π4\pi 의 배수인 경우에만 모든 게이트와 올바르게 커뮤트됩니다.

  • 다음 회로 라이브러리 함수가 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 (일반적으로 100\geq 100 )을 명시적으로 사용하지 않고 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, ModularAdderGateMultiplierGate 게이트에 대한 기본 정의를 추가하여 Operator를 이러한 게이트를 포함하는 양자 회로로 구성할 수 있습니다.

  • 에 필요한 클린 앤실라 큐비트 수를 수정했습니다 FullAdderSynthesisV95, HalfAdderSynthesisV95ModularAdderSynthesisV95 플러그인.

  • 누락 된 추가 FullAdderSynthesisDefault 사용 가능한 깨끗한 아실라 큐비트 수에 따라 최적의 분해를 선택하는 FullAdderGate 에 가장 적합한 분해를 선택하는 누락된 플러그인을 추가했습니다.

  • 수정됨 HalfAdderSynthesisDefaultModularAdderSynthesisDefault 플러그인 HalfAdderGateModularAdderGate 를 각각 사용하여 사용 가능한 깨끗한 앤실라 큐비트 수에 따라 최상의 분해를 선택합니다.

  • 매개변수 할당 중 잘못된 캐싱 동작을 수정하여 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, ConsolidateBlocksUnitarySynthesis. 포팅된 패스의 전체 목록은 기능 릴리스 노트에서 확인할 수 있습니다.

  • 컴파일 품질과 회로 구성 속도를 향상시키는 회로 라이브러리가 개선되었습니다. 이제 작업은 다음과 같이 구분됩니다:

    • 구조 연산은 고유한 분해를 가지며, 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")
    _images/release_notes-1.png
  • 두 개의 nn -쿼비트 레지스터( abaa+b|a\rangle |b\rangle \mapsto |a\rangle |a+b\rangle )를 제자리에 추가하기 위한 이진 산술 게이트가 추가되었습니다. 그리고 ModularAdderGate 는 더하기 모듈로 2n2^n 를 구현하고 HalfAdderGate 에는 캐리 아웃 큐비트가 포함되며 FullAdderGate 는 캐리 인 큐비트와 캐리 아웃 큐비트를 모두 포함합니다. 자세한 내용과 예시는 각 문서를 참조하세요.

    다음과 같은 기존 라이브러리 회로와 달리 CDKMRippleCarryAdder와 같은 기존 라이브러리 회로와 달리 추상 게이트를 처리하면 컴파일러(또는 사용자)가 회로의 컨텍스트에 따라 최적의 게이트 합성을 선택할 수 있습니다.

  • 를 추가했습니다 MultiplierGate 를 두 개의 nn -쿼비트 레지스터, 즉 ab0abab|a\rangle |b\rangle |0\rangle \mapsto |a\rangle |b\rangle |a \cdot b\rangle 로 곱하기 위해 추가했습니다. 자세한 내용과 예제는 클래스 설명서를 참조하세요.

  • 의 부울 논리 양자 회로는 qiskit.circuit.library 의 양자 회로는 이제 다음과 같은 Gate 객체로 동등하게 표현되어 HighLevelSynthesis 트랜스파일러 패스 및 플러그인 인프라에서 사용할 수 있습니다.

  • 의 특수 구현이 __eq__() 의 특수 구현이 모든 표준 라이브러리 서킷 게이트에 추가되었습니다. 대부분의 표준 게이트는 이미 이 방법을 특화했지만 일부는 그렇지 않아 예상치 못한 곳에서 상당한 속도 저하를 일으킬 수 있습니다.

  • 추가 evolved_operator_ansatz(), hamiltonian_variational_ansatz()qaoa_ansatz() 를 회로 라이브러리에 추가하여 연산자 진화에 따른 가변 회로를 구현했습니다. evolved_operator_ansatz()qaoa_ansatz() 는 기능적으로 EvolvedOperatorAnsatzQAOAAnsatz와 기능적으로 동일하지만 일반적으로 성능이 더 뛰어납니다.

    는 하나의 해밀턴을 가지고 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')
    _images/release_notes-2.png
  • 새로운 데이터 속성 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')
    _images/release_notes-3.png
  • 다중 제어 다중 대상 작업을 게이트로 나타내기 위해 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 객체로 표현되거나 합성 방법을 사용하여 구성할 수 있습니다:

  • 클래스가 CommutationChecker 클래스가 Rust에서 재작성되었습니다. 이 클래스는 이전과 동일한 기능과 공용 API를 유지하지만 대부분의 경우 훨씬 더 빨라졌습니다.

  • PauliFeatureMapZZFeatureMap 는 이제 키가 큐비트 수를 나타내고 값이 서로 얽힌 큐비트를 정의하는 정수 튜플 목록인 사전으로 얽힘을 지정하는 것을 지원합니다. 이를 통해 특정 양자 알고리즘에 맞춘 피처 맵을 보다 유연하게 구성할 수 있습니다. 사용 예:

    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, ZFeatureMapZZFeatureMap보다 빠르며 향후 이를 대체할 예정입니다.

    이 기능은 드롭인 대체 기능으로 사용할 수 있습니다:

    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 결과로 처리됩니다.

  • EstimatorStatevectorEstimator 는 입력 회로에 일부 하위 시스템에 대한 리셋이 포함된 경우 확률적 방식으로 기대값을 반환합니다. 이전에는 결과를 재현할 수 없었지만 이제 무작위 시드를 설정하면 재현할 수 있습니다. 예를 들어,

    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_paramsnum_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와 유사하지만 두 가지 핵심적인 차이점이 있습니다:

    1. 각 완전한 용어는 (사실상) 일련의 (qubit, bit_term) 쌍으로 저장되며, 해당 용어의 ID를 거치는 큐비트를 저장하지 않습니다. 이렇게 하면 폴리스 가중 합과 같은 관측값의 메모리 사용량이 크게 개선됩니다 iciZi\sum_i c_i Z_i.
    2. 단일 큐비트 용어 알파벳은 연산자 공간에 대해 지나치게 불완전합니다; 폴리 연산자(예 SparsePauliOp)를 나타낼 수 있을 뿐만 아니라 00\lvert 0\rangle\langle 0\rangle 와 같이 폴리 연산자의 고유 상태에 투영할 수도 있습니다. 이러한 프로젝터는 해당 Pauli 연산자와 똑같이 효율적으로 하드웨어에서 측정 할 수 있지만 SparsePauliOpnn 큐비트에서 00n{\lvert0\rangle\langle0\rvert}^{\otimes n} 를 표현하기 위해 기하급수적인 수의 항이 필요하지만, 반면 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()kk 를 사용하여 k2k - 2 더티 보조 큐비트를 사용하여 최대 8k68 * k - 6 CX 게이트가 있는 회로를 생성하는 다중 제어 X 게이트를 합성하는 합성 함수(Iten et al. al. (arXiv:1501.06911).

  • 합성 함수 추가 synth_mcx_n_clean_m15()kk 를 사용하여 k2k - 2 클린 보조 큐비트를 사용하여 최대 6k66 * k - 6 CX 게이트가 있는 회로를 생성하는 다중 제어 X 게이트를 합성하는 합성 함수( arXiv:1508.03273 )를 추가합니다.

  • 합성 함수 추가 synth_mcx_1_clean_b95() 를 추가하여 단일 클린 보조 큐비트를 사용하여 kk 제어가 있는 다중 제어 X 게이트를 합성하여 최대 16k816 * k - 8 CX 게이트가 있는 회로를 생성합니다(Barenco 등, arXiv:quant-ph/9503016 ).

  • 추가 adder_qft_d00(), adder_ripple_c04()adder_ripple_v95() 를 추가하여 가산기 게이트를 합성합니다, ModularAdderGate, HalfAdderGateFullAdderGate.

  • 추가 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')
    _images/release_notes-4.png

    이 코드 스니펫은 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 으로 설정하면 다음과 같은 형식의 용어가 됩니다

Z0Z1+X1X2+Y2Y3Z_0 Z_1 + X_1 X_2 + Y_2 Y_3

로 재주문됩니다

Z0Z1+Y2Y3+X1X2Z_0 Z_1 + Y_2 Y_3 + X_1 X_2

를 사용하면 첫 번째 부분에서 세 번의 순차적 회전이 아닌 RZZRYY 회전이 병렬로 적용됩니다.

이 옵션은 플러그인 인터페이스를 통해 설정할 수 있습니다:

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')
_images/release_notes-5.png

트랜스파일러 기능

  • 인수를 추가 matrix_based CollectCliffords 트랜스파일러 패스에 추가합니다. 새 파라미터가 matrix_based=True 인 경우 CollectCliffords 트랜스파일러 패스는 특정 파라미터에 대해 클리포드 게이트인 단일 게이트를 수집할 수 있습니다(예 RZGateπ/2\pi / 2 의 배수인 각도를 가진 게이트를 수집할 수 있습니다.

  • 트랜스파일러 패스는 RemoveIdentityEquivalent 트랜스파일러 패스는 이제 최적화 레벨 2와 3에서 프리셋 패스 관리자의 일부로 실행됩니다. 패스는 initoptimization 단계에서 실행되며, 적용되는 최적화가 두 단계 모두에 유효하고 패스의 실행 속도가 빠르기 때문입니다.

  • 합성을 위한 여러 하이 레벨 합성 플러그인을 추가했습니다 MCXGate:

    또한 다음도 리턴됩니다.

    • 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)
    _images/release_notes-6.png

    첫 번째 MCX 게이트의 경우, 큐비트 56 을 클린 부호로 사용할 수 있으며, 사용 가능한 최상의 합성 방법 synth_mcx_n_clean_m15 이 선택됩니다. 두 번째 MCX 게이트의 경우, qubit 6 을 클린 앤실라로 사용할 수 있으며, 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 으로 설정하면 큐비트가 처음에 0|0\rangle 상태인 것으로 간주되어 개별 트랜스파일러 패스에 대한 추가 최적화 기회를 제공할 수 있습니다. 특히 HighLevelSynthesis 트랜스파일러 패스는 회로의 각 게이트에 대해 더 나은 분해를 선택합니다 MCXGate0|0\rangle 상태의 유휴 보조 큐비트를 사용할 수 있을 때 회로의 각 게이트에 대해 더 나은 분해를 선택합니다.

    그러나 큐비트를 제대로 초기화하지 않는 백엔드에 대한 트랜스파일링이나 더 큰 양자 회로의 하위 회로에서 수동으로 트랜스파일러 패스를 호출하는 경우처럼 qubits_initially_zeroFalse 으로 설정해야 하는 경우가 있습니다.

  • 트랜스파일러 패스의 생성자는 HighLevelSynthesis 트랜스파일러 패스의 생성자는 이제 추가 인수를 허용합니다: qubits_initially_zero. True 로 설정하면 패스는 큐비트가 처음에 0|0\rangle 상태에 있다고 가정합니다. 또한 패스는 실행 내내 깨끗한 보조 큐비트와 더티 보조 큐비트를 추적하고, 이 정보를 kwargs num_clean_ancillasnum_dirty_ancillas 를 사용하여 플러그인에 전달합니다.

  • 트랜스파일러 패스에서 안실라 큐비트 처리가 개선되었습니다 HighLevelSynthesis 트랜스파일러 패스의 큐비트 처리가 개선되었습니다. 예를 들어 회로에 다음과 같은 정의가 있는 사용자 정의 게이트가 있을 수 있습니다 MCXGates. 이제 내부의 합성 알고리즘은 MCXGate의 합성 알고리즘은 글로벌 회로에서 사용 가능하지만 커스텀 게이트의 정의를 벗어난 앤실라 큐비트를 사용할 수 있습니다.

  • 새로운 메서드 추가 DAGCircuit.control_flow_op_nodes() 메서드를 추가하여 DAGOpNodeDAGCircuit 를 포함하는 ControlFlowOp. 메서드를 사용하고 DAGCircuit.op_nodes() 메서드를 사용하고 ControlFlowOp 클래스를 필터로 전달하기 전에도 가능했지만, 이 새로운 함수는 작업을 더 빠르게 수행합니다.

  • 프리셋 패스 관리자에서 사용되는 대부분의 트랜스파일러 패스는 다음에서 반환하고 generate_preset_pass_manager() 에 의해 반환되고 내부적으로 사용되는 transpile() 에서 반환하고 내부적으로 사용하는 대부분의 패스가 Rust로 포팅되었습니다. 이를 통해 각 패스의 런타임 성능이 크게 향상되어 트랜스파일러의 전반적인 운영 효율성이 크게 개선되었습니다. 이번 릴리스에서 Rust로 포팅된 패스 목록은 다음과 같습니다:

  • 새로운 트랜스파일러 패스를 추가했습니다, RemoveIdentityEquivalent 를 추가하여 일정 허용 오차 범위까지 아이덴티티에 해당하는 게이트를 제거하는 데 사용합니다. 예를 들어 다음과 같은 회로가 있다고 가정해 보겠습니다:

    _images/release_notes-7.png

    패스를 실행하면 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")
    _images/release_notes-8.png
  • 이제 ConsolidateBlocks 패스는 이제 내부적으로 Collect2qBlocks 패스가 패스 관리자에서 실행되지 않은 경우 내부적으로 실행됩니다. 이전에는 Collect2qBlocks 또는 Collect1qRuns 이전에 실행해야 했거나 ConsolidateBlocks for ConsolidateBlocks 실행해야 했습니다. 내부에서 수집을 수행하면 패스로 인한 오버헤드가 줄어듭니다. 만약 Collect2qBlocks 또는 Collect1qRuns 가 이전에 실행되는 경우 ConsolidateBlocks이전에 실행되는 경우 속성 집합에서 해당 패스에 의해 수집된 실행이 사용되며 패스에 대한 동작은 변경되지 않습니다.

  • 트랜스파일러 패스에 RemoveDiagonalGatesBeforeMeasure 트랜스파일러 패스가 더 많은 대각선 게이트를 포함하도록 업그레이드되었습니다: PhaseGate, CPhaseGate, CSGate, CSdgGateCCZGate. 또한 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을 사용하는 것이 좋습니다.

업그레이드 주의사항

  • 이제 다음 클래스에서는 X\sqrt{X} 연산을 사용하여 폴리-Y 연산자를 대각선화합니다: PauliEvolutionGate, EvolvedOperatorAnsatzPauliFeatureMap. 이전에는 이러한 클래스에서 HSH S 또는 RX(π/2)R_X(-\pi/2) 을 기본 변환으로 사용했습니다. X\sqrt{X} 연산으로 표시되는 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, DAGOutNodeDAGOpNode)는 더 이상 동일한 기본 객체에 대한 참조를 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() 는 이제 큐비트가 처음에 0|0\rangle 상태에 있다고 가정합니다. 이 가정을 피하기 위해 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 패키지 사용 중단의 일환으로, 다음 종속성들도 사용 중단됩니다:

  • 그리고 QuantumCircuit.unitQuantumCircuit.duration 속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 속성은 회로에서 실행할 예상 기간과 해당 기간의 단위를 추적하는 데 사용되었습니다. 그러나 이러한 속성의 값은 올바른 설정으로 트랜스파일러를 실행할 때만 제대로 채워지기 때문에 항상 제한적이었습니다. 지속 시간도 다음 지속 시간의 합에서 가장 긴 경로를 기반으로 한 추측에 불과했습니다 DAGCircuit 의 길이를 합한 가장 긴 경로를 기반으로 한 추측일 뿐이며 회로의 제어 흐름이나 조건을 제대로 설명하지 못했습니다.

  • 그리고 DAGCircuit.unitDAGCircuit.duration 속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 속성은 회로에서 실행할 예상 기간과 해당 기간의 단위를 추적하는 데 사용되었습니다. 그러나 이러한 속성의 값은 올바른 설정으로 트랜스파일러를 실행할 때만 제대로 채워지기 때문에 항상 제한적이었습니다. 지속 시간도 다음 지속 시간의 합에서 가장 긴 경로를 기반으로 한 추측에 불과했습니다 DAGCircuit 의 길이를 합한 가장 긴 경로를 기반으로 한 추측일 뿐이며 회로의 제어 흐름이나 조건을 제대로 설명하지 못했습니다.

  • 그리고 Instruction.durationInstruction.unit 속성은 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 여기에는 unit 또는 duration 인수를 설정하는 것이 포함됩니다 qiskit.circuit.Instruction 또는 서브클래스에 대한 인수를 설정합니다. 이러한 속성은 개별 인스트럭션에 사용자 지정 실행 기간과 해당 기간의 단위를 첨부하는 데 사용되었습니다. 그러나 게이트 기간의 진실의 출처는 BackendV2 Target 에 백엔드에서 지원되는 각 인스트럭션의 지속 시간이 포함되어 있습니다. 인스트럭션의 지속 시간은 일반적으로 사용자가 조정할 수 있는 것이 아니며 백엔드의 불변 속성입니다. 이전에 이 기능을 사용하여 게이트의 다양한 지속 시간을 실험했다면, 주어진 게이트의 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.BackendV2Converterqiskit.providers.fake_provider.GenericBackendV2 클래스의 해당 채널 메서드도 더 이상 사용되지 않습니다.

    또한, pulse_channelscalibrate_instructions 인수는 BackendV2 초기화 메서드의 인수는 더 이상 사용되지 않습니다.

  • defaults 인수는 함수에서 더 이상 사용되지 않습니다 qiskit.providers.convert_to_target() 함수에서 사용되지 않습니다.

QPY 사용 중단 사항

트랜스파일러 사용 중단 사항

  • 사용 중단됨 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 관련 기능들이 사용 중단 예정입니다. 주요 내용은 다음과 같습니다.


    또한, 다음 트랜스파일러 패스도 더 이상 사용되지 않을 예정입니다:

  • 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.

기타 지원 중단

버그 수정

  • 타이트 루프에서 메서드를 호출할 때 발생하는 성능 회귀를 수정했습니다 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.25

    13478 수정.

  • "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, SXGateSXdgGate 게이트를 이 트랜스파일러 패스에 추가했습니다.

  • 버그를 수정했습니다 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 의 내장 숫자 유형(예: floatint)의 인스턴스와 동일하게 비교되는 완전 바인딩 인스턴스도 다른 인스턴스의 해시값과 일치하는 해시값을 갖도록 업데이트되었습니다. 이 변경으로 이러한 유형을 사전 키로 상호 교환하여 사용할 수 있습니다. 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() 는 이제 1-1 고유값을 가진 단일 행렬의 소수 행렬 거듭제곱에서 예상되는 원금을 더 안정적으로 반환합니다. 일반적으로 부동 소수점 반올림 효과로 인해 행렬이 분기 컷의 음의 쪽에 고유값을 가질 수 있고(정확한 수학적 관계는 그렇지 않더라도) 다양한 BLAS 호출의 부정확성으로 인해 분기 컷의 잘못된 쪽을 잘못 찾을 수 있기 때문에 이는 까다로운 작업입니다.

    Operator.power() 이제 행렬 연산자의 분기 절단 위치가 1-1 에서 약간 복잡한 회전으로 이동합니다. 이것은 문제를 해결하는 것이 아니라 일반적으로 나타나는 연산자 유형에서 눈에 띄지 않는 위치로 이동하는 것일 뿐입니다. 새로운 branch_cut_rotation 매개변수를 사용하여 이를 보다 효과적으로 제어할 수 있습니다.

    13305번을 참조하세요.

  • 의 프로세스별 비결정성을 수정했습니다 SparsePauliOp.to_matrix(). 합계에서 부동 소수점 연산의 정확한 순서는 이전에는 프로세스마다 달랐지만 이제 동일한 스크립트의 여러 호출 간에 동일하게 적용됩니다. 13413번을 참조하세요.

  • Target.has_calibration() 는 인스트럭션 속성에 None 를 사용하여 대상에 추가된 인스트럭션에 대해 예외를 발생시키지 않도록 업데이트되었습니다. 수정 #12525.

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