Skip to main content
IBM Quantum Platform

키스킷 1.0 릴리즈 노트


1.0.2

Prelude

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

버그 수정

  • 다음과 관련된 문제를 수정했습니다 convert_to_target() 에서 제어 흐름 명령이 제어 흐름 명령이 객체에서 지정되는 일반적인 위치인 BackendConfiguration.supported_instructions 속성에 지정된 경우 변환기가 제어 흐름 명령을 잘못 무시하는 문제를 수정했습니다 BackendConfiguration 객체에 지정되는 일반적인 위치입니다. 11872 수정.

  • 호출 EquivalenceLibrary.set_entry() 을 호출하면 이제 라이브러리의 내부 그래프 객체가 올바르게 업데이트됩니다. 이전에는 메타데이터는 업데이트되지만 그래프 구조는 변경되지 않았기 때문에 다음과 같은 사용자는 BasisTranslator 와 같은 사용자는 여전히 이전 규칙을 사용하게 됩니다. 고정 #11958.

  • 이제 EvolvedOperatorAnsatz 는 이제 operators 인수가 빈 목록인 경우를 올바르게 처리합니다. 이전에는 이렇게 하면 오류가 발생했습니다.

  • 0 큐비트 인스턴스의 일관성 문제 수정 EvolvedOperatorAnsatz 인스턴스의 일관성 문제를 수정했습니다. 이전에는 이러한 인스턴스에는 단일 QuantumRegister in qregs 를 포함했지만 이제는 레지스터가 생성되지 않습니다. 이 동작은 슈퍼클래스와 더 일관되게 일치합니다 QuantumCircuit.

  • 의 충돌을 수정했습니다 convert_to_target() 에서 쿼비트 속성( T1, T2 또는 주파수)이 누락되었을 때 발생하는 충돌을 수정했습니다. 에서 누락된 속성 값이 QubitProperties 의 누락된 속성 값은 이제 None 으로 채워집니다.

  • 회로에서 많은 수의 큐비트와 비트를 역직렬화할 때 qpy.load() 함수의 성능 문제를 수정했습니다. 회로에 많은 수의 큐비트 또는 클릿이 있는 QPY 페이로드를 역직렬화할 때.

  • EstimatorPub.coerce()SamplerPub.coerce()BindingsArray 유형의 매개 변수를 부적절하게 처리하는 버그를 수정했습니다. 이전에는 ValueError 예외가 잘못 발생했습니다.

  • 에서 사용하는 사전 설정 패스 관리자 transpile() 가 사용하는 사전 설정 패스 관리자는 더 이상 하드웨어 타겟이나 기본 게이트 세트가 지정되지 않은 제어 흐름이 있는 회로에서 실패하지 않습니다. 이제 이러한 추상적인 대상을 모든 제어 흐름 작업을 허용하는 것으로 취급합니다. 11906 수정.

  • 입력이 중첩되지 않은 단일 옵저버블인 경우 0-d 배열을 반환하도록 coerce() 을 수정했습니다. 이전에는 모양이 (1,) 인 단일 차원으로 잘못 업그레이드되었습니다.

  • Parameter 는 동일하게 비교되는 인스턴스가 항상 동일한 해시를 갖도록 업데이트되었습니다. 이전에는 Parameter.uuid 만 비교되었기 때문에 Parameteruuid 매개변수의 공통 값(일반적으로 명시적으로 전달되지 않음)을 사용하여 생성된 경우 이름이 다른 인스턴스도 동일하게 비교될 수 있었습니다.

  • 버그 수정 QuantumCircuit.draw() 의 버그가 수정되어 Matplotlib 서랍의 사용자 정의 스타일 사전이 실행 시 수정되었습니다.


1.0.1

Prelude

키스킷 1.0.1 은 키스킷 1.0.0 릴리스에서 확인된 소수의 버그를 수정하는 패치 릴리스입니다.

버그 수정

  • 사용자 지정 펄스 지침을 레거시 형식으로 변환하는 버그가 수정되었습니다 qiskit.qobj 형식으로 변환하는 버그를 수정했습니다. 이 버그는 키스킷( 1.0.0 )에 도입되어 사용자 지정 펄스 모양을 가진 명령어를 변환할 때 오류가 발생했습니다. 수정 후 변환이 올바르게 수행되고 사용자 지정 펄스가 정상적으로 pulse.Waveform 로 변환됩니다. 11828 수정.

  • 트랜스파일러 패스의 문제를 수정했습니다 InverseCancellation 트랜스파일러 패스에서 경우에 따라 파라미터 값이 일치하지 않더라도 자체 역 파라미터화된 게이트가 잘못 취소되는 문제를 수정했습니다. 11815 수정.

  • BasePassManager.run() 은 더 이상 이전 워크플로우를 PropertySet 을 두 번 이상 호출할 때 새 워크플로로 누출되지 않습니다. 이전에는 이전과 동일한 PropertySet 을 사용하여 후속 실행을 초기화했는데, 이는 잘못된 속성 정보가 작업에 제공되고 있음을 의미할 수 있습니다. 이제 동작은 Qiskit 0.44 의 동작과 일치합니다. 수정 #11784.

  • convert_durations_to_dt() 에서 함수가 실제 단위를 읽지 않고 입력값을 모두 초 단위로 가정하는 버그가 수정되었습니다. 이로 인해 보고된 회로 지속 시간이 잘못 계산될 수 있습니다.


1.0.0

Prelude

키스킷을 출시하게 되어 매우 기쁘게 생각합니다 1.0.0. 이번 릴리스는 키스킷을 안정적이고 고성능의 양자 컴퓨팅용 SDK로 성숙시키기 위한 7년간의 개발의 정점이며, 키스킷 프로젝트와 커뮤니티의 새로운 시대를 여는 시작입니다. 일반적인 성능 및 안정성 개선 외에도 1.0.0 릴리스에서 가장 중요한 변경 사항은 안정성 정책, 릴리스 주기 및 버전 관리와 관련이 있습니다. 키스킷은 이제 시맨틱 버전 관리를 공식적으로 사용하고 있으며, 이는 1.x 릴리스 시리즈의 전체 수명 주기 동안 프로젝트가 공개 문서화된 API에서 하위 호환성을 유지하기 위해 최선을 다하고 있음을 의미합니다. 또한 이제 주요 버전에 대한 버그 수정 지원을 제공하기 시작하여 다음 주요 버전이 출시된 후에도 6개월 동안 계속 지원되는 브랜치를 사용할 수 있습니다. 이는 1.x 및 0.x 주요 시리즈부터 시작되며, 0.46.x 릴리스가 출시된 후 6개월 동안 버그 수정이 포함된 주기적인 패치 릴리스를 통해 1.0 이 계속 지원됩니다. 즉, 0.46.x 은 2024-08까지 지원됩니다. 새 정책에 대한 자세한 내용은 여기에서 확인할 수 있습니다:

시작/설치#키스킷 버전 관리

이번 릴리스에서 가장 중요한 것은 패키지의 변화입니다. 키스킷이 요소 모델을 도입한 2018-12년 키스킷 0.7 릴리스 이후, 여러분이 설치하게 될 qiskit 패키지는 키스킷을 구성하는 요소들을 결합하여 설치하는 메타 패키지(또는 패키지들의 패키지)였습니다. 이전 릴리스에서 발표한 대로(자세한 내용은 0.44.0, 0.45.30.46.0 릴리스 노트와 이 블로그 게시물을 참조하세요) 1.0 릴리스에서는 핵심 SDK만 노출하는 단일 qiskit 패키지(이전에는 qiskit-terra)로의 전환을 완료했습니다. 즉, 릴리스 >= 1.0.0 의 경우 qiskit-terra 패키지 사용을 중단하고 qiskit 만 게시합니다. 이 패키징 구조 변경은 Python 패키지 인스톨러 pip 에서 완전히 지원되지 않으므로 pip install -U qiskit 를 사용하여 키스킷 0.46.0 에서 1.0.0 로 업그레이드하는 것은 불가능하다. 키스킷( 1.0.0 )으로 업그레이드하려면 별도의 가상 환경을 만들어 설치를 격리할 것을 적극 권장합니다. 패키징 변경 사항과 다양한 시나리오에서 키스킷을 설치하는 방법( 1.0.0 )을 설명하는 자세한 마이그레이션 가이드는 여기에서 확인할 수 있습니다:

https://qisk.it/1-0-packaging-migration

모든 주요 릴리스와 마찬가지로 키스킷( 1.0.0 )에도 수많은 새로운 기능이 추가되었으며, 이번 릴리스의 주요 특징은 다음과 같습니다:

  • 클래스의 QuantumCircuit 클래스의 내부 data 구조가 Rust에서 재작성되어 메모리 효율성이 크게 향상되었습니다 QuantumCircuit 객체의 메모리 효율을 크게 개선하기 위해 내부 구조를 재작성했습니다.
  • 의 새로운 버전의 프리미티브 인터페이스 정의가 qiskit.primitives 의 새로운 버전의 BaseSamplerV2BaseEstimatorV2 추상 클래스. 이 새로운 버전의 인터페이스에는 프리미티브에 대한 벡터화된 호출을 수행하는 기능이 추가되어 매개변수 값 집합과 관측 가능 항목에 대한 스윕을 효율적으로 지정할 수 있습니다.
  • 새로운 실험적인 네이티브 OpenQASM 3 파서 qiskit.qasm3.loads_experimental()qiskit.qasm3.load_experimental(). 이 새로운 구문 분석기는 아직 개발 중이며 몇 가지 제한 사항이 있으며 아직 실험 단계에 있습니다. 그러나 사용 가능한 경우 새 구문 분석기는 훨씬 더 빠르고 진단 오류 메시지가 개선되어 OpenQASM 3 프로그램이 잘못된 부분을 디버깅할 수 있습니다. 이 새로운 구문 분석기는 Rust로 작성되었으며 새로 개발된 구문 분석용 Rust 라이브러리( OpenQASM3 )를 기반으로 합니다: https://github.com/Qiskit/openqasm3_parser

마지막으로, 키스킷 1.0.0 릴리스는 지난 7년간의 개발 기간 동안 쌓인 기술적 부채를 정리할 수 있는 기회였습니다. 키스킷 1.0.0 릴리스에는 DeprecationWarning가 거의 배포되지 않으며, 동시에 1.0.0 릴리스 노트의 업그레이드 섹션이 평소보다 길어진 것을 알 수 있습니다. 이는 기술 부채 정리의 직접적인 결과입니다. 0.46.x 에서 1.0.0 으로 마이그레이션하는 데 도움을 드리기 위해 릴리즈 노트 외에 전용 마이그레이션 가이드도 게시했으며, 여기에서 확인할 수 있습니다:

키스킷 1.0 기능 변경

이 가이드는 릴리스 노트를 보완하고 0.46.0 릴리스에서 더 이상 사용되지 않는 기능이 제거된 후 API 변경 사항을 마이그레이션하는 방법에 대한 구체적인 조언을 제공하기 위한 것입니다.

회로 기능

  • 메서드에 새 인수 annotated 를 추가했습니다 QuantumCircuit.inverse(), circuit.Instruction.inverse().inverse() 메서드에 Instruction 서브 클래스( SwapGate 또는 SGate)를 선택적으로 반환하는 AnnotatedOperation. annotated 의 기본값은 False 이며 메서드의 기존 동작에 해당합니다. 또한 명시적으로 정의된 inverse 메서드가 있는 표준 게이트의 경우, 예를 들어 annotated 인수는 둘 다 효과가 없습니다:

    SwapGate().inverse(annotated=False)
    SwapGate().inverse(annotated=True)

    를 반환하고 SwapGate를 반환합니다:

    SGate().inverse(annotated=False)
    SGate().inverse(annotated=True)

    반환하면 SdgGate. 명시적으로 정의된 역방향이 없는 사용자 지정 지침의 경우 차이가 나타납니다. annotated=False 을 사용하면 이전과 마찬가지로 재귀적으로 반전된 정의가 포함된 새 명령어를 반환합니다. annotated=True 가 반환하는 반면 AnnotatedOperation 로 수정된 명령어를 나타내는 InverseModifier.

  • 에 커뮤테이션 라이브러리를 추가했습니다 CommutationChecker. 이 라이브러리는 파라미터화할 수 없는 표준 게이트의 모든 정류 관계를 사전으로 저장하여 런타임에 효율적으로 조회할 수 있도록 합니다. 이렇게 하면 실행 속도가 빨라집니다 CommutationChecker 클래스와 더 나아가 CommutationAnalysis 트랜스파일러 패스는 매개변수화할 수 없는 두 개의 표준 게이트가 통근하는지 계산하는 대신 라이브러리에서 이를 조회하기만 하면 되기 때문에 실행 속도가 빨라집니다.

    또한 CommutationChecker 가 리팩터링되어 이제 정류 라이브러리에 없는 캐시된 정류 관계의 수에 상한이 설정되었습니다. 이것은 해결되었습니다: #8020#7101

  • QuantumCircuit.assign_parameters() 이제 매핑 형식의 입력에서 문자열 키를 사용할 수 있습니다. 이 이름은 해당 인스턴스를 조회하는 데 사용됩니다 Parameter 인스턴스를 get_parameter(). 이렇게 하면 됩니다:

    from qiskit.circuit import QuantumCircuit, Parameter
    
    a = Parameter("a")
    qc = QuantumCircuit(1)
    qc.rx(a, 0)
    
    qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1})
  • QuantumCircuit 에는 두 가지 새로운 메서드가 있습니다, get_parameter()has_parameter()각각 이름으로 회로에 사용된 Parameter 인스턴스를 이름으로 검색하고, 이름이 일치하는 매개변수(또는 주어진 정확한 인스턴스)가 회로에서 사용되는지 여부에 대한 부울을 반환합니다.

  • A uuid 속성이 qiskit.circuit.Parameter 클래스에 프로퍼티가 추가되었습니다. 고급 사용 사례에서는 이 속성을 사용하여 qiskit.circuit.Parameter 인스턴스를 생성하는 데 사용할 수 있습니다.

  • 새로운 메서드가 추가되었습니다, ParameterExpression.numeric()완전히 바인딩된 매개변수 표현식을 기호 평가 결과를 정확하게 설명하는 가장 제한적인 기본 제공 Python 숫자 유형으로 변환하는 메서드를 추가했습니다. 예를 들어, 기호 정수는 기호 실수는 int가 되고, 기호 실수는 a가 되고 float 가 되고 복소수는 complex. 이 메서드에는 symengine 의 평가 컨텍스트의 특성에 대한 몇 가지 해결 방법이 포함되어 있으며, 이로 인해 때때로 잘못된 결과가 발생할 수 있습니다 complex 또는 float 를 직접 호출할 때 잘못된 결과를 초래할 수 있습니다.

기본형 기능

  • 프리미티브 버전 2는 샘플러와 추정기 모두에 대한 새로운 베이스 클래스와 함께 입력 및 출력에 대한 새로운 유형을 통해 도입되었습니다. 이 새 버전은 기본 run() 메서드에 대한 벡터화된 호출을 수행하여 매개변수 값 집합과 관측값에 대한 스윕을 효율적으로 지정할 수 있도록 하는 데 중점을 두고 있습니다. 참조 StatevectorSamplerStatevectorEstimatorV2 프리미티브의 참조 구현을 참조하세요.

    또한, 추정기에는 precision 인수가 추가되었습니다 run() 메서드에 기대값 추정치의 목표 정밀도를 지정하는 인수를 추가할 수 있습니다. 마찬가지로, 샘플러는 shots 을 옵션에서 메서드의 인수로 옮겼습니다 run() 메서드의 인수로 이동했습니다. 샘플러는 또한 모든 샷에서 출력(예: 비트 문자열)을 반환하도록 변경되었습니다 Counts-반환하는 대신 모든 샷의 출력(예: 비트 문자열)을 반환하고 별도의 ClassicalRegisters. 이를 통해 파생 클래스는 고전적인 제어 흐름을 가진 회로에 대한 샘플러 지원을 구현할 수 있습니다.

    원시 V2 기본 클래스는 다음과 같습니다:

    입력 및 출력에 사용되는 새로운 유형은 다음과 같습니다:

    • SamplerPubLike샘플러 입력의 원시 통합 블록 ( PUB ); 샘플러에 허용되는 입력의 조합 유형입니다
    • EstimatorPubLike: 추정기 입력의 원시 통합 블록 ( PUB ); 추정기에 허용되는 입력의 유니온 유형입니다
    • PubResult단일 PUB 실행으로 인한 데이터 및 메타데이터
    • DataBin: 단일 PUB 실행의 데이터를 저장하는 네임스페이스
    • BitArray고밀도 형식의 배열 값 비트 값 모음입니다
    • PrimitiveResult의 이터러블 PubResult를 메타데이터와 함께
  • 참조 구현 StatevectorEstimatorBaseEstimatorV2 의 참조 구현이 추가되었습니다. 아래 예에서 볼 수 있듯이 이 추정기(및 모든 V2 추정기)는 특정 회로에 연결된 관측값 배열 및/또는 매개변수 값 집합 배열을 제공하는 것을 지원합니다.

    추정기 프리미티브 통합 블록( PUB )이라고 하는 (circuit, observables, <optional> parameter values, <optional> precision) 의 각 튜플은 자체 배열 기반 결과를 생성합니다. run() 메서드는 한 번에 여러 개의 퍼브를 지정할 수 있습니다.

    from qiskit.circuit import Parameter, QuantumCircuit
    from qiskit.primitives import StatevectorEstimator
    from qiskit.quantum_info import Pauli, SparsePauliOp
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define a circuit with two parameters.
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(0, 1)
    circuit.h(0)
    
    # Define a sweep over parameter values, where the second axis is over
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Define three observables. Many formats are supported here including
    # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1
    # lists cause this array of observables to have shape (3, 1), rather
    # than shape (3,) if they were omitted.
    observables = [
        [SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
        [Pauli("XX")],
        [Pauli("IY")]
    ]
    
    # Instantiate a new statevector simulation based estimator object.
    estimator = StatevectorEstimator()
    
    # Estimate the expectation value for all 300 combinations of
    # observables and parameter values, where the pub result will have
    # shape (3, 100). This shape is due to our array of parameter
    # bindings having shape (100,), combined with our array of observables
    # having shape (3, 1)
    pub = (circuit, observables, params)
    job = estimator.run([pub])
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # Error-bar information is also available, but the error is 0
    # for this StatevectorEstimator.
    result.data.stds
    
    # Pull out the array-based expectation value estimate data from the
    # result and plot a trace for each observable.
    for idx, pauli in enumerate(observables):
        plt.plot(result.data.evs[idx], label=pauli)
    plt.legend()
  • 참조 구현 StatevectorSamplerBaseSamplerV2 의 참조 구현이 추가되었습니다. 아래 예시에서 볼 수 있듯이 이 샘플러(및 모든 V2 샘플러)는 단일 회로에 바인딩할 파라미터 값 세트의 배열을 제공하는 기능을 지원합니다.

    샘플러 프리미티브 통합 블록( PUB )이라고 하는 (circuit, <optional> parameter values, <optional> shots) 의 각 튜플은 자체 배열 기반 결과를 생성합니다. run() 메서드는 한 번에 여러 개의 퍼브를 지정할 수 있습니다.

    from qiskit.circuit import (
        Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
    )
    from qiskit.primitives import StatevectorSampler
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define our circuit registers, including classical registers
    # called 'alpha' and 'beta'.
    qreg = QuantumRegister(3)
    alpha = ClassicalRegister(2, "alpha")
    beta = ClassicalRegister(1, "beta")
    
    # Define a quantum circuit with two parameters.
    circuit = QuantumCircuit(qreg, alpha, beta)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.cx(1, 2)
    circuit.ry(Parameter("a"), 0)
    circuit.rz(Parameter("b"), 0)
    circuit.cx(1, 2)
    circuit.cx(0, 1)
    circuit.h(0)
    circuit.measure([0, 1], alpha)
    circuit.measure([2], beta)
    
    # Define a sweep over parameter values, where the second axis is over.
    # the two parameters in the circuit.
    params = np.vstack([
        np.linspace(-np.pi, np.pi, 100),
        np.linspace(-4 * np.pi, 4 * np.pi, 100)
    ]).T
    
    # Instantiate a new statevector simulation based sampler object.
    sampler = StatevectorSampler()
    
    # Start a job that will return shots for all 100 parameter value sets.
    pub = (circuit, params)
    job = sampler.run([pub], shots=256)
    
    # Extract the result for the 0th pub (this example only has one pub).
    result = job.result()[0]
    
    # There is one BitArray object for each ClassicalRegister in the
    # circuit. Here, we can see that the BitArray for alpha contains data
    # for all 100 sweep points, and that it is indeed storing data for 2
    # bits over 256 shots.
    assert result.data.alpha.shape == (100,)
    assert result.data.alpha.num_bits == 2
    assert result.data.alpha.num_shots == 256
    
    # We can work directly with a binary array in performant applications.
    raw = result.data.alpha.array
    
    # For small registers where it is anticipated to have many counts
    # associated with the same bitstrings, we can turn the data from,
    # for example, the 22nd sweep index into a dictionary of counts.
    counts = result.data.alpha.get_counts(22)
    
    # Or, convert into a list of bitstrings that preserve shot order.
    bitstrings = result.data.alpha.get_bitstrings(22)
    print(bitstrings)

제공자 기능

  • 새 클래스를 추가했습니다, GenericBackendV2클래스를 qiskit.providers.fake_provider 모듈에 새 클래스, 를 추가했습니다. 이 클래스는 구성 가능하며, 로컬에서 실행할 수 있는 BackendV2 백엔드 인스턴스를 로컬에서 실행할 수 있습니다(가짜 백엔드의 정신에 따라). 사용자는 수동 타겟 구성 없이도 큐비트 수, 베이시스 게이트, 커플링 맵, 동적 회로(제어 흐름 명령어) 실행 기능, 명령어 보정 및 백엔드의 측정 타임스텝을 구성할 수 있습니다. 큐비트 및 게이트 속성(지속 시간, 오류)은 기본 범위에서 무작위로 샘플링하여 생성됩니다. 이 무작위 생성을 위한 시드는 백엔드 출력의 재현성을 보장하기 위해 고정할 수 있습니다. 이 백엔드는 표준 라이브러리의 게이트만 지원한다는 점에 유의하세요. 보다 유연한 백엔드가 필요한 경우, 번역에 사용할 객체를 직접 인스턴스화하는 Target 객체를 직접 인스턴스화할 수 있습니다.

    사용 예 1:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a simple circuit
    circuit = QuantumCircuit(3)
    circuit.h(0)
    circuit.cx(0,1)
    circuit.cx(0,2)
    circuit.measure_all()
    circuit.draw('mpl')
    
    # Define backend with 3 qubits
    backend = GenericBackendV2(num_qubits=3)
    
    # Transpile and run
    transpiled_circuit = transpile(circuit, backend)
    result = backend.run(transpiled_circuit).result()

    사용 예 2:

    from qiskit import QuantumCircuit, ClassicalRegister, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    # Create a circuit with classical control
    creg = ClassicalRegister(19)
    qc = QuantumCircuit(25)
    qc.add_register(creg)
    qc.h(0)
    for i in range(18):
        qc.cx(0, i + 1)
    for i in range(18):
        qc.measure(i, creg[i])
    with qc.if_test((creg, 0)):
        qc.ecr(20, 21)
    
    # Define backend with custom basis gates and control flow instructions
    backend = GenericBackendV2(
        num_qubits=25,
        basis_gates=["ecr", "id", "rz", "sx", "x"],
        control_flow=True,
      )
    
    #Transpile
    transpiled_qc = transpile(qc, backend)
    참고

    이 클래스에서 생성된 노이즈 속성은 구체적인 양자 장치를 모방하지 않으므로 구체적인 동작을 측정하는 데 사용해서는 안 됩니다. 이는 실제 양자 시스템의 특정 노이즈 값에 묶이지 않는 백엔드 인터페이스 기능을 테스트하는 데 사용할 수 있는 '합리적인 기본값'입니다. 기존 디바이스에 대한 보다 정확한 시뮬레이션을 위해 실제 백엔드에서 제공되는 기능을 사용하여 노이즈 모델을 수동으로 빌드할 수 있습니다 qiskit_aer.

  • 모듈은 이제 qiskit.providers.fake_provider 모듈에는 이제 일련의 일반 가짜 백엔드가 포함되어 있습니다 BackendV1 인터페이스를 따르는 일련의 일반 가짜 백엔드를 포함합니다. 더 이상 사용되지 않는 FakeProvider (FakeVigo, FakeTokyo, 등 )에 노출된 스냅샷 기반 가짜 백엔드의 대안으로 도입되었습니다. 새로운 가짜 백엔드 목록에는 다음이 포함됩니다:

    다음 패턴에 따라 가져올 수 있습니다: from qiskit.providers.fake_provider import Fake5QV1. 백엔드 속성에 대한 자세한 내용은 각 백엔드의 API 문서에서 확인할 수 있습니다.

OpenQASM 기능

  • 이제 qiskit.qasm3 패키지에는 이제 OpenQASM 3 프로그램을 다음과 같이 읽기 위한 내장된 러스트 기반 파서가 포함되어 있습니다 QuantumCircuit에 있는 qiskit.qasm3.load_experimental()loads_experimental(). 이는 일반적으로 기존의 순수 Python load()loads() 함수를 사용하는 경우, qiskit-qasm3-import 을 추가로 설치해야 합니다.

    예를 들어, 20,000개의 인스트럭션이 얽혀 있는 QuantumCircuit:

    import numpy as np
    import qiskit.qasm3
    from qiskit.circuit.library import RealAmplitudes
    
    qc = RealAmplitudes(100, reps=100, flatten=True)
    qc = qc.assign_parameters(np.random.rand(qc.num_parameters))
    oq3 = qiskit.qasm3.dumps(qc)

    이전 qasm3.loads() 은 결과 OpenQASM 3 프로그램을 로드하는 데 약 7.3s 이 걸렸지만 qasm3.loads_experimental() 는 일반 맥북 프로( i7, 2020)에서 300ms 으로 걸렸으며, 이는 25x 의 속도 향상입니다!

    이 프리뷰 버전에서는 실험적인 구문 분석기가 지원하는 기능 세트가 매우 제한적이지만, 키스킷 측과 네이티브 Rust 기반 구문 분석기가 모두 개선됨에 따라 확장될 예정입니다.

    이 새로운 구문 분석기의 주요 목표 중 하나는 속도 향상과 함께 최고 품질의 오류 진단 기능을 제공하는 것입니다. 구문 분석기의 다른 부분과 마찬가지로 현재 진행 중인 작업이지만, 실험용 구문 분석기로 잘못된 OpenQASM 3 프로그램을 구문 분석할 때 훨씬 더 높은 품질의 오류 메시지가 표시되기 시작할 것입니다.

  • OpenQASM 3 내보내기( dump()dumps() 함수 참조 qiskit.qasm3)는 이제 OpenQASM 3에서 switch 문의 안정화된 구문을 기본적으로 지원합니다. switch 문의 사전 인증 구문은 내보내기의 인수에 ExperimentalFeatures.SWITCH_CASE_V1 플래그를 사용하여 내보내기의 experimental 인수에 추가할 수 있습니다. 안정화된 구문에는 기능 플래그가 필요하지 않지만 아직 업데이트되지 않은 다른 도구와 인터페이스하는 경우 실험적 플래그를 전달해야 할 수 있습니다.

    안정화된 양식의 구문은 break 문 종료와 관련하여 약간 달라졌으며(더 이상 필요하거나 허용되지 않음), 여러 개의 대소문자가 이제 C 스타일 폴스루를 사용하지 않고 단일 case 줄로 결합됩니다. 자세한 내용은 스위치 케이스 구조에 대한 OpenQASM 3 문서를 참조하세요.

QPY 기능

  • 새로운 경고 클래스를 추가했습니다, QPYLoadingDeprecatedFeatureWarning를 QPY 모듈에 추가했습니다. 이 클래스를 사용하면 재귀적으로 호출되는 많은 QPY 로딩 함수의 경우처럼 사용되지 않는 기능이 호출 스택의 가변 지점에서 액세스되는 경우에도 사용 중단 경고가 표시될 수 있습니다.

  • 함수에 새 플래그인 version 를 추가했습니다 qpy.dump() 함수에 추가했습니다. 이를 통해 qpy.dump() 를 선택적으로 사용하여 QPY 형식 버전이 내보낼 정수 값을 지정할 수 있습니다. 이 기능은 이전 버전의 키스킷에서 로드할 QPY 파일을 생성해야 할 때 유용합니다. 그러나 지원되는 버전은 제한되어 있으며, 기본 버전인 최신 QPY 버전과 호환 QPY 버전인 버전 10 (키스킷에 소개된 버전 0.45.0 ) 사이의 버전만 사용할 수 있습니다. 호환성 버전은 전체 1.x.y 주요 버전 릴리스 시리즈에 대해 고정된 상태로 유지됩니다. 이것은 호출 시 QPY 형식의 하위 호환성 보장을 변경하지 않습니다 qpy.load()를 호출할 때 이전 버전의 QPY를 릴리스하여 0.x 및 1.x 릴리스 시리즈 간의 호환성 및 상호 운용성을 유지할 수 있도록 할 뿐입니다.

양자 정보 특성

  • 안정제 상태를 생성하는 qiskit.quantum_info.StabilizerState.from_stabilizer_list() 메서드를 추가하여 안정제 목록에서 안정제 상태를 생성합니다:

    from qiskit.quantum_info import StabilizerState
    
    stabilizer_list = ["ZXX", "-XYX", "+ZYY"]
    stab = StabilizerState.from_stabilizer_list(stabilizer_list)
  • SparsePauliOp.from_operator() 는 이제 Hatznko, Binkowski, Gupta(2023) 에서 제시된 "텐서화된 폴리 분해 알고리즘"의 구현을 사용합니다. 이 방법은 이제 몇 배 더 빨라졌습니다. 예를 들어, 일반 소비자용 맥북 프로(Intel i7, 2020)에서 임의의 10-큐비트 연산자를 약 250ms 안에 분해할 수 있습니다.

합성 기능

  • 추가 qiskit.synthesis.synth_circuit_from_stabilizers() 주어진 일련의 안정기에 의해 안정화된 상태를 출력하는 회로를 반환하는 함수를 추가했습니다.

  • 이제 AQC 단일 합성 플러그인 방식은 기본적으로 더 빠른 목적 함수 평가를 사용하므로 합성 시간이 크게 개선됩니다.

  • 새로운 합성 방법 추가 synth_qft_line() 을 추가하여 선형 근접 이웃 연결을 위한 QFT 회로의 새로운 합성 방법을 추가하여 SABRE에 비해 많은 수의 큐비트에 대한 SWAP 수를 크게 줄였습니다.

  • 클래스 TwoQubitWeylDecomposition 클래스가 공개 API에 추가되었습니다 qiskit.synthesis. 이 클래스를 사용하면 2쿼비트 단위의 웨일 분해를 적용할 수 있습니다. 현재 제거된 qiskit.quantum_info.synthesis 모듈에서 비공개 클래스일 때 이전에 이 클래스를 임포트했다면 임포트 경로를 업데이트해야 합니다.

트랜스파일러 기능

  • 새로운 예외 클래스가 추가되었습니다: InvalidLayoutError. 이것은 사용자가 제공한 레이아웃이 유효하지 않을 때 발생하는 TranspilerError 서브클래스로, 사용자가 제공한 레이아웃이 유효하지 않을 때(크기 불일치, 큐비트 중복 등) 발생합니다.

  • 에 새 키워드 인수 num_processes 를 추가했습니다 transpile()PassManager.run() 메서드를 추가했습니다. 이렇게 하면 트랜스파일별로 사용자 구성 파일에서 QISKIT_NUM_PROCSnum_processes 필드를 모두 재정의할 수 있습니다. 예를 들어,

    from qiskit import transpile, QuantumCircuit
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)

    는 2개의 프로세스만 사용하여 10개의 입력 회로에 대해 트랜스파일을 실행하고 해당 호출에 대한 시스템 기본값, 환경 변수 또는 사용자 구성 파일을 재정의합니다 transpile() 호출을 재정의합니다.

  • 새로운 트랜스파일러 패스를 추가했습니다, OptimizeAnnotated를 추가하여 양자 회로에서 주석이 달린 연산을 최적화합니다.

    다음 예를 고려하십시오.

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.annotated_operation import (
        AnnotatedOperation,
        InverseModifier,
        ControlModifier,
    )
    from qiskit.circuit.library import CXGate, SwapGate
    from qiskit.transpiler.passes import OptimizeAnnotated
    
    # Create a quantum circuit with multiple annotated gates
    gate1 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)],
    )
    gate2 = AnnotatedOperation(
        SwapGate(),
        [InverseModifier(), InverseModifier()]
    )
    gate3 = AnnotatedOperation(
        AnnotatedOperation(CXGate(), ControlModifier(2)),
        ControlModifier(1)
    )
    qc = QuantumCircuit(6)
    qc.append(gate1, [3, 2, 4, 0, 5])
    qc.append(gate2, [1, 5])
    qc.append(gate3, [5, 4, 3, 2, 1])
    
    # Optimize the circuit using OptimizeAnnotated transpiler pass
    qc_optimized = OptimizeAnnotated()(qc)
    
    # This is how the optimized circuit should look like
    gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3))
    gate2_expected = SwapGate()
    gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3))
    qc_expected = QuantumCircuit(6)
    qc_expected.append(gate1_expected, [3, 2, 4, 0, 5])
    qc_expected.append(gate2_expected, [1, 5])
    qc_expected.append(gate3_expected, [5, 4, 3, 2, 1])
    
    assert qc_optimized == qc_expected

    gate1 의 경우 주석이 달린 스왑 게이트의 수정자는 표준 형식으로 가져옵니다 InverseModifier가 상쇄되고 두 ControlModifier가 결합됩니다. gate2 의 경우 모든 수정자가 제거되고 주석이 달린 연산이 기본 연산으로 대체됩니다. gate3 의 경우 여러 개의 주석 레이어가 하나로 결합되어 있습니다.

    의 생성자는 OptimizeAnnotated 패스의 생성자는 선택적 인자 target, equivalence_library, basis_gatesrecurse 를 허용합니다. recurseTrue (기본값)이고 target 또는 basis_gates 이 지정되면 패스는 대상에서 이미 지원되거나 동등성 라이브러리에 속한 게이트를 제외하고 재귀적으로 게이트의 definition 회로로 내려갑니다. 반면에 target 또는 basis_gates 을 지정하지 않거나 recurseFalse 으로 설정된 경우 패스는 "최상위" 주석이 달린 연산만 합성합니다. 즉, definition 회로로 재귀적으로 내려가지 않습니다. 이 동작은 주석이 달린 연산을 1쿼비트와 2쿼비트 게이트로 "언롤"하기 위해 호출해야 하는 HighLevelSynthesis 트랜스파일러 패스와 일치하며, 주석이 달린 연산을 1쿼비트 및 2쿼비트 게이트로 "언롤"하기 위해 호출해야 합니다.

  • 새로운 HighLevelSynthesisPlugin for PermutationGate 객체를 추가했습니다. 이 플러그인을 사용하려면 하이레벨 합성 구성을 정의할 때 token_swapper 을 지정하세요.

    이 합성 플러그인은 레이아웃이 설정되기 전이나 후에 실행할 수 있습니다. 합성이 성공하면 플러그인은 스왑 게이트로만 구성된 양자 회로를 출력합니다. 합성에 성공하지 못하면 플러그인은 None 을 출력합니다.

    다음 코드는 새 플러그인을 실행하는 방법을 설명합니다:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PermutationGate
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig
    
    # This creates a circuit with a permutation gate.
    qc = QuantumCircuit(8)
    perm_gate = PermutationGate([0, 1, 4, 3, 2])
    qc.append(perm_gate, [3, 4, 5, 6, 7])
    
    # This defines the coupling map.
    coupling_map = CouplingMap.from_ring(8)
    
    # This high-level-synthesis config specifies that we want to use
    # the "token_swapper" plugin for synthesizing permutation gates,
    # with the option to use 10 trials.
    synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})])
    
    # This creates the pass manager that runs high-level-synthesis on our circuit.
    # The option use_qubit_indices=True indicates that synthesis is run after the layout is set,
    # and hence should preserve the specified coupling map.
    pm = PassManager(
        HighLevelSynthesis(
            synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True
        )
    )
    
    qc_transpiled = pm.run(qc)
  • 두 개의 새로운 인수 matrix_basedmax_qubits 를 트랜스파일러 패스 생성자에 추가했습니다 CommutativeInverseCancellation 트랜스파일러 패스의 생성자에 두 개의 인수를 추가했습니다. matrix_basedTrue 일 때 패스는 행렬 표현을 사용하여 두 연산이 서로의 역수인지 확인합니다. 이렇게 하면 검사가 더욱 강력해지고, 최대 위상이 반전된 연산 쌍을 취소하는 동시에 그에 따라 회로의 전역 위상을 업데이트할 수 있습니다. 이렇게 하면 일반적으로 런타임이 증가하는 대신 더 많은 시간을 단축할 수 있습니다. max_qubits 인수는 행렬 기반 정류성 및 역검사에서 큐비트 수를 제한합니다. 예를 들어,

    import numpy as np
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import CommutativeInverseCancellation
    
    circuit = QuantumCircuit(1)
    circuit.rz(np.pi / 4, 0)
    circuit.p(-np.pi / 4, 0)
    
    passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True))
    new_circuit = passmanager.run(circuit)

    이 패스는 RZP 게이트를 취소하고 회로의 글로벌 위상을 15π8\frac{15 \pi}{8} 로 조정할 수 있습니다.

  • 새로운 함수가 추가되었습니다, high_level_synthesis_plugin_names()를 사용하여 지정된 작업 이름에 대해 설치된 하이 레벨 합성 플러그인 목록을 가져올 수 있습니다.

시각화 기능

  • textmpl 출력은 QuantumCircuit.draw()circuit_drawer() 회로 서랍 기능의 출력은 이제 작동에 대한 자세한 정보를 표시합니다 AnnotatedOperation. AnnotatedOperation.modifiersControlModifier가 포함되어 있으면 제어 게이트와 동일한 방식으로 작동이 표시됩니다. 만약 InverseModifier 또는 PowerModifier 를 사용하면 기본 작업 이름과 함께 표시됩니다. 예를 들어,

    from qiskit.circuit import (
        AnnotatedOperation,
        ControlModifier,
        PowerModifier,
        InverseModifier,
        QuantumCircuit
    )
    from qiskit.circuit.library import SGate
    
    annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()])
    qc = QuantumCircuit(4)
    qc.append(annotated_op, range(4))
    qc.draw("mpl")
    _images/release_notes-1.png

기타 기능

  • 새로운 경고 기본 클래스가 추가되었습니다, QiskitWarning. 키스킷은 계속해서 내장된 Python 경고(예를 들어 DeprecationWarning)이 가장 적절한 경우, 키스킷에 더 특정한 경우 경고는 하위 클래스인 QiskitWarning.

  • 선택적 기능 테스터(qiskit.utils.optionals)는 이제 완전히 발견되지 않은 선택적 종속성(정상적인 상황)과 발견되었지만 가져오기 중에 오류가 발생한 종속성을 구분합니다. 후자의 경우, 이제 설치 실패 또는 호환되지 않는 버전을 나타낼 수 있으므로 OptionalDependencyImportWarning 메시지가 표시되며, 이는 설치 실패 또는 호환되지 않는 버전을 나타낼 수 있습니다.

업그레이드 주의사항

  • 키스킷 1.0 은 이제 rustworkx 의 버전 0.14.0 이 필요합니다. 새로운 token_swapper PermutationGate 합성 플러그인 HighLevelSynthesisPlugin.

  • 소스에서 키스킷을 빌드하기 위해 지원되는 최소 Rust 버전은 이제 1.70 이다. 이는 키스킷 0.45.x 및 0.46.0 릴리스 시리즈의 이전 최소 지원 Rust 버전인 1.64 에서 상향되었습니다.

  • Psutil에 대한 종속성이 제거되었습니다. Psutil 라이브러리는 이전에는 물리적 CPU 수와 총 시스템 메모리를 감지하는 데만 사용되었지만, 제공된 정보가 추가적인 종속성과 오버헤드를 정당화할 만큼 충분한 가치를 제공하지 못하므로 제거되었습니다. 즉, 내부에서 사용하는 기본 프로세스 수와 parallel_map() 와 내부적으로 사용할 수 있는 함수 parallel_map() 와 같은 transpile()PassManager.run() 는 이전 릴리스보다 병렬 프로세스를 더 많이 또는 더 적게 사용할 수 있습니다. 사용하는 프로세스 수를 조정하려면 해당 함수에 새로운 num_processes 인수를 사용하거나, 키스킷이 잠재적으로 사용하는 프로세스 수를 조정해야 하는 경우 사용자 구성 파일의 QISKIT_NUM_PROCS 환경 변수 또는 num_processes 필드(자세한 내용은 로컬 구성 가이드 참조)를 사용할 수 있습니다.

  • scoped_parameterssearch_parameters 메서드가 클래스에서 제거되었습니다 ScheduleBlock 클래스에서 제거되었습니다. 이 메서드들은 Parameter 인스턴스의 매개 변수에 부분적으로 연결된 객체를 반환하지만 ScheduleBlock 인스턴스의 매개 변수에 부분적으로 연결된 객체를 반환하지만 이러한 객체를 사용하여 값을 할당하는 것은 올바르게 작동하지 않습니다. 사용자는 ScheduleBlock.parameters 를 대신 사용하고 ScheduleBlock.references 를 반복하고 하위 참조의 Schedule.parameters 속성을 사용하여 매개변수가 어떤 서브루틴에 사용되는지 구분해야 합니다. 자세한 내용은 #11654를 참조하세요.

  • 주입하는 로직을 제거했습니다 QuantumCircuitGate 연산을 펄스 컨텍스트( pulse.builder.call()), 이는 키스킷에서 더 이상 사용되지 않는 레거시 동작이었다 0.46. 펄스 일정은 전체 일정 컨텍스트로 구축해야 하며, 회로와 게이트는 더 높은 수준의 추상화입니다.

    여기에는 관련 기능의 제거가 포함됩니다:

    • pulse.builder.call_gate
    • pulse.builder.cx
    • pulse.builder.u1
    • pulse.builder.u2
    • pulse.builder.u3
    • pulse.builder.x
    • pulse.builder.active_transpiler_settings
    • pulse.builder.active_circuit_scheduler_settings
    • pulse.builder.transpiler_settings
    • pulse.builder.circuit_scheduler_settings

    default_transpiler_settingsdefault_circuit_scheduler_settings 인수는 pulse.builder.build() 에 대한 인수도 마찬가지로 제거됩니다.

    from qiskit import transpile, schedule, QuantumCircuit, pulse
    from qiskit.providers.fake_provider import Fake7QPulseV1
    
    backend = Fake7QPulseV1()
    
    # Create a schedule from a hardware-based circuit.
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc = transpile(qc, backend)
    sched = schedule(qc, backend)
    
    # These pulse schedules can still be called in builder contexts.
    with pulse.build(backend) as qc_sched:
      pulse.call(sched)
    
    # Schedules for certain operations can also be directly retrieved
    # from BackendV1 instances:
    sched = backend.defaults().instruction_schedule_map.get('x', (0,))
    
    # ... and from BackendV2 instances:
    sched = backend.target['x'][(0,)].calibration
  • 심엔진에 필요한 최소 버전이 >= 0.11 로 상향되었습니다.

회로 업그레이드 노트

  • 키스킷 0.45.0 에서 더 이상 사용되지 않는 Instruction.qasm 메서드를 제거했습니다. 사용 qiskit.qasm2.dump() 대신 QuantumCircuit 대신 사용하세요.

  • Bit.registerBit.index 속성이 제거됩니다. 키스킷 0.25 (2021-04년에 릴리스됨)에서 더 이상 사용되지 않습니다. 큐비트와 비트는 이제 컨텍스트의 QuantumCircuit. 속성에 대한 대안은 QuantumCircuit.find_bit() 를 사용하여 회로 내에 포함된 모든 레지스터와 회로 내 비트의 인덱스를 찾는 것입니다.

  • 메서드 QuantumCircuit.bind_parameters 는 키스킷 0.45 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 드롭인 대체 방법으로 QuantumCircuit.assign_parameters() 을 모든 기본값과 함께 드롭인 방식으로 대체할 수 있으며, 이전 방식에 비해 추가 기능도 노출합니다.

  • 에서 Int1, Int2, BooleanFunction, classical_function() 가져오기 qiskit.circuit 는 이제 비활성화되었습니다. 대신, 객체를 가져오려면 qiskit.circuit.classicalfunction 서브모듈에서 객체를 가져오는데, 여기에는 tweedledum 패키지가 필요합니다.

  • headerextension_lib 데이터 전용 어트리뷰트는 QuantumCircuit 의 데이터 전용 속성은 키스킷 0.45 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이는 더 이상 사용되지 않는 OpenQASM 2 내보내기의 내부 세부 정보입니다.

  • 0.45 릴리스 이후 사용 중단 보류 중이며 0.46 릴리스에서 완전히 사용 중단된 qiskit.extensions 모듈을 제거했습니다. 이 모듈의 다음 작업은 다음에서 사용할 수 있습니다 qiskit.circuit.library:

    다음 개체가 제거되었습니다:

    • SingleQubitUnitary (대신 library.UnitaryGate),
    • Snapshot (Aer의 저장 지침으로 대체됨),
    • ExtensionError,

    와 함께 다음과 같은 회로 방법을 사용합니다:

    • QuantumCircuit.snapshot,
    • QuantumCircuit.squ,
    • QuantumCircuit.diagonal,
    • QuantumCircuit.hamiltonian,
    • QuantumCircuit.isometryQuantumCircuit.iso,
    • QuantumCircuit.uc,
    • QuantumCircuit.ucrx,
    • QuantumCircuit.ucry,
    • QuantumCircuit.ucrz.

    이러한 연산은 여전히 양자 회로에 적절한 명령을 추가하여 수행할 수 있습니다.

  • 더 이상 사용되지 않고 중복된 QuantumCircuit 메서드를 제거했습니다. 주요 내용은 다음과 같습니다.

  • 더 이상 설정할 수 없다 QuantumCircuit.metadataNone 로 설정할 수 없습니다. 0.43.0. 유형은 dict이므로 지우려면 {} 로 설정합니다.

  • .Register.name_format 어트리뷰트는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 더 이상 레지스터 이름에 대한 제한이 없으며, 정규식은 [a-z][a-zA-Z0-9_]* 입니다.

기본형 업그레이드 노트

공급자 업그레이드 안내

  • 함수에서 두 인수(add_delayfilter_faulty)의 기본값을 변경했습니다 convert_to_target() 함수의 기본값을 변경했습니다. 이 변환 기능은 이제 기본적으로 지연 인스트럭션을 추가하고 오류 인스트럭션을 제거합니다.

  • 그리고 BackendPropertiesPulseDefaults 모델 객체에서 사용되는 FakeOpenPulse2Q 가 내부적으로 일관성을 유지하고 누락된 지침을 추가하도록 업데이트되었습니다. 이전 모델 오브젝트를 컴파일 대상으로 사용했다면 키스킷 0.46 으로 백엔드를 사용하고 QuantumCircuit 로 생성된 transpile() 로 내보내고 qpy.dump 를 사용하여 직렬화하면 이번 릴리스에서 액세스할 수 있습니다.

  • qiskit.BasicAer 으로 노출되는 qiskit.providers.basicaer 모듈은 0.46 릴리스에서 더 이상 사용되지 않음에 따라 제거되었습니다. 해당 기능은 qiskit.quantum_info 모듈과 새로운 qiskit.providers.basic_provider 모듈로 대체되었습니다.

    qiskit.providers.basicaer (qiskit.BasicAer)를 사용하던 것에서 qiskit.providers.basic_provider 로의 마이그레이션은 다음과 같이 수행할 수 있습니다:

    마이그레이션 소스
    대체
    qiskit.BasicAer새 공급자에 글로벌 인스턴스가 없는 경우 가져오기는 다음에서 수행해야 합니다 qiskit.providers.basic_provider
    qiskit.providers.basicaerbasic_provider
    BasicAerProviderBasicProvider
    BasicAerJobBasicProviderJob
    QasmSimulatorPyBasicSimulator
    UnitarySimulatorPy사용 Operator
    StatevectorSimulatorPy사용 Statevector

    주목할 만한 차이점은 새 공급자는 더 이상 글로벌 인스턴스(예: BasicAer)를 통해 노출되지 않으므로 from qiskit import BasicProvider 을 수행하는 것이 유효하지 않다는 것입니다. 대신 공급자 클래스는 해당 서브모듈에서 가져와 수동으로 인스턴스화해야 합니다:

    from qiskit.providers.basic_provider import BasicProvider
    
    provider = BasicProvider()
    backend = provider.get_backend("basic_simulator")

    다음 예제는 BasicAer 에서 세 시뮬레이터의 마이그레이션 경로를 보여줍니다.

    1. 상태 벡터 시뮬레이터:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("statevector_simulator")
      statevector = backend.run(qc).result().get_statevector()
      
      # New path
      from qiskit.quantum_info import Statevector
      statevector = Statevector(qc)
    2. 유니티 시뮬레이터:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("unitary_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.quantum_info import Operator
      result = Operator(qc).data
    3. Qasm 시뮬레이터:

      from qiskit import QuantumCircuit
      qc = QuantumCircuit(3)
      qc.h(0)
      qc.h(1)
      qc.cx(1,2)
      qc.measure_all()
      
      # Former path
      from qiskit import BasicAer
      backend = BasicAer.get_backend("qasm_simulator")
      result = backend.run(qc).result()
      
      # New path
      from qiskit.providers.basic_provider import BasicProvider
      backend = BasicProvider().get_backend("basic_simulator")
      result = backend.run(qc).result()
      # or, directly
      from qiskit.providers.basic_provider import BasicSimulator
      backend = BasicSimulator()
      result = backend.run(qc).result()
  • 키스킷 0.46.0 에서 더 이상 사용되지 않는 ConfigurableFakeBackend 클래스를 제거했습니다. 대신 적절한 FakeBackend 을 사용할 수 있습니다.

  • 더 이상 사용되지 않는 qiskit.providers.fake_provider 모듈이 qiskit-ibm-runtime Python 패키지로 마이그레이션되었습니다. 이러한 이유로, 키스킷의 다음 요소들은 qiskit.providers.fake_provider 의 다음 요소는 키스킷에서 더 이상 사용되지 않음에 따라 제거되었습니다 0.46:

    • qiskit.providers.fake_provider.FakeProvider
    • qiskit.providers.fake_provider.FakeProviderForBackendV2
    • qiskit.providers.fake_provider.FakeProviderFactory
    • qiskit.providers.fake_provider.fake_backends.FakeBackendV2
    • qiskit.providers.fake_provider.backends 에 포함된 모든 가짜 백엔드(공급자를 통해 액세스 가능)
    • qiskit.providers.fake_provider.FakeQasmSimulator
    • qiskit.providers.fake_provider.FakeJob
    • qiskit.providers.fake_provider.FakeQobj

    새 가짜 공급자 모듈을 사용하려면 pip install qiskit-ibm-runtime 을 실행하고 qiskit 가져오기 경로(qiskit.providers.fake_provider)를 새 가져오기 경로(qiskit_ibm_runtime.fake_provider)로 바꾸면 됩니다. 마이그레이션 예시:

    # Legacy path
    from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()
    
    # New path
    # run "pip install qiskit-ibm-runtime"
    from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()

    또한 특수 테스트 목적으로 설계된 다음과 같은 가짜 백엔드가 새로운 GenericBackendV2 클래스로 대체되었으며, 키스킷에서 더 이상 사용되지 않음에 따라 제거되었다 0.46:

    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
    • `qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple

    새 클래스로의 마이그레이션 예제 GenericBackendV2 클래스로의 마이그레이션 예제:

    # Legacy path
    from qiskit.providers.fake_provider import FakeBackend5QV2
    backend = FakeBackend5QV2()
    
    # New path
    from qiskit.providers.fake_provider import GenericBackendV2
    backend = GenericBackendV2(num_qubits=5)
    # note that this class will generate 5q backend with generic
    # properties that serves the same purpose as FakeBackend5QV2
    # but will generate different results

펄스 업그레이드 노트

  • 더 이상 사용되지 않는 클래스 제거 qiskit.pulse.instructions.Call 대체 펄스 지침이 제공되지 않습니다.

  • InstructionToQobjConverterQobjToInstructionConverter 에서 더 이상 사용되지 않는 메서드를 제거했습니다. 해당 사용자는 다음과 같습니다.

    • InstructionToQobjConverter.convert_acquire()
    • InstructionToQobjConverter.convert_bundled_acquires()
    • InstructionToQobjConverter.convert_set_frequency()
    • InstructionToQobjConverter.convert_shift_frequency()
    • InstructionToQobjConverter.convert_set_phase()
    • InstructionToQobjConverter.convert_shift_phase()
    • InstructionToQobjConverter.convert_delay()
    • InstructionToQobjConverter.convert_play()
    • InstructionToQobjConverter.convert_snapshot()
    • QobjToInstructionConverter.convert_acquire()
    • QobjToInstructionConverter.convert_set_phase()
    • QobjToInstructionConverter.convert_shift_phase()
    • QobjToInstructionConverter.convert_set_frequency()
    • QobjToInstructionConverter.convert_shift_frequency()
    • QobjToInstructionConverter.convert_delay()
    • QobjToInstructionConverter.bind_pulse()
    • QobjToInstructionConverter.convert_parametric()
    • QobjToInstructionConverter.convert_snapshot()

    이러한 공개 메서드는 모두 단일 진입점에서 암시적으로 호출되는 보호된 메서드로 대체됩니다. 즉, 클래스를 함수처럼 호출하는 것입니다.

  • qiskit.pulse.library.ParametricPulse 클래스와 모든 하위 클래스가 제거됩니다. 이들은 2022-10에 릴리스된 키스킷 0.39 (qiskit-terra 0.22 )부터 더 이상 사용되지 않습니다. 대신 SymbolicPulse 를 사용하고 자세한 내용은 해당 문서를 확인하세요.

OpenQASM 업그레이드 노트

  • 클래스의 qasm() 메서드 QuantumRegisterClassicalRegister 메서드가 제거되었습니다. 이는 OpenQASM 2 내보내기 레거시 구현의 내부 세부 사항이므로 교체할 필요가 없습니다. OpenQASM 2로 프로그램을 내보내려면 qasm2.dump() 또는 qasm2.dumps().

QPY 업그레이드 노트

  • QPY의 최신 포맷 버전은 현재 버전 11이며, 실행 시 기본적으로 다음과 같이 출력됩니다 qpy.dump().

  • 모듈 경로 qiskit.circuit.qpy_serialization 는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. QPY 직렬화의 경우 qiskit.qpy를 새 위치로 설정합니다.

양자 정보 업그레이드 노트

  • 더 이상 사용되지 않는 __getitem__/__setitem__ 매직 메서드를 제거했습니다 Clifford. 이 메서드는 2023-07년에 릴리스된 키스킷 0.44 이후 더 이상 사용되지 않습니다. 대신 Clifford.tableau 속성을 인덱싱하거나 반복합니다.

  • 0.46 릴리스 이후 더 이상 사용되지 않는 qiskit.quantum_info.synthesis 모듈을 제거했습니다. 다음 개체가 다음으로 이동되었습니다 qiskit.synthesis:

    이 기능은 0.46 릴리스에서 이미 더 이상 사용되지 않으므로 제거되었습니다: * cnot_rxx_decompose

    이 기능은 이전 릴리스에서 이미 더 이상 사용되지 않으므로 제거되었습니다: * decompose_clifford (대신 synth_clifford_full() 대신 사용) * decompose_cnotdihedral (대신 synth_cnotdihedral_full() 대신 사용)

  • 기능 process_fidelity(), average_gate_fidelity(), gate_error()diamond_norm() 함수는 키스킷 0.25.0 에서 더 이상 표시된 예상 유형에 임의의 입력을 강제로 시도하지 않습니다. 표시된 유형의 입력을 각 인수에 직접 전달합니다.

합성 업그레이드 노트

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

  • 더 이상 사용되지 않는 방법 Target.aquire_alignment 이 제거되었습니다. 키스킷 0.43 (2023-05 릴리스)에서 더 이상 사용되지 않는 것으로 표시되었습니다. 대신 Target.acquire_alignment() 방법을 사용해야 합니다.

  • 더 이상 사용되지 않는 함수 제거 qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit. 대신 get_vf2_limits()을 사용하십시오.

  • 함수에서 기본적으로 approximation_degree!=1.0 의 암시적 사용은 generate_preset_pass_manager() 함수의 암시적 사용이 비활성화되었습니다. 이전 기본값은 특히 트로터화 또는 아이덴티티에 가깝지만 확실히 같지는 않은 유사한 작업 실행을 포함하는 워크로드에서 과도하고 예기치 않은 근사값을 생성할 수 있습니다.

    이 변경으로 인해 내부 패스 관리자 생성 기본값이 원래의 의도인 transpile()와 일치하도록 합니다. 자세한 내용은 #8595를 참조하세요.

  • qiskit.transpiler.passes.basis 에서 더 이상 사용되지 않는 Unroller 클래스를 제거했습니다. 이 클래스는 키스킷( 0.45 )에서 더 이상 사용되지 않으며, 이 클래스를 사용하는 대신 BasisTranslatorUnrollCustomDefinitions.

    참고 BasisTranslatorUnrollCustomDefinitionsEquivalenceLibrary 객체를 전달해야 하므로 Unroller 와는 다른 인수를 사용합니다.

    이전에는 Unroller(basis_gates) 을 사용할 수 있었지만 이제는 을 사용할 수 있습니다:

    from qiskit.circuit.library.standard_gates.equivalence_library import (
        StandardEquivalenceLibrary as std_eqlib,
    )
    pm = PassManager([
        UnrollCustomDefinitions(std_eqlib, basis_gates)
        BasisTranslator(std_eqlib, basis_gates),
    ])
    translated = pm.run(circuit)
  • 더 이상 사용되지 않는 NoiseAdaptiveLayout 트랜스파일러 패스가 제거되었습니다. 키스킷 0.46.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 패스는 대부분 다음과 같이 대체되었습니다 VF2LayoutVF2PostLayout 로 대체되었으며, 백엔드의 보고된 노이즈 특성을 기반으로 레이아웃을 설정합니다. 패스와 함께 layout_method 플러그인( "noise_adaptive" )이 제거되었습니다.

  • 더 이상 사용되지 않는 CrosstalkAdaptiveSchedule 트랜스파일러 패스가 제거되었습니다. 키스킷 0.46.0 에서 사용되지 않는 것으로 표시되었습니다. 이 패스는 내부 작동이 사용자 정의 속성의 BackendProperties 페이로드에 설정된 BackendV1 인스턴스의 페이로드에 설정된 커스텀 프로퍼티에 의존했기 때문입니다. 이러한 필드를 설정하는 백엔드가 없으므로 패스가 제거되었습니다. 사용자 지정 워크플로우를 위해 패스에 의존하는 경우 키스킷 0.46.x 에서 버전을 사용할 수 있습니다.

  • 0.46 릴리스 이후 더 이상 사용되지 않는 qiskit.transpiler.synthesis 모듈을 제거했습니다. 다음 개체가 이동되었습니다:

  • 함수로 인스턴스를 호출할 때 target 키워드 별칭이 TwoQubitBasisDecomposer 인스턴스를 함수로 호출할 때의 0.40.0 키워드 별칭은 키스킷에서 더 이상 사용되지 않음에 따라 제거되었습니다. 인수를 첫 번째 인자로 위치 지정하여 전달하거나 새 이름 unitary 을 사용해야 합니다.

  • 특수 트랜스파일러 패스 LinearFunctionsSynthesis 는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 더 이상 사용되지 않는 이후에는 매우 얇은 래퍼로 HighLevelSynthesis를 대신 사용해야 합니다.

  • 가져오기 경로 qiskit.transpiler.passes.scheduling.calibration_creators 가 제거됩니다. 트랜스파일러는 이를 보관된 상태로 전달합니다, RZXCalibrationBuilderRZXCalibrationBuilderNoEcho 에서 직접 가져올 수 있습니다 qiskit.transpiler.passes.

  • 가져오기 경로 qiskit.transpiler.passes.scheduling.rzx_templates 가 제거됩니다. 가져와야 합니다 rzx_templates() 에서 qiskit.transpiler.passes 에서 직접 가져와야 합니다.

  • 패스 파이프라인 구성 패턴이 업그레이드되었습니다. 플로우 컨트롤러의 인스턴스화를 위해 아래에 표시된 구문 설탕이 제거되었습니다.

    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)

    이 키워드 인수 패턴을 사용하는 대신 흐름 컨트롤러를 명시적으로 인스턴스화해야 합니다.

    from qiskit.passmanager import ConditionalController, DoWhileController
    from qiskit.transpiler import PassManager
    
    pm = PassManager()
    pm.append(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )

    키워드 인자로는 불가능했던 컨트롤러의 중첩 순서를 관리할 수 있다는 점에 유의하세요. 지금은 추가 메서드를 호출할 이유가 없으므로 아래와 같이 패스 매니저의 생성자를 사용하여 파이프라인을 빌드할 수도 있습니다.

    pm = PassManager(
      ConditionalController(
        DoWhileController(my_pass, do_while=do_while_callable),
        condition=condition_callable,
      )
    )
  • 내장 플로우 컨트롤러의 추가 메서드가 제거되었습니다. 해당 사용자는 다음과 같습니다.

    • ConditionalController.append
    • DoWhileController.append
    • FlowControllerLinear.append

    플로우 컨트롤러의 작업 파이프라인은 고정되어 있으며 컨트롤러 인스턴스가 생성될 때 전달되어야 합니다.

  • passess 메서드 제거 PassManagerStagedPassManager 의 메서드를 제거하여 포함된 패스를 사전 목록 형태로 반환했습니다. 그러나 이 형식은 조건 분기 및 중첩 조건을 포함할 수 있는 복잡한 전달 파이프라인을 효율적으로 표현하지 못합니다. 이 표현을 사용하는 대신 다음 패턴을 사용하세요

    pm = PassManager(...)
    pm.to_flow_controller().tasks

    이렇게 하면 선형화된 기본 작업 인스턴스를 튜플 형식으로 직접 반환합니다.

  • max_iteration 인수가 PassManager.append()PassManager.replace().

  • 키스킷에서 더 이상 사용되지 않는 다음 레거시 클래스는 패스 매니저 및 트랜스파일러 모듈에서 제거되었다 0.46:

    • qiskit.passmanager.flow_controllers.FlowController
    • qiskit.transpiler.fencedobjs.FencedObject
    • qiskit.transpiler.fencedobjs.FencedPropertySet
    • qiskit.transpiler.fencedobjs.FencedDAGCircuit
    • qiskit.transpiler.runningpassmanager.RunningPassManager

시각화 업그레이드 안내

  • Matplotlib 을 사용하는 회로 시각화의 기본 스타일이 "iqp" 으로 변경되어 IBM 퀀텀 플랫폼과 일치합니다.

  • 더 이상 사용되지 않는 모듈 qiskit.visualization.qcstyle 이 제거되었습니다. 이 모듈은 키스킷 0.39.0 이후 더 이상 사용되지 않는 것으로 표시되었습니다. 대신 qiskit.visualization.circuit.qcstyle 을 사용해야 합니다.

  • 전달에 대한 지원은 더 이상 사용되지 않습니다 QuasiDistribution, ProbDistribution또는 배포 사전을 시각화의 data 인수에 전달하는 지원이 더 이상 지원되지 않습니다 plot_histogram() 시각화에 대한 지원이 제거되었습니다. 이 기능은 키스킷 0.39.0 릴리스(2022-10)에서 더 이상 사용되지 않는 것으로 표시되었습니다. 대신 히스토그램을 그리려는 경우 QuasiDistribution, ProbDistribution또는 분포 사전에서 히스토그램을 그리려면 대신 plot_distribution() 함수를 사용해야 합니다.

  • QiskitTimelineStylelink_interval_dt 키가 제거되었습니다. 새 이름 link_interval_percent 을 사용해야 합니다.

기타 업그레이드 주의사항

  • qiskit.Aer 오브젝트는 키스킷 0.46 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 대신 드롭인 대체품인 qiskit_aer.Aer 을 사용할 수 있습니다.

  • 키스킷 0.46 에서 더 이상 사용되지 않음에 따라 qiskit.providers.aer 에서 가져오기가 더 이상 작동하지 않습니다. 대신 드롭인 대체품인 qiskit_aer 에서 가져와야 합니다.

  • Aer의 기본 시뮬레이션 기능이 더 이상 사용되지 않고 제거됨에 따라 펄스 작업은 더 이상 가짜 백엔드에서 지원되지 않습니다. 회로 객체의 컨텍스트가 아닌 펄스 레벨 시뮬레이션의 경우, Qiskit Dynamics와 같은 특수 목적 라이브러리를 사용하는 것을 고려하세요.

  • 키스킷의 execute() 기능이 제거되었습니다. 이 함수는 일부 트랜스파일 옵션으로 회로를 트랜스파일하고 일부 실행 옵션으로 백엔드에서 실행하는 것에 대한 높은 수준의 래퍼 역할을 합니다. 같은 작업을 수행하려면 명시적으로 transpile() 함수(적절한 트랜스파일 옵션 포함) 뒤에 backend.run() (적절한 실행 옵션 포함)를 사용하면 됩니다.

    예를 들어, 달리기 대신

    from qiskit import execute
    job = execute(circuit, backend)

    실행할 수 있습니다:

    from qiskit import transpile
    new_circuit = transpile(circuit, backend)
    job = backend.run(new_circuit)

    또는 Sampler 프리미티브는 더 이상 사용되지 않는 execute() 함수와 의미적으로 동일합니다. 클래스 BackendSampler 는 프리미티브를 지원하지 않는 백엔드를 위한 일반 래퍼입니다:

    from qiskit.primitives import BackendSampler
    sampler = BackendSampler(backend)
    job = sampler.run(circuit)
  • 더 이상 사용되지 않는 qiskit.IBMQ 객체가 제거되었습니다. 이 별칭 개체는 키스킷 0.40.0 릴리스에서 사용되지 않는 것으로 표시되었습니다. 이 별칭 객체는 어트리뷰트 액세스를 qiskit.providers.ibmq.IBMQ 로 느리게 리디렉션했습니다. qiskit-ibmq-provider 패키지는 이제 사용되지 않고 자체 네임스페이스를 유지하는 qiskit-ibm-provider 패키지로 대체되었으므로 이 별칭을 유지하는 것은 더 이상 적절하지 않습니다. qiskit.IBMQ 별칭을 사용 중인 경우 qiskit-ibm-provider 패키지로 사용량을 마이그레이션해야 하며, 자세한 내용은 마이그레이션 가이드를 참조하세요.

  • 키스킷에서 일부 데이터를 대화형으로 시각화하기 위한 Jupyter 매직과 위젯을 포함했던 더 이상 사용되지 않는 모듈 qiskit.tools.jupyter 을 제거했습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않습니다. 이 기능의 대부분은 기존 qiskit-ibmq-provider 패키지에 직접 연결되어 있었고 더 이상 유효하지 않아 모듈이 제거되었습니다. 비슷한 기능은 qiskit-ibm-provider 패키지의 qiskit_ibm_provider.jupyter 모듈에서 사용할 수 있습니다.

  • 이전에 추적 도구가 포함되어 있던 더 이상 사용되지 않는 모듈 qiskit.tools.monitor 제거 JobV1 작업 인스턴스를 추적하는 도구를 포함했던 qiskit-ibm-provider 모듈을 제거했습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 패키지는 레거시 qiskit-ibm-provider 패키지에 직접 연결되어 있기 때문에 제거됩니다.

  • 이전에 모의 백엔드에 대한 임포트를 최신 위치로 리디렉션하는 데 사용되었던 더 이상 사용되지 않는 임포트 경로 qiskit.test.mock 를 제거했습니다 qiskit.providers.fake_provider. 이 모듈은 키스킷 0.37.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 모듈을 사용하는 경우 가져오기를 qiskit.test.mock 에서 qiskit.providers.fake_provider 로 업데이트해야 합니다.

  • qiskit.test 모듈은 더 이상 공개 모듈이 아닙니다. 이것은 공개용으로 의도된 것이 아니며, 키스킷의 자체 테스트 스위트 외부에서 사용되지 않았습니다. 모든 기능은 키스킷 전용이며 대체 기능은 제공되지 않으므로 유사한 기능이 필요한 경우 자체 테스트 하네스에 포함시켜야 합니다.

  • 더 이상 사용되지 않는 qiskit.tools.visualization 모듈이 제거되었습니다. 이 모듈은 키스킷 0.46.0 릴리스에서 더 이상 사용되지 않습니다. 이 모듈은 키스킷의 시각화 모듈의 원래 위치에서 레거시 리디렉션된 것으로, 키스킷의 시각화 모듈이 qiskit.visualization 키스킷 0.8.0 으로 이전되었다. 이 경로를 계속 사용하는 경우 가져오기 경로를 qiskit.tools.visualization 에서 qiskit.visualization.

  • 더 이상 사용되지 않는 qiskit.tools.events 모듈과 해당 모듈에 노출된 qiskit.tools.progressbar 유틸리티가 제거되었습니다. 이 기능은 키스킷 0.46.0 릴리스에서 더 이상 사용되지 않습니다. 이 모듈의 기능은 널리 사용되지 않았으며 tqdm과 같은 전용 패키지가 더 잘 다루고 있습니다.

  • qiskit.tools 모듈이 제거되었습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않습니다. 이 모듈의 모든 콘텐츠는 qiskit.tools.parallel_map 함수를 제외하고 제거되었으며, 대신 다음에서 사용할 수 있습니다 qiskit.utils.parallel_map() 에서 사용할 수 있습니다.

기본형 폐기

  • PrimitiveJob.submit()PrimitiveJob.wait_for_final_state() 메서드는 키스킷 0.46 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이는 공개적인 방법을 의도한 것이 아니라 잘못된 상속 구조의 유산이었습니다.

버그 수정

  • 큐비트의 하위 집합만 요청된 경우 부적절한 측정 일정이 반환되던 문제를 수정했습니다. 이전에는 모든 큐비트에 대한 측정 일정이 반환되었습니다.

  • 클래스가 아닌 작업을 표시할 때 text 회로 서랍에서 발생하는 문제를 수정했습니다 circuit.instruction.Instruction 클래스가 아닌 작업을 표시할 때 발생하는 문제를 수정했습니다. 이러한 작업으로 인해 서랍이 실패할 수 있습니다. 예를 들면 CliffordAnnotatedOperation.

  • 트랜스파일러 패스의 문제를 수정했습니다 SetLayout 트랜스파일러 패스에서 중복 항목이 포함된 유효하지 않은 정수 목록 입력이 발생하면 유효하지 않은 Layout 가 생성되고 이후의 트랜스파일러 패스가 암호화된 오류와 함께 실패하는 문제를 수정했습니다. 이제 이 문제는 SetLayout.run() 가 호출되면 InvalidLayoutError 정수 목록에 중복된 항목이 있음을 나타내는 오류가 발생합니다.

  • QPY( qpy.dump()qpy.load())는 이제 주석이 달린 연산(()을 사용하여 양자 회로를 올바르게 직렬화 및 역직렬화합니다AnnotatedOperation).

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

  • QuantumCircuit.compose() 는 이제 올바르게 CircuitError 인수가 qubits 또는 clbits 인수가 중복될 때 올바르게 발생합니다.

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

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

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

  • 사전 설정 패스 관리자 사용 또는 실행 시 발생하는 문제를 수정했습니다 transpile() 를 사용하거나 사전 설정된 패스 매니저( generate_preset_pass_manager())를 사용할 때 연결이 분리된 백엔드를 타깃팅할 때 출력에 추가 장벽을 추가하는 문제를 수정했습니다 QuantumCircuit. 어떤 경우에는 여러 개의 단일 큐비트 Barrier 지시어가 회로의 최종 측정 직전에 출력 회로에 포함되는 경우도 있습니다. 이는 출력 회로에 잘못 추가된 연결에 대한 내부 처리로 인해 생성된 내부 상태였습니다. 수정 #11649

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

  • 메서드는 이제 Operator.power() 메서드는 이제 문서화된 설명과 일치하는 부동 소수점 지수로 작동합니다.

  • 스왑 및 측정 명령어와 관련된 회로를 잘못 최적화하는 OptimizeSwapBeforeMeasure 패스의 문제를 수정했습니다. 예를 들어,

    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
  • QPY 직렬화 관련 문제를 수정했습니다 QuantumCircuit 에 동일한 속성을 가진 여러 사용자 지정 명령어 인스턴스가 포함되어 있는 경우 name 속성을 가진 커스텀 인스트럭션 인스턴스가 여러 개 있을 때 발생하는 문제를 수정했습니다. 버전 11 이전의 QPY 형식 버전에서는 QPY 페이로드가 이러한 인스턴스를 구분하지 않고 회로에서 첫 번째 인스턴스의 속성만 직렬화했습니다. 사용자 지정 명령의 다른 속성은 다르지만 이름이 같은 경우 잘못된 역직렬화가 발생할 수 있습니다. 이 문제는 QPY 버전 11에서 수정되어 사용자 지정 명령의 각 인스턴스가 개별적으로 직렬화되고 더 이상 이름이 겹치는 잠재적 충돌이 발생하지 않습니다. 수정 #8941.

  • 함수 관련 문제를 수정했습니다 qpy.dump() 함수에서 use_symengine 플래그가 True 로 평가되지만 실제로는 부울 True 이 아닌 진실 객체로 설정된 경우, 생성된 QPY 페이로드가 손상되는 문제를 수정했습니다. 예를 들어 use_symengineHAS_SYMENGINE로 설정하면 이 객체는 부울로 캐스팅할 때 True 로 평가되지만 실제로는 True 이 아닙니다.

  • 문자열 표현의 버그를 수정했습니다 StabilizerState 문자열 표현의 버그를 수정합니다.

  • 버그 convert_to_target()BackendV2Converter 가 예기치 않은 오류를 발생시키는 버그가 해결되었습니다. 이 버그는 변환할 백엔드에 백엔드 속성에 정의가 없는 게이트에 대한 캘리브레이션이 포함되어 있을 때 발생했습니다. 이러한 게이트는 이제 유한한 큐비트 집합에 대한 보정이 보고되는 경우에도 이상적인 오류 없는 명령으로 모든 큐비트에 브로드캐스트됩니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 QuantumCircuit.draw() 메서드 관련 문제를 수정했습니다.

  • InstructionDurations.from_backend() 는 이제 기본 클래스 대신 InstructionDurations 의 서브클래스 인스턴스를 반환합니다.

  • 트랜스파일러 패스는 이제 UnitarySynthesis 트랜스파일러 패스는 이제 존재하지 않는 합성 플러그인이 지정되면 런타임까지 기다리지 않고 초기화 시 오류를 생성합니다. 수정 #11355.

  • OpenQASM 3개 수출업체 qasm3.dump()dumps() 는 이제 OpenQASM 3 프로젝트에서 버전 관리가 표준화되었으므로 자격이 없는 3 대신 3.0 버전이라고 주장하는 파일을 올바르게 출력합니다.

  • 의 매개변수 형식은 XXPlusYYGateXXMinusYYGate 의 매개변수 형식은 이제 get_standard_gate_name_mapping() 에서 반환된 β\beta 매개변수와 초기 θ\theta 로테이션을 올바르게 포함합니다.

  • 이제 TemplateOptimization 패스는 이제 네이티브 심볼릭 표현식 형식인 ParameterExpression를 사용하여 파라메트릭 표현식을 반환합니다. 지원되는 대부분의 플랫폼에서 이는 표현식이 Symengine 객체가 된다는 의미입니다. 이전에는 패스가 일치하지 않는 객체를 반환하여 나중에 매개변수 처리 코드에서 오류를 일으킬 수 있었습니다.

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