Skip to main content
IBM Quantum Platform

키스킷 0.39 릴리즈 노트


0.39.5

테라 0.22.4

Prelude

키스킷 테라 0.22.4 는 0.22 시리즈에서 확인된 일부 버그를 수정하는 마이너 버그 수정 릴리스입니다.

버그 수정

  • 의 버그를 수정했습니다 BackendSampler 의 버그를 수정했습니다 run() 메서드를 두 번 연속으로 호출하면 오류가 발생하던 버그를 수정했습니다.

  • 에서 두 가지 버그를 수정했습니다 ComposedOp 에서 두 가지 버그를 수정했습니다 ComposedOp.to_matrix() 메서드가 컴포지션에 대해 올바른 결과를 제공하지 않는 두 가지 버그가 수정되었습니다 StateFn 와 전역 계수가 있는 컴포지션에 대해 올바른 결과를 제공하지 않는 두 가지 버그를 수정했습니다. 수정 #9283.

  • 프리미티브 SamplerEstimatornumpy.ndarray 를 매개변수로 전달할 때 작동하지 않던 문제를 수정했습니다.

  • 의 버그를 수정했습니다 SamplingVQE 에서 aggregation 인수가 영향을 미치지 않는 버그를 수정했습니다. 이제 집계 함수와 이를 통해 CVaR 기대값을 올바르게 지정할 수 있습니다.

  • 성능 버그가 수정되었습니다 SamplingVQE 가 고유 상태의 에너지를 느리게 평가하는 성능 버그를 수정했습니다.

  • 에서 베타 매개변수의 자동 평가가 수정되었습니다 VQD의 베타 파라미터 자동 평가를 수정하고 SparsePauliOp 입력에 대한 지원을 추가하고, 두 작업이 모두 제출된 후에만 작업 결과를 검색하여 프리미티브의 비동기 실행을 활용하도록 에너지 평가 기능을 수정했습니다.

  • 의 문제를 수정했습니다 Statevector.probabilities_dict()DensityMatrix.probabilities_dict() 메서드가 qargs 인수를 지정했을 때 비쿼비트 시스템에 대해 잘못된 결과를 반환하는 문제를 수정했습니다. 수정 #9210

  • 일부 classmethod의 처리 문제를 수정했습니다 wrap_method() 에서 Python 3.11. 이전에는 Python 3.11 에서 wrap_methodclassmethod 에 연결된 바인딩되지 않은 함수를 래핑한 다음 호출하면 일반적으로 classmethod 에 바인딩된 클래스 객체가 함수에 전달되지 않았기 때문에 실패했습니다. Python 3.11.1 에서부터 이 문제는 QiskitTestCase 에 영향을 미쳐 다른 테스트 코드에서 가져올 수 없게 되었습니다. 수정 #9291.

에어 0.11.2

변경 없음

IBM Q 제공자 0.19.2

변경 없음


0.39.4

테라 0.22.3

변경 없음

에어 0.11.2

새 기능

  • Python 3.11 지원으로 키스킷 에어 실행에 대한 지원이 추가되었습니다.

알려진 문제점

  • AerStatevector 에서 두 가지 버그를 수정했습니다. AerStatevector 메서드에서는 사용할 수 없는 mc* 인스트럭션을 사용하며, 이는 matrix_product_state 메서드에서는 사용할 수 없습니다. 이 커밋은 AerStatevector 을 MC*를 사용하지 않고 H, X, Y, Z, U 및 CX를 사용하도록 변경합니다. AerStatevector 명령이 빈 QuantumCircuit 으로 분해되는 경우에도 실패합니다. 이 커밋은 그러한 지시를 허용합니다.

버그 수정

  • AerSimulator.from_backend() 메서드에서 AerSimulator 인스턴스를 a BackendV2 객체에서 인스턴스화할 수 있도록 수정했습니다. 이전에는 AerSimulator.from_backend() 를 객체와 함께 사용하려고 하면 BackendV2 객체를 사용하려고 하면 지원되지 않는다는 AerError 오류가 발생했을 것입니다.

  • BackendV2 객체가 포함된 NoiseModel.from_backend() 가 비게이트 인스트럭션에서 과도한 QuantumError 초를 가진 노이즈 모델을 생성할 수 있는 버그 수정(예: ReadoutError 초만 측정에 충분해야 하는 경우). 이 커밋은 BackendV2 객체로 NoiseModel.from_backend() 을 업데이트하여 해당 BackendV1 객체로 호출한 것과 동일한 노이즈 모델을 반환합니다. 즉, 결과 노이즈 모델에는 측정값에 대한 QuantumError s가 포함되지 않으며 재설정과 같은 다른 비게이트 명령에 대한 열 완화 오류만 포함될 수 있습니다. 여전히 측정값에 ReadoutError 가 포함되어 있습니다.

  • NoiseModel.from_backend() 에서 기본값이 아닌 값으로 temperature kwarg를 사용하면 지정된 온도에 대한 여기 상태 모집단을 잘못 계산하는 버그가 수정되었습니다. 이전에는 볼츠만 분포 계산에 2라는 추가 계수가 있었기 때문에 여기 상태 모집단의 값이 부정확하게 작아졌습니다.

  • 제어 흐름 컴파일러에서 실행 중에 관련 없는 명령어가 제어 흐름 본문 '내부'에 표시되어 잘못된 결과를 초래할 수 있는 잘못된 로직을 수정했습니다. 예를 들어, 이전에는

    from qiskit import QuantumCircuit
    from qiskit_aer import AerSimulator
    
    backend = AerSimulator(method="statevector")
    
    circuit = QuantumCircuit(3, 3)
    circuit.measure(0, 0)
    circuit.measure(1, 1)
    
    with circuit.if_test((0, True)):
        with circuit.if_test((1, False)):
            circuit.x(2)
    
    with circuit.if_test((0, False)):
        with circuit.if_test((1, True)):
            circuit.x(2)
    
    circuit.measure(range(3), range(3))
    print(backend.run(circuit, method=method, shots=100).result())

    는 중첩된 제어 흐름 연산이 실행되어야 할 큐비트 2의 첫 번째 X 게이트를 실수로 건너뛰기 때문에 {'010': 100} 를 출력합니다.

  • T2 > 2 * T1 같은 비물리적 장치 매개변수를 보고하는 백엔드를 제공할 때 통계적 추정 오류로 인해 NoiseModel.from_backend() 에 자세한 경고를 출력하는 버그를 수정했습니다. 이 커밋은 noise.device 모듈 내에서 수행되는 것처럼 이론적 범위로 잘라내는 것 외에 다른 방법이 없다는 점에서 사용자가 실행할 수 없으므로 이러한 경고를 제거합니다. 수정된 버그에 대한 자세한 내용은 1631호를 참조하세요.

  • GPU 상태 벡터 시뮬레이터에 대한 수정 사항입니다. 청크 배포가 GPU의 모든 여유 메모리를 할당하려고 시도했지만 이로 인해 메모리 할당 오류가 발생했습니다. 따라서 이 수정 사항은 사용 가능한 메모리의 80%를 할당합니다. 또한 노이즈 샘플링이 적용될 때 매트릭스 버퍼의 크기를 수정합니다.

  • 캐시 차단으로 실행되는 AerState 의 수정 사항입니다. AerState 캐시 차단을 위해 Aer의 트랜스파일러를 잘못 구성한 후 큐비트를 교환하는 알고리즘이 잘못 작동했습니다. 이 수정으로 AerState 이 트랜스파일러를 사용하도록 수정합니다. 보다 구체적으로, 트랜스퓔레이션 후 스왑된 큐비트 맵은 AerState 을 사용할 때 원래 맵으로 복구됩니다. 이 수정은 AerStatevector 에서 다중 GPU를 사용하려면 필요합니다.

  • AerStatevector 에 대한 수정 사항입니다. 테라의 스테이트벡터에서 직접 AerStatevector 인스턴스를 생성할 수 없었습니다. 이 수정으로 상태 벡터를 AerStatevector’s 입력으로 사용할 수 있습니다.

  • SamplerResult.quasi_dists 에는 큐비트 수에 대한 데이터가 포함됩니다. QuasiDistribution.binary_probabilities() 는 올바른 길이의 비트 문자열을 반환합니다.

  • 이전에는 AerStatevector 에서 시드가 초기화되지 않았으며 샘플링된 결과는 항상 동일합니다. 이 커밋을 사용하면 각 샘플링에 대해 시드가 초기화되고 샘플링 결과가 달라질 수 있습니다.

IBM Q 제공자 0.19.2

변경 없음


0.39.3

테라 0.22.3

Prelude

키스킷 테라 0.22.3 는 0.22 시리즈의 몇 가지 추가 버그를 수정하는 마이너 버그 수정 릴리스입니다.

버그 수정

  • AdaptVQE 이제 보조 연산자를 지원함을 올바르게 표시합니다.

  • 회로 서랍(QuantumCircuit.draw()circuit_drawer())는 회로의 내용에 모든 비트를 개별적으로 그려야 하는 경우 기본 인수를 사용할 때 cregbundle 매개변수에 대한 경고를 더 이상 표시하지 않습니다. 이는 새로운 스타일의 제어 흐름 연산으로 회로를 그리려고 할 때 가장 많이 나타납니다.

  • 1보다 큰 값을 설정했을 때 QNSPSAmax_evals_grouped 가 1보다 큰 값으로 설정된 경우 실패하는 버그를 수정했습니다.

  • 패스와 관련된 문제를 수정했습니다 SabreSwapseed 인수를 지정하지 않고 패스를 여러 번 실행하면 다른 시드를 사용하는 대신 실행 사이에 동일한 난수 생성기 시드를 재사용하도록 하는 패스의 문제를 수정했습니다. 이로 인해 이전에는 seed 을 지정하지 않아도 실행 간에 동일한 결과가 반환되었습니다.

  • 프리미티브 클래스 관련 문제를 수정했습니다, BackendSamplerBackendEstimator로 인스턴스를 직렬화할 수 없던 문제를 수정했습니다( pickle). 일반적으로 이러한 클래스는 다음과 같이 직렬화할 수 없습니다 BackendV2BackendV1 인스턴스는 직렬화 가능해야 할 필요는 없지만 (그리고 종종 그렇지 않은 경우도 있습니다), 클래스 정의의 BackendSamplerBackendEstimator 의 클래스 정의는 더 이상 pickle 의 사용을 막지 않습니다.

  • 이제 이전과 마찬가지로 pulse.Instruction.draw() 메서드가 성공합니다. 이 방법은 대체 계획 없이 더 이상 사용되지 않지만 사용 중단 기간 동안은 계속 작동합니다.

에어 0.11.1

변경 없음

IBM Q 제공자 0.19.2

변경 없음


0.39.2

테라 0.22.2

Prelude

키스킷 테라 0.22.2 는 사소한 버그 수정 릴리스이며, Python 3.11 에 대한 첫 번째 공식 지원입니다.

버그 수정

  • 백엔드 프리미티브 클래스 관련 문제 수정 BackendSamplerBackendEstimator 필드가 설정되지 않은 BackendV1max_experiments 필드가 설정되지 않은 인스턴스의 BackendConfiguration.

  • 백엔드에서 정의된 VF2PostLayout 정의된 백엔드에 대해 트랜스파일링할 때 정의된 Target가 정의된 백엔드에 대한 트랜스파일링 시 인터랙션 그래프가 잘못 작성되는 버그를 수정했습니다. 그래프가 필요 이상으로 복잡해져 런타임이 과도하게 늘어날 수 있습니다.

  • 펄스 표현식 구문 분석기가 더 이상 Jupyter 노트북에서 호출될 때 주기적으로 중단되지 않습니다. 이는 메모화가 평가하기 특히 어려워 보이는 재귀 객체의 내부 deepycopy 를 피함으로써 달성할 수 있습니다.

에어 0.11.1

변경 없음

IBM Q 제공자 0.19.2

변경 없음


0.39.1

테라 0.22.1

Prelude

키스킷 테라 0.22.1 는 버그 수정 릴리스로, 0.22.0 릴리스 이후 확인된 몇 가지 사소한 문제를 해결합니다.

지원 중단 노트

  • pauli_list kwarg pauli_basis() 는 더 이상 사용되지 않습니다 pauli_basis() 는 이제 항상 PauliList. 이 인수는 키스킷 테라 0.22.0 에서 조기에 제거되어 pauli_list``argument. Now, the argument has been restored but will emit a ``DeprecationWarning 을 사용하던 사용자들의 호환성을 깨뜨렸습니다. 사용하면 키스킷 테라 0.22.0 a PauliList 는 항상 반환됩니다.

버그 수정

  • 트랜스파일러 패스가 BarrierBeforeFinalMeasurements 트랜스파일러 패스를 수정했습니다 Clbit의 최종 측정 레이어 바로 직전에 조건이 있을 때 트랜스파일러 패스를 수정했습니다. 이전에는 내부 임시 회로에 비트가 존재하지 않는다고 주장하며 실패했습니다. 수정 #8923

  • 에 대한 동일성 검사기 QuantumCircuitDAGCircuit (동일한 유형의 객체 포함)에 대한 동일성 검사기는 이제 단일 비트에 대한 조건을 올바르게 처리합니다. 이전에는 비트가 회로 명령어의 나머지 속성이 받는 '의미론적' 검사 대신 '정확한' 동일성 검사를 사용했기 때문에 동일성에 대한 잘못된 네거티브가 발생했습니다.

  • 제어 흐름에서 클래식 비트 처리 수정 StochasticSwap 의 클래식 비트 처리를 수정했습니다. 이전에는 제어 흐름 연산이 외부 회로의 모든 클래식 비트를 포함하도록 확장되었다가 다시 축소되지 않아 명령어가 필요하다고 보고한 클릿 수와 실제 공급된 클릿 수가 불일치하는 문제가 발생했습니다. 수정 #8903

  • 클래스에 대해 전역으로 정의된 명령어 처리를 수정했습니다 Target 클래스에 대한 전역 정의 명령어 처리를 수정했습니다. 이전에는 두 가지 방법이 있었습니다, operations_for_qargs()operation_names_for_qargs() 는 대상에 존재하는 전역적으로 정의된 이상적인 연산을 무시하거나 잘못 처리했습니다. 예를 들어,

    from qiskit.transpiler import Target
    from qiskit.circuit.library import CXGate
    
    target = Target(num_qubits=5)
    target.add_instruction(CXGate())
    names = target.operation_names_for_qargs((1, 2))
    ops = target.operations_for_qargs((1, 2))

    이제 names 의 경우 {"cx"} , [CXGate()] 의 경우 ops 을 반환하는 대신 KeyError 또는 빈 리턴을 반환합니다.

  • 메서드의 문제를 수정했습니다 Target.add_instruction() 메서드에서 이전에는 properties 인수의 일부로 잘못된 큐비트 수가 포함된 인수를 허용했던 문제를 수정했습니다. 예를 들어,

    from qiskit.transpiler import Target
    from qiskit.circuit.library import CXGate
    
    target = Target()
    target.add_instruction(CXGate(), {(0, 1, 2): None})

    이제 대상과 상호 작용할 때 런타임 문제를 일으키는 대신 TranspilerError 이 올바르게 발생합니다. 수정 #8914

  • 시각화 기능의 문제를 수정했습니다 plot_state_hinton() 시각화 기능의 문제를 수정하여 축이 실제 플롯에서 오프셋되어 잘못 배치되는 문제를 해결했습니다. 수정 #8446 <https://github.com/Qiskit/qiskit/issues/8446>

  • 함수의 출력을 수정하여 plot_state_hinton() 함수의 출력을 수정하여 상태 레이블이 올바르게 정렬되고 이미지가 자연스러운 행렬 순서와 일치하도록 했습니다. 수정 #8324

  • 프리미티브 클래스 관련 문제를 수정했습니다, BackendSamplerBackendEstimator 각 작업의 회로 수가 제한된 백엔드에서 실행할 때 발생하는 문제를 수정했습니다. 모든 백엔드가 무제한 배치 크기를 지원하는 것은 아니며(대부분의 하드웨어 백엔드는 지원하지 않습니다) 이전에는 백엔드 프리미티브 클래스가 지원되는 백엔드보다 더 많은 회로를 잘못 전송했을 가능성이 있었습니다. 이 문제는 다음과 같이 수정되었습니다 BackendSamplerBackendEstimator 는 백엔드에 작업당 회로 수가 제한된 경우 회로를 여러 작업으로 분할합니다.

  • 클래스 관련 문제를 수정했습니다 BackendEstimator 클래스에서 이전에 monitor 이라는 실행 옵션을 True 으로 평가되는 값으로 설정하면 qiskit-ibmq-provider 패키지의 백엔드에서만 작동하는 작업 모니터가 잘못 트리거되던 문제를 수정했습니다. 필요한 경우 문제 없이 monitor 실행 옵션을 사용할 수 있도록 이 옵션이 제거되었습니다.

  • 메소드 관련 문제를 수정했습니다 Target.build_coupling_map() 메서드가 None 를 잘못 반환하는 문제를 수정했습니다 Target 객체에서 전역적으로 사용 가능한 이상적인 명령어와 큐비트 제약 조건이 있는 명령어가 혼합되어 있을 때 발생하는 문제를 수정했습니다. 이제 이러한 경우 Target.build_coupling_map() 은 제약된 명령어에 대한 커플링 맵을 반환합니다(전역적으로 연결 제약이 없으므로 None 을 반환하는 2쿼비트 연산이 아니라면). 수정 #8971

  • 속성 관련 문제를 수정했습니다 Target.qargsNone 어트리뷰트 관련 문제를 수정했습니다 Target 객체를 반환하는 문제를 수정했습니다.

  • pauli_list 키워드 인수의 조기 제거를 수정했습니다 pauli_basis() 함수의 키워드 인수를 조기에 제거하여 키스킷 테라 0.22.0 로 업그레이드할 때 pauli_list=True 향후 호환성 경로를 사용하는 기존 코드를 깨뜨리는 문제를 수정했습니다. 이 키워드 인수는 함수에 다시 추가되었으며 현재 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다.

  • QPY 직렬화(dump())에서 사용자 정의 ControlledGate 서브클래스가 _define() 메서드를 오버로드하여 연산에 대한 사용자 정의 정의를 제공할 때 발생하는 문제를 수정했습니다. 이전에는 이 작업 사례가 정의를 제공할 때 잠재적으로 _define() 메서드를 사용하는 것을 고려하지 않았기 때문에 올바르게 직렬화되지 않았습니다. 수정 #8794

  • QPY 역직렬화는 더 이상 회로에 추가 인스턴스를 추가하지 않습니다 Clbit 인스턴스를 회로에 추가하지 않습니다 Clbit와 더 많은 Qubit보다 많은 Clbits.

  • QPY 역직렬화는 입력 회로에 느슨한 비트만 포함된 경우 더 이상 q와 c라는 이름의 레지스터를 추가하지 않습니다.

  • 두 개의 연산자에서 SparsePauliOp.dot() 메서드가 실수 계수가 있는 두 연산자에서 실행될 때 오류가 수정되었습니다. 이 문제를 해결하기 위해 SparsePauliOp 에서 사용할 수 있는 dtype은 np.complex128object 로 제한됩니다. 수정 #8992

  • 함수 및 circuit_drawer() 함수 및 QuantumCircuit.draw() 메서드에서 mpl 출력에 사용할 수 있는 기본 제공 스타일이 default 뿐인 문제를 수정했습니다. iqx 와 같은 다른 기본 제공 스타일을 사용하면 스타일을 찾을 수 없다는 경고가 표시되고 서랍이 default 스타일을 사용하도록 되돌아갑니다. 수정 #8991

  • 문제를 수정했습니다 transpile() 인수를 통해 사용자 정의 객체가 전달된 경우 TypeError 에서 실패하던 문제를 수정했습니다 Target 객체가 target 인수를 통해 전달되고 circuits 인수에 여러 회로 목록이 지정된 경우 문제가 해결되었습니다.

  • 관련 문제를 수정했습니다 transpile() 를 타겟팅할 때 Target ( target 인수를 통해 직접 또는 인수의 BackendV2 인수를 통해 직접 또는 backend 인수의 인스턴스를 통해)를 타겟팅할 때 발생하는 문제를 수정했습니다 Measure 인스트럭션(프로퍼티가 정의되지 않은 인스트럭션)을 타겟팅할 때 발생하는 문제를 수정했습니다. 이전에는 타깃을 구문 분석하려고 할 때 예외가 발생했습니다. 수정 #8969

  • 패스와 관련된 문제를 수정했습니다 VF2Layout 패스로 실행할 때 오류가 발생하는 Target 로 실행할 때 오류가 발생하던 문제를 수정했습니다. 이러한 경우 오류율이 없으면 이상적인 구현으로 간주하고 오류율이 없으면 가장 먼저 일치하는 레이아웃을 선택하도록 수정되었습니다. 수정 #8970

  • 패스와 관련된 문제를 수정했습니다 VF2PostLayout 패스로 실행할 때 오류가 발생하는 Target 로 실행할 때 오류가 발생하던 문제를 수정했습니다. 이러한 경우 오류율이 없는 것은 이상적인 작업 구현으로 간주됩니다.

  • 클래스 관련 문제를 수정했습니다 VQD 클래스에서 k=2 고유값이 두 개 이상 계산되는 문제를 수정했습니다. 이전에는 내부 유형 불일치로 인해 실패했지만 이제는 예상대로 실행됩니다. 수정 #8982

  • 새로운 프리미티브 기반 변형 알고리즘의 성능 버그 수정 minimum_eigensolvers.VQE, eigensolvers.VQDSamplingVQE 가 기본적으로 에너지 평가를 일괄 처리하지 않아 하드웨어 백엔드를 사용하는 경우 속도가 크게 느려지는 성능 버그를 수정했습니다.

  • 제로 연산자 게이트 및 명령어는 이제 다음과 함께 작동합니다 circuit_to_gate(), QuantumCircuit.to_gate(), Gate.control()와 함께 작동하며 Operator 에서 QuantumCircuit 에서 0 피연산자 인스트럭션이 포함된 이 에지 케이스는 더 큰 복합 명령어의 일부로 전역 위상 게이트를 생성할 때 가끔 유용하지만, 많은 용도에 있어서는 QuantumCircuit.global_phase 가 더 적절할 수 있습니다.

  • 다음과 같은 문제 수정 Statevector.evolve()DensityMatrix.evolve() 가 비쿼비트 서브시스템의 중첩된 서브시스템 진화에 대한 예외를 발생시키는 문제를 수정했습니다. 문제 #8897 수정

  • 버그 수정 Statevector.evolve() 하위 시스템 진화 시 하위 시스템 차원이 다른 진화하지 않은 하위 시스템이 2개 이상 있는 특정 경우에 잘못된 값을 반환하는 버그가 수정되었습니다. 문제 #8899 수정

에어 0.11.1

버그 수정

  • CMake 3.18 이상을 사용하고 GPU 지원을 활성화한 상태에서 qiskit-aer를 빌드하려고 할 때 발생할 수 있는 빌드 오류를 수정했습니다. CMake 3.18 이후부터는 CUDA로 빌드할 때 CMAKE_CUDA_ARCHITECTURES 을 타겟 GPU의 아키텍처 값으로 설정해야 했습니다. 이 설정이 없는 경우 AER_CUDA_ARCH 설정이 사용되도록 수정되었습니다.

  • LocalNoisePass 에서 클릿으로 명령어를 처리하는 버그를 수정했습니다. 이전에는 method="append" 의 경우 노이즈가 적용되는 지침(예: 조치)의 일부가 실수로 지워지는 문제가 있었습니다.

  • 여러 실행에서 동일한 회로로 실행할 때 샘플러 클래스의 성능 오버헤드를 수정했습니다. 이는 후속 실행에서 이러한 동일한 회로의 트랜스필레이션을 건너뛰거나 캐싱함으로써 달성할 수 있었습니다.

  • 및 프리미티브 클래스의 호환성을 수정했습니다 SamplerEstimator 프리미티브 클래스와 키스킷-테라 0.22.0 릴리스와의 호환성을 수정했다. Qiskit-terra 0.22.0 에서 이러한 클래스와의 호환성을 깨뜨리는 추상 인터페이스의 API 변경이 이루어졌는데, 이 문제가 해결되었다 SamplerEstimator 는 이제 qiskit-terra >= 0.22.0 와 함께 사용할 수 있습니다.

IBM Q 제공자 0.19.2

변경 없음


0.39.0

이번 릴리스에서는 키스킷 메타패키지의 일부인 키스킷 에어 프로젝트도 공식적으로 더 이상 사용되지 않습니다. 즉, 향후 릴리스에서 pip install qiskit 에는 더 이상 qiskit-aer 이 포함되지 않습니다. 현재 qiskit 을 설치하거나 종속성으로 나열하여 Aer를 설치하는 경우 qiskit-aer 도 명시적으로 나열하도록 업그레이드해야 합니다.

qiskit-aer 프로젝트는 여전히 활성화되어 있고 앞으로도 유지될 것이지만, 키스킷 메타패키지(즉, pip install qiskit 을 통해 설치되는 것)의 경우 키스킷 패키지는 양자 회로, 프로그램 및 애플리케이션을 구축하고 컴파일하는 공통 핵심 기능만 포함하고, 이를 기반으로 구축하거나 하드웨어 또는 시뮬레이터에 키스킷을 연결하는 패키지는 별도의 패키지로 구성하는 모델로 나아가고 있습니다.

테라 0.22.0

Prelude

키스킷 테라 0.22.0 릴리즈는 수많은 새로운 기능과 버그 수정이 포함된 주요 기능 릴리즈입니다. 이번 릴리스의 주요 내용은 다음과 같습니다:

  • 트랜스파일링에 대한 트랜스파일러 초기 지원 추가 QuantumCircuit 객체와 같은 제어 흐름 명령어를 포함하는 ForLoopOpWhileLoopOp.
  • 특히 많은 큐비트를 사용하는 transpile() 함수의 확장 및 성능이 크게 개선되었습니다(특히 optimization_level=3 사용 시).
  • 외부 플러그인 인터페이스 transpile() 외부 패키지에서 기본 패스 관리자를 위한 스테이지를 구현할 수 있습니다. 이에 대한 자세한 내용은 qiskit.transpiler.preset_passmanagers.plugin. 또한 BackendV2 백엔드에서는 이제 스케줄링 및 번역 단계에 사용할 사용자 지정 기본 플러그인을 선택적으로 설정할 수 있습니다.
  • 업데이트된 알고리즘 구현 qiskit.algorithms 의 업데이트된 알고리즘 구현 primitives 클래스를 구현하는 BaseSamplerBaseEstimator.

새 기능

  • 클래스에 가변 폭을 갖는 연산 표현을 위한 지원을 추가합니다 Target 클래스에 추가합니다. 이전에는 Target 객체에는 대상에서 지원되는 각 작업에 대해 Operation 인스턴스가 정의되어 있어야 했습니다. 이는 인수의 유효성 검사와 연산 매개변수 검증에 모두 사용되었습니다. 그러나 가변 폭을 갖는 연산에서는 Operation 클래스의 각 인스턴스가 고정된 수의 큐비트만 가질 수 있기 때문에 이것이 불가능했습니다. 백엔드에서 가변 너비 연산을 지원하는 경우 인스턴스 대신 연산 클래스와 함께 인스트럭션을 추가할 수 있습니다. 이러한 경우 작업은 모든 큐비트에서 전역적으로 지원되는 것으로 처리됩니다. 예를 들어 다음과 같은 타겟을 구축하는 경우

    from qiskit.circuit import Parameter, Measure, IfElseOp, ForLoopOp, WhileLoopOp
    from qiskit.circuit.library import IGate, RZGate, SXGate, XGate, CXGate
    from qiskit.transpiler import Target, InstructionProperties
    
    theta = Parameter("theta")
    
    ibm_target = Target()
    i_props = {
        (0,): InstructionProperties(duration=35.5e-9, error=0.000413),
        (1,): InstructionProperties(duration=35.5e-9, error=0.000502),
        (2,): InstructionProperties(duration=35.5e-9, error=0.0004003),
        (3,): InstructionProperties(duration=35.5e-9, error=0.000614),
        (4,): InstructionProperties(duration=35.5e-9, error=0.006149),
    }
    ibm_target.add_instruction(IGate(), i_props)
    rz_props = {
        (0,): InstructionProperties(duration=0, error=0),
        (1,): InstructionProperties(duration=0, error=0),
        (2,): InstructionProperties(duration=0, error=0),
        (3,): InstructionProperties(duration=0, error=0),
        (4,): InstructionProperties(duration=0, error=0),
    }
    ibm_target.add_instruction(RZGate(theta), rz_props)
    sx_props = {
        (0,): InstructionProperties(duration=35.5e-9, error=0.000413),
        (1,): InstructionProperties(duration=35.5e-9, error=0.000502),
        (2,): InstructionProperties(duration=35.5e-9, error=0.0004003),
        (3,): InstructionProperties(duration=35.5e-9, error=0.000614),
        (4,): InstructionProperties(duration=35.5e-9, error=0.006149),
    }
    ibm_target.add_instruction(SXGate(), sx_props)
    x_props = {
        (0,): InstructionProperties(duration=35.5e-9, error=0.000413),
        (1,): InstructionProperties(duration=35.5e-9, error=0.000502),
        (2,): InstructionProperties(duration=35.5e-9, error=0.0004003),
        (3,): InstructionProperties(duration=35.5e-9, error=0.000614),
        (4,): InstructionProperties(duration=35.5e-9, error=0.006149),
    }
    ibm_target.add_instruction(XGate(), x_props)
    cx_props = {
        (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713),
        (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713),
        (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929),
        (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929),
        (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659),
        (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659),
        (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201),
        (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201),
    }
    ibm_target.add_instruction(CXGate(), cx_props)
    measure_props = {
        (0,): InstructionProperties(duration=5.813e-6, error=0.0751),
        (1,): InstructionProperties(duration=5.813e-6, error=0.0225),
        (2,): InstructionProperties(duration=5.813e-6, error=0.0146),
        (3,): InstructionProperties(duration=5.813e-6, error=0.0215),
        (4,): InstructionProperties(duration=5.813e-6, error=0.0333),
    }
    ibm_target.add_instruction(Measure(), measure_props)
    ibm_target.add_instruction(IfElseOp, name="if_else")
    ibm_target.add_instruction(ForLoopOp, name="for_loop")
    ibm_target.add_instruction(WhileLoopOp, name="while_loop")

    그리고 IfElseOp, ForLoopOpWhileLoopOp 연산은 모든 수의 큐비트에 대해 전 세계적으로 지원됩니다. 그런 다음 다음과 같은 다른 호출에 의해 반영됩니다 Target API의 다른 호출에 instruction_supported():

    ibm_target.instruction_supported(operation_class=WhileLoopOp, qargs=(0, 2, 3, 4))
    ibm_target.instruction_supported('if_else', qargs=(0, 1))

    둘 다 True 을 반환합니다.

  • 새로운 프리미티브 구현이 추가되었습니다, BackendSamplerBackendEstimatorqiskit.primitives. 이 새로운 프리미티브 클래스 구현은 BackendV1 또는 BackendV2 인스턴스를 BaseSampler 또는 BaseEstimator 로 래핑합니다. 이러한 기본 구현의 사용 사례는 기본 기본 구현이 없는 공급자와 기본 구현과 함께 작동하는 API를 사용하는 공급자의 백엔드 간의 격차를 해소하기 위한 것입니다. 예를 들어 SamplingVQE 클래스는 BaseSampler 인스턴스가 필요합니다. 네이티브 프리미티브 구현이 없는 공급자의 백엔드로 해당 클래스를 실행하고 싶다면 BackendSampler 를 생성하면 됩니다:

    from qiskit.algorithms.minimum_eigensolvers import SamplingVQE
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.circuit.library import TwoLocal
    from qiskit.primitives import BackendSampler
    from qiskit.providers.fake_provider import FakeHanoi
    from qiskit.opflow import PauliSumOp
    from qiskit.quantum_info import SparsePauliOp
    
    backend = FakeHanoi()
    sampler = BackendSampler(backend=backend)
    
    operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12]))
    ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    optimizer = SLSQP()
    sampling_vqe = SamplingVQE(sampler, ansatz, optimizer)
    result = sampling_vqe.compute_minimum_eigenvalue(operator)
    eigenvalue = result.eigenvalue

    네이티브 프리미티브 구현이 있는 공급자(예: qiskit-ibm-runtime 또는 qiskit-aer)를 사용하는 경우 항상 네이티브 프리미티브 구현을 사용하는 것이 좋습니다 BackendEstimator 또는 BackendSampler 보다 네이티브 구현이 훨씬 효율적이거나 추가 사전 및 사후 처리를 수행할 수 있기 때문입니다. BackendEstimatorBackendSampler 는 반환하는 모든 백엔드에서 작동할 수 있는 범용으로 설계되었습니다 CountsResults 를 반환하는 모든 백엔드에서 작동할 수 있는 범용으로 설계되어 추가 최적화가 필요하지 않습니다.

  • 새로운 알고리즘 클래스를 추가했습니다, AdaptVQEqiskit.algorithms 이 알고리즘은 qiskit.algorithms.minimum_eigensolvers.VQE 와 연산자 풀을 조합하여 qiskit.circuit.library.EvolvedOperatorAnsatz 연산자 풀과 조합하여 사용합니다. 예를 들어,

    from qiskit.algorithms.minimum_eigensolvers import AdaptVQE, VQE
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.primitives import Estimator
    from qiskit.circuit.library import EvolvedOperatorAnsatz
    
    # get your Hamiltonian
    hamiltonian = ...
    
    # construct your ansatz
    ansatz = EvolvedOperatorAnsatz(...)
    
    vqe = VQE(Estimator(), ansatz, SLSQP())
    
    adapt_vqe = AdaptVQE(vqe)
    
    result = adapt_vqe.compute_minimum_eigenvalue(hamiltonian)
  • 클래스는 이제 BackendV2 클래스는 이제 두 개의 새로운 선택적 훅 포인트를 지원하여 백엔드에서 사용자 정의 컴파일 단계를 삽입할 수 있습니다 transpile()generate_preset_pass_manager(). 구현에 BackendV2 구현에 get_scheduling_stage_plugin() 또는 get_translation_stage_plugin() 메서드가 포함된 경우 트랜스파일러는 반환된 문자열을 scheduling_methodtranslation_method 인수의 기본값으로 사용합니다. 이를 통해 백엔드에서 트랜스파일러 스테이지를 활용하여 해당 백엔드를 타겟팅할 때 추가 커스텀 트랜스파일러 패스를 실행할 수 있습니다 plugin 인터페이스를 활용할 수 있습니다. 사용 방법에 대한 자세한 내용은 다음을 참조하세요: 커스텀 트랜스파일러 패스를 참고하세요.

  • 새 키워드 인수 ignore_backend_supplied_default_methods 를 추가했습니다 transpile() 함수에 새로운 키워드 인수인 get_scheduling_stage_plugin() 또는 get_translation_stage_plugin() 을 추가하여 대상 백엔드에 또는 이 정의되어 있는 경우 백엔드의 기본 방법 사용자 지정 선택을 비활성화하는 데 사용할 수 있습니다.

  • 클래스의 생성자에 label 파라미터를 추가했습니다 Barrier 클래스의 생성자 및 barrier() 메서드에 사용자가 레이블을 지정할 수 있는 Barrier 지시어의 인스턴스에 레이블을 할당할 수 있는 메서드를 추가했습니다. 를 사용하여 생성된 비주얼리제이션의 경우 circuit_drawer() 또는 QuantumCircuit.draw() 로 생성된 시각화의 경우 이 레이블은 barrier 의 상단에 인쇄됩니다.

    from qiskit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.h(1)
    circuit.barrier(label="After H")
    circuit.draw('mpl')
  • 새 게이트 추가 CCZGate, CSGateCSdgGate 를 회로 라이브러리의 표준 게이트(qiskit.circuit.library).

  • 추가 qiskit.algorithms.eigensolvers 패키지에 프리미티브 지원 알고리즘을 위한 인터페이스를 추가했습니다. 이 새 모듈은 결국 이전 qiskit.algorithms.eigen_solvers 을 대체하게 됩니다. 이 새로운 모듈에는 백엔드나 VQD 의 대체 구현이 포함되어 있으며, 백엔드 또는 QuantumInstance 의 인스턴스를 취하는 대신 BaseEstimator의 인스턴스(예 Estimator, BackendEstimator또는 qiskit-ibm-runtimeqiskit-aer 에 있는 것과 같은 모든 공급자 구현을 포함합니다.

    예를 들어, 새 구현을 다음과 같은 인스턴스와 함께 사용하려면 Estimator 클래스의 인스턴스와 함께 사용하려면

    from qiskit.algorithms.eigensolvers import VQD
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.circuit.library import TwoLocal
    from qiskit.primitives import Sampler, Estimator
    from qiskit.algorithms.state_fidelities import ComputeUncompute
    from qiskit.opflow import PauliSumOp
    from qiskit.quantum_info import SparsePauliOp
    
    h2_op = PauliSumOp(SparsePauliOp(
        ["II", "IZ", "ZI", "ZZ", "XX"],
        coeffs=[
            -1.052373245772859,
            0.39793742484318045,
            -0.39793742484318045,
            -0.01128010425623538,
            0.18093119978423156,
        ],
    ))
    
    estimator = Estimator()
    ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    optimizer = SLSQP()
    fidelity = ComputeUncompute(Sampler())
    
    vqd = VQD(estimator, fidelity, ansatz, optimizer, k=2)
    result = vqd.compute_eigenvalues(h2_op)
    eigenvalues = result.eigenvalues

    평가된 보조 연산자는 이제 결과의 aux_operators_evaluated 필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다. aux_operator_eigenvalues 는 더 이상 유효한 필드가 아닙니다.

  • 양자 회로 쌍의 상태 충실도/중첩을 계산하는 새로운 알고리즘이 추가되었습니다(매개변수화 가능). 인터페이스를 정의하는 베이스 클래스(BaseStateFidelity)의 인스턴스를 활용하는 계산-계산 해제 메서드의 구현이 있는데, 인터페이스를 정의하는 베이스 클래스( BaseSampler 프리미티브 qiskit.algorithms.state_fidelities.ComputeUncompute.

    예를 들어,

    import numpy as np
    from qiskit.primitives import Sampler
    from qiskit.algorithms.state_fidelities import ComputeUncompute
    from qiskit.circuit.library import RealAmplitudes
    
    sampler = Sampler(...)
    fidelity = ComputeUncompute(sampler)
    circuit = RealAmplitudes(2)
    values = np.random.random(circuit.num_parameters)
    shift = np.ones_like(values) * 0.01
    
    job = fidelity.run([circuit], [circuit], [values], [values+shift])
    fidelities = job.result().fidelities
  • 새로운 모듈이 추가되었습니다 qiskit.algorithms.gradients 에 정의된 프리미티브 인터페이스를 사용하여 그라디언트를 계산하는 데 사용되는 클래스를 포함하는 새로운 모듈이 추가되었습니다 qiskit.primitives. 그라데이션 클래스에는 4가지 유형이 있습니다: 유한차이, 파라미터 시프트, 유니티의 선형 조합, 그리고 SPSA의 인스턴스를 사용하는 구현이 있는 BaseEstimator 인터페이스의 인스턴스를 사용합니다:

    의 인스턴스 또는 BaseSampler 인터페이스의 인스턴스입니다:

    추정기 기반 기울기는 기대값의 기울기를 계산하는 반면 샘플러 기반 기울기는 측정 결과의 기울기("확률 기울기"라고도 함)를 반환합니다.

    예를 들어,

    estimator = Estimator(...)
    gradient = ParamShiftEstimatorGradient(estimator)
    job = gradient.run(circuits, observables, parameters)
    gradients = job.result().gradients
  • 클래스에는 Grover 클래스에는 새로운 키워드 인수가 있는데, sampler 이 인수는 결과를 계산하기 위해 인터페이스의 인스턴스를 사용하여 알고리즘을 실행하는 데 사용됩니다 BaseSampler 인터페이스의 인스턴스를 사용하여 알고리즘을 실행하는 데 사용됩니다. 이 새 인수는 quantum_instance 인수를 대체하며, 따라서 quantum_instance 인수는 사용 중단 대기 중이며 향후 릴리스에서 사용 중단 및 제거될 예정입니다.

    예:

    from qiskit import QuantumCircuit
    from qiskit.primitives import Sampler
    from qiskit.algorithms import Grover, AmplificationProblem
    
    sampler = Sampler()
    oracle = QuantumCircuit(2)
    oracle.cz(0, 1)
    problem = AmplificationProblem(oracle, is_good_state=["11"])
    grover = Grover(sampler=sampler)
    result = grover.amplify(problem)
  • 새로운 옵션인 "formatter.control.fill_waveform" 이 펄스 서랍(pulse_v2.draw()Schedule.draw()) 스타일 시트에 추가되었습니다. 이 옵션을 사용하면 출력 시각화에서 펄스의 얼굴 색을 제거하여 선으로만 펄스를 그릴 수 있습니다.

    예를 들어,

    from qiskit.visualization.pulse_v2 import IQXStandard
    
    my_style = IQXStandard(
        **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2}
    )
    
    my_sched.draw(style=my_style)
  • 새로운 트랜스파일러 패스를 추가했습니다, ResetAfterMeasureSimplification라는 새로운 트랜스파일러 패스가 추가되었는데, 이 패스는 Reset 연산 뒤에 Measure 를 조건부 XGate. 이 패스는 백엔드에서 측정을 수행한 다음 조건부 X 게이트를 통해 Reset 연산을 수행한 다음 조건부 X 게이트를 수행하여 중복된 암시적 중첩을 제거할 수 있도록 Measure 연산에서 Reset 연산에서 중복을 제거합니다. 예를 들어,

    from qiskit import QuantumCircuit
    from qiskit.transpiler.passes import ResetAfterMeasureSimplification
    
    qc = QuantumCircuit(1)
    qc.measure_all()
    qc.reset(0)
    qc.draw('mpl')
    result = ResetAfterMeasureSimplification()(qc)
    result.draw('mpl')
  • entanglement 키워드 인수에 대해 지원되는 새로운 값 "reverse_linear" 을 회로 클래스의 생성자에 추가했습니다 NLocal 회로 클래스의 생성자에 의 경우 TwoLocal 회로( 의 서브 클래스인 NLocal)의 하위 클래스인 경우( entanglement_blocks="cx" ), entanglement="reverse_linear" 을 사용하면 entanglement="full" 과 동등한 n-큐비트 회로가 제공되지만 n1n-1 CXGaten(n1)2\frac{n(n-1)}{2} 게이트만 사용합니다.

  • ScheduleBlock 는 할당되지 않은 하위 루틴을 관리할 수 있도록, 즉 다른 프로그램의 지연 호출을 허용하도록 업데이트되었습니다. 예를 들어 다음과 같은 워크플로우를 사용할 수 있습니다:

    from qiskit import pulse
    
    with pulse.build() as prog:
      pulse.reference("x", "q0")
    
    with pulse.build() as xq0:
      pulse.play(Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
    
    prog.assign_references({("x", "q0"): xq0})

    이제 사용자는 참조 ("x", "q0") 의 실제 구현을 알지 못해도 prog 을 생성하고 나중에 실행을 위해 할당할 수 있습니다. 이렇게 하면 펄스 프로그램의 모듈성이 향상되므로 다른 캘리브레이션에 의존하는 템플릿 펄스 프로그램을 쉽게 작성할 수 있습니다.

    이 기능을 구현하기 위해 새로운 펄스 명령어(컴파일러 지시어) Reference 가 추가되었습니다. 이 명령은 현재 빌더 스코프에 주입됩니다 reference() 명령이 사용될 때 주입됩니다. 현재 펄스 프로그램에 정의된 모든 참조는 references 속성을 사용하여 나열할 수 있습니다.

    또한 모든 참조는 스코프를 통해 관리되므로 매개변수를 쉽게 관리할 수 있습니다. scoped_parameters()search_parameters() 에 추가되었습니다 ScheduleBlock. 자세한 내용은 API 설명서를 참조하세요.

  • 새로운 메서드 SparsePauliOp.argsort()메서드를 추가하여 계수를 기준으로 정렬하고 폴리를 기준으로 정렬하는 순서로 순열의 구성을 반환합니다. 메서드에 weight 키워드 인수를 사용하면 폴리에 있는 비동일성 용어의 수에 따라 출력을 추가로 정렬할 수 있으며, 여기서 주어진 가중치의 모든 폴리 집합은 여전히 사전순으로 정렬됩니다.

  • 새로운 메서드 SparsePauliOp.sort()를 사용하여 계수를 정렬하는 메서드가 추가되었는데, 이 메서드는 먼저 numpy의 argsort() 를 사용하여 계수를 정렬한 다음 폴리를 기준으로 정렬하며, 폴리 정렬이 우선합니다. 폴리 정렬이 동일하면 계수별로 정렬됩니다. weight 키워드 인수를 사용하면 폴리에 있는 비동일성 용어의 수에 따라 출력을 추가로 정렬할 수 있으며, 여기서 주어진 가중치의 모든 폴리 집합은 여전히 사전순으로 정렬됩니다.

  • 함수에 새로운 키워드 인수 wire_order 를 추가했습니다 circuit_drawer() 함수와 QuantumCircuit.draw() 메서드에 새로운 키워드 인수를 추가하여 출력 시각화에서 양자 비트와 기존 비트의 순서를 임의로 변경할 수 있습니다. 예를 들어,

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qr = QuantumRegister(4, "q")
    cr = ClassicalRegister(4, "c")
    cr2 = ClassicalRegister(2, "ca")
    circuit = QuantumCircuit(qr, cr, cr2)
    circuit.h(0)
    circuit.h(3)
    circuit.x(1)
    circuit.x(3).c_if(cr, 10)
    circuit.draw('mpl', cregbundle=False, wire_order=[2, 1, 3, 0, 6, 8, 9, 5, 4, 7])
  • 에 대한 지원이 추가되었습니다 CSGate, CSdgGateCCZGate 클래스에 대한 지원을 연산자 클래스의 생성자 CNOTDihedral. 연산자를 생성할 때 입력 회로는 CNOTDihedral 연산자는 이제 이러한 게이트를 사용하는 회로를 지원합니다. 예를 들어,

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import CNOTDihedral
    
    qc = QuantumCircuit(2)
    qc.t(0)
    qc.cs(0, 1)
    qc.tdg(0)
    operator = CNOTDihedral(qc)
  • 진폭 추정 알고리즘 클래스입니다:

    이제 생성자에 새로운 키워드 인자 sampler 가 추가되어 객체의 인스턴스인 BaseSampler 인터페이스 또는 BackendSampler, Sampler, 또는 qiskit-ibm-runtime 및 qiskit-aer에 있는 것과 같은 모든 공급자 구현을 포함한다. 이는 quantum_instance 인수를 사용하여 대상을 설정하는 대신 Backend 또는 QuantumInstance 를 사용하여 알고리즘을 실행할 수 있습니다. 사용 QuantumInstance 는 사용 중단 대기 중이며 향후 릴리스에서 사용 중단될 예정입니다.

  • 새 클래스를 추가했습니다, BackendV2Converter인스턴스를 래핑하는 데 사용되는 BackendV1 인스턴스를 BackendV2 인터페이스에 인스턴스를 감싸는 데 사용되는 클래스를 추가했습니다. 이를 통해 어느 곳에서나 BackendV2 인스턴스를 BackendV1. 이를 통해 최신 인터페이스에서 액세스 패턴을 표준화할 수 있습니다 BackendV2 인터페이스를 지원하더라도 BackendV1.

  • 새로운 기능 추가 convert_to_target() 를 가져오는 데 사용되는 BackendConfiguration및 선택적으로 BackendPropertiesPulseDefaults 를 가져와서 해당 객체의 내용에 해당하는 Target 객체를 생성하는 함수를 추가했습니다.

  • qiskit.quantum_info.BaseOperator 서브클래스( ScalarOp, SparsePauliOpPauliList)는 이제 내장된 Python sum() 함수와 함께 사용할 수 있습니다.

  • 새로운 트랜스파일러 패스가 추가되었습니다, ConvertConditionsToIfOps 가 추가되어 구식 조건부 명령어를 Instruction.c_if()-조건부 명령어를 IfElseOp 객체로 변환하는 데 사용할 수 있습니다. 이는 백엔드에서 이전 유형에서 새 유형으로 쉽게 전환할 수 있도록 돕기 위한 것입니다. 대부분의 사용자에게는 패스 매니저에 추가할 필요가 없으며, 사전 설정된 패스 매니저에도 포함되어 있지 않습니다.

  • 게이트 정류성 분석을 클래스로 리팩터링했습니다 CommutationChecker. 이 클래스를 사용하면 두 게이트의 통근 여부를 (행렬 곱셈을 기반으로) 확인하고 결과를 캐시할 수 있습니다(나중에 유사한 검사를 할 때 더 이상 행렬 곱셈이 필요하지 않도록).

    예를 들어 이제 할 수 있습니다:

    from qiskit.circuit import QuantumRegister, CommutationChecker
    
    comm_checker = CommutationChecker()
    qr = QuantumRegister(4)
    
    res = comm_checker.commute(CXGate(), [qr[1], qr[0]], [], CXGate(), [qr[1], qr[2]], [])

    두 개의 CX 게이트가 오가면서(첫 번째 CX 게이트는 qr[1]qr[0], 두 번째 CX 게이트는 qr[1]qr[2]), resTrue 이 됩니다.

    이 정류성 검사는 조건부 및 매개변수화된 게이트의 경우 지나치게 보수적이며, 이러한 게이트가 정류하는 경우에도 False 을 반환할 수 있습니다.

  • 새로운 트랜스파일러 패스를 추가했습니다 CommutativeInverseCancellation 를 추가하여 게이트 간 정류 관계를 이용하는 역게이트 쌍을 취소합니다. 이 패스는 트랜스파일러 패스의 일반화입니다 InverseCancellation 를 일반화한 것으로, 더 큰 역 게이트 집합을 감지하고 정류성을 고려하기 때문입니다. 이 패스는 또한 트랜스파일러 패스와 관련된 몇 가지 문제를 방지합니다 CommutativeCancellation.

    예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import CommutativeInverseCancellation
    
    circuit = QuantumCircuit(2)
    circuit.z(0)
    circuit.x(1)
    circuit.cx(0, 1)
    circuit.z(0)
    circuit.x(1)
    
    passmanager = PassManager(CommutativeInverseCancellation())
    new_circuit = passmanager.run(circuit)

    는 한 쌍의 자기 역 Z 게이트와 한 쌍의 자기 역 X 게이트(해당 게이트가 CX 게이트와 통근하므로)를 취소하여 단일 CX 게이트로 구성된 회로를 생성합니다.

    역검사는 조건부 및 매개변수화된 게이트에 대해 지나치게 보수적이며, 이러한 게이트 중 일부는 취소되지 않을 수 있습니다.

  • QuantumCircuit.compose() 는 이제 기본 회로 자체에 비트가 없는 경우 클래식 비트가 있는 피연산자를 허용합니다. 이제 양자 전용 회로에 측정값으로 회로를 구성하는 패턴이 유효합니다. 예를 들어,

    from qiskit import QuantumCircuit
    
    base = QuantumCircuit(3)
    terminus = QuantumCircuit(3, 3)
    terminus.measure_all()
    
    # This will now succeed, though it was previously a CircuitError.
    base.compose(terminus)
  • 메서드의 DAGCircuit 메서드 depth()size() 에는 제어 흐름 연산을 포함하는 회로에 사용할 수 있는 새로운 recurse 키워드 인수가 있습니다( IfElseOp, WhileLoopOpForLoopOp). 기본값은 False 이며, 제어 흐름 연산이 있는 경우 잘못 정의된 결과를 방지하기 위해 오류를 발생시킵니다. True 로 설정하면 일반적으로 구체적인 실행의 깊이나 크기를 알 수 없더라도 각 제어 흐름 블록의 상태를 기준으로 공정하게 가중치를 부여하는 프록시 값이 반환됩니다. 각 제어 흐름 연산이 출력에 미치는 영향은 각 메서드의 설명서를 참조하세요.

  • DAGCircuit.count_ops() 는 제어 흐름 블록으로 리커싱하기 위한 recurse 키워드 인수를 얻었습니다. 기본값은 True 이며, 모든 블록의 모든 연산과 제어 흐름 연산 자체가 반환됩니다.

  • 함수에 create_preds_and_succs 인수를 추가했습니다 circuit_to_dagdependency()dag_to_dagdependency() 에서 변환하는 QuantumCircuitDAGCircuit에서 각각 DAGDependency. create_preds_and_succs 값이 False인 경우, 다음의 노드에 대한 전이 전임자와 후속 노드인 DAGDependency 의 노드에 대한 전이 전임자와 후임자가 구성되지 않으므로 변환 속도가 빨라지고 메모리 사용량이 훨씬 줄어듭니다. 의 노드에 대한 직접 전임자와 후임자는 기존과 같이 DAGDependency 의 노드의 직접 전임자와 후임자는 평소와 같이 구성됩니다.

    예를 들어,

    from qiskit.converters import circuit_to_dagdependency
    from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
    
    circuit_in = QuantumCircuit(2)
    circuit_in.h(qr[0])
    circuit_in.h(qr[1])
    
    dag_dependency = circuit_to_dagdependency(circuit_in, create_preds_and_succs=False)
  • 새로운 속성 추가 Clifford.symplectic_matrix, Clifford.tableau, Clifford.z, Clifford.x, Clifford.phase, Clifford.stab, Clifford.stab_z, Clifford.stab_x, Clifford.stab_phase, Clifford.destab, Clifford.destab_z, Clifford.destab_x, Clifford.destab_phase 클래스에 Clifford 클래스에 추가합니다. 향후 더 이상 사용되지 않는 Clifford.table 대신 사용할 수 있습니다. StabilizerTablePauliTable 은 사용 중단 대기 중이며 향후 릴리스에서 사용 중단되고 그 이후에는 제거될 예정입니다.

  • 이제 Commuting2qGateRouter 생성자에는 이제 새로운 키워드 인자 edge_coloring 가 추가되었습니다. 이 인수는 커플링 맵의 가장자리 색상을 제공하여 커뮤팅 게이트가 적용되는 순서를 결정하는 데 사용됩니다.

  • 프리미티브를 사용하여 시간 진화 알고리즘을 생성하기 위한 새로운 알고리즘 인터페이스가 추가되었습니다 BaseSamplerBaseEstimator. 이 새로운 인터페이스는 다음과 같이 구성됩니다:

    이 새로운 인터페이스는 기존의 시간 진화 알고리즘 인터페이스를 대체하여 EvolutionProblem, EvolutionResult, RealEvolverImaginaryEvolver 와 함께 작동했던 QuantumInstance 객체로 작동했습니다. 이 새로운 인터페이스는 향후 릴리스에서 더 이상 사용되지 않고 제거될 이전 인터페이스를 대체합니다.

  • 에 새로운 백엔드 클래스를 추가했습니다 qiskit.providers.fake_provider:

    이 새로운 클래스는 BackendV2 인터페이스를 구현하며 각각 IBM Quantum 시스템 ibm_auckland, ibm_oslo, ibm_geneva, ibm_perth 시스템에서 백엔드 정보의 저장된 스냅샷을 사용하여 만들어집니다.

  • 클래스의 Z2Symmetries 클래스에는 두 가지 새로운 메서드가 있습니다, convert_clifford()taper_clifford(). 이 두 가지 메서드는 객체의 Z2 대칭을 기반으로 연산자를 테이퍼링하는 데 필요한 두 가지 연산이며, 이전에는 내부적으로 taper() 메서드를 통해 내부적으로 수행되었습니다. 그러나 이러한 메서드는 이제 클래스의 공용 메서드로서 필요한 경우 개별적으로 호출할 수 있습니다.

  • 긴 객체의 활용에 대한 런타임 성능 PauliList 객체를 Clifford 를 사용하여 PauliList.evolve() 의 런타임 성능이 크게 향상되었습니다. 이제 이전보다 훨씬 빠르게 실행됩니다.

  • 모듈에 새로운 추상 클래스 ClassicalIOChannel 를 추가했습니다 qiskit.pulse.channels 모듈에 추가했습니다. 이 클래스는 고전적인 I/O 채널을 나타내고 이러한 채널을 다른 Channel. 이 새로운 클래스는 MemorySlot, RegisterSlotSnapshotChannel 클래스의 베이스 클래스입니다. 따라서 pad() 의 표준화 펄스 변환 qiskit.pulse.transforms 의 표준화 펄스 변환은 다음과 같은 인스턴스에 지연을 일으키지 않습니다 ClassicalIOChannel

  • 트랜스파일러 패스의 SabreSwap 트랜스파일러 패스의 생성자에는 새로운 키워드 인수가 있습니다( trials). trials 인수는 시도할 무작위 시드 시도 횟수를 지정하는 데 사용됩니다. 난수에 사용된 시드에 따라 SABRE 알고리즘의 출력은 크게 달라질 수 있습니다. SabreSwap 는 이제 trials 수의 무작위 시드를 사용하여 알고리즘을 실행하고 가장 적합한(가장 적은 수의 스왑이 삽입된) 시드를 선택합니다. trials 을 지정하지 않으면 기본적으로 로컬 시스템의 물리적 CPU 수를 사용하도록 패스가 설정됩니다.

  • 트랜스파일러 패스의 SabreLayout 트랜스파일러 패스의 생성자에는 새로운 키워드 인수가 있습니다( swap_trials). swap_trials 인수는 내부적으로 패스에서 실행할 무작위 시드 시도 횟수를 지정하는 데 사용됩니다 SabreSwap 패스를 내부적으로 전달합니다. 패스의 trials 아루그먼트에 해당합니다 SabreSwap 패스. 설정하면, 각 반복은 SabreSwap 의 각 반복이 내부적으로 swap_trials 번 실행됩니다. swap_trials 을 지정하지 않으면 기본적으로 로컬 시스템의 물리적 CPU 수를 사용합니다.

  • 새로운 함수가 추가되었습니다, estimate_observables() 의 구현을 사용하는 BaseEstimator 인터페이스 구현(예 Estimator, BackendEstimator또는 qiskit-ibm-runtimeqiskit-aer)에 있는 것과 같은 공급자 구현을 사용하여 관측값 목록 또는 사전에서 기대값, 평균 및 표준 편차를 계산합니다. 이는 기존 함수와 유사한 목적을 가지고 있습니다 eval_observables() 객체를 사용하여 계산을 수행했던 기존 함수 QuantumInstance 객체를 사용하여 계산을 수행했던 기존 함수와 유사한 용도로 사용되며, 이 새로운 함수로 대체되었습니다(향후 릴리스에서 더 이상 사용되지 않고 제거될 예정입니다).

  • 새로운 Operation 베이스 클래스를 추가하여 객체에 대한 경량 추상 인터페이스를 제공합니다 QuantumCircuit. 이를 통해 "상위 수준" 객체를 회로에 직접 저장하고(예를 들어 Clifford 객체), 그러한 객체를 직접 결합하고(예를 들어, 동일한 큐비트 위에 여러 개의 연속된 Clifford 객체), 런타임에 이러한 객체를 합성(예를 들어, 깊이 최적화 및/또는 장치 연결을 활용하는 방식으로 Clifford 깊이를 최적화하거나 디바이스 연결을 활용하는 방식으로). 이전에는 qiskit.circuit.Instruction 의 서브클래스만 QuantumCircuit의 서브클래스만 사용할 수 있었지만, 이 인터페이스는 다루기 어렵고 범용 객체를 위한 메서드와 속성이 너무 많이 포함되어 있습니다.

    새로운 Operation 인터페이스에는 name, num_qubitsnum_clbits (향후 약간 조정될 수 있음)이 포함되지만, 중요한 것은 definition (따라서 합성을 객체에 연결하지 않음), condition (별도의 클래식 제어 흐름의 일부여야 함), durationunit (트랜스파일러 출력의 속성이므로)이 포함되지 않는다는 점입니다.

    현재 기준입니다, Operation 포함 Gate, Reset, Barrier, Measure와 같은 "상위 수준" 객체와 Clifford. 이 '상위 수준' 객체 목록은 앞으로 더 늘어날 예정입니다.

  • A Clifford 는 이제 이 클리포드를 구현하는 하위 회로를 합성하지 않고도 양자 회로에 Operation로 추가할 수 있으며, 이 클리포드를 구현하는 서브 회로를 먼저 합성하지 않아도 됩니다. 실제 합성은 나중으로 연기됩니다 HighLevelSynthesis 트랜스필레이션 패스로 연기됩니다.

    예를 들어 다음 코드가 있습니다:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_clifford
    
    qc = QuantumCircuit(3)
    cliff = random_clifford(2)
    qc.append(cliff, [0, 1])

    는 더 이상 cliffqiskit.circuit.Instruction에 추가될 때 클리포드를 회로로 합성하는 것을 포함하여 qc 으로 변환합니다.

  • 새로운 트랜스파일러 패스 추가 OptimizeCliffords 를 추가하여 회로에서 연속된 오브젝트 블록을 Clifford 오브젝트 블록을 수집하고 각 블록을 하나의 Clifford.

    예를 들어 다음 코드가 있습니다:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_clifford
    from qiskit.transpiler.passes import OptimizeCliffords
    from qiskit.transpiler import PassManager
    
    qc = QuantumCircuit(3)
    cliff1 = random_clifford(2)
    cliff2 = random_clifford(2)
    qc.append(cliff1, [2, 1])
    qc.append(cliff2, [2, 1])
    qc_optimized = PassManager(OptimizeCliffords()).run(qc)

    는 먼저 qccliff1cliff2 두 개의 클리포드를 "상위 수준" 객체로 저장한 다음, 트랜스파일러 패스 OptimizeCliffords 는 이 두 클리포드를 하나의 클리포드로 구성하여 회로를 최적화합니다. 결과물인 클리포드는 여전히 qc 에 상위 레벨 객체로 저장됩니다. 이 패스는 아직 사전 설정 패스 매니저에 포함되어 있지 않습니다.

  • 새로운 트랜스파일러 패스가 추가되었습니다 HighLevelSynthesis 를 추가하여 상위 레벨 객체(예를 들어, Clifford 오브젝트).

    예를 들어 다음 코드가 있습니다:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_clifford
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import HighLevelSynthesis
    
    qc = QuantumCircuit(3)
    qc.h(0)
    cliff = random_clifford(2)
    qc.append(cliff, [0, 1])
    
    qc_synthesized = PassManager(HighLevelSynthesis()).run(qc)

    는 기본 decompose_clifford() 함수를 사용하여 qc 에 저장된 상위 수준의 클리포드를 합성합니다.

    이 새로운 트랜스파일러 패스 HighLevelSynthesis 는 프리셋 패스 관리자에 통합되어 바로 뒤에 실행되며 UnitarySynthesis 패스. 따라서 transpile() 는 회로에 존재하는 모든 상위 클리포드를 합성합니다.

    객체를 "상위 수준" 객체로 저장하는 작업은 Clifford 객체를 "상위 수준" 객체로 저장하고 이러한 객체를 트랜스파일하기 위해 HighLevelSynthesis 패스를 사용하여 이러한 객체를 투명하게 만드는 작업은 완전히 투명해야 하며 코드를 변경할 필요가 없습니다.

  • SparsePauliOp는 이제 일반적인 Python 객체인 계수 배열로 구성할 수 있습니다. 이것은 다음과 함께 사용하기 위한 것입니다 ParameterExpression 객체와 함께 사용하기 위한 것입니다. 다른 객체는 작동할 수 있지만 일급 지원은 제공되지 않습니다. 일부 SparsePauliOp 메서드(다른 클래스 표현으로의 변환 등)는 object 배열을 사용할 때 원하는 대상이 이러한 일반 배열을 나타낼 수 없는 경우 작동하지 않을 수 있습니다.

    예를 들어 ParameterExpression SparsePauliOp 로 구성할 수 있습니다:

    import numpy as np
    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    print(SparsePauliOp(["II", "XZ"], np.array([Parameter("a"), Parameter("b")])))

    SparsePauliOp(['II', 'XZ'],
          coeffs=[ParameterExpression(1.0*a), ParameterExpression(1.0*b)])
  • 새로운 함수 추가 plot_distribution() 함수를 추가했습니다. Counts, QuasiDistribution , ProbDistribution 에 적합합니다. 원시 딕셔너리도 전달할 수 있습니다. 예를 들어,

    from qiskit.visualization import plot_distribution
    
    quasi_dist = {'0': .98, '1': -.01}
    plot_distribution(quasi_dist)
  • 새로운 하이 레벨 합성 플러그인 인터페이스를 도입하여 외부 패키지에 포함된 대체 합성 기법을 트랜스파일러 패스와 함께 원활하게 사용할 수 있습니다 HighLevelSynthesis 트랜스파일러 패스. 이러한 대체 합성 기법은 "상위 수준" 객체 유형에 대해 지정할 수 있습니다 Operation의 "상위 수준" 객체에 대해 지정할 수 있습니다(예 CliffordLinearFunction 객체에 대해 지정할 수 있습니다. 이 플러그인 인터페이스는 단일 합성을 위한 인터페이스와 유사합니다. 후자의 경우 새 플러그인 작성에 대한 자세한 내용은 qiskit.transpiler.passes.synthesis.plugin 모듈 문서를 참고하세요.

  • 유형의 "상위 수준" 객체에 대한 대체 합성 알고리즘을 지정하는 데 사용할 수 있는 새로운 클래스 HLSConfig 를 도입했습니다 Operation. 관심 있는 각 상위 수준 객체에 대해 HLSConfig 객체는 합성 메서드 목록과 해당 인수를 지정합니다. 이 객체는 HighLevelSynthesis 트랜스파일러 패스로 전달하거나 hls_config 에서 파라미터로 지정할 수 있습니다 transpile().

    예를 들어 op_aop_b 이 두 개의 상위 레벨 객체의 이름이고, op_a-객체에는 추가 파라미터가 필요한 두 개의 합성 메서드 default 와 선택적 정수 파라미터 option_1option_2 가 있는 other , op_b-객체에는 단일 합성 메서드 default 가 있으며, qcop_aop_b 객체를 포함하는 양자 회로라고 가정해 봅시다. 다음 코드 스니펫입니다:

    hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})])
    pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
    transpiled_qc = pm.run(qc)

    op_b-객체에 대해 대체 합성 방법 other 을 실행하고, op_a-객체를 포함한 다른 모든 상위 수준 객체에 대해 default 방법을 사용하는 방법을 보여 줍니다.

  • 프리미티브 실행을 위한 새로운 메서드가 추가되었습니다: BaseSampler.run()BaseEstimator.run(). 이러한 메서드는 비동기적으로 실행되며 예외에 대한 핸들을 제공하는 JobV1 객체를 반환합니다. 이러한 새로운 실행 메서드는 QuantumCircuit 객체(및 BaseEstimator)를 전달할 수 있습니다. 예를 들어,

    estimator = Estimator()
    result = estimator.run(circuits, observables, parameter_values).result()

    이것은 이전 실행 모델(현재는 더 이상 사용되지 않음)에 대한 대안을 제공합니다 BaseSamplerBaseEstimator 프리미티브가 생성자를 통해 모든 입력을 받고 해당 입력 매개변수의 조합으로 프리미티브 객체를 호출하여 실행에 사용할 수 있습니다.

  • 프리미티브의 참조 구현을 위한 shots 옵션이 추가되었습니다. 난수는 seed_primitive 을 제공하여 수정할 수 있습니다. 예를 들어,

    from qiskit.primitives import Sampler
    from qiskit import QuantumCircuit
    
    bell = QuantumCircuit(2)
    bell.h(0)
    bell.cx(0, 1)
    bell.measure_all()
    
    with Sampler(circuits=[bell]) as sampler:
        result = sampler(circuits=[0], shots=1024, seed_primitive=15)
        print([q.binary_probabilities() for q in result.quasi_dists])
  • 의 생성자와 BaseSamplerBaseEstimator 프리미티브 클래스의 생성자에는 새로운 옵션 키워드 인수가 있는데, options 이 인수는 노출된 옵션의 기본값을 설정하는 데 사용됩니다 options 어트리뷰트를 통해 노출되는 옵션의 기본값을 설정하는 데 사용됩니다.

  • 시간 진화 프레임워크에 PVQD 클래스를 시간 진화 프레임워크에 추가했습니다 qiskit.algorithms. 이 클래스는 예상 변동 양자 역학(p-VQD) 알고리즘인 Barison et al...

    각 타임스텝에서 이 알고리즘은 트로터 공식을 사용하여 다음 상태를 계산하고 이를 변형 양식에 투영합니다. 투영은 고전적인 최적화 루틴을 사용하여 트로터 진화 상태와 안사츠의 충실도를 최대화하여 결정됩니다.

    import numpy as np
    
    from qiskit.algorithms.state_fidelities import ComputeUncompute
    from qiskit.algorithms.evolvers import EvolutionProblem
    from qiskit.algorithms.time_evolvers.pvqd import PVQD
    from qiskit.primitives import Estimator, Sampler
    from qiskit import BasicAer
    from qiskit.circuit.library import EfficientSU2
    from qiskit.quantum_info import Pauli, SparsePauliOp
    from qiskit.algorithms.optimizers import L_BFGS_B
    
    sampler = Sampler()
    fidelity = ComputeUncompute(sampler)
    estimator = Estimator()
    hamiltonian = 0.1 * SparsePauliOp([Pauli("ZZ"), Pauli("IX"), Pauli("XI")])
    observable = Pauli("ZZ")
    ansatz = EfficientSU2(2, reps=1)
    initial_parameters = np.zeros(ansatz.num_parameters)
    
    time = 1
    optimizer = L_BFGS_B()
    
    # setup the algorithm
    pvqd = PVQD(
        fidelity,
        ansatz,
        initial_parameters,
        estimator,
        num_timesteps=100,
        optimizer=optimizer,
    )
    
    # specify the evolution problem
    problem = EvolutionProblem(
        hamiltonian, time, aux_operators=[hamiltonian, observable]
    )
    
    # and evolve!
    result = pvqd.evolve(problem)
  • 이제 QNSPSA.get_fidelity() 정적 메서드는 이제 선택적 sampler 인수를 지원합니다 BaseSampler 인터페이스(예 Sampler, BackendSampler또는 qiskit-ibm-runtimeqiskit-aer 에 있는 것과 같은 공급자 구현)의 충실도를 계산하기 위해 QuantumCircuit. 예를 들어,

    from qiskit.primitives import Sampler
    from qiskit.algorithms.optimizers import QNSPSA
    
    fidelity = QNSPSA.get_fidelity(my_circuit, Sampler())
  • 위상 추정 클래스의 생성자에 새로운 키워드 인수 sampler 를 추가했습니다:

    이 인수는 다음과 같은 인터페이스의 구현을 제공하는 데 사용됩니다 BaseSampler 인터페이스의 구현을 제공하는 데 사용됩니다 Sampler, BackendSampler와 같은 인터페이스 구현 또는 qiskit-ibm-runtimeqiskit-aer 과 같은 공급자 구현을 제공하는 데 사용됩니다.

    예를 들어,

    from qiskit.primitives import Sampler
    from qiskit.algorithms.phase_estimators import HamiltonianPhaseEstimation
    from qiskit.synthesis import MatrixExponential
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.opflow import PauliSumOp
    
    
    sampler = Sampler()
    num_evaluation_qubits = 6
    phase_est = HamiltonianPhaseEstimation(
        num_evaluation_qubits=num_evaluation_qubits, sampler=sampler
    )
    
    hamiltonian = PauliSumOp(SparsePauliOp.from_list([("X", 0.5), ("Y", 0.6), ("I", 0.7)]))
    result = phase_est.estimate(
        hamiltonian=hamiltonian,
        state_preparation=None,
        evolution=MatrixExponential(),
        bound=1.05,
    )
  • 트랜스파일러 패스의 SabreSwap 트랜스파일러 패스는 Rust에서 알고리즘을 재작성하여 런타임 성능이 크게 향상되었습니다.

  • 기호 펄스 서브클래스 Gaussian, GaussianSquare, DragConstant 는 서브클래스 자체가 아닌 SymbolicPulse 를 인스턴스화하도록 업그레이드되었습니다. 서브클래싱이 더 이상 필요하지 않으므로 펄스 프로그램의 모든 파라메트릭 펄스 객체는 심볼릭 펄스 인스턴스여야 합니다. SymbolicPulseSymbolicPulse.envelope 에 정의된 기호 표현식 객체로 특정 봉투를 고유하게 식별할 수 있습니다.

  • 새로운 함수가 추가되었습니다, sampled_expectation_value()를 추가하여 다음과 같은 분포에서 대각선 연산자의 기대값을 계산할 수 있습니다 CountsQuasiDistribution. 이 함수에 사용할 수 있는 유효한 연산자는 다음과 같습니다: str, Pauli, PauliOp, PauliSumOpSparsePauliOp.

  • A SamplingVQE 클래스가 도입되어 대각선 해밀턴에 최적화되고 sampler 프리미티브를 활용합니다. A QAOA 클래스도 추가되어 하위 클래스 SamplingVQE.

    예를 들어 참조 프리미티브와 함께 새로운 SamplingVQE 을 사용하려면 다음과 같이 할 수 있습니다:

    from qiskit.algorithms.minimum_eigensolvers import SamplingVQE
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.circuit.library import TwoLocal
    from qiskit.primitives import Sampler
    from qiskit.opflow import PauliSumOp
    from qiskit.quantum_info import SparsePauliOp
    
    operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12]))
    
    sampler = Sampler()
    ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    optimizer = SLSQP()
    
    sampling_vqe = SamplingVQE(sampler, ansatz, optimizer)
    result = sampling_vqe.compute_minimum_eigenvalue(operator)
    eigenvalue = result.eigenvalue

    평가된 보조 연산자는 이제 결과의 aux_operators_evaluated 필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다. aux_operator_eigenvalues 는 더 이상 유효한 필드가 아닙니다.

  • 메서드에 새로운 atol 키워드 인수를 추가했습니다 SparsePauliOp.equiv() 메서드에 동등성 검사의 허용 오차를 조정하는 키워드 인수를 추가했습니다,

  • 트랜스파일러 스테이지를 위한 새로운 플러그인 인터페이스를 도입하여 특정 스테이지의 일부로 외부 패키지에서 대체 가능한 PassManager 외부 패키지의 오브젝트를 특정 스테이지의 일부로 사용하거나 transpile() 또는 StagedPassManager 에서 출력 generate_preset_pass_manager(), level_0_pass_manager(), level_1_pass_manager(), level_2_pass_manager()level_3_pass_manager(). 사용자는 init_method, layout_method, routing_method, translation_method, optimization_method, scheduling_method 키워드 인수를 사용하여 트랜스파일러 스테이지에 사용할 플러그인을 선택할 수 있습니다 transpile()generate_preset_pass_manager(). 현재 설치된 플러그인 이름의 전체 목록은 list_stage_plugins() 함수를 통해 확인할 수 있습니다. 플러그인을 만들려면 스테이지 플러그인 작성 가이드가 포함된 qiskit.transpiler.preset_passmanagers.plugin 모듈 문서에 스테이지 플러그인 작성 가이드가 포함되어 있습니다.

  • 에는 transpile() 에는 각각 init 단계와 optimization 단계에 사용할 대체 플러그인을 지정하는 데 사용되는 init_methodoptimization_method 이라는 두 개의 새로운 키워드 인수가 있습니다.

  • 클래스에는 PassManagerConfig 클래스에는 생성자 메서드에 일치하는 키워드 인자와 함께 init_methodoptimization_method 이라는 두 가지 새로운 어트리뷰트가 있습니다. 이는 사용자가 컴파일에 사용할 initoptimization 플러그인을 지정한 것을 나타냅니다.

  • 클래스가 SteppableOptimizer 클래스가 추가됩니다. 메서드를 사용하여 기존 최적화를 단계별로 수행할 수 있습니다 step() 메서드를 사용합니다. 이러한 옵티마이저는 필요한 함수 또는 그라데이션 평가를 수동으로 계산하여 옵티마이저에 다시 연결할 수 있는 '묻고 답하기' 인터페이스를 구현합니다(선택 사항). 이 인터페이스에 대한 자세한 내용은 묻고 답하기 인터페이스를 참조하세요. 사용자가 단계별로 최적화를 수행하고자 하는 매우 간단한 사용 사례는 판독을 위한 것입니다:

    import random
    import numpy as np
    from qiskit.algorithms.optimizers import GradientDescent
    
    def objective(x):
          return (np.linalg.norm(x) - 1) ** 2
    
    def grad(x):
          return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x)
    
    
    initial_point = np.random.normal(0, 1, size=(100,))
    
    optimizer = GradientDescent(maxiter=20)
    optimizer.start(x0=initial_point, fun=objective, jac=grad)
    
    for _ in range(maxiter):
        state = optimizer.state
        # Here you can manually read out anything from the optimizer state.
        optimizer.step()
    
    result = optimizer.create_result()

    더 복잡한 경우는 오류 처리입니다. 평가 중인 함수가 무작위로 실패할 확률이 있다고 상상해 보세요. 이 경우 오류를 포착하고 원하는 결과가 나올 때까지 함수를 다시 실행한 후 최적화 프로세스를 계속할 수 있습니다. 이 경우 묻고 답하기 인터페이스를 사용합니다.

    import random
    import numpy as np
    from qiskit.algorithms.optimizers import GradientDescent
    
    def objective(x):
        if random.choice([True, False]):
            return None
        else:
            return (np.linalg.norm(x) - 1) ** 2
    
    def grad(x):
        if random.choice([True, False]):
            return None
        else:
            return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x)
    
    
    initial_point = np.random.normal(0, 1, size=(100,))
    
    optimizer = GradientDescent(maxiter=20)
    optimizer.start(x0=initial_point, fun=objective, jac=grad)
    
    while optimizer.continue_condition():
        ask_data = optimizer.ask()
        evaluated_gradient = None
    
        while evaluated_gradient is None:
            evaluated_gradient = grad(ask_data.x_center)
            optimizer.state.njev += 1
    
        optmizer.state.nit += 1
    
        cf  = TellData(eval_jac=evaluated_gradient)
        optimizer.tell(ask_data=ask_data, tell_data=tell_data)
    
    result = optimizer.create_result()

    GradientDescent 의 서브 클래스로 전환했습니다 SteppableOptimizer.

  • subset_fitter 메서드가 TensoredMeasFitter 클래스에 추가됩니다. 구현은 각 큐비트가 개별적으로 완화되는 완화 패턴으로 제한됩니다(예: [[0], [1], [2]]). 그러나 이것이 가장 널리 사용되는 경우입니다. 이는 TensoredMeasFitter 를 물리적 큐비트의 숫자 순서가 기존 비트의 인덱스와 일치하지 않는 경우에 사용할 수 있습니다.

  • 이제 트랜스파일러를 통해 최적화 레벨 0과 1에서 제어 흐름 연산이 지원됩니다(예 transpile() 또는 generate_preset_pass_manager() 키워드 인자로 optimization_level=1). 이제 다음과 같은 회로를 구성할 수 있습니다

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(2, 1)
    qc.h(0)
    qc.measure(0, 0)
    with qc.if_test((0, True)) as else_:
      qc.x(1)
    with else_:
      qc.y(1)

    등을 통해 성공적으로 트랜스파일할 수 있습니다:

    from qiskit import transpile
    from qiskit_aer import AerSimulator
    
    backend = AerSimulator(method="statevector")
    transpiled = transpile(qc, backend)

    키워드 인수 layout_method 에 사용할 수 있는 값은 "trivial" 및 "dense"입니다. routing_method 의 경우 "확률적" 및 "없음"을 사용할 수 있습니다. 번역(translation_method)은 '번역기' 또는 '언롤러'를 사용하여 수행할 수 있습니다. 최적화 레벨 2와 3은 아직 제어 흐름과 회로 스케줄링( scheduling_method)에 값을 제공하는 것과 같이 지원되지 않지만, 키스킷 테라의 후속 릴리스에서 이들과 다른 레이아웃, 라우팅 및 변환 방법에 대한 지원을 확대할 계획입니다.

    백엔드에서 제어 흐름 연산을 사용한 번역이 성공하려면 백엔드에 명시된 기반에 필요한 제어 흐름 연산이 있어야 합니다. 예를 들어, 키스킷 에어가 이를 수행합니다. 단순히 이러한 번역을 시도해보고 싶다면 basis_gates 인수를 재정의하여 transpile().

  • 다음 트랜스파일러 패스는 모두 다음과 같은 형태로 제어 흐름 구조를 이해하도록 학습되었습니다 ControlFlowOp 명령어의 형태로 제어 흐름 구조를 이해하도록 학습되었습니다:


    레이아웃 관련


    라우팅 관련


    번역 관련


    최적화와 관련된

    이러한 패스는 가장 일반적으로 사전 설정된 패스 관리자( transpile()generate_preset_pass_manager())를 통해 사용되지만 다른 용도로도 사용할 수 있습니다. 이제 이러한 패스는 적절한 경우 제어 흐름 작업으로 재귀하여 내부 블록을 업데이트하거나 분석합니다.

  • 새로운 TrotterQRTE 클래스를 구현하는 RealTimeEvolver 인터페이스를 구현하는 새로운 클래스를 추가했습니다 qiskit.primitives.BaseEstimator 를 사용하여 계산을 수행하는 인터페이스를 구현하는 새로운 클래스를 추가했습니다. 이 새로운 클래스는 이전에 사용 가능했던 qiskit.algorithms.TrotterQRTE 클래스(향후 릴리스에서 더 이상 사용되지 않고 제거될 예정)를 대체합니다 Backend 또는 QuantumInstance 을 사용하여 계산을 수행했습니다.

  • DAGCircuit.substitute_node_with_dag() 이제 propagate_condition 을 키워드 인수로 사용합니다. 기본값은 이전 동작인 True 이며, 대체할 노드의 모든 조건을 대체의 모든 작업 노드에 복사합니다. False 로 설정하면 조건이 복사되지 않으므로 조건 노드를 이미 조건을 충실히 구현하는 하위 DAG로 대체할 수 있습니다.

  • DAGCircuit.substitute_node_with_dag() 는 이제 시퀀스뿐만 아니라 wires 매개변수에 대한 매핑도 사용할 수 있습니다. 매핑은 대체 DAG의 비트를 삽입되는 DAG의 비트에 매핑해야 합니다. 이렇게 하면 입력 노드에 기존 비트와 조건이 모두 있는 경우 호출자가 더 쉬운 스타일의 구성을 할 수 있으며, 대체 DAG는 이러한 순서를 벗어난 비트를 사용할 수 있습니다.

  • 패키지를 추가하여 qiskit.algorithms.minimum_eigensolvers 패키지에 프리미티브 지원 알고리즘을 위한 인터페이스를 추가했습니다. VQE 이 구현에서는 프리미티브를 활용하기 위해 리팩터링되었습니다.

    예를 들어 참조 프리미티브와 함께 새 구현을 사용하려면 다음과 같이 할 수 있습니다:

    from qiskit.algorithms.minimum_eigensolvers import VQE
    from qiskit.algorithms.optimizers import SLSQP
    from qiskit.circuit.library import TwoLocal
    from qiskit.primitives import Estimator
    from qiskit.quantum_info import SparsePauliOp
    
    h2_op = SparsePauliOp(
        ["II", "IZ", "ZI", "ZZ", "XX"],
        coeffs=[
            -1.052373245772859,
            0.39793742484318045,
            -0.39793742484318045,
            -0.01128010425623538,
            0.18093119978423156,
        ],
    )
    
    estimator = Estimator()
    ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    optimizer = SLSQP()
    
    vqe = VQE(estimator, ansatz, optimizer)
    result = vqe.compute_minimum_eigenvalue(h2_op)
    eigenvalue = result.eigenvalue

    평가된 보조 연산자는 이제 결과의 aux_operators_evaluated 필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다. aux_operator_eigenvalues 는 더 이상 유효한 필드가 아닙니다.

업그레이드 주의사항

  • 의 경우 Target 객체의 경우 연결 제약 조건 없이 전역으로 정의된 2 큐비트 연산만 포함된 객체의 경우 Target.build_coupling_map() 메서드의 반환은 이제 None 대신 CouplingMap 객체가 아닌 num_qubits 노드를 포함하고 에지가 없는 객체로 반환됩니다. 이 변경은 실제 연결 제약 조건을 더 잘 반영하기 위해 이루어졌습니다 Target 이 경우 모델링되는 백엔드에는 연결성 제약 조건이 없으므로 Target에 의해 모델링되는 백엔드에 연결 제약이 없기 때문입니다. 어떤 이유로든 이전 동작을 원한다면 None 반환을 확인하고 수동으로 커플링 맵을 작성하여 이전 동작을 재현할 수 있습니다:

    from qiskit.transpiler import Target, CouplingMap
    from qiskit.circuit.library import CXGate
    
    target = Target(num_qubits=3)
    target.add_instruction(CXGate())
    cmap = target.build_coupling_map()
    if cmap is None:
        cmap = CouplingMap()
        for i in range(target.num_qubits):
            cmap.add_physical_qubit(i)
  • 의 생성자에서 entanglement 키워드 인수의 기본값은 RealAmplitudesEfficientSU2 클래스의 생성자 인수 기본값이 "full" 에서 "reverse_linear" 으로 변경되었습니다. 이 변경은 출력 회로는 동일하지만 n(n1)2\frac{n(n-1)}{2} 대신 n1n-1 CXGate 게이트만 사용합니다. 이전 기본값을 사용하려면 생성자를 호출할 때 entanglement="full" 을 명시적으로 설정하면 됩니다.

  • 에 유효성 검사 추가 BaseSampler.run(). 클래식 비트가 없는 경우 오류가 발생합니다.

  • 펄스 빌더 기능의 동작 call() 펄스 빌더 기능이 업그레이드되었습니다. 인스턴스가 이 메서드에 의해 호출되면 ScheduleBlock 인스턴스가 이 메서드에 의해 호출되면, 내부적으로 현재 컨텍스트에 Reference 를 생성하고 호출된 프로그램을 즉시 참조에 할당합니다. 따라서 Call 명령어가 더 이상 생성되지 않습니다. 이 변경 사항과 함께 동일한 name 인수를 사용하여 다른 블록을 호출하는 것이 금지됩니다. 이러한 작업은 오류가 발생합니다.

  • 다음 키스킷 테라 릴리스( 0.23 )부터는 대부분의 아키텍처에서 tweedledum 패키지가 필수 항목이 아닌 선택적 종속 요소가 됩니다. 현재 일부 고전적인 위상 오라클 함수에서 사용됩니다. 애플리케이션이나 라이브러리에 이 기능이 필요한 경우 패키지의 종속성에 tweedledum 을 추가하여 즉시 준비할 수 있습니다.

    tweedledum 는 키스킷 테라 0.22 에서 즉시 적용되며 macOS arm64 ( M1 )에서 더 이상 요구 사항이 아닙니다. 이 플랫폼에 제공된 바퀴가 고장 났고 대부분의 사람들이 SDIST에서 빌드하는 것은 신뢰할 수 없기 때문입니다. tweedledum 의 작동 버전을 수동으로 설치하면 모든 종속 기능이 계속 작동합니다.

  • 객체의 ._layout 속성이 QuantumCircuit 객체를 저장하는 것에서 Layoutinitial_layout 객체를 저장하는 것에서 2개의 속성을 가진 데이터 클래스를 저장하는 것으로 변경되었습니다 Layout 객체와 원래 회로의 위치 인덱스에 큐비트를 매핑하는 사전을 포함하는 input_qubit_mapping 객체의 두 가지 속성으로 저장됩니다. 이 변경은 트랜스파일 후 회로가 모든 상황에서 초기 레이아웃으로 인한 순열을 완전히 되돌릴 수 있도록 모든 정보를 제공하기 위해 필요했습니다. 이 속성은 비공개이며 외부에서 사용해서는 안 되지만, 초기 레이아웃을 추적할 수 있는 유일한 방법이기 때문에 transpile() 을 통해 초기 레이아웃을 추적할 수 있는 유일한 방법이므로 변경 사항을 문서화합니다. 키스킷 API에서 해결되지 않는 _layout 속성에 대한 사용 사례가 있는 경우, 이 기능 공백을 해결할 수 있도록 이슈를 열어주세요.

  • 의 생성자는 SetPhase, ShiftPhase, SetFrequencyShiftFrequency 클래스의 생성자는 이제 PulseError 를 발생시킵니다. channel 인수를 통해 전달된 값이 PulseChannel 의 인스턴스가 아닌 경우. 이 변경은 생성자에 대한 입력이 펄스 채널에만 유효하고 다른 유형의 채널에는 유효하지 않기 때문에 생성자에 대한 입력이 유효한지 확인하기 위해 이루어졌습니다.

  • 함수는 plot_histogram() 함수는 이산 구간차원 값의 실제 히스토그램을 반환하도록 수정되었습니다. 함수의 이전 동작은 이름과 달리 실제로는 입력 분포의 시각화를 생성하는 것이었습니다. 함수 이름과 동작 사이의 이러한 불일치로 인해 함수 동작이 변경되어 이제 실제로 적절한 불연속형 데이터 히스토그램을 생성하고 있습니다. 카운트 데이터의 확률 분포를 그리는 이전 동작을 유지하려는 경우에는 plot_distribution() 를 사용하여 동등한 그래프를 생성할 수 있습니다. 예를 들어 이전 동작( plot_histogram({'00': 512, '11': 500}) )은 다음과 같이 다시 만들 수 있습니다:

    from qiskit.visualization import plot_distribution
    import matplotlib.pyplot as plt
    
    ax = plt.subplot()
    plot_distribution({'00': 512, '11': 500}, ax=ax)
    ax.set_ylabel('Probabilities')
  • qiskit.pulse.builder 컨텍스트 inlinepad 가 제거되었습니다. 이 기능은 테라 0.18.0 (2021년 7월)에서 처음 사용 중단되었습니다. inline 을 대체할 수 있는 방법은 없으며, 포함된 범위에서 펄스를 작성하기만 하면 됩니다. pad 컨텍스트 관리자는 더 이상 사용되지 않으므로 효과가 없습니다.

  • 트랜스파일러 패스의 출력은 SabreSwap 트랜스파일러 패스( optimization_level=3 또는 routing_method 또는 layout_method 을 호출할 때 'sabre' 으로 설정된 경우 포함 transpile())의 출력(시드 값이 고정된 경우 포함)은 이전 릴리스에서 변경될 수 있습니다. 이는 새로운 난수 생성기가 Rust에서 패스를 다시 작성하는 과정에서 SabreSwap 패스를 재작성하여 성능을 크게 개선했기 때문입니다. 일관된 출력에 의존하는 경우 이전 버전의 키스킷에서 패스를 실행하고 qiskit.qpy 를 사용하여 회로를 저장한 다음 현재 버전을 사용하여 로드할 수 있습니다.

  • 이전 릴리스에서 Layout.add()physical_bit 를 지정하지 않을 때의 동작이 이전 릴리스에서 변경되었습니다. 이전 릴리스에서는 객체의 길이에 따라 새로운 물리적 비트가 추가되었습니다 Layout 객체의 길이에 따라 새로운 물리적 비트가 추가되었습니다. 예를 들어 Layout 에 물리적 비트 1과 3을 연속적으로 호출하면 add() 를 호출하면 물리적 비트 2, 4, 5, 6 등이 추가됩니다. 실제 비트가 2와 3이면 연속적으로 호출하면 4, 5, 6, 7 등이 추가됩니다. 대신 Layout.add() 는 먼저 0과 최대 물리 비트 사이에 누락된 물리 비트를 추가합니다 Layout. 따라서 1과 3 예제의 경우 이제 0, 2, 4, 5를 추가하고 2와 3 예제의 경우 0, 1, 4, 5를 추가합니다 Layout. 이 변경은 결과의 예측 가능성을 높이고 예기치 않은 동작으로 인해 발생하는 여러 종류의 버그를 수정하기 위해 이루어졌습니다. 백엔드의 물리적 비트는 항상 0에서 nn 까지 연속된 시퀀스이므로 아직 사용하지 않은 물리적 비트가 있을 때 새 비트를 추가하면 레이아웃이 백엔드에서 사용할 수 있는 것보다 더 많은 비트를 사용하게 될 가능성이 있습니다. 이전 동작을 원한다면, 호출할 때 원하는 물리적 비트를 수동으로 지정할 수 있습니다 Layout.add().

  • 더 이상 사용되지 않는 메서드 SparsePauliOp.table 속성이 제거되었습니다. 이 기능은 원래 키스킷 테라 0.19 에서 더 이상 사용되지 않습니다. 대신 paulis() 방법을 사용해야 합니다.

  • 함수에서 PauliTable 반환에 대한 지원이 pauli_basis() 함수에 대한 지원이 제거되었습니다. 마찬가지로, pauli_list 인수는 pauli_basis() 함수(현재 유일한 반환 유형)로 전환하는 데 사용되었던 PauliList (현재 유일한 반환 유형)로 전환하는 데 사용되었던 인수가 제거되었습니다. 이 기능은 키스킷 테라 0.19 릴리스에서 더 이상 사용되지 않습니다.

  • 가짜 백엔드 객체 FakeJohannesburg, FakeJohannesburgV2, FakeAlmaden, FakeAlmadenV2, FakeSingaporeFakeSingaporeV2 는 더 이상 펄스 기본 페이로드를 포함하지 않습니다. 이는 BackendV1 기반 클래스의 경우 BackendV1.defaults() 메서드 및 펄스 시뮬레이션을 통한 BackendV1.run() 을 통한 펄스 시뮬레이션을 더 이상 사용할 수 없습니다. For BackendV2 기반 클래스의 경우 calibration 속성의 지침에 대한 Target 가 더 이상 채워지지 않습니다. 이 변경은 이러한 시스템이 파라미터 펄스 정의 대신 샘플링된 파형을 사용하기 때문에 펄스 기본 페이로드(총 ~50MB )가 지나치게 크기 때문에 이루어졌습니다. 이 세 개의 페이로드 파일은 qiskit-terra를 설치하는 데 필요한 디스크 공간의 50% 이상을 차지합니다. 펄스 인식 또는 펄스 시뮬레이션으로 컴파일할 수 있는 잠재적 가치와 이러한 폐기된 디바이스의 파일 크기를 비교했을 때 파일 크기는 비용 대비 가치가 없습니다. 이러한 속성을 활용해야 하는 경우, 이전 버전의 키스킷을 활용하고 qpy 를 사용하여 이전 버전의 키스킷에서 현재 릴리스로 회로를 전송할 수 있습니다.

  • isinstance 펄스 클래스로 확인 Gaussian, GaussianSquare, DragConstant 는 이러한 펄스 하위 클래스가 더 이상 인스턴스화되지 않으므로 무효화됩니다. 테라 0.22 에서 계속 작동하지만 즉시 전환을 시작해야 합니다. 유형 정보를 사용하는 대신 SymbolicPulse.pulse_type 을 사용해야 합니다. 이것은 펄스 봉투에 대한 고유한 문자열 식별자로 가정하고 문자열 동일성을 사용하여 펄스 유형을 조사할 수 있습니다. 예를 들면 다음과 같습니다.

    from qiskit.pulse.library import Gaussian
    
    pulse = Gaussian(160, 0.1, 40)
    
    if isinstance(pulse, Gaussian):
      print("This is Gaussian pulse.")

    이 코드는 다음과 같이 업그레이드해야 합니다

    from qiskit.pulse.library import Gaussian
    
    pulse = Gaussian(160, 0.1, 40)
    
    if pulse.pulse_type == "Gaussian":
      print("This is Gaussian pulse.")

    같은 이유로 펄스 유형 정보를 얻기 위해 pulse.__class__.__name__ 같은 클래스 속성에 액세스해서는 안 됩니다.

  • 예외 qiskit.exceptions.QiskitIndexError 는 qiskit-terra 0.18.0 (2021년 7월 12일에 릴리스됨)의 사용 중단 공지에 따라 제거되었으며 더 이상 존재하지 않습니다.

  • 더 이상 사용되지 않는 인자 epsilonfactr 이 제거되었습니다 L_BFGS_B 옵티마이저 클래스의 생성자 인수가 제거되었습니다. 이러한 인수는 원래 0.18.0 릴리스(2021년 7월 12일 출시)의 일부로 더 이상 사용되지 않습니다. 대신 ftol 인수를 사용해야 하며, 이러한 인수 간의 관계에 대한 자세한 내용은 옵티마이저의 scipy 문서를 참조하세요.

  • 레벨 1과 2에 대한 사전 설정된 패스 관리자는 optimization_level=1 또는 optimization_level=2 에서 transpile() 또는 generate_preset_pass_manager() 및 출력 level_1_pass_manager()level_2_pass_manager()는 이제 이전 기본값 대신 SabreLayoutSabreSwap 가 이전의 기본값인 DenseLayoutStochasticSwap. 이 변경은 트랜스파일러의 출력 품질을 개선하기 위해 이루어졌습니다 SabreLayoutSabreSwap 조합을 사용하면 일반적으로 출력 회로에 삽입되는 SwapGate 객체가 출력 회로에 삽입되는 횟수가 줄어듭니다. 이전 기본 패스를 사용하려면 layout_method='dense'routing_method='stochastic' 을 설정하면 됩니다 transpile() 또는 generate_preset_pass_manager() 를 설정하여 DenseLayoutStochasticSwap 로 설정하면 됩니다.

  • 함수에서 기본적으로 approximation_degree!=1.0 의 암시적 사용은 transpile()optimization_level=3 함수의 암시적 사용이 비활성화되었습니다. 트랜스파일러는 기본적으로 일면 순열 및 유사도 변환과 같은 알려진 변환까지 입력의 균일성을 유지해야 합니다. 이전에는 approximation_degree=None 을 사용하면 트로터화 진화와 같이 시간 단계가 많은 경우 단위가 과도하게 근사화되어 잘못된 결과를 초래하는 경우 잘못된 결과를 초래할 수 있었습니다. 단일 동등성을 깨는 변환은 사용자가 명시적으로 활성화해야 한다는 결정이 내려졌습니다. 합성된 UnitaryGate 명령어가 대상 백엔드의 기본 명령어의 오류율까지 근사화되는 이전의 기본 동작을 원한다면, approximation_degree=None 을 호출할 때 명시적으로 설정할 수 있습니다 transpile()optimization_level=3 로 대체할 수 있습니다:

    transpile(circuit, backend, approximation_degree=None, optimization_level=3)
  • 에서 허용되는 최대 함수 평가 횟수(maxfun)의 기본값을 1000에서 2000으로 변경합니다 L_BFGS_B 의 기본값( SciPy )과 일치하도록 1000에서 15000으로 변경합니다. 이 숫자는 기본 반복 횟수(maxiter)와도 일치합니다.

  • 업데이트 ProbDistributionQuasiDistribution 를 사용하여 접두사 “0b” 없는 비트 문자열이 주어지면 비트 수에 대한 정보를 저장합니다. ProbDistribution.binary_probabilities()QuasiDistribution.binary_probabilities() 는 저장된 비트 수를 비트 수의 기본값으로 사용합니다.

  • RZXCalibrationBuilderRZXCalibrationBuilderNoEcho 는 예기치 않은 오류로 패스가 종료되는 것을 방지하기 위해 비반향 교차 공명(ECR) 시퀀스로 구현된 스트레칭 CX 게이트를 건너뛰도록 업그레이드되었습니다. 이 패스는 새로운 인수 verbose 를 사용하여 이러한 상황이 발생했을 때 패스가 경고할지 여부를 제어합니다. verbose=True 을 설정하면 패스가 비ECR 시퀀스를 발견할 때 사용자 경고를 표시합니다.

  • 시각화 모듈 qiskit.visualization 이 내부적으로 개편되었습니다. 공개 인터페이스에는 영향을 미치지 않아야 하지만 회로 서랍의 내부에 액세스하는 경우 이제 다른 위치에 있을 수 있습니다. 시각화 모듈에서 공개로 간주되는 부분은 이 온라인 설명서에 문서화된 구성 요소뿐입니다.

지원 중단 노트

  • 에서 직접 Int1, Int2, classical_functionBooleanExpression 이름을 가져오는 것은 qiskit.circuit 는 더 이상 사용되지 않습니다. 이는 tweedledum 을 필수 종속 항목이 아닌 선택 종속 항목으로 만들기 위한 조치의 일환입니다. 대신 다음에서 이러한 이름을 가져와야 합니다 qiskit.circuit.classicalfunction.

  • qiskit.algorithms.factorizersqiskit.algorithms.linear_solvers 모듈은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 키스킷 교재의 튜토리얼로 대체됩니다: 쇼어 HHL

  • random_stabilizer_table() 은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 random_pauli_list() 함수를 사용해야 합니다.

  • 펄스 모듈 기능( qiskit.pulse.utils.deprecated_functionality )은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이는 주로 내부 전용 기능이었습니다. qiskit.utils.deprecate_function 에서 동일한 기능을 제공하므로 대신 사용해야 합니다.

  • 프리미티브 실행 방법이 변경되었습니다. BaseSampler.__call__()BaseEstimator.__call__() 메서드는 더 이상 사용되지 않습니다. 예를 들어,

    estimator = Estimator(...)
    result = estimator(circuits, observables, parameters)
    
    sampler = Sampler(...)
    result = sampler(circuits, observables, parameters)

    를 다음과 같이 다시 작성해야 합니다

    estimator = Estimator()
    result = estimator.run(circuits, observables, parameter_values).result()
    
    sampler = Sampler()
    result = sampler.run(circuits, parameter_values).result()

    프리미티브를 컨텍스트 관리자로 사용하는 것은 더 이상 사용되지 않습니다. 모든 프리미티브에 컨텍스트 관리자가 있는 것은 아닙니다. 사용 가능한 경우(예: qiskit-ibm-runtime)에는 세션의 컨텍스트 관리자가 동일한 기능을 제공합니다.

    circuits, observables, parameters 을 생성자에서 더 이상 사용되지 않습니다. circuitsobservables 메서드에서 run 메서드를 전달할 수 있습니다. run 메서드는 parameters 을 지원하지 않습니다. 사용자가 직접 매개변수 값을 조정해야 합니다.

  • 의 미사용 인수 qubit_channel_mapping RZXCalibrationBuilderRZXCalibrationBuilderNoEcho 트랜스파일러 패스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 인수는 더 이상 사용되지 않으며 패스 작동에 영향을 미치지 않습니다.

버그 수정

  • 다음과 같은 문제가 수정되었습니다 Pauli.evolve()PauliList.evolve() 가 폴리의 위상을 수정하는 특정 클리포드 게이트로 진화할 때 dtype 오류가 발생하던 문제를 수정했습니다. 수정 #8438

  • 의 버그를 수정했습니다 QuantumCircuit.initialize()QuantumCircuit.prepare_state() 의 버그를 수정하여 초기화 인자로 Qubit 를 하나도 받지 못하도록 했습니다.

  • 메서드 QuantumCircuit.while_loop() 는 이제 그 조건에서 고전적인 비트 참조를 QuantumCircuit.if_test()InstructionSet.c_if() 와 같은 방식으로 해결합니다.

  • 메서드의 DAGCircuit 메서드 depth(), size()DAGCircuit.count_ops() 메서드는 이전에는 제어 흐름이 회로에 존재할 경우 의미가 거의 없거나 전혀 없는 결과를 조용히 반환했습니다. 그리고 depth()size() 메서드는 이제 이러한 경우 오류를 올바르게 발생시키지만 새로운 recurse 키워드 인수를 사용하여 프록시 값을 계산할 수 있고 count_ops() 는 기본적으로 블록으로 재귀하여 그 안의 연산을 계산합니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 DenseLayout 트랜스파일러 패스에서 느슨한 Qubit 오브젝트(즉, 하나의 QuantumRegister의 일부가 아닌 QuantumCircuit 에 포함되지 않은 오브젝트(예 Layout 에 포함되지 않던 문제를 수정했습니다.

  • 생성자 메서드의 Operator.from_circuit() 의 레이아웃 출력을 처리할 수 있도록 생성자 메서드가 업데이트되었습니다 transpile() 의 레이아웃 출력을 처리하고 모든 경우에 레이아웃으로 인한 큐비트 순열을 올바르게 반전시킬 수 있도록 업데이트되었습니다. 이전에는 트랜스파일된 회로가 느슨한 객체를 사용했다면 Qubit 객체, 여러 QuantumRegister 객체 또는 이름이 다른 단일 QuantumRegister"q" 을 사용했다면 생성자가 회로에서 Operator 를 생성하지 못했습니다. 수정 #8800.

  • 하나의 큐비트와 하나의 양자 게이트가 포함된 클래식 비트로 인스트럭션을 분해할 때 실패하던 버그가 수정되었습니다. 이제 다음은 예상대로 분해됩니다:

    block = QuantumCircuit(1, 1)
    block.h(0)
    
    circuit = QuantumCircuit(1, 1)
    circuit.append(block, [0], [0])
    
    decomposed = circuit.decompose()
  • 에서 빈 심플렉티브 행렬의 초기화 수정 from_symplectic() 에서 PauliList 클래스 예를 들어:

    from qiskit.quantum_info.operators import PauliList
    
    x = np.array([], dtype=bool).reshape((1,0))
    z = np.array([], dtype=bool).reshape((1,0))
    pauli_list = PauliList.from_symplectic(x, z)
  • 트랜스파일러 패스의 문제 수정 GateDirection 트랜스파일러 패스의 CZGate. CZ 게이트는 대칭이므로 큐비트 인수를 뒤집어 방향성 커플링 맵과 일치시킬 수 있습니다.

  • 호출과 중첩된 매개변수 바인딩 사이에 회로 샘플러를 재사용할 때 DerivativeBase.gradient_wrapper() 메서드의 문제를 수정했습니다.

  • mpllatex 회로 서랍에서 회로에 barrier 이 있을 때 idle_wires 옵션을 False로 설정하면 서랍이 작동하지 않던 문제가 수정되었습니다. 수정 #8313

  • 의 문제를 수정했습니다 circuit_drawer()QuantumCircuit.draw()latex 에서 임시 디렉터리 (예: /tmp)가 작업 디렉터리와 다른 파일 시스템에 있는 시스템에서 OSError 이 발생하는 문제를 수정했습니다. 수정 #8542

  • 중첩 FlowController 를 다른 PassManager 에 중첩하면 이전에는 일부 트랜스파일러 패스가 트랜스파일링 중에 "잊혀지는" 경우가 있었는데, 패스가 입력을 변경하는 대신 새로운 DAGCircuit 를 반환하는 경우 일부 트랜스파일러 패스가 "잊혀지는" 문제가 있었습니다. 중첩 FlowController가 이제 올바르게 번역에 영향을 미칩니다.

  • 비교하다 QuantumCircuit 그리고 DAGCircuit 이전에는 회로에 동일한 유형의 레지스터가 두 개 이상 포함된 경우( 예: 두 개 이상) s가 동등성에 대한 비결정적이었습니다. QuantumRegister s), 때때로 돌아오다 False 레지스터가 동일하더라도. 이제 여러 레지스터가 있는 회로를 올바르게 비교합니다.

  • OpenQASM 2 익스포터(QuantumCircuit.qasm())는 이제 모든 큐비트에 영향을 주지 않는 연산에 대해 UnitaryGate 연산에 대한 큐비트 매개변수를 올바르게 정의합니다. 8224번 수정.

  • text 회로 서랍에 두 가지 버그가 수정되었습니다. vertical_compression 을 기본값인 medium 으로 설정했을 때 이러한 현상이 나타납니다. 첫 번째는 텍스트가 다른 텍스트나 게이트를 덮어쓰는 경우가 있고, 두 번째는 게이트와 컨트롤 사이의 연결이 끊어지는 경우가 있습니다. 8588번을 참조하세요.

  • 1 큐비트 게이트가 있는 회로의 UnitarySynthesis 게이트가 1 큐비트인 회로와 a Target 입력이 있는 회로가 예상대로 처리되지 않고 때때로 실패하는 문제를 수정했습니다.

  • 트랜스파일러 패스의 GateDirection 트랜스파일러 패스는 이제 파라미터화된 게이트를 처리할 때 게이트 파라미터에 사용 가능한 값을 존중합니다 Target.

  • 옵티마이저 클래스의 문제를 수정했습니다 SNOBFIT 옵티마이저 클래스의 문제를 수정했습니다 minimize() 메서드 실행 중 내부 오류가 발생하는 문제를 수정했습니다. 이제 호출 시 이를 확인하여 필요한 바운드가 호출에 누락된 경우 신속하게 ValueError minimize() 호출합니다. 수정 #8580

  • 메서드에서 호출 가능한 출력의 문제를 수정했습니다 get_energy_evaluation() 메서드에서 호출 가능한 출력 문제를 수정했습니다 VQD 클래스가 이제 실행될 때 지정된 callback 을 올바르게 호출합니다. 이전에는 이 경우 콜백이 잘못 사용되지 않았습니다. 수정 #8575

  • 클래식 비트가 없는 회로에서 reverse_bits=True 과 함께 circuit_drawer() 을 사용할 때 cregbundle 에 대한 잠재적으로 혼란스러운 경고가 표시되는 문제를 수정했습니다. 수정 #8690

  • OpenQASM 3 익스포터(qiskit.qasm3)는 이제 고전적인 조건이 적용된 OpenQASM 내장(예: resetmeasure)을 올바르게 처리합니다 c_if(). 이전에는 이 조건이 무시되었을 것입니다.

  • 클래스 관련 문제를 수정했습니다 SPSA 클래스에서 내부적으로 균일한 크기의 배치로 작업을 일괄 처리하려고 할 때 균일한 배치를 생성할 수 없는 경우 예외가 발생하는 문제를 수정했습니다. 이 문제가 수정되어 크기가 균등하지 않은 작업도 항상 성공적으로 일괄 처리됩니다.

  • 의 동작을 수정했습니다 Layout.add() 의 출력이 잠재적으로 transpile() 의 출력이 유효하지 않고 대상 백엔드에서 사용 가능한 것보다 더 많은 큐비트를 포함할 수 있는 동작을 수정했습니다. 수정되었습니다: #8667

  • state_to_latex() 함수의 문제를 수정했습니다. 함수의 선택적 인수 prefix 에 라텍스 문자열을 전달하면 오류가 발생했습니다. 수정 #8460

  • state_to_latex() 함수는 0에 가까운 값이 있을 때 유효하지 않은 LaTeX 값을 생성하여 state_drawer() 호출 시 오류가 발생했습니다. 수정 #8169.

  • GradientDescent 는 이제 반복 횟수, 함수 평가 및 그라데이션 평가 횟수를 올바르게 계산합니다. 또한 이제 문서에 그라데이션이 순방향 유한 차분 방법으로 근사화된다는 내용이 올바르게 명시되어 있습니다.

  • 의 사용 중단 경고를 수정했습니다 NaturalGradient에서 normalize 매개 변수가 True 로 설정된 경우 이제 StandardScaler 를 사용하여 모델을 맞추기 전에 데이터의 크기를 조정합니다.

에어 0.11.0

변경 없음

IBM Q 제공자 0.19.2

변경 없음

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