Skip to main content
IBM Quantum Platform

키스킷 SDK 1.2 릴리즈 노트


1.2.4

Prelude

키스킷 1.2.4 은 1.2.3 버그 수정 릴리스에서 발생한 QPY 문제를 수정하는 패치 릴리스입니다. 1.2.3 에서 로드할 때 설치된 버전과 다른 심엔진 버전으로 생성된 QPY 파일을 로드할 때 오류가 발생했습니다.

버그 수정

  • 현재 삭제된 1.2.3 버그픽스 릴리스에 도입된 문제로, 로드 시 설치된 버전과 다른 심엔진 버전으로 생성된 QPY 파일을 로드할 때마다 "Qiskit은 심엔진 >= 1.0 으로 생성된 심엔진 페이로드 로드를 지원하지 않습니다."라는 오류 메시지와 함께 예외가 발생하는 문제를 수정했습니다. 이 문제는 1.2.3 에서만 발생할 수 있습니다.

1.2.3

Prelude

Qiskit 1.2.3 은 한 Python 환경에서 생성된 파일이 전송 가능한 형식임에도 불구하고 다른 Python 환경에서 로드되지 않을 수 있는 문제를 수정하는 패치 릴리스입니다. 이는 QPY가 보호해야 하는 라이브러리 symengine 의 버전 차이와 관련이 있습니다.

알려진 문제점

  • 1.2.4 이전 버전의 키스킷은 다음을 사용하여 덤프한 QPY 파일을 로드할 수 없습니다 qpy.dump()version 를 적절하게 설정하더라도 QPY 파일을 로드할 수 없습니다:

    • 파일에 바인딩되지 않은 ParameterExpression 객체가 있습니다,
    • use_symengine=True 플래그(키스킷 >= 1.0.0 )가 설정되어 있고 qpy.dump()
    • 생성 및 로딩 환경에 설치된 symengine 버전이 동일한 부 버전에 속하지 않습니다.

    이는 해당 세대에 사용된 키스킷 버전에 관계없이 적용됩니다(최소한 키스킷 1.2.4 포함).

    키스킷 버전과의 호환성을 극대화하려면 < 1.2.3, you should set use_symengine=False. Versions of Qiskit > = 1.2.3 이 필요하지 않아야 합니다.

  • 키스킷 0.45 시리즈의 QPY 파일은 매우 구체적이고 가능성이 희박한 상황에서 키스킷 1.2.4 을 포함한 최신 버전의 키스킷에서 로드되지 않을 수 있습니다. 기준은 다음과 같습니다.

    • 또는 QuantumCircuit 또는 ScheduleBlock 덤프 대상에 바인딩되지 않은 ParameterExpression 객체를 포함해야 합니다,
    • symengine 의 설치 버전은 0.9 시리즈(키스킷 0.45 의 지원 기간 중 가장 최근 릴리스)였습니다
    • 기본값이 아닌 use_symengine=True 플래그가 설정되었습니다.

    생성 시 사용된 이후 버전의 키스킷은 symengine 0.9 보다 최신 버전이 필요하기 때문에 영향을 받지 않습니다.

    이 경우 Qiskit 0.45.3 및 symengine 0.9.2 이 설치된 환경으로 다시 로드하여 QPY 파일을 복구할 수 있습니다. 그런 다음 qpy.dump() 와 함께 use_symengine=False 를 사용하여 파일을 다시 내보냅니다. 그러면 모든 최신 버전의 키스킷에서 읽을 수 있습니다.

업그레이드 주의사항

  • 지원되는 심엔진 버전은 < 0.14.0 (이번 키스킷 릴리스 기준, 다음 마이너 버전이 될 것으로 예상됨)로 선제적으로 제한되었습니다. 이것은 잠재적인 비호환성을 방지하기 위해 수행되었습니다 qpy 객체를 직렬화할 때 ParameterExpression 객체를 직렬화할 때 발생할 수 있는 비호환성을 방지하기 위한 것입니다. QPY 형식 버전 10, 11 및 12에서 객체에 대해 사용되는 직렬화는 ParameterExpression 객체에 사용되는 직렬화는 이를 생성하는 데 사용된 심엔진 버전과 연결되어 있으며, 향후 심엔진 릴리스가 호환되지 않을 가능성이 있습니다. 이 상위 버전 제한은 향후 심 엔진 릴리스에서 QPY 파일을 로드할 때 qpy.load().

버그 수정

  • 다음과 관련된 문제를 수정했습니다 qpy.load() 가 포함된 QPY 파일을 로드할 때 ParameterExpression가 포함된 QPY 파일을 로드할 때 생성 환경과 로드 환경에 설치된 symengine 의 버전이 동일하지 않은 경우 발생하는 문제를 수정했습니다. 예를 들어, 객체가 포함된 QPY 파일이 ParameterExpression 객체가 포함된 QPY 파일을 symengine==0.11.0 이 설치된 키스킷 1.2.2 을 사용하여 생성했다면, 1.2.2 이 설치된 키스킷 symengine==0.13.0 은 이 파일을 로드할 수 없습니다.

    이전에는 이 버전 불일치에 대해 symengine 에서 오류가 발생했을 것입니다. symengine 0.11 및 0.13 ( 0.12 )에서 이 문제를 해결했습니다. 그러나 symengine 의 다른 버전을 사용하려고 하는데 불일치가 있는 경우, 이 버전의 키스킷이 여전히 작동하지 않을 수 있습니다.


1.2.2

Prelude

키스킷 1.2.2 은 1.2 시리즈의 사소한 버그 수정 릴리스입니다.

버그 수정

  • 트랜스파일러 패스의 버그 수정 ElidePermutations 가 있을 때 큐비트 매핑이 올바르게 업데이트되지 않던 버그를 수정했습니다 PermutationGates.

  • 에서 비결정성의 잠재적 원인을 수정했습니다 DenseLayout (그리고 더 나아가 SabreLayout) 타깃팅할 때 CouplingMap 또는 Target 하위 그래프에서 동일한 수준의 연결성을 가진 두 개 이상의 하위 그래프를 대상으로 할 때 발생할 수 있는 비결정성을 수정했습니다. 이 경우 패스의 정확한 출력 레이아웃은 이전에는 로컬 CPU 수와 스레드 실행 속도에 따라 변동될 수 있었습니다.

  • 트랜스파일러 패스의 HighLevelSynthesis 트랜스파일러 패스는 더 이상 "qft"라고 불리지만 인스턴스가 아닌 사용자 정의 게이트를 만날 때 예외를 발생시키지 않습니다 QFTGate. 대신 QFT 게이트용 합성 플러그인은 이러한 게이트를 무시하고 게이트의 정의가 사용됩니다(제공된 경우).

  • 회로 서랍의 버그를 수정하여 idle_wires=False 에서 전선이 끊어지거나 누락될 수 있는 버그가 수정되었습니다. 1312813146을 수정했습니다.

  • 호출할 때 발생하는 문제를 수정했습니다 transpile() 또는 메서드 StagedPassManager.run() 에 의해 생성된 패스 매니저의 generate_preset_pass_manager()routing_method 인수가 "none" 로 설정된 경우 optimization_level 2 또는 3을 사용하여 라우팅을 명시적으로 비활성화할 때 발생하는 문제를 수정했습니다. 이전에는 이러한 조건에서 트랜스파일러가 초기화 단계의 일부로 ElidePermutations 패스를 초기화 단계의 일부로 실행했는데, 이는 일반적인 조건에서 유용한 최적화이므로 SwapGatePermutationGate 인스턴스를 제거하는 데 유용한 최적화였습니다. 그러나 routing_method="none" 의 경우 이 최적화는 라우팅과 유사한 방식으로 회로를 순열하기 때문에 예상치 못한 최적화이며, routing_method="none" 의 경우 수행해서는 안 됩니다. 더 이상 실행하지 않음으로써 이 문제가 해결되었습니다 ElidePermutationsrouting_method="none" 를 더 이상 실행하지 않음으로써 수정되었습니다. 수정 #13144.

  • OpenQASM 3 내보내기는 includes 인수의 비표준 라이브러리 포함 파일을 허용하는 동작을 다음과 같이 복원했습니다 qasm3.dump(), dumps()로, 그리고 Exporter. 이렇게 하면 이전과 마찬가지로 출력에 적절한 include 문이 삽입되며 내보내기는 해당 include 파일에서 의도한 게이트를 인식하지 못하므로 basis_gates 인수에서 정의할 것으로 예상되는 게이트를 동일한 함수에 전달해야 합니다.

    향후 키스킷 릴리스에서 비표준 포함 파일에 대한 내보내기 메커니즘을 개선할 예정입니다.


1.2.1

Prelude

키스킷 1.2.1 은 1.2 시리즈의 사소한 버그 수정 릴리스입니다.

버그 수정

  • 일부 백엔드/커플링 맵의 시각화에서 자체적으로 접힌 것으로 표시되던 문제를 수정했습니다. 기본 ``neato` 설정 <https://graphviz.org/docs/layouts/neato/> `_은 대부분의 경우 잘 작동합니다. 그러나 prism 겹침은 다른 시나리오에 대해 보다 일반적인 레이아웃을 반환합니다.

  • 파라메트릭으로 제어되는 표준 라이브러리 게이트(예 CRXGate)를 사용할 때 이제 Rust 공간 표준 게이트로 올바르게 추출됩니다 QuantumCircuit.append() 와 게이트 객체를 사용할 때 올바르게 추출됩니다. 이전에는 메서드를 사용할 경우 QuantumCircuit.crx() 메서드를 사용하면 Rust 공간에서 올바른 추출이 이루어지지만 append() 양식에서는 그렇지 않은 경우가 있었습니다. 이 버그로 인해 일반적으로 Python 에서 문제가 발생하지 않아야 합니다.

  • 버그 수정 TwoQubitBasisDecomposer 의 버그를 수정했습니다. 주어진 KAK 게이트가 표준 게이트의 기본 버전이 아닌 경우(예: CXGate(ctrl_state=0) 사용) Rust 기반 코드가 패닉에 빠지는 버그입니다. 수정 #12998.

  • 다음과 같은 버그가 수정되었습니다 InstructionDurations.from_backend() 가 백엔드에서 BackendV2 백엔드에서 작동하지 않는 버그를 수정했습니다. 12760 수정.

  • 행렬의 정의를 수정했습니다 CUGate 행렬의 정의를 수정했습니다. 이것은 순수하게 CUGatePython 를 처리할 때는 눈에 띄지 않았지만, 트랜스파일러 패스가 Rust 표현을 사용할 때는 Consolidate2qBlocks 에서와 같이 노크 효과가 발생했습니다. 수정 #13118.

  • 제어된 게이트가 단순화되었지만 새 게이트가 제대로 처리되지 않던 HoareOptimizer 에서 제어 게이트를 제거하여 단순화했지만 새 게이트가 올바르게 처리되지 않는 버그가 수정되었습니다. 13079 수정.

  • generate_preset_pass_manager() 가 잘못된 값으로 설정된 경우(즉, 음수가 아닌 정수가 아닌 경우) 이제 seed_transpiler 가 올바르게 예외를 발생시킵니다. 12938번 수정.

  • 의 에지 케이스가 수정되었습니다 SabreLayout에서 대형 디바이스나 까다로운 회로에서 드물게 라우팅이 실패하는 에지 케이스를 수정했습니다. 이는 릴리스 밸브가 하나만 예상되던 2쿼비트 게이트를 두 개 이상 라우팅할 수 있게 만들었기 때문입니다. 13081 수정.

  • 버그 수정 Split2QUnitaries 의 버그를 수정했습니다 Gate__array__ 객체를 구현하지 않은 회로에서 실행되지 않는 버그를 수정했습니다. 12970을 참조하세요.

  • 의 버그를 수정했습니다 StatePreparation 에서 입력 배열에 대해 normalize 인수가 무시되던 버그를 수정했습니다. 수정 #12984.

  • 다양한 합성 방법이 양자 또는 클래식 레지스터 없이 회로를 생성하던 버그를 수정했습니다. 이는 다음과 같이 내부적으로 합성 방법을 사용하는 함수에도 영향을 미쳤습니다 Clifford.to_circuit(). 회로는 유효하지만 회로를 레지스터와 비교할 때 문제가 발생할 수 있습니다. 13041 수정.

  • 메서드 실패를 유발하는 버그를 수정했습니다 Initialize.gates_to_uncompute() 메서드가 실패하는 버그를 수정했습니다. 12969 수정.

  • 2큐비트 게이트가 포함된 회로에 불완전한 1큐비트 기준 게이트가 설정된 optimization_level 2 또는 3으로 회로를 트랜스파일할 때 단일 큐비트 게이트의 곱으로 구현할 수 있는 에지 케이스를 수정했습니다. 이 버그는 다음과 같이 제한하여 해결되었습니다 Split2QUnitaries 만 고려하도록 UnitaryGate 객체만 고려하도록 제한하면 해결됩니다. 12970 수정.


1.2.0

Prelude

키스킷 1.2.0 릴리스는 주로 컴파일러의 성능과 품질을 개선하는 데 중점을 둡니다. 또한 Python 3.8 을 지원하는 마지막 릴리스입니다. 키스킷 1.3.0 에서 필요한 최소 Python 버전은 3.9 입니다. 다양한 새로운 기능, 개선 사항 및 수정 사항 중에서 이번 릴리스의 주요 내용은 다음과 같습니다:

  • 게이트와 운영을 포함한 서킷 인프라가 Rust로 이전됩니다. 이를 통해 회로 구성 및 회로 조작 속도를 크게 높일 수 있습니다.
  • 위의 점을 활용하여 합성 라이브러리의 일부가 이제 Rust에서 회로를 구성하고 있습니다. 이렇게 하면 클리포드, 순열 또는 선형 함수와 같은 연산을 합성할 때 속도가 크게 빨라집니다. 예를 들어 50개 이상의 큐비트 클리포드를 분해하면 런타임에서 약 1000배의 속도 향상 효과를 얻을 수 있습니다.
  • 컴파일된 회로의 품질은 트랜스필레이션 워크플로우의 초기 단계에서 단일 피홀 최적화(최적화 수준 >1)로 최적화하고, 세이버 레이아웃 시험(최적화 수준 >0)으로 고밀도 레이아웃을 사용하여 개선합니다.

새 기능

  • 새로운 클래스 추가 QFTGate 클래스를 추가했습니다. 양자 회로를 통해 QFT를 표현하는 이전 방식( QFT는 이전 버전과의 호환성을 위해 그대로 유지됩니다. 게이트를 통해 QFT를 표현하는 새로운 방식은 게이트가 선언될 때 정의 회로를 합성하지 않으므로 실제 합성이 트랜스파일러로 지연됩니다. 또한 고급 합성 플러그인으로 사용할 수 있는 여러 가지 알고리즘 중에서 QFT 합성을 위한 알고리즘을 쉽게 선택할 수 있습니다.

  • 합성 메서드 추가 synth_qft_full() 를 추가하여 완전히 연결된 아키텍처를 가정한 QFT 회로를 구성할 수 있습니다.

  • 합성을 위한 두 개의 하이 레벨 합성 플러그인이 추가되었습니다 QFTGate. 클래스 QFTSynthesisFull 클래스는 synth_qft_full() 를 기반으로 하며, 올투올 연결을 가정하여 QFT 게이트를 합성합니다. 클래스 QFTSynthesisLine 클래스는 synth_qft_line() 를 기반으로 하며 선형-최근접 이웃 연결을 가정하여 QFT 게이트를 합성합니다.

  • 에 두 개의 매개변수를 추가했습니다 GenericBackendV2 에 오류(noise_info)와 펄스 채널 정보(pulse_channels)를 백엔드 구성에서 제외하기 위한 두 개의 매개변수를 추가했습니다. 이러한 매개변수는 기본적으로 True 이며, 생성자의 초기 기본 동작을 복제합니다. 메모리에 민감한 사용자는 이 옵션을 False 으로 설정하여 대규모로 트랜스파일링할 때 메모리 오버헤드를 40x 만큼 줄일 수 있습니다 GenericBackendV2.

  • 클래스의 StabilizerState 클래스에는 이제 새로운 메서드 StabilizerState.probabilities_dict_from_bitstring() 메서드가 추가되어 사용자가 결과를 측정할 단일 비트스트링을 전달할 수 있습니다. 이전에는 StabilizerState.probabilities_dict() 가 사용되어 사용자가 단일 결과를 원하더라도 최악의 경우 (상태에 따라) 확률 계산 횟수( 2n2^n )를 계산했습니다. 이 새로운 방법을 사용하면 사용자가 확률을 측정하기 위해 전달한 단일 결과 비트 문자열 값만 계산할 수 있습니다. 큐비트 수가 증가할수록 비트 문자열 결과가 1개만 측정되기 때문에 (상태에 따라) 성능 향상이 더 두드러질 수 있습니다.

  • 슈클라-베둘라 알고리즘을 사용하여 균일한 중첩 상태를 생성할 수 있는 UniformSuperpositionGate 클래스를 구현했습니다. 이 기능은 진폭이 1M\frac{1}{\sqrt{M}} 인 계산 기저 상태의 수를 나타내는 양의 정수인 MM 을 사용하여 균일한 중첩 상태( 1Mj=0M1j\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle )를 생성하는 양자 회로를 쉽게 만들 수 있습니다. 이 구현은 O(log2(M))O(\log_2 (M)) 큐비트와 O(log2(M))O(\log_2 (M)) 게이트만 있으면 균일한 중첩 상태를 효율적으로 생성할 수 있도록 지원합니다. 사용 예제:

    from qiskit import QuantumCircuit 
    from qiskit.circuit.library.data_preparation import UniformSuperpositionGate
    
    M = 5
    num_qubits = 3
    usp_gate = UniformSuperpositionGate(M, num_qubits)
    qc = QuantumCircuit(num_qubits)
    qc.append(usp_gate, list(range(num_qubits)))
    
    qc.draw()

회로 기능

  • 새로운 기능 추가 random_clifford_circuit()qiskit.circuit에 표준 라이브러리의 게이트로 의사 랜덤 클리포드 회로를 생성할 수 있는 새로운 함수를 추가했습니다. 사용 예:

    from qiskit.circuit.random import random_clifford_circuit
    
    circ = random_clifford_circuit(num_qubits=2, num_gates=6)
    circ.draw(output='mpl')
    _images/release_notes-1.png
  • 에 대한 지원이 추가되었습니다 AnnotatedOperation.paramsAnnotatedOperation.validate_parameter()를 지원하여 주석이 달린 연산을 위한 회로 수준 매개변수 처리(예: 바인딩 매개변수)를 가능하게 합니다.

  • CircuitInstructionDAGOpNode 에는 각각 내부의 다양한 프로퍼티를 쿼리하는 새로운 메서드가 있습니다 Operation의 다양한 프로퍼티를 쿼리할 수 있습니다. 이러한 방법은 다음과 같습니다.

    해당되는 경우 이러한 방법을 사용하면 쿼리하는 것보다 CircuitInstruction.operation 또는 DAGOpNode.op 를 직접 사용하는 것보다 훨씬 빠릅니다. 특히 명령어나 노드가 키스킷 표준 게이트를 나타내는 경우 더욱 그렇습니다. 이는 표준 게이트가 기본적으로 Rust에 저장되어 있고 요청이 있을 때만 Python 표현이 생성되기 때문입니다.

  • 키스킷의 표준 게이트 라이브러리의 네이티브 러스트 표현이 추가되었습니다. 표준 게이트에 QuantumCircuit 또는 DAGCircuit 에 표준 게이트를 추가하면 이제 Rust에서 직접 더 효율적인 방식으로 표현됩니다. 회로 또는 DAG에서 해당 게이트 객체에 액세스하면 표준 게이트를 나타내는 새 Python 객체가 반환됩니다. 이를 통해 Rust로 작성된 기능에 대한 회로를 더 빠르고 효율적으로 변환하고 조작할 수 있습니다.

  • 함수에는 random_circuit() 함수에는 사용자가 무작위 회로에서 1큐비트, 2큐비트, 3큐비트, 4큐비트 게이트의 비율을 지정하는 분포 num_operand_distribution (딕셔너리)를 지정할 수 있는 새로운 기능이 있습니다. 예를 들어 num_operand_distribution = {1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25} 을 함수에 전달하면 생성된 회로는 1큐비트, 2큐비트, 3큐비트, 4큐비트 게이트의 약 25%를 가지게 됩니다. 또한 num_operand_distribution 을 지정하지 않으면 max_operands 이 기본값으로 4가 되고 무작위 게이트 분포의 랜덤 회로가 생성된다는 점에 유의해야 합니다. num_operand_distributionmax_operands 을 동시에 지정하면 num_operand_distribution 이 무작위 회로를 생성하는 데 사용됩니다.

    사용 예:

    from qiskit.circuit.random import random_circuit
    
    circ = random_circuit(
      num_qubits=6, depth=5, num_operand_distribution={1: 0.25, 2: 0.25, 3: 0.25, 4: 0.25}
    )
    circ.draw(output="mpl")
    _images/release_notes-2.png
  • 메서드 성능 개선 DAGCircuit.quantum_causal_cone() 다른 경로에서 도달할 때 동일한 비지시적 노드를 여러 번 검사하지 않음으로써 메서드의 성능을 개선했습니다.

  • 메서드에 insert_barriers 키워드 인수를 추가했습니다 QuantumCircuit.repeat() 메서드에 추가했습니다. True 으로 설정하면 회로 반복 사이에 장벽이 삽입됩니다.

  • 의 내부 합성 알고리즘을 대체합니다 StatePreparationInitialize 의 내부 합성 알고리즘을 다음과 같은 알고리즘으로 대체합니다 Isometry 의 알고리즘으로 대체합니다. 새로운 알고리즘은 CX 게이트의 수와 회로 깊이를 2배로 줄였습니다.

  • ParameterExpression 이제 단항 + 연산자를 지원합니다.

기본형 기능

  • 새로운 메서드 BitArray.postselect() 지정된 비트값을 포함하는 모든 샷을 반환하는 메서드를 추가했습니다. 사용 예:

    from qiskit.primitives.containers import BitArray
    
    ba = BitArray.from_counts({'110': 2, '100': 4, '000': 3})
    print(ba.postselect([0,2], [0,1]).get_counts())
    # {'110': 2, '100': 4}
  • 프리미티브 V2 구현의 메타데이터, 즉., StatevectorSampler, StatevectorEstimator, BackendSamplerV2BackendEstimatorV2의 메타데이터가 IBM 양자 디바이스의 메타데이터와 일치하도록 업데이트되었습니다.

    의 메타데이터에는 StatevectorEstimator 의 메타데이터에는 shots 가 없으며, 클래스가 기대값을 계산할 때 Statevector 로 기대값을 계산하고 샷은 사용되지 않기 때문입니다.

OpenQASM 기능

  • OpenQASM 3 내보내기의 내부 심볼 테이블(qiskit.qasm3)이 재작성되어 OpenQASM 3 표준 라이브러리 헤더에 없는 키스킷 표준 라이브러리 게이트를 사용할 때 더 깔끔한 출력과 더 결정론적인 출력을 얻을 수 있습니다. 예를 들어, 여러 개의 RZXGate를 여러 개 사용하면 이제 하나의 파라미터 정의만 생성되며, 이름 충돌이 발생하면 심볼 테이블이 비결정적 정수 대신 결정적 카운터를 할당하여 이름을 고유하게 만듭니다(이전에는 객체 ID가 사용됨).

  • OpenQASM 3.0 표준 라이브러리의 공급업체 버전은 커밋 4ca1d79383 시점의 상태와 일치하도록 업데이트되었습니다. 이는 일반적으로 사용자가 직접 사용하기 위해 공급된 파일을 검색하는 경우가 아니라면 키스킷 사용에 아무런 영향을 미치지 않습니다.

합성 기능

  • MCXRecursivekk 제어 큐비트와 하나의 깨끗한 보조 큐비트로 이제 최대 16k816k-8 CX 게이트가 필요합니다.

  • MCXVChain 에는 두 개의 새로운 부울 파라미터 상대_상 및 액션_전용이 있습니다. action_onlyTrue 인 경우 회로는 더러운 큐비트를 청소하지 않습니다. relative_phaseTrue 인 경우 게이트는 글로벌 단계까지 구현됩니다. 두 매개 변수는 모두 분해를 최적화하는 데 사용됩니다 MCXVChain.

  • MCXVChainkk 컨트롤과 k2k-2 더티 보조 큐비트를 사용하려면 이제 8k68k-6 CX 게이트가 필요합니다.

  • 포트 synth_permutation_acg()큐비트 순열을 합성하는 데 사용되는 포트가 Rust로 변경되었습니다. 이렇게 하면 1000큐비트 회로에서 대략 3x 성능이 향상됩니다.

  • 포트 synth_permutation_basic()큐비트 순열을 합성하는 데 사용되는 포트가 Rust로 변경되었습니다.

  • 포트 synth_cnot_count_full_pmh()를 사용하여 선형 함수를 CX 네트워크로 합성하는 데 사용됩니다. 이렇게 하면 100큐비트 회로에서 측정한 결과 약 44x 속도가 향상됩니다.

  • 함수 synth_cnot_count_full_pmh()None 으로 설정하여 (휴리스틱적으로) 최적의 section_size 을 선택할 수 있습니다. 그런 다음 CX 게이트 수의 상한을 최소화하려는 값( αlog2(n)\alpha \log_2(n), 여기서 nn 은 큐비트 수, α0.56\alpha \approx 0.56 는 큐비트 수)이 선택됩니다.

  • 함수 synth_clifford_bm() 함수가 Rust로 포팅되었습니다. 이 함수는 CX 게이트 수에 대해 1 큐비트에 대한 Clifford 연산자를 1, 2 또는 3 큐비트에 최적으로 합성합니다. 이로 인해 성능이 크게 향상됩니다. 3큐비트 이상의 클리퍼드의 경우 속도가 80배 정도 빨라집니다.

  • 기능 synth_clifford_greedy() 연산자를 합성하는 Clifford 연산자를 합성하는 함수가 Rust로 포팅되어 모든 큐비트 수에 대한 성능이 크게 향상되었습니다. 50큐비트가 넘는 클리퍼드의 경우, 속도가 1000배 정도 빨라집니다.

  • wrap 키워드 인수를 ProductFormula 클래스에 (활성화된 경우) 개별 폴리 진화 용어를 래핑하는 키워드 인수를 추가했습니다. 회로를 시각화할 때 유용하게 사용할 수 있습니다.

  • atomic_evolution 인수는 ProductFormula (및 그 서브클래스)에는 새로운 함수 서명이 있습니다. 새 함수는 일부 파울리 연산자와 시간 계수를 취하고 진화 회로를 반환하는 대신 기존 회로를 가져와서 제공된 파울리 연산자와 주어진 시간의 진화를 이 회로에 추가해야 합니다. 이 새로운 구현은 훨씬 더 나은 성능의 이점을 제공합니다.

  • 의 성능을 개선했습니다 synth_permutation_depth_lnn_kms()의 성능을 개선하여 선형 연결을 위한 순열을 합성하는 데 사용되는 함수를 Rust로 포팅했습니다.

트랜스파일러 기능

  • 에 대한 새로운 가져오기 경로 옵션이 추가되었습니다 generate_preset_pass_manager()에 대한 가져오기 경로 옵션을 추가하여 이제 다른 이름으로 가져올 수 있습니다:

    from qiskit import generate_preset_pass_manager

    를 입력하는 대신 전체 경로를 입력하세요:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

    이 함수는 qiskit.transpiler 모듈에서도 임포트할 수 있습니다:

    from qiskit.transpiler import generate_preset_pass_manager
  • 새로운 사용자 구성 파일 옵션 sabre_all_threads 및 해당 환경 변수 QISKIT_SABRE_ALL_THREADS 를 추가했습니다. 이 플래그가 설정되면 프리셋 패스 관리자가 SabreLayoutSabreSwap 트랜스파일러 패스를 로컬 시스템에서 사용 가능한 모든 CPU를 사용하여 실행합니다. 이 옵션을 사용하면 서로 다른 컴퓨터 간의 출력 결정성과 더 적은 수의 SwapGates.

    이러한 트랜스파일러 패스는 여러 개의 랜덤 트라이얼을 병렬로 실행하여 가장 적은 수의 SwapGates. 일반적으로 더 많은 테스트를 실행하면 알고리즘이 더 나은 결과를 찾을 수 있는 기회가 더 많아집니다. 기본적으로 프리셋 패스 관리자는 이번 릴리스에서는 레벨 0과 1의 경우 5회, 레벨 2와 3의 경우 20회의 고정된 시험 횟수를 사용하지만, 향후 릴리스에서는 이 횟수가 변경될 수 있습니다(이전 릴리스에서는 달랐음). 고정된 시도 횟수를 사용하면 로컬 시스템에 관계없이 결정론적인 결과를 얻을 수 있습니다. 시드가 고정되어 있어도 사용 가능한 로컬 CPU 수를 기본값으로 설정하면 다른 컴퓨터에서 실행할 때 결과가 달라지기 때문입니다.

    주어진 최적화 수준에 대한 기본 시도 횟수가 로컬 CPU 수보다 많으면 더 높은 최적화 수준 기본값을 사용합니다.

  • 새로운 패스를 추가했습니다 Split2QUnitaries 는 회로의 모든 2큐비트 게이트 또는 유니너리를 반복하고 가능한 경우 오류 없이 두 개의 단일 큐비트 유니너리로 대체합니다(즉, 2큐비트 게이트/유니너리는 실제로는 단일 큐비트 유니너리의 텐서 곱입니다).

  • 패스 Collect2qBlocks, ConsolidateBlocksSplit2QUnitaries 가 최적화 레벨 2 및 최적화 레벨 3으로 사전 설정된 패스 관리자의 init 단계에 추가되었습니다. init 단계를 수정하면 양자 회로를 보다 효율적으로 라우팅할 수 있습니다:

    • 에는 실제로는 단일 큐비트 게이트의 산물인 2큐비트 유니타리/게이트가 포함되어 있거나, 또는
    • 는 2큐비트 게이트의 연속 블록에 여러 개의 2큐비트 게이트를 포함합니다.

    전자의 경우, 한 쌍의 큐비트 간에 실제 상호 작용이 발생하지 않으므로 2큐비트 게이트의 라우팅을 건너뛸 수 있습니다. 후자의 경우 라우팅 알고리즘의 룩헤드 공간은 불필요한 2큐비트 게이트로 인해 '오염'되지 않습니다. 즉, 라우팅의 경우 2큐비트 게이트의 연속 블록당 하나의 2큐비트 게이트만 고려하는 것으로 충분합니다. 이러한 패스는 패스 관리자가 이산 기저 게이트가 설정된 Target 를 대상으로 하는 경우, 즉 모든 기저 게이트가 파라미터화되지 않은 경우 실행되지 않습니다.

  • 의 성능이 향상되었습니다 StarPreRouting의 성능은 별 그래프 연결 하위 회로를 찾는 데 사용되는 Rust 공간에서 무거운 작업을 수행함으로써 향상됩니다.

  • 트랜스파일러 패스의 SabreLayout 트랜스파일러 패스가 항상 동일한 알고리즘을 사용하여 추가 트라이얼을 실행하도록 업데이트되었습니다 DenseLayout 를 사용하여 세이버의 레이아웃 알고리즘의 시작점을 선택하도록 업데이트되었습니다. 레이아웃 알고리즘에서 사용하는 시작점은 결과물의 품질에 큰 영향을 미칠 수 있습니다. 기본적으로 SabreLayout 는 여전히 layout_trials 무작위 트라이얼로 시작하지만 연결 그래프의 가장 밀도가 높은 하위 그래프를 시작점으로 사용하는 단일 트라이얼이 추가됩니다. 이렇게 하면 경우에 따라 더 큰 커플링 맵을 위해 더 작은 회로를 사용하는 경우에 더 나은 결과를 얻을 수 있습니다.

  • 에 새로운 dt 인수가 추가되었습니다 generate_preset_pass_manager() 의 인수 집합과 일치하도록 transpile(). 이렇게 하면 트랜스필레이션 제약 조건을 내부에서 Target 표현으로 변환할 수 있습니다.

시각화 기능

  • 사용자 구성 파일에는 부울 값을 취하는 새로운 옵션 circuit_idle_wires 이 있습니다. 이를 통해 사용자는 회로 서랍의 idle_wires 옵션의 기본 동작을 원하는 대로 설정할 수 있습니다 QuantumCircuit.draw()circuit_drawer(). 예를 들어 ~/.qiskit/settings.conf 에 섹션을 추가합니다:

    [default]
    circuit_idle_wires = false

    를 클릭하면 기본값이 유휴 전선을 표시하지 않도록 변경됩니다.

기타 기능

  • 1 (예: QISKIT_NO_CACHE_GATES=1)의 값으로 설정하면 새로운 빌드 시간 환경 변수 QISKIT_NO_CACHE_GATES 가 추가되었습니다 의 메모리 오버헤드를 줄입니다 CircuitInstructionDAGOpNode 객체에 대한 다중 액세스에서 런타임이 증가하는 대가로 CircuitInstruction.operationDAGOpNode.op. 소스에서 키스킷 Python 패키지를 빌드할 때 이 환경 변수를 설정하면 이러한 속성 반환의 캐싱이 비활성화됩니다.

회로 업그레이드 노트

  • 메서드의 annotated 인자는 Gate.control() 메서드의 인수는 이제 기본적으로 None 이며, 키스킷이 제어된 연산에 주석을 달지 여부를 선택할 수 있습니다. 구체적인 구현(annotated=False)을 사용할 수 있는 경우 기본적으로 반환됩니다. 그렇지 않으면 주석이 달린 구현이 반환됩니다(annotated=True). 이를 통해 예를 들어 제어되고 파라미터화된 게이트의 합성을 지연시킬 수 있습니다.

  • Operation 인스턴스 DAGOpNode.op 의 인스턴스는 더 이상 기본 객체에 대한 공통 참조를 공유하지 않습니다. 이것은 결코 보장되지 않았으며 참조로 직접 DAGOpNode.op 를 참조로 직접 변경하는 것은 건전하지 않았고 항상 DAG의 내부 상태 추적을 손상시킬 가능성이 높았습니다 QuantumCircuitDAGCircuit 의 내부 리팩터링으로 인해 표준 게이트를 Rust에 저장할 때, 출력 객체는 DAGOpNode.op 의 출력 객체는 이제 공유 인스턴스가 아닌 복사본이 될 가능성이 높습니다. 요소를 변경해야 하는 경우 반드시 변경해야 합니다:

    op = dag_node.op
    op.params[0] = 3.14159
    dag.substitute_node(dag_node, op)

    와 같은 작업을 수행하는 대신

    dag_node.op.params[0] = 3.14159

    이 릴리스에서는 모든 표준 게이트에서 작동하지 않습니다. 이전 릴리스에서는 우연히 작동했을 가능성이 높지만 API가 보장하지 않는 기능입니다.

  • Operation 인스턴스 CircuitInstruction.operation 의 인스턴스는 더 이상 기본 객체에 대한 공통 참조를 공유하지 않습니다. 이는 결코 보장되지 않았으며, 특히 매개변수를 사용 중일 때 참조로 CircuitInstruction.operation 를 참조로 직접 변경하는 것은 안전하지 않으며 특히 매개변수가 사용 중일 때는 항상 회로가 손상될 가능성이 높았습니다. 의 내부 리팩터링으로 인해 QuantumCircuit 의 내부 리팩터링으로 인해, 표준 게이트를 Rust에 저장할 때 CircuitInstruction.operation 의 출력 객체는 이제 공유 인스턴스가 아닌 복사본이 될 가능성이 높습니다. 회로의 요소를 변경해야 하는 경우(비효율적이고 오류가 발생하기 쉬우므로 강력히 권장하지 않습니다 ) 반드시 변경해야 합니다:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    qc.p(0)
    
    op = qc.data[0].operation
    op.params[0] = 3.14
    
    qc.data[0] = qc.data[0].replace(operation=op)

    와 같은 작업을 수행하는 대신

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1)
    qc.p(0)
    
    qc.data[0].operation.params[0] = 3.14

    이 릴리스에서는 표준 게이트에서 작동하지 않습니다. 이전 릴리스에서는 우연히 작동했을 가능성이 높지만 API가 보장하지 않는 기능입니다.

기본형 업그레이드 노트

  • BitArray.slice_bits()BitArray.slice_shots() 는 이제 인덱스가 범위를 벗어날 때 IndexError 를 표시합니다. 이 경우 ValueError 을 올리곤 했습니다.

  • BitArray.__getitem__() 은 이제 인덱스가 범위를 벗어나거나 인덱스의 차원 수가 일치하지 않을 때 IndexError 을 반환합니다 BitArray. 이 경우 ValueError 을 올리곤 했습니다.

합성 업그레이드 노트

  • LieTrotterSuzukiTrotter 는 더 이상 개별적으로 진화한 폴리 용어를 게이트 정의에 포함시키지 않습니다. 회로의 특정 분해 레벨에 의존하는 경우, 한 레벨의 QuantumCircuit.decompose() 를 제거하거나 합성 객체에 wrap=True 키워드 인수를 추가해야 합니다.

트랜스파일러 업그레이드 노트

  • 최적화 레벨 2와 3은 이제 번역/합성 단계 전에 추가로 피홀 최적화를 사용합니다(이전에는 최적화 단계에서만 수행). 피홀 최적화의 효과에는 아이덴티티에 매우 가까운 게이트(예: 회전 각도가 2π2252\pi \otimes 2^{-25} 보다 작은 제어 위상 게이트)의 제거가 포함됩니다.

  • 최적화 수준 0에서 사용하는 기본 라우팅 패스는 generate_preset_pass_manager()transpile() 에서 StochasticSwap 에서 SabreSwap. 패스는 SabreSwap 패스는 정확히 동일한 기능을 수행하지만 런타임과 출력 품질(스왑 게이트 수와 깊이) 모두에서 StochasticSwap. optimization_level=0 의 경우 레벨 0의 일반적인 사용 사례에 대해 라우팅을 실행할 것으로 예상되지 않으므로 문제가 되지 않습니다.

    어떤 이유로든 이전 기본 라우팅 알고리즘에 의존하는 경우 routing_method 인수를 사용할 수 있습니다 transpile()generate_preset_pass_manager()"stochastic" 로 변경하여 StochasticSwap 전달합니다.

  • 함수는 generate_preset_pass_manager() 함수는 가능한 경우 내부적으로 트랜스파일러 제약 조건을 Target 인스턴스로 변환하도록 업그레이드되었습니다. 유형의 백엔드 입력이 제공되면 BackendV1 유형의 백엔드 입력이 제공되면 BackendV2 로 변환되어 Target. 이 변경에는 사용자 조치가 필요하지 않습니다.

기타 업그레이드 주의사항

  • 이 릴리스를 실행하는 데 필요한 rustworkx의 최소 버전이 0.14.0 에서 0.15.0 으로 증가했습니다. 이는 키스킷이 이제 성능을 개선하는 rustworkx 0.15.0 릴리스에 추가된 새로운 기능을 사용하기 때문에 필요합니다.

회로 사용 중단

기본형 폐기

제공자 기능 폐기

  • 클래스는 더 이상 사용되지 않습니다 BackendV1 클래스는 더 이상 사용되지 않으며 다음 주요 릴리스( 2.0.0 ) 이전에 제거될 예정입니다. 로 업데이트하는 방법에 대한 자세한 내용은 마이그레이션 가이드를 참조하세요 BackendV2.

  • Qobj 구조와 관련 클래스( qiskit.qobj)는 이제 더 이상 사용되지 않습니다. 워크플로우의 일부로 도입되었으며 BackendV1 워크플로의 일부로 도입되었으며 더 이상 백엔드와의 상호 작용에 BackendV2 백엔드와의 상호 작용에 더 이상 필요하지 않습니다. QuantumCircuit 시리얼라이제이션은 QPY를 통해 수행해야 합니다( qiskit.qpy) 또는 OpenQASM ( qiskit.qasm2qiskit.qasm3) 대신 사용하세요.

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

  • 이제 assemble() 함수는 이제 더 이상 사용되지 않으며 2.0 릴리스에서 제거될 예정입니다. 이 함수는 주로 Qobj 을 만드는 데 사용되었지만 더 이상 필요하지 않은 BackendV2-기반 워크플로에서는 더 이상 필요하지 않습니다. 또한 매개변수 바인딩에도 사용되었는데, 이 기능은 QuantumCircuit.assign_parameters().

시각화 기능의 사용 중단

  • justify 인수의 circuit_drawer() 또는 QuantumCircuit.draw()의 인수는 더 이상 유효하지 않은 값을 지원하지 않으며(이전에는 기본값으로 변경됨), 향후 릴리스에서는 오류가 발생합니다. 유효한 정당화 값은 "left", "right" 또는 "none" 입니다.

  • 기능이 더 이상 사용되지 않습니다 visualize_transition() 함수는 더 이상 사용되지 않으며 2.0.0 릴리스에서 제거될 예정입니다. 이 기능은 매우 특정한 사용 사례에만 유용하고 나머지 키스킷 시각화 모듈과 어울리지 않는 여러 가지 제한이 있었습니다.

버그 수정

  • 파라미터화된 표준 게이트를 제어할 때 발생하는 일련의 문제를 수정했습니다. 일부 게이트의 제어 버전(예 RXXGate 또는 RYGate )에 바인딩되지 않은 파라미터가 포함되어 있으면 합성할 수 없습니다. 이전에는 이러한 경우 .control() 을 호출하면 실패했지만 이제는 AnnotatedOperation 를 자리 표시자로 만듭니다. 이를 통해 제어된 게이트를 회로에 삽입하고 나중에 매개변수를 바인딩한 다음 연산을 합성할 수 있습니다. 10311, #10697, #12135 수정.

  • 그리고 SGateSdgGate 는 이제 올바르게 CSGate를 반환합니다. CSdgGate, 단일 제어 큐비트에서 제어되는 경우.

  • 에서 표준 편차 계산을 수정합니다 BackendEstimatorV2의 표준편차 계산을 수정하여 출퇴근하지 않는 폴리의 공분산을 고려합니다. Fixed Qiskit/qiskit-ibm-runtime#1751.

  • 또는 circuit_drawer() 또는 QuantumCircuit.draw() 메서드가 기본값으로 변경하기 전에 justify 인수에 잘못된 값을 전달할 때 경고를 발생시키지 않는 문제를 수정했습니다. 이제 유효하지 않은 값이 전달되면 경고를 표시합니다. 유효한 정당화 값은 "left", "right" 또는 "none" 입니다. 자세한 내용은 #12089를 참조하세요.

  • 수정됨 SparsePauliOp.apply_layout()Pauli.apply_layout() 를 올리려면 QiskitError 를 발생시켜야 합니다.

  • 트랜스파일러 패스의 버그를 수정했습니다 ConsolidateBlocks 트랜스파일러 패스의 버그 수정, 입력 회로에 사용자 지정 불투명 게이트가 포함되어 있고 basis_gates 또는 target 옵션이 설정되어 있지 않은 경우 패스가 발생하면 QiskitError 를 발생시키고 실패합니다. 이러한 상황에서 트랜스파일러 패스가 사용자 지정 게이트가 포함된 식별된 블록을 통합하지 않고 실패하도록 수정되었습니다.

  • 의 버그를 수정했습니다 PadDynamicalDecoupling에서 이전 또는 다음 노드가 입력/출력 노드인 경우 지연이 펄스 정렬되지 않았다는 오류 메시지가 제대로 표시되지 않던 버그가 수정되었습니다. 이제 오류 메시지가 올바르게 표시됩니다.

  • 함수의 키워드 인수 order BitArray.from_bool_array()"little" 또는 "big" 여야 합니다. 유효하지 않은 값을 입력하면 오류가 발생하는 검사를 추가했습니다.

  • 에 의해 생성된 게이트의 분해를 개선합니다 QuantumCircuit.mcx() 에 의해 생성된 게이트의 분해를 개선하여, 예상대로 CXGate의 수가 예상대로 기하급수적으로 증가하지 않고 큐비트 수에서 기하급수적으로 증가하도록 개선합니다.

  • 수정 SparsePauliOp.apply_layout() 가 제로 큐비트 연산자와 올바르게 작동하도록 수정되었습니다. 예를 들어 이전에 0 큐비트를 생성하고 다음과 같은 레이아웃을 적용한 경우입니다:

    op = SparsePauliOp("")
    op.apply_layout(None, 3)

    이전에는 오류가 발생했을 것입니다. 이제 형식의 연산자가 올바르게 반환됩니다: SparsePauliOp(['III'], coeffs=[1.+0.j])

  • 의 버그를 수정했습니다 StatevectorSampler 의 게이트를 무시하는 버그 수정 c_if. 다음과 같은 이유로 오류가 발생합니다 Statevectorc_if 을 처리할 수 없기 때문에 오류가 발생합니다.

  • 트랜스파일러 패스의 Commuting2qGateRouter 트랜스파일러 패스에서 퀀텀 레지스터 순열이 패스 속성 세트에 추가되지 않아 사용자가 수동으로 추적해야 했던 문제를 수정했습니다. 이제 출력 회로의 layout 속성을 통해 순열에 액세스하고 정보 손실 없이 모든 트랜스필레이션 파이프라인에 패스를 연결할 수 있습니다.

  • 특정 펄스 단위를 초와 나노초 사이로 스케일링할 때 부동 소수점 부정확성을 수정했습니다. 펄스가 기호적으로 정의된 경우, symengine 의 특정 빌드에 대한 스케일링으로 인해 불필요한 부동 소수점 오류가 발생할 수 있으며, 심볼이 완전히 바인딩되면 예기치 않은 결과가 나타날 수 있습니다. 수정 #12392.

  • 의 버그를 수정했습니다 synth_cnot_count_full_pmh() 에서 잔여 큐비트 없이 큐비트 수를 나누지 않은 section_size 을 제공하면 잘못된 결과가 발생할 수 있는 버그가 수정되었습니다. 이제 section_size (최대 큐비트 수와 같음)는 올바른 회로를 합성합니다. (휴리스틱적으로) 최적의 값은 section_size=None 을 설정합니다.

  • PassManager.run() 는 직렬로만 작동하는 경우 여러 입력이 주어졌을 때 더 이상 직렬화하는 데 시간을 낭비하지 않습니다.

  • 버그 수정 plot_coupling_map() 의 버그를 수정하여 커플링 맵의 가장자리가 잘못 색상이 지정되도록 했습니다. 수정 #12354.

  • OpenQASM 2.0 파서(qasm2.load()qasm2.loads())는 이제 시스템 크기 정수를 오버플로하는 정수 피연산자를 포함한 게이트-각 식을 평가할 수 있습니다. 나머지 표현식은 항상 그랬던 것처럼 배정밀도 부동소수점 컨텍스트에서 평가됩니다. 주의: 임의로 큰 정수는 반드시 배정밀도 부동 소수점으로 정확히 표현할 수 있는 것은 아니므로 회로가 생성되었더라도 이미 모든 수치 정밀도 모듈로 2π2\pi 를 잃어버렸을 가능성이 있습니다.

  • OpenQASM 3 내보내기( qiskit.qasm3)는 이제 키워드 또는 기타 잘못된 식별자를 '기준 게이트'로 사용하라는 요청을 받으면 오류가 발생하는데, 이러한 경우 올바른 출력을 생성할 방법이 없기 때문입니다.

  • OpenQASM 3 내보내기(qiskit.qasm3)는 이제 회로에서 여러 인스턴스의 PauliEvolutionGate 의 여러 인스턴스를 올바르게 내보냅니다. 이전에는 하나의 인스턴스만 내보내고 다른 모든 인스턴스는 자동으로 동일한 (잘못된) 버전을 사용했습니다.

  • OpenQASM 3 내보내기(qiskit.qasm3)는 이제 게이트 이름을 올바르게 이스케이프 처리합니다. 이전에는 이름이 잘못된 OpenQASM 3 식별자인 게이트가 있으면 잘못된 OpenQASM 3이 생성되었습니다.

  • 일련의 입력 처리 불일치는 transpile()generate_preset_pass_manager() 사이의 일련의 입력 처리 불일치가 수정되었습니다. 이러한 불일치로 인해 동일한 입력에 대해 서로 다른 번역 출력이 발생하거나 generate_preset_pass_manager() 에서 허용하는 특정 입력 조합에 대해 실패하거나 transpile().

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