Skip to main content
IBM Quantum Platform

키스킷 0.45 릴리즈 노트

이 페이지에는 기존 "요소" 구조가 완전히 제거된 후 첫 번째 릴리스인 키스킷( 0.45 )의 릴리스 노트가 포함되어 있습니다. 키스킷의 이전 "메타 패키지" 구조로 거슬러 올라가는 릴리스 노트를 포함한 모든 릴리스 노트는 릴리스 노트를 참조하세요. 메타 패키지 버전 표는 키스킷 0.44 릴리즈 노트를 참조하세요.


0.45.3

Prelude

키스킷 0.45.3 은 포인트 릴리스로, 잘못된 환경에서 키스킷이 설치되었음을 감지하면 ImportError1.0 를 발생시키는 것 외에는 코드 변경이 없습니다.

오류에 대한 도움말, 키스킷 준비 방법 및 자세한 배경 정보는 새 패키징에 대한 마이그레이션 가이드 1.0 를 참조하세요.

참고

키스킷 1.0 은 키스킷 0.45.3 으로부터 약 2주 후인 2024년 2월 15일에 출시될 예정이며, 이 메시지를 읽는 시점에서는 아직 이용이 불가능할 수도 있습니다. 이러한 변화는 선제적으로 이루어지고 있습니다.

키스킷의 패키징 구조는 키스킷 1.0 에서 변경되고 있으며, 안타깝게도 변경된 요구사항은 pip, 특히 환경이 처음 구성된 후 pip install --upgrade 명령이 실행되는 경우 완전히 전달되지 않습니다. 이 버전을 포함한 1.0 이전의 모든 버전의 키스킷은 pip 에서 해결할 수 없는 키스킷 1.0 과의 설치 충돌이 있습니다.

import qiskit 에서 ImportError 가 발생하면 사용자 환경이 유효하지 않은 상태이며, 키스킷 0.45/0.46 및 1.0 버전 모두에 도달할 수 있으므로 코드가 미묘하게 손상된 것입니다. 새 가상 환경을 만들고 두 버전 중 하나만 설치해야 합니다. 특히, 키스킷 1.0 을 설치하려는 경우 qiskit-terra 에 종속된 패키지가 설치되어 있지 않아야 하며, 이러한 패키지는 키스킷 1.0 과 호환되지 않으므로 업데이트해야 합니다. 키스킷 0.45 또는 0.46 을 설치하려는 경우, qiskit>=1.0 을 설치하려고 시도하는 것이 없는지 확인해야 합니다.

키스킷을 기반으로 라이브러리를 개발하면서 여전히 qiskit-terra 에 종속되어 있는 경우, qiskit 에만 종속되는 새 패키지를 긴급하게 릴리스해야 합니다. 버전 0.44 이후 qiskit 패키지에는 qiskit-terra 컴파일러 코어(현재 간단히 "키스킷"이라고 부르는 구성 요소)만 포함되어 있으므로 최소 버전이 0.44 인 경우 설치되는 항목의 변경 없이 qiskit-terra>=0.44 종속성을 qiskit>=0.44 로 안전하게 전환할 수 있습니다. 테스트 및 준비에 대한 자세한 내용과 권장 사항은 마이그레이션 가이드의 개발자용 섹션을 참조하세요.


0.45.2

Prelude

키스킷 0.45.2 은 0.45 릴리스 시리즈에서 발견된 몇 가지 버그를 수정하는 소규모 패치 릴리스입니다.

버그 수정

  • 전화 copy() 또는 copy_empty_like() 을 호출하면 이제 BlueprintCircuit 에 있는 global_phase 를 복사본에 올바르게 전달합니다. 이전에는 복사 후 글로벌 단계가 항상 0이었습니다.

  • QPY( qpy.dump()qpy.load())는 이제 클리포드 연산자(Clifford).

  • mpl 서랍에서 텍스트가 상자 끝을 넘어 인쇄되는 문제를 수정했습니다 SwitchCaseOp 의 텍스트가 상자 끝을 넘어 인쇄되던 문제를 수정했습니다.

  • 의 큐비트 인수 방송이 QuantumCircuit.delay() 의 큐비트 인자 방송은 이제 의도한 대로 각 큐비트에 대한 Delay 인스트럭션을 올바르게 생성합니다. 이전에는 특정 이터러블(예를 들어 set와 같은) 이터러블이 주어지면 비정상적인 위치에서 실패할 수 있는 유효하지 않은 회로를 자동으로 생성했습니다.

  • 특정 상황에서 사용자가 게이트의.calibration 데이터를 로드하려고 할 때 오류가 발생하는 버그가 수정되었습니다 Target 로 로드하려고 할 때 오류가 발생하는 버그를 수정했습니다. 이는 백엔드가 명령 정의에서 파형 펄스를 참조하지만 펄스 라이브러리에는 해당 파형 펄스를 포함하지 않는 등 일부 보정 데이터만 보고할 때 발생합니다. 이 상황에서는 키스킷 펄스 오브젝트를 빌드할 수 없으므로 캘리브레이션을 위한 펄스 스케줄을 빌드하지 못합니다. 이제 보정 데이터가 불완전하면 Target 는 보정이 전혀 보고되지 않은 것과 동일하게 취급하며 예외를 발생시키지 않습니다.

  • 트랜스파일러 패스 관련 문제를 수정했습니다 Optimize1qGatesDecomposition 트랜스파일러 패스가 잠재적으로 단일 이상(오류율이 0.0) 게이트를 재합성할 수 있는 문제를 수정했습니다 Target. 이제 오류율이 같으면 패스 Optimize1qGatesDecomposition 가 오류율(게이트 수 포함)이 동일한 경우 회로의 게이트로 지연되도록 수정되었습니다. 수정 #10568

  • 스왑 및 측정 명령어와 관련된 회로를 잘못 최적화하는 OptimizeSwapBeforeMeasure 패스의 문제를 수정했습니다. 이 커밋은 버그를 수정하여 DAGCircuit.successors()DAGCircuit.descendants(). 또한 버그가 수정되었는지 확인하기 위해 몇 가지 추가 테스트를 추가했습니다. 예를 들어,

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure
    pass_ = OptimizeSwapBeforeMeasure()
    qc = QuantumCircuit(2, 1)
    qc.swap(0, 1)
    qc.measure(0, 0)
    qc.measure(0, 0)
    print(qc.draw())
    print(pass_(qc).draw())

    가 이전에는 인쇄되었습니다:

            ┌─┐┌─┐
    q_0: ─X─┤M├┤M├
          │ └╥┘└╥┘
    q_1: ─X──╫──╫─
             ║  ║
    c: 1/════╩══╩═
             0  0
         ┌─┐
    q_0: ┤M├───
         └╥┘┌─┐
    q_1: ─╫─┤M├
          ║ └╥┘
    c: 1/═╩══╩═
          0  0

    이제 두 번째 서킷이 올바르게 최적화되었습니다:

    q_0: ──────
         ┌─┐┌─┐
    q_1: ┤M├┤M├
         └╥┘└╥┘
    c: 1/═╩══╩═
          0  0
  • 문자열 표현의 버그를 수정했습니다 StabilizerState 문자열 표현의 버그를 수정합니다.


0.45.1

Prelude

키스킷 테라 0.45.1 는 0.45 릴리스 시리즈에서 발견된 몇 가지 버그를 수정하는 소규모 패치 릴리스입니다. 또한 Python 3.12 에 대한 공식 지원을 제공하는 첫 번째 릴리스입니다. 0.45.1 릴리스는 Python 3.8, 3.9, 3.10, 3.11, 3.12 을 지원합니다.

새 기능

  • 키스킷 사용 지원 추가 Python 3.12. 이 릴리스부터 키스킷은 Python 버전 3.8, 3.9, 3.10, 3.11, 3.12 에서 실행을 지원합니다.

버그 수정

  • QuantumCircuit.barrier() 는 이제 입력 중 하나로 set 가 입력 중 하나로 주어지면 올바른 출력을 생성합니다. 이전에는 유효하지 않은 연산을 회로에 추가했지만, 실제로는 일반적으로 관찰 가능한 문제를 일으키지 않았습니다. 수정 #11208

  • 속성 Instruction.condition_bits 는 이제 런타임 클래식 표현식(qiskit.circuit.classical).

  • 키스킷 펄스 오브젝트의 hash() 키스킷 펄스 Channel 객체(예 DriveChannel) 채널이 한 Python 프로세스에서 다른 해시 시드를 사용하는 다른 프로세스로 전송되는 경우를 수정했습니다.

  • OpenQASM 2에서 가져온 조건부 사용자 지정 게이트는 이제 피클 및 딥 복사 시 조건이 올바르게 유지됩니다. 이전에는 조건부 사용자 정의 게이트( OpenQASM 2 파일의 gate 문으로 정의됨)를 복사하거나 피클하면 조건이 손실되었습니다.

  • 의 QPY 역직렬화를 수정했습니다 StatePreparationInitialize 회로 명령어를 문자열 및 정수 매개변수로 역직렬화하도록 수정했습니다(기존에 작동하던 명시적 상태벡터와 반대로). 수정 #11158.

  • 버그 수정 SabreLayout 의 버그를 수정했습니다 Layout 에 사용된 객체에 TranspileLayout.initial_layout. 이는 회로 시각화에 영향을 미쳤습니다 QuantumCircuit.draw()circuit_drawer() 변환 후 레지스터 이름(예: q0)을 사용하여 예상되는 가상 큐비트 레이블이 아닌 Qubit[QuantumRegister(6, 'q', 0)] 형식의 가상 큐비트 레이블이 표시됩니다. 수정 #11038

  • 의 문제를 수정했습니다 qpy.dump() 함수가 직렬화할 때 use_symengine 값을 무시할 수 있는 문제를 수정했습니다 ScheduleBlock 객체를 직렬화할 때 이렇게 하면 심볼릭 표현식에 심엔진을 사용한다고 보고하지만 실제로는 심파이 직렬화된 데이터를 포함하므로 잘못된 QPY 페이로드가 생성될 수 있습니다.

  • 초기화 시 오류를 일으키는 버그를 수정했습니다 UnitaryOverlap 가 배리어가 포함된 입력 회로가 주어지면 초기화 시 오류가 발생하던 버그를 수정했습니다.


0.45.0

Prelude

키스킷 0.45.0 은 1.0 이전의 마지막 기능 릴리스입니다. 이는 첫 번째 주요 버전 릴리스에서 계획 중인 API 변경의 기반을 마련하는 것으로, 여기에는 이전에 사용되지 않던 많은 기능의 제거와 일련의 새로운 사용 중단이 포함됩니다.

참고

프로젝트가 키스킷에 의존하는 경우, 키스킷에서 더 이상 지원되지 않는 기능에 의존할 수 있습니다 1.0. 따라서 지원 버전을 <1.0 으로 미리 제한하는 것이 좋습니다.

키스킷( 0.45.0 )의 주요 기능은 다음과 같습니다:

  • 이번 릴리스부터 키스킷 표준 회로 라이브러리의 모든 파라미터화되지 않은 게이트는 이제 싱글톤이 됩니다. 기본적으로 이러한 게이트는 메모리에서 단일 인스턴스를 공유하므로 특정 유형의 게이트, 예를 들어 XGate의 인스턴스가 인스턴스화되면 이후의 모든 XGate 의 후속 인스턴스는 첫 번째 인스턴스에 대한 참조가 됩니다. 따라서 회로에서 동일한 유형의 게이트를 여러 개 사용할 때 메모리 사용량과 구성 오버헤드가 줄어듭니다. 이 기능을 구현하기 위해 새로운 베이스 클래스가 도입되었습니다: SingletonInstructionSingletonGate. 자세한 내용은 기능 노트를 참조하세요.
  • 새로운 일반 패스 관리자 인터페이스가 추가되었습니다 qiskit.passmanager 모듈에서 찾을 수 있습니다. 이것은 키스킷 트랜스파일러를 구축하는 데 사용된 패스 매니저를 일반화한 것으로, 사용자가 다른 중간 표현(IR)을 사용하는 새로운 패스 매니저를 만들 수 있는 일반 프레임워크를 도입합니다. 이 모듈에는 일반 패스 관리자 베이스 클래스, 플로우 컨트롤러, 패스 관리자 작업 실행을 관리하는 데 필요한 인프라가 포함되어 있습니다. 새로운 인터페이스는 기존 패스 매니저를 재구축하는 데 사용되었습니다 qiskit.transpiler 모듈의 기존 패스 관리자를 재구축하여 코드의 기술적 부채를 정리하고 사용성과 성능을 개선하는 데 사용되었습니다. 자세한 내용은 기능 및 업그레이드 노트를 참조하세요.
  • 0.45.0 를 사용하면 트랜스파일러가 수행하는 레이아웃 순열과 더 잘 상호작용할 수 있습니다. 클래스에 포함된 데이터는 TranspileLayout 클래스에 포함된 데이터는 이제 일련의 새로운 메서드와 속성을 통해 더욱 쉽게 액세스할 수 있습니다. 그리고 새로운 SparsePauliOp.apply_layout() 메서드를 사용하면 특정 레이아웃 순열을 트랜스파일러에 입력 회로용으로 만들어진 SparsePauliOp 옵저버블에 특정 레이아웃 순열을 적용할 수 있습니다. 자세한 내용은 기능 노트를 참조하세요.
  • 마지막으로, 주석이 달린 연산을 도입하여 새로운 AnnotatedOperation 클래스를 통해 복잡한 회로 명령어를 수정자 집합으로 기본 명령어로 공식화할 수 있습니다. 예를 들어, 제어된 역을 구현하는 특정 연산 유형인 RXGate의 역수를 구현하는 특정 연산 유형 대신 이제 주석이 달린 RXGate 를 역 및 제어 속성과 함께 사용할 수 있습니다. 자세한 내용은 기능 노트를 참조하세요.

회로 기능

  • 새로운 클래스 추가 AnnotatedOperation 의 서브클래스이며 Operation 의 서브클래스이며 "수정자" 목록에 의해 수정된 "기본 연산"을 나타냅니다. 기본 연산은 타입 Operation 유형이며 현재 지원되는 수정자는 다음과 같습니다 InverseModifier, ControlModifierPowerModifier. 수정자는 목록에 표시되는 순서대로 적용됩니다.

    에를 들면 다음과 같습니다.

    gate = AnnotatedOperation(
      base_op=SGate(),
      modifiers=[
          InverseModifier(),
          ControlModifier(1),
          InverseModifier(),
          PowerModifier(2),
      ],
    )

    는 논리적으로 gate = SGate().inverse().control(1).inverse().power(2) 와 같거나:

    gate = AnnotatedOperation(
      AnnotatedOperation(SGate(), [InverseModifier(), ControlModifier(1)]),
      [InverseModifier(), PowerModifier(2)],
    )

    그러나 이러한 동등성은 논리적일 뿐, 내부적으로 표현하는 방식은 매우 다릅니다.

    편의를 위해 단일 수정자를 직접 전달할 수도 있으므로 AnnotatedGate(SGate(), [ControlModifier(1)])AnnotatedGate(SGate(), ControlModifier(1)) 과 동일합니다.

    주석이 달린 오퍼레이션의 특징은 오퍼레이션이 선언될 때 회로 정의가 구성되지 않고 트랜스파일링 중에, 특히 HighLevelSynthesis 트랜스파일러 패스 중에만 발생한다는 것입니다.

    주석이 달린 연산은 양자 회로에 추가할 수 있는 "더 높은 수준" 또는 "더 추상적인" 객체로 볼 수도 있습니다. 이를 통해 이 상위 레벨 표현을 활용하는 트랜스파일러 최적화 패스를 작성할 수 있습니다(예: 게이트 바로 뒤에 역으로 오는 게이트를 제거하는 경우)(게이트와 역이 모두 더 간단한 게이트로 먼저 합성된 경우에는 이러한 감소가 불가능할 수 있습니다).

    어떤 의미에서 주석이 달린 작업은 기본 작업의 확장으로 볼 수 있습니다 ControlledGate의 확장으로 볼 수 있으며, 기본 연산에 제어 기능을 추가할 수도 있습니다. 향후에는 다음을 대체할 계획입니다 ControlledGateAnnotatedOperation. 제어 게이트와 마찬가지로 트랜스파일러는 레이아웃/라우팅이 수행되기 전에 주석이 달린 연산을 합성합니다.

    현재로서는 주석이 달린 연산은 양자 회로의 최상위 레벨에만 나타날 수 있으며, 즉 재귀적으로 정의된 definition 회로 내부에는 나타날 수 없습니다. 이 제한은 추후 제거할 계획입니다.

  • 에 새로운 옵션 max_num_qubits 을 추가했습니다 qiskit.circuit.CommutationChecker.commute() 에 더 비싼 행렬 곱셈 기반 정류성 검사에 고려할 최대 큐비트 수를 지정하는 옵션을 추가했습니다. 이렇게 하면 내부적으로 2N×2N2^N \times 2^N 크기의 배열을 할당하려고 시도하는 것을 피할 수 있습니다. 더 간단한 버전의 정류성 검사(예: 두 양자 연산이 서로 다른 큐비트 집합에 걸쳐 있을 때 정류하는 경우)는 이 제한 없이 계속 작동합니다.

  • 클래스의 생성자에 새 인수 check_input 를 추가했습니다 UnitaryGate 클래스의 생성자에 새 인수를 추가했습니다. 이 플래그는 입력 객체가 단일 행렬을 나타내는지 기본 초기화 검사를 비활성화하는 데 사용됩니다. 입력이 이미 단일 행렬이라는 것을 알고 있는 경우 이 방법을 사용하여 UnitaryGate 객체를 빠르게 생성하는 데 사용할 수 있습니다. 이 새 옵션은 False 로 설정되어 있고 입력이 단일이 아닌 경우 잘못된 UnitaryGate 객체가 생성되므로 이러한 경우에만 사용해야 합니다.

  • 새로운 방법 Parameter.assign() 가 추가되었습니다. 이 방법은 주로 나중에 할당되는 단일 매개변수가 주로 포함된 회로의 경우 QuantumCircuit.assign_parameters() 의 성능을 향상시키는 빠른 경로입니다. 주로 나중에 할당될 단일 매개변수인 '표현식'을 포함하는 회로의 일반적인 경우에 사용됩니다.

  • 의 성능이 향상되었습니다 QuantumCircuit.assign_parameters() 의 성능이 여러 매개변수가 포함된 회로의 단일 매개변수를 할당할 때 개선되었습니다.

  • 두 가지 새로운 클래스를 도입했습니다, SingletonInstructionSingletonGate의 서브클래스인 InstructionGate 의 서브클래스로, 각각 해당 유형의 모든 객체에 대해 단일 인스턴스를 사용합니다. 이 클래스의 목적은 글로벌 공유 상태를 갖는 대신 회로에서 여러 게이트를 사용하는 데 따른 메모리 및 구성 오버헤드를 최소화하는 것입니다. 따라서 이 클래스는 인스턴스에 고유하거나 변경 가능한 상태가 저장되지 않은 게이트에만 적용할 수 있습니다. 예를 들어, 가장 좋은 예는 XGate 는 상태를 포함하지 않고 레버리지를 활용할 수 있지만 SingletonGate (그리고 이번 릴리스부터 사용)를 활용할 수 있는 반면 RXGate 는 각도 매개변수를 인스턴스에 저장하므로 단일 공유 전역 인스턴스는 매개변수 값을 나타낼 수 없으므로 SingletonGate 단일 공유 전역 인스턴스는 매개변수 값을 나타낼 수 없기 때문입니다.

    싱글톤 클래스를 사용할 때 주의해야 할 또 다른 잠재적 문제는 Instruction 데이터 모델이 일부 변경 가능한 상태를 지원한다는 것입니다. 특히 label, duration, unitcondition 어트리뷰트는 모두 접근 가능하고 변경 가능합니다 Instruction 와 그 직접 서브클래스에서 접근 및 변경 가능합니다. 그러나 이것은 공유 객체를 사용하는 것과는 호환되지 않습니다 SingletonInstruction. 의 인스턴스의 경우 SingletonInstruction의 경우 이러한 속성을 직접 설정하는 것은 허용되지 않으며 예외가 발생합니다. 특정 인스턴스에 필요한 경우 다음을 사용하여 변경 가능한 인스턴스가 있는지 확인해야 합니다 Instruction.to_mutable() (또는 Instruction.c_if() for condition). label, durationunit 를 클래스 생성 시 키워드 인수로 지정할 수도 있습니다.

  • 이제 다음 표준 라이브러리 게이트가 인스턴스화됩니다 SingletonGate:

    즉, 이러한 클래스가 (예를 들어) 다음과 같이 인스턴스화된 경우 XGate() 모든 생성자 기본값을 사용하면 모두 하나의 전역 인스턴스를 공유하게 됩니다. 따라서 이러한 유형의 오브젝트가 1개 이상일 경우 메모리 오버헤드가 크게 감소하고 오브젝트 구성 시간이 훨씬 빨라집니다.

  • 새로운 클래스 도입 SingletonControlledGate 의 서브클래스인 ControlledGate 의 서브클래스로 해당 유형의 모든 객체에 대해 단일 인스턴스를 사용하는 새로운 클래스를 도입했습니다. 이 클래스의 목적은 글로벌 공유 상태를 갖는 대신 회로에서 여러 게이트를 사용하는 데 따른 메모리 및 구성 오버헤드를 최소화하는 것입니다. 따라서 이 클래스는 인스턴스에 고유하거나 변경 가능한 상태가 저장되어 있지 않은 게이트에만 적용됩니다. 예를 들어, a CXGate 는 어떤 상태도 포함하지 않으므로 SingletonControlledGate 를 활용할 수 있습니다(이번 릴리스부터는 가능합니다). 반대로 CRXGate 는 각도 매개 변수를 인스턴스 데이터의 일부로 저장하므로 사용할 수 없습니다 SingletonControlledGate.

    사용할 때 주의해야 할 또 다른 잠재적 문제는 SingletonControlledGate 의 원본 데이터 모델이 ControlledGate 의 원본 데이터 모델이 변형을 지원한다는 것입니다. 특히 label, duration, unit, conditionctrl_state 속성은 모두 접근 및 변경이 가능한 ControlledGate에서 접근 가능하고 변경 가능하지만, 이러한 어트리뷰트를 SingletonControlledGate 서브클래스에서 이러한 어트리뷰트를 변경하는 것은 허용되지 않으며 예외가 발생합니다. 이러한 속성은 사용자 지정할 수 있지만 생성 시에만(즉, 생성자를 통해서만) 사용자 지정할 수 있습니다. 이 경우 새로 생성된 게이트는 전역적으로 공유되는 인스턴스 대신 사용자 지정 상태를 가진 별도의 인스턴스가 됩니다. SingletonControlledGate.to_mutable() 메서드를 사용하여 게이트 객체의 변경 가능한 복사본을 가져온 다음 다른 객체에서와 마찬가지로 속성을 변경할 수도 있습니다 Instruction 객체처럼 속성을 변경할 수 있습니다.

  • 이제 다음 표준 라이브러리 게이트가 인스턴스화됩니다 SingletonControlledGate:

    즉, 생성 시점에 인스턴스에 label, condition, duration, unit, ctrl_state 이 설정되어 있지 않으면 새 게이트 객체가 생성될 때마다 모두 하나의 전역 인스턴스를 공유하게 됩니다. 이렇게 하면 이러한 유형의 객체가 1개 이상일 경우 메모리 오버헤드가 크게 감소합니다.

  • 새로운 메서드 Instruction.to_mutable() 와 어트리뷰트 Instruction.mutable 메서드 및 어트리뷰트가 추가되었습니다 Instruction 객체가 변경 가능한지 확인하는 데 사용되는 메서드와 어트리뷰트가 추가되었습니다. 의 도입으로 SingletonGate 를 도입하면 이러한 메서드를 사용하여 명령 객체의 가변성을 처리하는 통합 인터페이스를 가질 수 있습니다.

  • 어트리뷰트 추가 Instruction.base_class속성을 추가하여 인스트럭션의 "기본" 유형을 가져옵니다. 많은 인스트럭션이 type(obj) == obj.base_class 을 만족하지만, 싱글톤 인스턴스인 SingletonInstructionSingletonGate 의 싱글톤 인스턴스는 기본 타입의 서브클래스입니다. 새로운 base_class 속성을 사용하여 이러한 기본 클래스를 찾을 수 있습니다. 다른 서브클래스가 어트리뷰트 문서를 참조하여 언제 다른 서브클래스의 base_class를 수정할 수 있는 경우와 이것이 실행에 미치는 영향에 대해 설명합니다.

  • 키스킷 회로 라이브러리에 UnitaryOverlap 회로를 키스킷 회로 라이브러리에 추가했습니다. 올제로 상태의 출력 분포 확률을 보거나, 이와 동등하게 올제로 상태에 대한 프로젝터의 기대값을 계산하여 유니타리에서 생성된 상태의 충실도를 계산하는 데 사용할 수 있습니다. 이는 머신 러닝, 양자 화학의 여기 상태 계산과 같은 애플리케이션에 유용합니다.

펄스 기능

  • 를 사용하여 회로-펄스 스케줄링 활성화 BackendV2.

    # import a fake backend which is a sub-class of BackendV2
    from qiskit.providers.fake_provider import FakePerth
    from qiskit.compiler.scheduler import schedule
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.measure(0,0)
    sched = schedule(circuits=qc, backend=FakePerth())

    이후 BackendV2 함수에 의해 지원되지 않았기 때문에 schedule() 함수에서 지원되지 않았기 때문에 backend 인수가 인스턴스와 함께 제공되었을 때 schedule() 메서드에 오류가 발생했습니다 BackendV2. 자세한 내용은 #10837을 참조하세요.

OpenQASM 기능

  • OpenQASM 2 모듈 qiskit.qasm2 은 내보내기 기능 dump()dumps(). 이들은 이전과 매우 유사한 방식으로 사용됩니다 QuantumCircuit.qasm():

    from qiskit import qasm2, QuantumCircuit
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure([0, 1], [0, 1])
    print(qasm2.dumps(qc))

    새로운 함수는 다음과 같은 코드에서 비롯됩니다 QuantumCircuit.qasm()와 동일한 코드에서 비롯되며, OpenQASM 3 (...)과 비교할 때 보다 일관된 인터페이스를 제공하기 위해 단계적으로 폐지되고 새로운 경로로 대체될 예정입니다qiskit.qasm3) 및 QPY(qiskit.qpy) 모듈에 비해 일관된 인터페이스를 제공합니다. 메서드 이름에 qasm() 에 OpenQASM 버전이 표시되지 않았고, 처음 추가된 이후 키스킷은 쉽게 혼동될 수 있는 여러 직렬화 모듈을 갖게 되었습니다.

QPY 기능

  • QPY는 이제 펄스 스케줄 블록의 기호 표현식뿐만 아니라 ParameterExpression 유형의 객체에 대한 심엔진 네이티브 직렬화 및 역직렬화 사용을 지원합니다. 이는 더 빠른 직렬화 대안이지만 모든 플랫폼에서 지원되지는 않습니다. 이 옵션을 설정하기 전에 대상 플랫폼이 심엔진 라이브러리에서 지원되는지 확인하시기 바랍니다. 페이로드를 역직렬화하려면 qpy가 필요하므로 이 옵션을 설정하세요.

    이 기능은 qpy.dump()use_symengine 파라미터를 통해 활성화할 수 있습니다:

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit import qpy
    
    theta = Parameter("theta")
    phi = Parameter("phi")
    sum_param = theta + phi
    
    qc = QuantumCircuit(1)
    qc.rz(sum_param, 0)
    qc.measure_all()
    
    with open('bell.qpy', 'wb') as fd:
        qpy.dump(qc, fd, use_symengine=True)
    
    with open('bell.qpy', 'rb') as fd:
        new_qc = qpy.load(fd)[0]

양자 정보 특성

  • 추가 Clifford.from_linear_function()Clifford.from_permutation() 메서드를 추가하여 Clifford 객체를 생성하는 LinearFunctionPermutationGate 를 각각 추가했습니다. 결과적으로 이제 Clifford 는 이제 a에서 직접 LinearFunction, a PermutationGate또는 이러한 게이트를 포함하는 양자 회로로 직접 구성할 수 있습니다.

  • 클래스는 이제 Operator 클래스에는 이제 draw() 메서드를 사용하여 텍스트 매트릭스, IPython LaTeX 객체 또는 LaTeX 소스로 표시할 수 있습니다. 기본 그리기 유형은 여전히 연산자의 ASCII __repr__ 입니다.

  • 새로운 메서드를 추가했습니다, apply_layout()메서드를 SparsePauliOp 클래스에 메서드를 추가했습니다. 이 메서드는 트랜스파일러에서 TranspileLayout 레이아웃을 트랜스파일러의 SparsePauliOp 옵저버블에 트랜스파일러의 레이아웃을 적용하는 데 사용됩니다. 이를 통해 BaseEstimator 구현 및 로컬 번역 작업을 더 쉽게 수행할 수 있습니다. 예를 들어,

    from qiskit.circuit.library import RealAmplitudes
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.primitives import BackendEstimator
    from qiskit.compiler import transpile
    from qiskit.providers.fake_provider import FakeNairobiV2
    
    psi = RealAmplitudes(num_qubits=2, reps=2)
    H1 = SparsePauliOp.from_list([("II", 1), ("IZ", 2), ("XI", 3)])
    backend = FakeNairobiV2()
    estimator = BackendEstimator(backend=backend, skip_transpilation=True)
    
    thetas = [0, 1, 1, 2, 3, 5]
    transpiled_psi = transpile(psi, backend, optimization_level=3)
    permuted_op = H1.apply_layout(transpiled_psi.layout)
    res = estimator.run(transpiled_psi, permuted_op, thetas)

    로 전달되기 전에 입력 회로가 로컬에서 트랜스파일링되는 경우 run 로 전달됩니다. 트랜스필레이션은 원래 회로를 2 큐비트에서 7 큐비트( backend)로 확장하고 레이아웃을 퍼뮤트한 다음 H1 에 적용하여 apply_layout() 에 의해 수행된 변환을 반영하기 위해 transpile().

트랜스파일러 기능

  • 클래스는 HighLevelSynthesis 클래스가 확장되어 유형의 객체가 있는 회로를 합성합니다 AnnotatedOperation.

  • 새로운 qiskit.passmanager 모듈이 키스킷 라이브러리에 추가되었습니다. 이 모듈은 일반 패스 매니저와 플로우 컨트롤러를 구현하고 패스 매니저 작업의 실행을 관리하기 위한 인프라를 제공합니다. 이 모듈은 패스(GenericPass) 및 흐름 컨트롤러(BaseController)를 위한 베이스 클래스와 패스 매니저의 실행을 관리하는 새로운 인터페이스 클래스 passmanager.Task 를 제공합니다( Task.execute() 메서드 참조). 이러한 새로운 클래스는 복합 패턴을 따르는데, 흐름 컨트롤러는 패스의 모음이며 컨트롤러는 작업 파이프라인에 재귀적으로 중첩될 수 있기 때문입니다. 또한 기본 클래스는 입력 및 출력 객체 유형을 인식하지 못하므로 최적화를 위해 특정 프로그램 유형에 맞게 서브클래싱해야 한다는 점에 유의해야 합니다. 이 통합 설계는 기존 패스 관리자의 복잡성을 줄여주며, 실행 로직 디스패치 및 작업 구조 정규화를 처리하기 위해 RunningPassManager 같은 클래스를 더 이상 사용할 필요가 없습니다. 모듈은 qiskit.transpiler 모듈은 일반 패스 매니저를 기반으로 기존 패스 매니저를 재구성하도록 재구성되었습니다. 자세한 내용은 업그레이드 노트를 참조하세요.

  • 새로운 분석 SabrePreLayout 에 대한 시작 레이아웃을 생성하는 새로운 분석 패스를 추가했습니다 SabreLayout에 대한 시작 레이아웃을 생성하는 분석 패스를 추가했습니다 sabre_starting_layouts.

    패스는 커플링 맵에 점점 더 많은 "추가" 가장자리를 추가하여 VF2Layout 가 완벽한 그래프 동형성을 찾는 데 성공할 때까지 작동합니다. 보다 정확하게는 증강된 커플링 맵에는 원래 커플링 맵에서 주어진 거리 d 내에 있는 노드 간의 에지가 포함되며, 동형성을 찾을 때까지 d 값이 증가합니다. 또한 패스는 선택적으로 로컬 최소값을 찾을 때까지 레이아웃에 관련된 추가 가장자리 수를 최소화합니다. 여기에는 여분의 가장자리를 제거하고 동형이 여전히 존재하는지 확인하기 위해 VF2Layout 를 호출하여 동형이 여전히 존재하는지 확인합니다.

    다음은 SabrePreLayout 전에 SabreLayout:

    import math
    from qiskit.transpiler import CouplingMap, PassManager
    from qiskit.circuit.library import EfficientSU2
    from qiskit.transpiler.passes import SabrePreLayout, SabreLayout
    
    qc = EfficientSU2(16, entanglement='circular', reps=6, flatten=True)
    qc.assign_parameters([math.pi / 2] * len(qc.parameters), inplace=True)
    qc.measure_all()
    
    coupling_map = CouplingMap.from_heavy_hex(7)
    
    pm = PassManager(
        [
            SabrePreLayout(coupling_map=coupling_map),
            SabreLayout(coupling_map),
        ]
    )
    
    pm.run(qc)
  • 인수를 coupling_map, targetuse_qubit_indices 에 추가했습니다 HighLevelSynthesis 트랜스파일러 패스에 추가했습니다. target 인수는 타겟 백엔드를 지정하여 패스 내에서 호출되는 합성 플러그인이 커플링 맵 및 지원되는 게이트 세트와 같은 모든 타겟별 정보에 액세스할 수 있도록 합니다. coupling_map 인수는 커플링 맵만 지정하며 target 을 지정하지 않은 경우에만 사용됩니다. use_qubit_indices 인수는 레이아웃이 설정되기 전 또는 후에 상위 수준 합성 패스가 실행 중인지, 즉 상위 수준 객체의 큐비트 인덱스가 대상 백엔드의 큐비트 인덱스에 해당하는지 여부를 나타냅니다.

  • coupling_map, targetqubits 인수를 추가했습니다 HighLevelSynthesisPlugin. 위치 인수 target 는 대상 백엔드를 지정하여 플러그인이 커플링 맵, 지원되는 게이트 세트 등과 같은 모든 대상별 정보에 액세스할 수 있도록 합니다. 위치 인수 coupling_map 는 커플링 맵만 지정하며 target 이 지정되지 않은 경우에만 사용됩니다. 위치 인자 qubits 는 물리적 회로에서 합성이 수행되는 경우 상위 레벨 객체가 정의되는 큐비트 목록을 지정합니다. None 값은 레이아웃이 아직 선택되지 않았음을 나타냅니다.

    이렇게 하면 합성 플러그인 옵션을 플러그인용 일반 인터페이스 옵션( coupling_map, target, qubits)과 플러그인별 옵션( options 을 통해 지정된 자유 형식 구성 사전)으로 더 깔끔하게 분리할 수 있습니다. 이 변경 사항은 이전 버전과 호환되므로 coupling_map, 등의 옵션이 플러그인의 run() 메서드에 명시적으로 추가되지 않은 경우 options 의 일부로 표시됩니다.

  • 메서드의 DAGCircuit 메서드 apply_operation_back()apply_operation_front()check 키워드 인수를 얻었으며, 이 인수는 False 으로 설정하여 입력이 DAGCircuit 데이터 구조 불변성을 준수하는지 검증을 생략할 수 있습니다. 이는 트랜스파일러 패스와 같이 알려진 양호한 데이터로 DAG를 빌드할 때 성능 최적화에 유용합니다.

  • 메서드 CouplingMap.reduce() 는 이제 기본값이 True 인 추가 인수 check_if_connected 를 허용합니다. 이는 이전 동작에 해당하는 것으로, 축소된 커플링 맵이 연결되어 있는지 확인하고 그렇지 않은 경우 CouplingError 을 발생시킵니다. False 로 설정하면 확인을 건너뛰고 연결이 끊어진 축소 커플링 맵을 사용할 수 있습니다.

  • 의 생성자는 HighLevelSynthesis 트랜스파일러 패스의 생성자는 이제 추가 인자 equivalence_library, basis_gates, min_qubits 를 허용합니다. 이제 패스는 사용자 정의 정의를 언롤링할 수 있습니다 UnrollCustomDefinitions와 유사하게 사용자 정의 정의를 펼칠 수 있으므로 후자의 패스의 기능을 완전히 대체합니다. 특히 HighLevelSynthesis 은 이제 재귀적이어서 초기 구현에서 간과했던 부분을 수정했습니다. 따라서 target 또는 basis_gates 중 하나를 지정하면 HighLevelSynthesis 는 회로의 모든 상위 수준 객체, 주석이 달린 연산 및 사용자 정의 게이트를 재귀적으로 합성하여 대상에서 지원되거나 동등성 라이브러리에 속하는 게이트만 남깁니다. 이를 통해 HighLevelSynthesis 의 드롭인 대체로 UnrollCustomDefinitions. 반면에 target 또는 basis_gates 모두 지정되지 않은 경우 패스는 "최상위" 상위 수준 객체와 주석이 달린 연산만 합성합니다. 즉, 사용자 정의 게이트 definition 필드로 재귀적으로 하강하지 않습니다. 이것은 (아무것도 하지 않는) UnrollCustomDefinitions (아무것도 하지 않음) 및 하이 레벨 합성 패스의 이전 동작과 모두 호환되며, 중간 변환으로 사용할 수 있으며 HLSConfig 에 지정된 대로 하이 레벨 객체만 합성할 수 있습니다.

  • 장벽을 병합하기 위해 전체 DAG를 재구성하는 MergeAdjacentBarriers 트랜스파일러 패스의 성능을 크게 개선했습니다. 전체 DAG를 다시 빌드하여 장벽을 병합하는 데 사용되었습니다.

  • 새 키워드 인수 min_qubits 를 트랜스파일러 패스의 생성자에 추가했습니다 BasisTranslator 트랜스파일러 패스의 생성자에 추가했습니다. 0이 아닌 값으로 설정하면 회로에서 변환할 연산을 필터링할 최소 큐비트 수를 설정하는 데 사용됩니다. 예를 들어 min_qubits=3 을 설정하면 BasisTranslator 인스턴스는 3개 이상의 큐비트에서 작동하는 회로의 게이트만 변환합니다.

  • 새 키워드 인수 min_qubits 를 트랜스파일러 패스의 생성자에 추가했습니다 UnrollCustomDefinitions 트랜스파일러 패스의 생성자에 추가했습니다. 0이 아닌 값으로 설정하면 회로에서 변환할 연산을 필터링할 최소 큐비트 수를 설정하는 데 사용됩니다. 예를 들어 min_qubits=3 을 설정하면 UnrollCustomDefinitions 인스턴스는 3개 이상의 큐비트에서 작동하는 회로의 게이트만 변환합니다.

  • 지정된 시작 레이아웃을 추가할 수 있는 SabreLayout 패스를 지원하여 지정된 시작 레이아웃으로 평가판을 추가할 수 있습니다. 트랜스파일러 패스는 SabreLayout 트랜스파일러 패스는 일반적으로 완전히 무작위 레이아웃으로 시작한 다음 스왑을 삽입하는 대신 라우팅 패스를 사용하여 해당 레이아웃을 퍼뮤트하여 스왑 게이트가 더 적은 레이아웃을 찾는 여러 레이아웃 트라이얼을 실행합니다. 이 새로운 기능을 사용하면 AnalysisPass 이전 SabreLayout 를 실행하여 속성 세트의 "sabre_starting_layout" 필드를 설정하면 SabreLayout 에 내부 평가판에서 사용할 추가 시작 레이아웃을 제공할 수 있습니다. 예를 들어 DenseLayout 를 한 번의 평가판의 시작점으로 SabreLayout 에서 시작점으로 실행하려면 다음과 같이 하시면 됩니다:

    from qiskit.providers.fake_provider import FakeSherbrooke
    from qiskit.transpiler import AnalysisPass, PassManager
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.transpiler.passes import DenseLayout
    
    class SabreDenseLayoutTrial(AnalysisPass):
    
      def __init__(self, target):
          self.dense_pass = DenseLayout(target=target)
          super().__init__()
    
      def run(self, dag):
          self.dense_pass.run(dag)
          self.property_set["sabre_starting_layouts"] = [self.dense_pass.property_set["layout"]]
    
    backend = FakeSherbrooke()
    opt_level_1 = generate_preset_pass_manager(1, backend)
    pre_layout = PassManager([SabreDenseLayoutTrial(backend.target)])
    opt_level_1.pre_layout = pre_layout

    그런 다음 opt_level_1 StagedPassManager 를 회로와 함께 실행하면 DenseLayout 패스의 출력은 다음 중 하나에 사용됩니다 SabreLayout 최적화 레벨 1에서 기본적으로 실행되는 5개의 완전 무작위 트라이얼에 추가됩니다.

  • 두 개의 새로운 트랜스파일러 패스가 추가되어 싱글 펄스 RX 게이트 캘리브레이션을 즉시 생성할 수 있습니다. 이러한 단일 펄스 RX 보정을 통해 게이트 시간을 절반으로 줄일 수 있으며, 이는 P.Gokhale 외, 최적화 양자 컴파일을 통한 근시일 알고리즘( OpenPulse, 2020)에 설명되어 있습니다, arXiv:2004.11205.

    생성해야 하는 RX 보정 데이터의 양을 줄이기 위해 NormalizeRXAngle 는 세 가지 최적화를 수행합니다 RXGate 회전 각도를 [0, pi] 로 바꾸고 RX(pi/2)RX(pi)SXGateXGate로 바꾸고 회전 각도를 정량화합니다. 이 패스를 실행하려면 RXCalibrationBuilder를 실행하기 전에 실행해야 합니다.

    최적화를 통해 NormalizeRXAngle 를 통해 캘리브레이션 데이터의 양을 줄이고 보다 정확한 하드웨어 캘리브레이션 펄스를 활용할 수 있게 되었습니다. 에 의해 생성된 캘리브레이션은 RXCalibrationBuilder 에서 생성된 캘리브레이션은 SXGate 캘리브레이션에서 부트스트랩되며, 대상에 이미 존재해야 합니다. 진폭은 원하는 임의의 회전 각도를 얻기 위해 선형적으로 스케일링됩니다.

    이러한 단일 펄스 캘리브레이션은 두 개의 펄스로 구성된 기존 시퀀스에 비해 RXGate 두 개의 펄스로 구성된 기존 시퀀스에 비해 시간을 절반으로 줄입니다 SXGate 펄스. 이러한 게이트 시간 단축으로 인해 충실도가 향상될 수 있습니다.

  • 에 새로운 메서드가 추가되었습니다 TranspileLayout, initial_index_layout()routing_permutation()의 목록 보기를 생성하는 데 사용되는 TranspileLayout.initial_layoutTranspileLayout.final_layout 속성의 목록 보기를 생성하는 데 사용되는 메서드를 추가했습니다. 예를 들어 final_layout 속성이

    Layout({
      qr[0]: 2,
      qr[1]: 3,
      qr[2]: 0,
      qr[3]: 1,
    })

    를 입력하면 routing_permutation() 가 반환됩니다:

    [2, 3, 0, 1]
  • 에 새로운 메서드를 추가했습니다 TranspileLayout, initial_virtual_layout()에 새로운 메서드를 추가했는데, 이는 TranspileLayout.initial_layout 속성과 동일하지만 회로에 추가된 앤실라 큐비트를 필터링할 수 있는 옵션을 제공합니다. 기본적으로 TranspileLayout.initial_layout 에는 일반적으로 트랜스파일러가 추가한 모든 부수어가 포함됩니다.

  • 새로운 메서드가 추가되었습니다, final_index_layout()final_virtual_layout() 메서드를 TranspileLayout 클래스에 이러한 메서드는 최종 레이아웃(입력 회로 큐비트를 출력의 최종 위치에 매핑하는 것)을 반환하는 데 사용됩니다. 이것은 라우팅으로 인한 순열인 final_layout 속성과는 구별되며, 라우팅으로 인한 순열인 Layout 객체로 라우팅할 때 발생하는 순열입니다. 메서드는 final_index_layout() 메서드는 입력 회로의 각 큐비트에 대한 출력 위치를 트랜스파일러에 표시하는 리스트를 반환합니다. 예를 들어, 오리지널 회로를 사용합니다:

    qc = QuantumCircuit(3)
    qc.h(0)
    qc.cx(0, 1)
    qc.cx(0, 2)

    를 입력했고 트랜스파일러의 출력은 다음과 같았습니다:

    tqc = QuantumCircuit(3)
    tqc.h(2)
    tqc.cx(2, 1)
    tqc.swap(0, 1)
    tqc.cx(2, 1)

    의 출력은 final_index_layout() 의 출력은 목록을 반환합니다:

    [2, 0, 1]

    final_virtual_layout() 는 이것을 Layout 객체로 반환하므로 위 예제에서 반환되는 값은 다음과 같습니다:

    Layout({
      qc.qubits[0]: 2,
      qc.qubits[1]: 0,
      qc.qubits[2]: 1,
    })

시각화 기능

  • 에서 조건을 표현식으로 표시하는 기능이 추가되었습니다 ExprQuantumCircuit.draw() 메서드 및 circuit_drawer() 함수가 있는 회로를 시각화할 때 ControlFlowOp 인스트럭션이 있는 회로를 시각화할 때

  • matplotlib 회로 서랍에 IBM Quantum Platform 색 구성표를 기반으로 하는 "iqp""iqp-dark" 색상 스타일을 추가했습니다.

  • TextDrawer 에서 빌드된 작업은 ControlFlowOp를 포함하여 if, else, while, for, switch/case 에서 직접 인스턴스화되거나 메서드를 사용하여 빌드된 작업은 이제 QuantumCircuit에 정의된 회로를 ControlFlowOps 에 괄호로 묶어 완전히 표시합니다.

  • 펄스 타임라인 드로어에 대한 사용자 정의 스타일시트를 정의할 때 qiskit.visualization.timeline_drawer()로 설정된 개체 속성 accepts_programTrue 으로 설정된 "생성기" 함수는 전체 스케줄이 포함된 추가 키워드 인수 program 를 받게 됩니다 QuantumCircuit 을 포함하는 추가 키워드 인수를 받습니다.

  • 의 시각화는 plot_gate_map(), plot_coupling_map(). plot_error_map(), 및 plot_circuit_layout() 함수는 많은 수의 큐비트가 있는 백엔드의 레이아웃을 렌더링하기 위해 크게 개선되었습니다. 이는 러스트워크엑스의 graphviz_draw() 함수를 통해 그래프 시각화를 활용하여 많은 수의 큐비트에 맞게 확장되는 보다 정교한 알고리즘 그래프 레이아웃을 수행함으로써 달성할 수 있었습니다.

    _images/release_notes-1.png

기타 기능

  • 의 부호 표현에 대한 지원이 추가되었습니다 ParameterExpression. 구체적인 값을 할당하고 numpy.sign 또는 다른 라이브러리 함수를 사용하는 대신 사용자는 ParameterExpression 클래스의 인스턴스를 사용하여 부호를 계산할 수 있으며 표현식이 완전히 할당되기 전에 부호로 작업할 수 있습니다.

    다음과 같이 사용할 수 있습니다.

    from qiskit.circuit import Parameter
    
    b = Parameter("phi")
    sign_value = b.sign()
    print("sign of an unassigned Parameter is: ", sign_value)
    print("Sign of a Parameter assigned to -3 is: ", sign_value.assign(b,-3))

    자세한 내용은 #10360을 참조하세요.

  • Parameter 는 이제 생성자에 고급 사용 키워드 인수 uuid 를 사용하여 Parameter 를 같은 이름의 다른 것과 동일하게 만드는 데 사용할 수 있습니다. 이는 일반적으로 사용자가 사용해서는 안 되며 사용자 지정 직렬화 및 역직렬화에 가장 유용합니다.

회로 업그레이드 노트

  • ControlledGate.definition 메서드에서 출력되는 Gate.control() 메서드의 출력은 이전 릴리스와 다를 수 있습니다. 메서드의 내부 생성은 Gate.control() 메서드의 내부 생성은 이제 더 이상 사용되지 않는 Unroller 트랜스파일러 패스를 사용하여 정의를 생성하므로 잠재적으로 다른 정의가 생성될 수 있습니다. 출력 ControlledGate 객체의 정의는 이전에 생성된 것과 동일한 단일 정의가 됩니다. 그러나 호출에서 정확한 정의가 필요한 경우 Gate.control() 호출에서 정확한 정의가 필요한 경우 이전 릴리스를 사용하여 회로를 저장하고 qpy.dump() 로 저장한 다음 최신 릴리스로 로드하면 됩니다.

  • 클래스의 num_ancilla_qubits 속성이 PolynomialPauliRotations 는 키스킷 0.23.0 에서 더 이상 사용되지 않으므로 제거되었습니다. 대신 속성 PolynomialPauliRotations.num_ancillas.

  • 다음은 표준 라이브러리 게이트입니다:

    를 더 이상 설정할 수 없습니다 label, condition, duration또는 unit (및 ctrl_state for ControlledGate 서브클래스의 경우) 더 이상 객체를 인스턴스화하지 않습니다. 여전히 설정할 수 있습니다 condition 를 사용하여 c_if(). 를 사용하여 to_mutable() 를 사용하여 명령어의 변경 가능한 복사본을 가져온 다음 원본 객체 대신 해당 복사본에 설정자를 사용할 수 있습니다. label, durationunit 를 이러한 게이트에 키워드 인자로 지정할 수 있으며, 생성 시 변경 가능한 인스턴스가 자동으로 반환됩니다. 이러한 클래스를 다음과 같이 변환하기 위해 이 변경이 필요했습니다 SingletonGateSingletonControlledGate 유형으로 변환하는 과정에서 필요했기 때문에 이러한 게이트의 반복 인스턴스의 메모리 풋프린트를 크게 줄였습니다.

  • 와 상호 작용하는 모든 것에 대해 Gate, Operation또는 Instruction 객체와 상호 작용하거나 QuantumCircuit 또는 DAGCircuit 클래스의 일부로 작동하는 경우 인스턴스에 대한 공유 참조를 사용하는 것이 훨씬 더 일반적이라는 점에 유의하는 것이 중요합니다. 이전에는 회로 작업의 인스턴스를 재사용하고 공유할 수 있었지만, 일반적으로 사용되지는 않았고 복사하면 고유한 인스턴스가 생성되었습니다. 이번 릴리스부터 다음과 같은 이유로 변경되었습니다 SingletonInstructionSingletonGate 를 사용할 수 있게 되었기 때문입니다(그리고 이제 이를 기반으로 구축된 수많은 표준 라이브러리 게이트가 있습니다). 이러한 객체를 사용할 때 모든 회로 작업에 대해 고유한 인스턴스를 가정하는 경우, 이제 동일한 유형의 작업 간에 공유 상태가 재사용되므로(복사 및 심층 복사를 통해 유지됨) 잠재적인 문제가 될 수 있습니다. 속성을 사용하여 Instruction.mutable 속성을 사용하여 객체의 변경 가능성을 확인하거나 Instruction.to_mutable() 를 사용하여 변경 가능한 인스트럭션의 복사본을 얻을 수 있습니다.

  • More Instruction 인스턴스(싱글톤을 반환하는 인스턴스)는 더 이상 엄격하게 만족하지 않습니다(예를 들어):

    type(XGate()) is XGate

    그러나 반환된 객체는 여전히 표준 서브클래스가 되므로 isinstance() (올바른 타입 검사 방법)은 계속 올바르게 작동합니다. 이미 여러 명령어에 이 프로퍼티가 있습니다(예 MCXGate), 하지만 이제는 더 많은 표준 게이트가 이 작업을 수행하므로 더 일반적입니다.

    어떤 이유로 "베이스" 유형의 게이트가 필요하여 인스턴스화할 수 없는 합성 싱글톤 서브클래스를 생략하려면 Instruction.base_class.

  • 의 정의는 UnitaryGate 의 정의는 이제 단일 큐비트 단위의 경우 UGate 레거시 U3Gate 클래스로 정의됩니다.

공급자 업그레이드 안내

  • 파이썬 기반 시뮬레이터에 포함된 QasmSimulatorPy 에 포함된 파이썬 기반 시뮬레이터 qiskit.providers.basicaer 에 포함된 파이썬 기반 시뮬레이터는 이제 'h' (HGate), 'p' (PhaseGate), 'u' (UGate)를 기본 게이트 세트에 포함합니다.

  • 메서드에서 channel 인자 PulseBackendConfiguration.control() 인수가 제거됩니다. 2021년 12월에 릴리스된 키스킷 0.33 (테라 0.19 )에서 더 이상 사용되지 않습니다. 대신 qubits 인수를 사용합니다.

  • qobj[Qobj] 인수를 QasmSimulatorPy.run()run_input[QuantumCircuit or list]

    다음은 코드를 마이그레이션하는 예제입니다:

    # Importing necessary Qiskit libraries
    from qiskit import transpile, QuantumCircuit
    from qiskit.aer import QasmSimulator
    
    # Defining the Quantum Circuit
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    # Transpile the circuit to optimize for the target simulator
    simulator = QasmSimulator()
    transpiled_circuit = transpile(qc, simulator)
    # Run the simulation
    job = simulator.run(transpiled_circuit, shots=1024)
    # Get the simulation result
    result = job.result()

    이러한 기능은 모두 0.22 (2022년 10월 13일 출시) 이후 사용되지 않으며 현재 제거되었습니다.

펄스 업그레이드 노트

  • qiskit.scheduler.utils.format_meas_map(), qiskit.scheduler.utils.measure(), qiskit.scheduler.utils.measure_all() 기능은 각각 qiskit.pulse.utils.format_meas_map(), qiskit.pulse.macros.measure(), qiskit.pulse.macros.measure_all() 로 이전되었습니다. 이전 위치는 키스킷 0.20.0 (Terra 0.15.0, 2020-08-10에 릴리스됨)에서 더 이상 지원되지 않으며 더 이상 사용되지 않습니다.

  • 클래스의 to_dict 메서드 pulse.transforms.AlignmentKind, pulse.transforms.AlignEquispacedpulse.transforms.AlignFunc 가 제거됩니다. 2022년 6월에 릴리스된 키스킷 0.37 (테라 0.21 )에서 더 이상 사용되지 않습니다.

QPY 업그레이드 노트

  • 함수의 첫 번째 위치 인자에 circuits 키워드 사용 qiskit.qpy.dump() 은 2022년 6월에 릴리스된 키스킷 0.37 (테라 0.21 )에서 더 이상 사용되지 않으므로 제거되었습니다. 대신 programs 키워드를 대신 사용하거나 인수를 위치적으로 전달하면 동일하게 작동합니다.

양자 정보 업그레이드 노트

  • 메서드 qiskit.quantum_info.pauli_basis() 는 더 이상 pauli_list 인수를 허용하지 않습니다. 이 기능은 2022년 10월에 릴리스된 키스킷 0.39 (테라 0.22 )에서 더 이상 사용되지 않습니다.

  • qiskit.quantum_info.random 모듈의 random_stabilizer_table 함수가 제거되었습니다. 이 기능은 2022년 10월에 릴리스된 키스킷 0.39 (테라 0.22 )에서 더 이상 사용되지 않습니다. 대신 qiskit.quantum_info.random.random_pauli_list() 을 사용하세요.

  • qiskit.quantum_info.PauliTableqiskit.quantum_info.StabilizerTable 클래스가 제거되었습니다. random_pauli_table() 기능도 제거됩니다. 2023년 5월에 릴리스된 키스킷 0.43 (테라 0.24 )에서 더 이상 사용되지 않습니다. 대신 PauliListrandom_pauli_list().

  • 에 대한 이니셜라이저에 대한 zx 인자 Pauli 인수는 키스킷 테라 0.17 (2021년 4월에 출시)에서 더 이상 사용되지 않으므로 제거되었습니다. 대신 xz 한 쌍을 단일 튜플로 전달해야 합니다(Pauli((z, x))).

  • 초기화자에 대한 label 인수가 Pauli 인수는 키스킷 테라 0.17 (2021년 4월에 출시)에서 더 이상 사용되지 않으므로 제거되었습니다. 대신 Pauli("XYZ") 와 같이 레이블을 위치에 전달합니다.

  • qiskit.quantum_info.operators.pauli 에서 가져오기는 키스킷 테라 0.21 (2022년 6월에 출시)에서 더 이상 사용되지 않으므로 더 이상 허용되지 않습니다. 대신 qiskit.quantum_info 에서 직접 가져옵니다.

합성 업그레이드 노트

  • 생성자의 order 매개변수는 synthesis.SuzukiTrotter 생성자의 매개변수가 홀수로 설정되면 사용 중단 경고 대신 예외를 발생시킵니다. 스즈키 제품 공식은 대칭형이므로 짝수 주문에 대해서만 정의됩니다.

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

  • 패스 관리자의 리팩토링 노력의 결과로 기존 흐름 컨트롤러: FlowControllerLinear, ConditionalControllerDoWhileController 는 이제 BaseController. 이러한 컨트롤러는 다음과 같이 __iter__() 메서드의 구현을 삭제했습니다. 이제 각 내부 작업이 실행된 후 컴파일 상태를 스레딩하는 흐름 컨트롤러 실행의 컨텍스트에서만 이터러블합니다.

  • RunningPassManager 클래스는 기능적으로 새로운 패스 관리자 프레임워크(BasePassManagerBaseController). 실행 중인 패스 관리자는 이제 상태 비저장 흐름 컨트롤러(본질적으로 FlowControllerLinear)로, 패스 관리자는 태스크 파이프라인의 구성을 담당하고 컨트롤러는 연결된 태스크의 실행을 담당합니다. RunningPassManager 서브클래싱은 더 이상 권장되지 않으며, 이 클래스는 향후 릴리스에서 플로우 컨트롤러로 완전히 대체될 예정입니다.

  • 새로운 클래스 WorkflowStatus라는 새로운 클래스가 도입되어 패스 관리자 워크플로우의 상태를 추적할 수 있습니다. 이 휴대용 개체는 패스 관리자가 실행될 때 생성되어 기본 작업으로 전달됩니다. 이러한 상태는 이전에는 RunningPassManager 에서 인스턴스 변수를 사용하여 관리했습니다.

  • 트랜스파일러 전용 transpiler.PassManager ( 에 사용된 transpile())은 이제 passmanager.BasePassManager. 그러나 이 클래스 계층 구조 변경으로 인해 공개용 API에 획기적인 변화가 생기지는 않습니다.

  • 이제 패스 관리자 실행 중에 발생하는 예외는 새로 도입된 PassManagerError. 패스 관리자 기계의 일반적인 실패는 일반 패스 관리자에게는 PassManagerError 를 발생시키지만, 트랜스파일러 전용 transpile.PassManager 은 현재 이전 버전과의 호환성을 위해 이를 특정 TranspilerError 로 래핑하여 이전 버전과의 호환성을 유지합니다. 이 래핑은 향후 제거될 예정입니다.

  • 패스 관리자 프레임워크에서 FencedObject 사용이 제거되었습니다. 이 래퍼 클래스는 변경 가능한 객체 속성을 수정으로부터 보호할 수 없으며, 제대로 구현된 코드에서는 문제가 되지 않습니다. 분석 패스는 입력 IR을 수정해서는 안 되며, 컨트롤러는 프로퍼티 세트를 업데이트해서는 안 됩니다. 패스가 객체 속성을 수정하지 않도록 하는 것은 패스 관리자 개발자의 책임입니다,

  • 플러그인 이름 default플러그인 단계 init, layout, optimization, scheduling 를 위해 예약되어 있습니다. 이전에는 이 플러그인 이름을 예약하지 않았지만, 이제 default 이름은 이러한 단계에 대한 키스킷의 내장 기본 메서드를 나타내는 데 사용됩니다. 이 단계에서 플러그인에 이러한 이름을 사용했다면 키스킷의 사용법과 충돌하므로 플러그인 이름을 변경해야 합니다.

  • 사전 설정 패스 관리자에서 RemoveResetInZeroState 클래스 사용을 비활성화합니다. 이전에는 transpile() 또는 generate_preset_pass_manager() 를 레벨 1, 2 또는 3에서 optimization_level 로 실행하면 RemoveResetInZeroState. 그러나 이 패스는 재설정을 통해 명시적으로 0으로 설정하지 않는 한 임의의 초기 상태라는 개념을 금지했습니다. 컴파일 파이프라인의 일부로 패스를 실행해야 하는 경우 다음과 같이 실행할 수 있습니다:

    pm = generate_preset_pass_manager(1, backend)
    pm.init.append(RemoveResetInZeroState())
    pm.run(circuit)

    를 사용하여 회로 컴파일을 위해 이 기능을 유지합니다.

  • 더 이상 사용되지 않는 트랜스파일러 라우팅 패스( BIPMapping )가 제거되었습니다. 이 기능은 키스킷 0.43.0 릴리스에서 더 이상 사용되지 않는 것으로 표시되었습니다. 외부 플러그인 패키지로 대체되었습니다: qiskit-bip-mapper. 이 새로운 패키지에 대한 자세한 내용은 패키지의 깃허브 리포지토리에서 확인할 수 있습니다:

    https://github.com/qiskit-community/qiskit-bip-mapper

    패스를 별도의 플러그인 패키지로 만든 이유는 두 가지입니다. 첫째, CPLEX에 대한 종속성으로 인해 사용하기가 더 어려워지고 둘째, 플러그인 패키지가 더 깔끔하게 transpile(). 이 패스를 지원하기 위한 cplexdocplex 설치를 위한 추가 옵션( bip-mapper )은 키스킷에서 더 이상 선택적으로 필요하지 않으므로 제거되었습니다.

  • 메서드에서 qubits 인자 InstructionDurations.get()는 더 이상 Qubit (또는 그 목록)을 더 이상 허용하지 않습니다. 이 기능은 2021년 12월에 릴리스된 키스킷 0.33 (테라 0.19 )에서 더 이상 사용되지 않습니다. 대신 큐비트 인덱스에 정수를 사용하세요.

  • 에서 qubit_channel_mapping 인자를 제거했다 RZXCalibrationBuilder에서 더 이상 사용되지 않는 인수를 제거했습니다 0.39 (2022년 10월에 qiskit-terra 0.22 로 출시됨)

  • In transpiler.CouplingMap 메서드 subgraph 는 0.20 에서 사용되지 않는 것으로 제거되었습니다. reduce() 메서드 대신 subgraph 을 사용할 수 있습니다.

시각화 업그레이드 안내

  • 의 첫 번째 위치 인수에 rho 키워드 사용에 대한 지원을 제거했습니다 plot_state_hinton(), plot_bloch_multivector(), plot_state_city(), plot_state_paulivec()plot_state_qsphere(). rho 대신 state 을 사용할 수 있습니다. 포함된 모든 기능이 qiskit.pulse.macrosqiskit.pulse.utils 로 이전되었으므로 qiskit.scheduler.utils 을 제거했습니다. 이 모든 기능은 0.15 (2020년 8월 6일 출시) 이후 더 이상 사용되지 않으며 현재 제거되었습니다.

  • visualization.QCircuitImage 에 대한 클래스 생성자 인수 qregs, cregs, layoutglobal_phase 는 0.20 에서 더 이상 사용되지 않으므로 제거되었습니다.

  • 시각화 기능: plot_gate_map(), plot_coupling_map(). plot_error_map()plot_circuit_layout() 는 이제 그래프 시각화 설치 여부에 따라 작동합니다. 이 변경은 더 많은 수의 큐비트를 사용하는 백엔드를 시각화하기 위해 필요했습니다. 이 추가 외부 요구 사항은 이전에 이러한 기능에 필요했던 기존의 선택적 종속성에 추가됩니다. 그래프 시각화 설치 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다: https://graphviz.org/download/

기타 업그레이드 주의사항

  • 값에 QuasiDistribution 값에는 부동 소수점 오류가 포함될 수 있습니다. QuasiDistribution.__repr__ 라운드는 numpy.round() 및 매개 변수 ndigits 를 사용하여 클래스 속성 __ndigits__ 으로 조작할 수 있습니다. 기본값은 15 입니다.

  • qiskit.qobj.Qobj 클래스가 제거되었습니다. 2021년 12월에 릴리스된 키스킷 0.33 (테라 0.19 )에서 더 이상 사용되지 않습니다. 대신 qiskit.qobj.QasmQobj 또는 qiskit.qobj.PulseQobj.

  • 데코레이터 qiskit.utils.deprecation.deprecate_function() 는 키스킷 0.39.0 (2022년 10월에 출시, 키스킷-테라 0.22.0 ) 이후 더 이상 사용되지 않으며 현재 제거되었습니다. 대신 qiskit.utils.deprecate_func() 대신 사용하세요.

  • 함수 execute() 함수는 더 이상 qobj_idqobj_header 인수를 허용하지 않습니다. 2022년 6월에 릴리스된 키스킷 0.37 (테라 0.21 )에서 사용이 중단되었습니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.CXDirection 가 제거되었습니다. 이 기능은 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 )에서 더 이상 사용되지 않습니다. 대신 보다 일반적인 GateDirection 패스를 사용합니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.CheckCXDirection 가 제거되었습니다. 이 기능은 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 )에서 더 이상 사용되지 않습니다. 대신 보다 일반적인 CheckGateDirection 패스를 사용합니다.

  • 이제 소스에서 키스킷을 빌드하려면 언어 버전 1.64 과 호환되는 Rust 컴파일러가 필요합니다. 이는 이전 버전의 키스킷을 빌드할 때 지원되던 최소 Rust 버전( 1.61 )보다 높아졌습니다.

알고리즘 사용 중단

  • qiskit.utils.validationqiskit.utils.algorithm_globals 의 알고리즘 유틸리티는 이제 더 이상 사용되지 않으며 출시일로부터 3개월 이내에 제거될 예정입니다. 이러한 유틸리티는 레거시 및 프리미티브 기반 알고리즘 워크플로우를 지원하기 위해 qiskit.algorithms 모듈과 함께 도입되었습니다. 이제 qiskit.algorithms 이 더 이상 사용되지 않고 프리미티브 기반 알고리즘 코드베이스가 독립형 라이브러리로 마이그레이션되었으므로, 이러한 유틸리티는 더 이상 키스킷의 컨텍스트에서 사용되지 않습니다. 애플리케이션에서 허용하는 경우, qiskit_algorithms.utils 에서 algorithm_globalsvalidation 에서 관련 유틸리티를 가져올 수 있는 qiskit_algorithms를 사용하도록 코드를 마이그레이션할 것을 권장합니다. 레거시 기능은 새 패키지로 마이그레이션되지 않았다는 점에 유의하세요.

회로 사용 중단

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

  • 플로우 컨트롤러 팩토리 메서드 FlowController.controller_factory() 와 함께 더 이상 사용되지 않습니다 FlowController.add_flow_controller()FlowController.remove_flow_controller(). 앞으로는 메서드에 키워드 인수를 사용하여 작업을 구성하는 BasePassManager.append() 메서드를 사용한 작업 구성도 더 이상 사용되지 않습니다. 컨트롤러는 명시적으로 인스턴스화하여 패스 매니저에 추가해야 합니다. 예를 들어, 이전에 사용된 기존 구문은 다음과 같습니다

    pm.append([task1, task2], condition=lambda x: x["value1"] > 10)

    controller = ConditionalController([task1, task2], condition=lambda x: x["value1"] > 10)
    pm.append(controller)

    후자는 특히 여러 키워드 인수가 함께 지정될 때 컨트롤러의 순서를 보다 정밀하게 제어할 수 있으며, 파이프라인이 두 개 이상이거나 생성자에 하나의 단순 조건 함수를 사용하지 않는 일반적인 흐름 컨트롤러를 구성할 수 있습니다.

  • 그리고 FlowControllerLinear.append(), DoWhileController.append()ConditionalController.append() 메서드는 모두 즉시 사용되지 않습니다. 패스 관리자 작업 파이프라인의 구성은 이제 BasePassManager를 통해 이루어지며, 개별 흐름 컨트롤러는 이 방법을 사용할 필요가 없습니다. 플로우 컨트롤러의 경우 모든 패스를 생성자에 직접 한 번에 지정해야 합니다.

  • 일반 속성 및 변수 이름 passes 은 전체 모듈에서 tasks 으로 대체됩니다 qiskit.passmanager 모듈로 대체됩니다. 작업은 pass와 컨트롤러의 결합을 나타내야 하며, 단수형 pass는 Python 키워드와 충돌한다는 점에 유의하세요. 이런 의미에서 작업을 사용하는 것이 훨씬 더 바람직합니다.

  • 트랜스파일러 패스는 Unroller 트랜스파일러 패스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 는 Unroller 는 유사한 기능을 제공하지만 더 일반적인 방식으로 제공하는 BasisTranslator 로 대체되었으며, 이는 유사한 기능을 제공하지만 보다 일반적인 방식으로 제공하므로 회로를 모든 범용 기본 집합으로 변환할 수 있습니다. 클래스는 Unroller 클래스는 회로의 게이트 정의가 대상 기준으로 재귀적으로 정의되는 상황에서만 작동합니다; 키스킷의 표준 라이브러리 게이트의 경우 이는 UGateCXGate. 패스를 사용하는 경우 Unroller 형식의 사용자 지정 패스 관리자를 사용하여 대체할 수 있습니다:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import UnrollCustomDefinitions, BasisTranslator
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    pm = PassManager(
        [
            UnrollCustomDefinitions(sel, basis_gates=basis_gates),
            BasisTranslator(sel, target_basis=basis_gates),
        ]
    )
    pm.run(circuit)
  • translation_method 키워드 인수에 "unroller" 값을 사용하는 것은 transpile()generate_preset_pass_manager() 는 더 이상 사용되지 않습니다. 이 번역 단계 플러그인은 "unroller" 플러그인과 유사하게 작동하지만 더 광범위한 대상 백엔드를 지원하는 기본 "translator" 메서드로 대체되었으므로 향후 릴리스에서 키스킷에서 제거될 예정입니다.

시각화 기능의 사용 중단

  • 기본 matplotlib 서랍 설정은 이제 기본 스타일이 "iqp" 스타일(이전에는 "iqx")로 변경되므로 FutureWarning 을 발행합니다. 이전 기본값은 "clifford" 스타일로 사용할 수 있습니다. 경고를 무음으로 설정하려면 원하는 스타일을 명시적으로 설정할 수 있습니다. g.:

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.x(0)
    circuit.h(0)
    circuit.cp(0.5, 0, 1)
    
    circuit.draw("mpl", style="clifford")  # or style="iqp"
  • 예약된 노드 시작 시간 정보가 없는 qiskit.visualization.timeline_drawer() 에 예약된 노드 시작 시간 정보가 없는 회로를 전달하는 것은 더 이상 사용되지 않습니다. 스케줄링 분석 패스 중 하나를 통과한 회로만(예를 들어 ALAPScheduleAnalysis 또는 ASAPScheduleAnalysis)를 거친 회로만 시각화할 수 있습니다. 이전 스타일의 예약 패스 중 하나를 사용한 경우(예 ALAPSchedule 또는 ASAPSchedule)을 사용했다면 실행하여 스케줄링 정보를 전파할 수 있습니다:

    from qiskit import transpile
    from qiskit.transpiler import InstructionDurations
    
    scheduled = transpile(
      my_old_style_circuit,
      optimization_level=0,
      scheduling_method="alap",
      instruction_durations=InstructionDurations(),
    )

    이 동작은 이전에 키스킷( 0.37 )에서 더 이상 사용되지 않을 예정이었으나 경고의 버그로 인해 지금까지 사용자에게 표시되지 않았습니다. 이 동작은 키스킷 1.0 에서 제거될 예정입니다.

버그 수정

  • 행렬 곱셈 기반 정류성 검사에 고려할 최대 큐비트 수 CommutationChecker 은 이제 기본적으로 3으로 제한됩니다. 수정 #10488

  • 트랜스파일러 패스는 GateDirection 트랜스파일러 패스는 이제 연속형에 의존하지 않고 불연속형 기준 번역을 사용합니다 RYGate에 의존하지 않고 이산 기준 변환을 사용하므로 일부 이산 기준 설정 타깃의 안정성이 약간 더 높아질 것입니다. 일반적으로 transpile() 는 연속적으로 매개변수화된 연산을 포함하지 않는 기저 집합을 부분적으로만 지원하므로 이러한 상황에서 항상 성공하지 못할 수 있으며 최적의 결과를 생성하지 못할 가능성이 거의 높습니다.

  • 수정 CommutationAnalysis 를 사용하여 와이어의 게이트를 세트로 그룹화하고 각 세트에는 쌍으로 통근하는 게이트만 포함하도록 수정했습니다. 이렇게 하면 CommutationCancellation 이 불건전한 최적화를 수행하지 못하게 됩니다. 8020 참조

  • CUGate 로 호출하는 동안 올바르게 작동합니다 QuantumCircuit.assign_parameters(). 이전에는 초기 회로 할당 후 시간이 지나면 여러 가지 이상한 오류가 발생하곤 했습니다. 7326, #7410, #9627, #10002#10131을 참조하세요.

  • 제어 흐름 빌더 인터페이스( 컨텍스트 관리자 형식의 QuantumCircuit.if_test(), while_loop(), for_loop()switch())는 이제 해당 블록 내에서 별도의 전역 단계 진행을 올바르게 추적합니다. 다음을 할당하여 내부 블록에 전역 단계 발전을 추가할 수 있습니다 QuantumCircuit.global_phase 에 할당하면 됩니다:

    from math import pi
    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 3)
    qc.global_phase = pi / 2  # Set the outer circuit's global phase.
    
    with qc.if_test((qc.clbits[0], False)) as else_:
      # The global phase advancement in a control-flow block begins at 0,
      # because it represents how much the phase will be advanced by an
      # execution of the block.  The defined phase of the outer scope is not
      # affected by this set.
      qc.global_phase = pi
    with else_:
      # Similarly, the `else` block may induce a different global-phase
      # advancement to the `if`, so it can also be set separately.
      qc.global_phase = 1.5 * pi
    
    # The phase advancement caused directly by the outer scope is independent
    # of the phase advancement conditionally caused by each control-flow path.
    assert qc.global_phase == pi / 2

    의 의미는 QuantumCircuit.global_phase 의 의미는 블록의 단일 실행에 내재된 글로벌 단계의 진전으로 간주됩니다. 블록이 입력되면 전체 프로그램의 모든 큐비트의 위상이 진전된다는 점에서 여전히 글로벌 위상 진전입니다.

  • "iqx""iqx-dark" matplotlib 색 구성표의 색상을 수정했습니다 RZGate, RZZGate, (다중)제어 PhaseGateiSwapGate 를 잘못된 색으로 그렸습니다.

  • 의 해시는 Parameter 의 해시는 이제 비교 대상인 ParameterExpression 의 해시와 같습니다. 이전에는 해시가 달라서 다음과 같은 경우 해시맵에 잘못된 추가 항목이 발생했습니다 ParameterParameterExpression 값이 같은 맵에 혼합되어 Python 의 데이터 모델을 위반하는 경우가 있었습니다.

  • QPY 직렬화의 버그(qiskit.qpy)에서 회로의 제어된 단일 게이트가 역직렬화되지 않을 수 있는 버그가 수정되었습니다. 수정 #10802.

  • 의 구현을 수정하여 random_statevector() 의 구현을 수정하여 균일한 분포에서 샘플링하도록 했습니다.

  • 패스 NoiseAdaptiveLayout 는 이제 CouplingMap 를 선택적 인수로 받습니다. 이것은 플러그인에서 다음과 같은 불일치를 제어하는 데 사용됩니다 configuration()properties()의 경우처럼 FakeMelbourne. 수정 #7677.

  • 메소드 QuantumCircuit.copy()copy_empty_like() 는 이제 name 인수를 잘못 입력하면 잘못된 회로를 생성하는 대신 오류를 발생시킵니다.

  • "decay" 휴리스틱의 SabreSwapSabreLayout 는 이제 가상 큐비트에서 스왑의 '깊이'를 잘못 추적하는 대신 물리적 큐비트에서 깊이를 올바르게 추적합니다.

  • 의 간과된 부분을 수정했습니다 ECRGate 에서 객체 생성 시 ECRGate.label 어트리뷰트를 설정하지 못하게 하는 문제를 수정했습니다. 다른 모든 Gate 클래스 및 서브클래스는 생성자에서 label 키워드 인수를 설정할 수 있습니다.

  • (및 표준 라이브러리 서브 클래스) 생성자에서 간과된 부분을 수정했습니다 Gate (및 표준 라이브러리 서브 클래스) 생성자의 간과를 수정했습니다 durationunit 어트리뷰트를 생성 중에 키워드 인수로 설정할 수 없던 문제를 수정했습니다. 부모 클래스 Instruction 는 이 설정을 지원하지만 Gate 는 이전에는 이 인터페이스를 올바르게 노출하지 않았습니다.

  • 정적 메서드에 빈 이터러블을 전달하는 SparsePauliOp 기본 초기화를 허용하는 지원이 추가되었습니다 from_list()from_sparse_list(). 수정 #10159.

  • 에 (더 이상 사용되지 않는) Optimizer 클래스를 사용하는 것은 AQC 에는 더 이상 사용되지 않는 대체 경로가 없었으며, 이는 키스킷 0.44 에 도입되었어야 했습니다. 이제 더 이상 사용되지 않는 경고에 명시된 대로 Minimizer 프로토콜을 구현하는 호출러블을 허용합니다(사용 중단 경고에 명시된 대로). 콜러블은 다음 예시와 같이 보일 수 있습니다:

    from scipy.optimize import minimize
    from qiskit.transpiler.synthesis.aqc.aqc import AQC
    
    optimizer = partial(minimize, args=(), method="L-BFGS-B", options={"maxiter": 200})
    aqc = AQC(optimizer=optimizer)
  • 클래스 관련 문제를 수정했습니다 Barrier 클래스 관련 문제를 수정했습니다. 인스턴스를 추가할 때 Barrier 인스턴스를 추가할 때 QuantumCircuit 에 인스턴스를 추가할 때 QuantumCircuit.append() 메서드에 인스턴스를 추가할 때 이전에는 배리어의 크기가 지정된 qargs와 일치하는지 검증할 수 없었습니다.

  • 이제 BlockCollapser 트랜스파일러 패스는 동일한 클래식 레지스터에 두 개 이상의 조건이 포함된 회로를 올바르게 처리합니다.

  • BlueprintCircuit 서브클래스는 이제 빌드되지 않은 상태의 블루프린트와 함께 반공개 메서드 QuantumCircuit._append() 를 사용할 때 올바르게 동작합니다(즉 , 추가를 시도하기 전에 회로가 빌드됩니다).

  • 확대/축소, 글꼴 크기 및 여백을 조정하여 plot_state_city() 을 조정하여 더 많은 그림 크기에 맞게 플롯을 더 잘 맞출 수 있습니다. 막대와 영진폭 평면의 Z 정렬 동작을 수정하고 음수 실수값 막대의 표시를 수정했습니다.

기타 참고사항

  • 이 버전의 키스킷은 아직 출시되지 않은 Numpy 2.x 시리즈에 대해 아직 컴파일되지 않은 확장자를 포함하고 있기 때문에 명시적으로 Numpy 1.x 시리즈에 고정되어 있습니다. 가능한 한 빠른 시일 내에 Numpy 2.x 를 지원하는 새로운 버전의 키스킷을 출시할 예정입니다.

    호환되는 버전이 출시되기 전에 Numpy 2와 함께 키스킷을 강제로 설치하려고 하면 패키지 관리자가 이전 버전의 키스킷(핀이 같지는 않지만 여전히 호환되지 않을 가능성이 있는)으로 리셋하는 것을 막을 수 없습니다.

  • 의 동작을 수정했습니다 VF2LayoutVF2PostLayout 트랜스파일러 패스의 동작을 수정했는데, 이전에는 입력 회로가 충분히 큰 경우 멀티스레딩을 사용하여 내부 스코어링을 실행했습니다. 멀티스레딩 사용은 원래 의도한 대로 성능이 개선되지 않고 오히려 퇴보하는 것으로 나타났기 때문에 이제 패스에서 제거되었습니다.

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