Skip to main content
IBM Quantum Platform

키스킷 0.33 릴리즈 노트


0.33.1

테라 0.19.1

Prelude

키스킷 테라 0.19.1 는 버그 수정 릴리스로, 제어 흐름 빌더 인터페이스, 조건부 게이트 및 최신 테라 오브젝트의 QPY 직렬화에 의해 구성된 회로와 관련된 0.19.0 의 일부 문제를 해결합니다.

지원 중단 노트

  • 느슨한 함수 qiskit.circuit.measure.measure()qiskit.circuit.reset.reset() 는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 다음 메소드로 액세스해야 합니다 QuantumCircuit:

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(1, 1)
    
    # Replace this deprecated form ...
    from qiskit.circuit.measure import measure
    measure(circuit, 0, 0)
    
    # ... with either of the next two lines:
    circuit.measure(0, 0)
    QuantumCircuit.measure(circuit, 0, 0)

버그 수정

  • 회로 변환 기능의 오류 수정 circuit_to_gate()circuit_to_instruction() (및 관련 회로 메서드 QuantumCircuit.to_gate()QuantumCircuit.to_instruction()) 레지스터가 없는 비트 또는 둘 이상의 레지스터에 비트가 있는 회로에서 작동할 때 발생하는 오류를 수정했습니다. 이전에는 생성된 게이트 또는 명령어에 필요한 비트 수가 잘못 계산되어 변환 중에 예외가 발생하는 경우가 많았습니다.

  • 빌더 인터페이스에서 생성된 제어 흐름 연산에서 QuantumCircuit.copy() 를 호출하면 오류가 발생하는 문제를 수정했습니다. 예를 들어, 이전에는 오류가 발생했지만 이제 성공적으로 반환됩니다:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.if_test((creg, 0)):
        circ.h(0)
    
    if_else_instruction, _, _ = circ.data[0]
    true_body = if_else_instruction.params[0]
    true_body.copy()
  • 이제 제어 흐름 빌더 인터페이스에서 중첩된 제어 흐름 범위의 조건으로 ClassicalRegister를 중첩된 제어 흐름 범위의 조건으로 사용할 수 있습니다. 이전에는 이렇게 하면 즉시 오류가 발생하지는 않지만 내부 회로 블록에 올바른 레지스터가 정의되지 않아 나중에 내부 블록과 함께 작동하는 로직이 실패할 수 있었습니다.

    예를 들어, 이전에는 클래식 레지스터에 조건부 내부 블록을 그리려고 할 때 서랍이 실패했지만 이제는 이 예제에서와 같이 성공합니다:

    from qiskit import QuantumCircuit
    from qiskit.circuit import QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(4)
    creg = ClassicalRegister(1)
    circ = QuantumCircuit(qreg, creg)
    
    with circ.for_loop(range(10)) as a:
        circ.ry(a, 0)
        with circ.if_test((creg, 1)):
            circ.break_loop()
    
    print(circ.draw(cregbundle=False))
    print(circ.data[0][0].blocks[0].draw(cregbundle=False))
  • 직렬화에 대한 qpy_serialization 지원 수정 QuantumCircuit 객체를 직렬화하는 ParameterVector 또는 ParameterVectorElement 을 매개변수로 사용하는 객체를 직렬화할 수 있도록 수정했습니다. 이전에는 ParameterVectorElement 매개변수가 QPY 직렬화를 위한 Parameter 로 취급되어 QPY 직렬화에서 ParameterVector 컨텍스트가 손실되어 출력 순서인 parameters 의 출력 순서가 잘못될 수 있었습니다.

    이 문제를 해결하려면 새로운 QPY 형식 버전인 버전 3이 필요했습니다. 이 새로운 형식 버전에는 qpy_serialization 문서에 설명된 ParameterVectorElement 클래스의 표현이 포함되어 있으며, 이는 PARAMETER_VECTOR_ELEMENT에 설명되어 있습니다.

  • 객체 직렬화에 대한 qpy_serialization 지원 수정 PauliEvolutionGate 객체 직렬화 지원을 수정했습니다. 이전에는 PauliEvolutionGate 는 직렬화를 위한 사용자 정의 게이트로 취급되어 원래의 정의와 이름이 같은 Gate 객체와 동일한 정의와 이름을 가진 PauliEvolutionGate. 그러나 이렇게 하면 원래 상태의 PauliEvolutionGate. 이 문제가 수정되어 이번 릴리스부터 회로에서 a PauliEvolutionGate 는 이제 QPY 직렬화 전반에 걸쳐 1:1로 유지됩니다. 유일한 한계는 사용자 정의 클래스를 지원하지 않는다는 것입니다 EvolutionSynthesis 클래스를 지원하지 않는다는 것입니다. 에서 제공되는 클래스만 qiskit.synthesis 에서 사용할 수 있는 클래스만 PauliEvolutionGate 와 함께 사용할 수 있습니다.

    이 문제를 해결하려면 새로운 QPY 형식 버전인 버전 3이 필요했습니다. 이 새로운 형식 버전에는 다음이 포함됩니다. PauliEvolutionGate 에 설명된 클래스 qpy_serialization PAULI_EVOLUTION 의 설명서.

  • qiskit.circuit.measure.measure()qiskit.circuit.reset.reset() 두 개의 느슨한 함수가 사용 중단 기간 없이 실수로 제거되었습니다. 이 메서드들은 복원되었지만 더 이상 사용되지 않는 것으로 표시되어 있습니다 QuantumCircuit.measure()QuantumCircuit.reset()로 각각 표시되며 향후 릴리스에서 제거될 예정입니다.

기타 참고사항

  • 새로운 제어 흐름 빌더 인터페이스는 다양한 컨텍스트 관리자와 헬퍼 개체를 사용하여 작업을 수행합니다. 이는 공개 API의 일부로 간주되어서는 안 되며, 경고 없이 변경 및 제거될 수 있습니다. 빌더 인터페이스의 사용에는 안정성이 보장되어 있는데, 그 이유는 QuantumCircuit.for_loop(), while_loop()if_test() 에 의해 설명되는 동작은 표준 지원 중단 정책의 적용을 받지만, 이를 적용하는 데 사용되는 실제 객체는 그렇지 않습니다. 현재 위치에 존재하거나 메서드나 속성이 첨부된 객체(예: IfContext 또는 ControlFlowBuilderBlock)에 의존해서는 안 됩니다.

    이전에는 0.19.0 릴리스에서 명확하지 않았습니다. 이제 이러한 모든 객체는 문서 문자열에 경고가 추가되어 이를 명시합니다. 앞으로는 그 위치와 지원 구현 방식이 상당히 달라질 가능성이 높습니다.

에어 0.9.1

변경 없음

이그니스 0.7.0

변경 없음

IBM Q 제공자 0.18.2

버그 수정

  • 서킷 메타데이터에서 Parameter 을 전달할 때 작업이 계속 충돌하는 문제에 대한 수정이 #1065에서 제공되었습니다.
  • 직렬화 중인 회로가 BlueprintCircuit 인 경우 qiskit.providers.ibmq.runtime.RuntimeEncoder 이 추가 decompose()를 수행하는 문제에 대해 #1094에서 제공된 수정 사항.

0.33.0

이번 릴리스는 키스킷에서 키스킷 아쿠아 프로젝트에 대한 지원이 공식적으로 종료됨을 의미합니다. 원래 0.25.0 릴리스에서 더 이상 사용되지 않았으며, 해당 릴리스에서 문서화된 대로 qiskit-aqua 패키지가 키스킷 메타패키지에서 제거되었으므로 pip install qiskit 에는 더 이상 qiskit-aqua 이 포함되지 않습니다. 그러나 파이썬 패키징의 제한으로 인해 이전 버전의 키스킷을 이번 릴리스(또는 향후 릴리스)로 업그레이드할 때 pip install -U qiskit 을 사용하여 기존 설치( qiskit-aqua )를 자동으로 제거할 수 없습니다. 이전 버전에서 업그레이드하는 경우 pip uninstall qiskit-aqua 을 사용하여 수동으로 Qiskit Aqua를 제거하거나 새로운 파이썬 환경에서 설치하는 것이 좋습니다.

qiskit-aqua 에서 제공하던 애플리케이션 모듈이 여러 개의 새로운 패키지로 분리되었습니다: qiskit-optimization, qiskit-nature, qiskit-machine-learning, 그리고 qiskit-finance 입니다. 이러한 패키지는 표준 pip 설치 명령(예: pip install qiskit-nature)을 통해 자체적으로 설치할 수 있습니다 또는 나머지 키스킷 메타패키지를 선택적 추가 기능으로 제공(예 pip install 'qiskit[finance,optimization]' 또는 pip install 'qiskit[all]'). 핵심 알고리즘과 운영자 흐름은 이제 키스킷 테라의 일부로 qiskit.algorithmsqiskit.opflow 에서 확인할 수 있습니다. 기존 아쿠아 사용법에 따라 애플리케이션 패키지를 사용하거나 키스킷 테라의 새로운 모듈을 사용해야 합니다. 키스킷 아쿠아에서 마이그레이션하는 방법에 대한 자세한 내용은 아쿠아 마이그레이션 가이드를 참조하세요.

이번 릴리스에서는 키스킷 이그니스 프로젝트도 공식적으로 더 이상 사용되지 않습니다. 따라서 향후 릴리스에서 qiskit-ignis 패키지는 키스킷 메타패키지에서 제거될 것이며, 이는 향후 릴리스에서 pip install qiskit 에 더 이상 qiskit-ignis 이 포함되지 않음을 의미합니다. 키스킷 이그니스는 키스킷 실험 프로젝트에 의해 대체되어 활발한 개발이 중단되었습니다. 더 이상 사용되지 않지만 중요한 버그 수정 및 호환성 수정은 계속 진행되어 사용자에게 Ignis에서 마이그레이션할 수 있는 충분한 기회를 제공할 것입니다. 사용 중단 기간(이번 릴리스부터 3개월 이내)이 지나면 프로젝트는 폐기되어 보관됩니다. 키스킷 이그니스에서 키스킷 실험으로 전환하는 방법에 대한 자세한 내용은 마이그레이션 가이드를 참조하세요.

테라 0.19.0

Prelude

키스킷 테라 0.19 릴리즈의 주요 내용은 다음과 같습니다:

  • 추상적인 키스킷/하드웨어 인터페이스의 새로운 버전으로, 다음과 같은 형태의 BackendV2새로운 데이터 구조와 함께 제공되는 Target 를 사용하여 백엔드에서 트랜스파일러에 대한 제약 조건을 더 잘 모델링할 수 있습니다.
  • 트랜스파일러 패스에 대한 확장 가능한 플러그인 인터페이스로 UnitarySynthesis 트랜스파일러 패스에 대한 확장 가능한 플러그인 인터페이스로, 사용자나 다른 패키지가 새로운 방법으로 키스킷 테라의 합성 루틴을 확장할 수 있습니다.
  • 제어 흐름 명령어, forwhile 루프와 if/else 문을 표현하기 위한 QuantumCircuit. 키스킷 에어의 시뮬레이터는 곧 이 새로운 명령어로 작동할 수 있게 되어 더욱 동적인 양자 프로그램을 작성할 수 있게 될 것입니다.
  • 진화하는 OpenQASM 3 사양에 대한 예비 지원. 새로운 qiskit.qasm3 모듈을 사용하여 QuantumCircuit를 OpenQASM 3으로 직렬화할 수 있습니다.

이번 릴리스는 키스킷에서 Python 3.6 에 대한 지원이 종료됨을 의미합니다. 이번 키스킷 테라 릴리스와 0.19.x 시리즈의 모든 후속 버그 수정 릴리스는 Python 3.6 과 함께 작동하는 마지막 릴리스가 될 것입니다. 키스킷 테라의 다음 마이너 릴리스( 0.20.0 )부터는 최소 요구되는 Python 버전은 3.7 입니다.

항상 그렇듯이 이번 릴리스에는 더 많은 기능과 수정 사항이 포함되어 있으며, 아래에서 자세한 내용을 확인할 수 있습니다.

새 기능

  • QuantumCircuit.decompose() 와 해당 트랜스파일러 패스 Decompose 는 이제 선택적으로 게이트 이름 모음이 포함된 매개변수를 허용합니다. 이 파라미터를 지정하면 이름이 일치하는 게이트만 분해됩니다. 유닉스 셸 스타일의 와일드카드 일치를 지원합니다. 예를 들어,

    qc.decompose(["h", "r[xz]"])

    h, rx 또는 rz 게이트를 분해하지만 (예를 들어) x 게이트는 그대로 둡니다.

  • 최적화 프로그램에 termination_checker 인수를 추가했습니다 SPSA 최적화 프로그램에 추가했습니다. 이를 통해 사용자는 사용자 지정 종료 기준을 구현할 수 있습니다.

    import numpy as np
    from qiskit.algorithms.optimizers import SPSA
    
    def objective(x):
        return np.linalg.norm(x) + .04*np.random.rand(1)
    
    class TerminationChecker:
    
        def __init__(self, N : int):
            """
            Callback to terminate optimization when the average decrease over
            the last N data points is smaller than the specified tolerance.
            """
            self.N = N
            self.values = []
    
        def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool:
            """
            Returns:
                True if the optimization loop should be terminated.
            """
            self.values.append(value)
    
            if len(self.values) > self.N:
                last_values = self.values[-self.N:]
                pp = np.polyfit(range(self.N), last_values, 1)
                slope = pp[0] / self.N
    
                if slope > 0:
                    return True
            return False
    
    maxiter = 400
    spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10))
    parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5]))
  • 새로운 버전의 Backend 인터페이스의 새 버전을 추가했습니다, BackendV2. 이 새 버전은 이전 버전에서 크게 변경된 사항입니다, BackendV1 백엔드의 속성(예: 큐비트 수 등)에 대한 사용자 액세스 패턴과 백엔드가 트랜스파일러에 제약 조건을 나타내는 방식을 모두 변경합니다. 메서드를 통한 회로 실행은 run() 메서드를 통한) 회로 실행은 변경되지 않습니다. 별도의 백엔드 대신 BackendV2 백엔드를 사용하는 대신 configuration(), properties()defaults() 메서드를 구성하는 BackendConfiguration, BackendPropertiesPulseDefaults 객체를 각각 생성하는 BackendV1 인터페이스에서와 같이, 이러한 출력 객체에 포함된 어트리뷰트를 직접 BackendV2 객체의 어트리뷰트로 직접 액세스할 수 있습니다. 예를 들어, 다음과 같은 백엔드의 큐비트 수를 얻으려면 BackendV1 를 사용하면 됩니다:

    num_qubits = backend.configuration().n_qubits

    와 함께 BackendV2 를 사용하면 됩니다:

    num_qubits = backend.num_qubits

    이와 관련된 또 다른 변경 사항은 추상 클래스에 노출되는 어트리뷰트 수가 하드웨어/공급업체에 구애받지 않도록 설계되었다는 것입니다 BackendV2 클래스가 하드웨어/벤더에 구애받지 않는 필수 또는 선택 필드의 집합으로 설계되어 현재 키스킷의 나머지 부분들이 모든 백엔드에서 사용할 수 있다는 것입니다. 추상 클래스의 서브 클래스 BackendV2 클래스의 서브클래스는 정의된 것 외에 추가 어트리뷰트와 메서드에 대한 지원을 추가할 수 있지만 BackendV2에 정의된 것 이외의 속성과 메서드를 추가할 수 있지만, 키스킷 전체에서 보편적으로 지원되지는 않습니다.

    공급자 작성자에게 주로 중요한 또 다른 중요한 변경 사항은 공급자 작성자가 BackendV2 가 특정 백엔드의 속성을 트랜스파일러에 노출하는 방식입니다. 와 BackendV2 를 사용하면 Target 객체를 통해 이루어집니다. 를 통해 노출되는 Target속성을 통해 노출되는 target 속성을 통해 노출되는 는 특정 백엔드에서 회로를 실행하기 위한 제약 조건 집합을 나타내는 데 사용됩니다. 여기에는 이전에 노출된 정보의 하위 집합인 BackendConfiguration, BackendPropertiesPulseDefaults 클래스가 적극적으로 사용할 수 있는 정보 집합을 포함합니다. 사용할 공급자를 마이그레이션할 때 BackendV2 사용하도록 마이그레이션할 때(또는 새 공급자 패키지를 생성할 때) 백엔드 객체의 구성은 주로 백엔드를 위한 Target 객체를 생성하는 것입니다.

  • 새로운 Target 클래스를 추가했습니다 transpiler 모듈에 새 클래스를 추가했습니다. 클래스는 Target 클래스는 컴파일러에 대한 백엔드의 제약 조건을 나타내도록 설계되었습니다. 클래스는 Target 클래스는 백엔드와 함께 사용하기 위한 것으로 BackendV2 백엔드와 함께 사용되며 백엔드가 앞으로 트랜스파일러에 대한 제약 조건을 모델링하는 방식입니다. 이전에 대상 장치를 제어하는 데 사용되었던 개별 필드를 transpile() 대상 디바이스(예: basis_gates, coupling_map, instruction_durations, 등)를 단일 데이터 구조로 결합합니다. 또한 이기종 게이트 세트 표현, 멀티비트 게이트 연결, 동일한 게이트의 조정된 변형 등 기존에 제공되던 기능에 추가 기능을 추가했습니다. 현재 트랜스파일러는 이러한 제약 조건을 모두 고려하지 않지만, 시간이 지남에 따라 추가 기능을 활용할 수 있도록 확장할 예정입니다.

  • 이제 Options 클래스는 이제 유효성 검사기 지정에 대한 선택적 지원을 제공합니다. 이를 통해 Backend 작성자는 사용자가 제공한 필드 값에 대한 기본 유효성 검사를 선택적으로 지정할 수 있습니다 Options 객체의 필드에 대한 기본 유효성 검사를 지정할 수 있습니다. 예를 들어, 다음과 같이 정의된 Options 로 정의된 객체가 있다면

    from qiskit.providers.Options
    options = Options(shots=1024)

    를 사용하여 샷에 유효성 검사기를 1에서 4096 사이로 설정할 수 있습니다:

    options.set_validator('shots', (1, 4096))

    유효성 검사기를 설정한 상태에서 update_options() 메서드를 호출하면 shots 가 업데이트되는 경우 제안된 새 값이 유효한 범위 내에 있는지 확인합니다.

  • 새로운 트랜스파일러 분석 패스를 추가했습니다, ContainsInstructionqiskit.transpiler.passes 모듈에 새로운 트랜스파일러 분석 패스를 추가했습니다. 이 패스는 회로에 특정 명령어가 포함되어 있는지 확인하는 데 사용됩니다. 초기화 시 단일 매개변수, 즉 명령어의 이름을 받아 회로에 해당 명령어가 포함되어 있는지 여부를 확인하고 속성 세트에서 부울을 설정합니다. 예를 들어,

    from qiskit.transpiler.passes import ContainsInstruction
    from qiskit.circuit import QuantumCircuit
    
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    
    property_set = {}
    # Contains Hadamard
    contains_h = ContainsInstruction("h")
    contains_h(circuit, property_set)
    assert property_set["contains_h"] == True
    # Not contains SX
    contains_sx = ContainsInstruction("sx")
    contains_sx(circuit, property_set)
    assert property_set["contains_sx"] == False
  • 유틸리티 함수 추가 qiskit.utils.detach_prefix() 의 대응하는 유틸리티 함수 apply_prefix(). 새 함수는 주어진 실수 값에서 스케일링된 값과 접두사의 튜플을 반환합니다. 예를 들어 1.3e8 값은 (130, "M") 으로 변환되어 130 MHz 과 같은 사용자 친화적인 형식으로 값을 표시하는 데 사용할 수 있습니다.

  • 이제 BIPMapping 객체를 구성할 때 objective 옵션에 "gate_error""balanced" 값을 사용할 수 있으며, 기본값은 "balanced" 입니다.

    "gate_error" 오브젝트를 사용하려면 BackendPropertiesbackend_prop 인스턴스를 전달해야 하며, 여기에는 목표 계산에 사용되는 2q-gate 게이트 오류가 포함되어 있습니다. "balanced" 객체는 주어진 경우 BackendProperties 인스턴스를 사용하지만, 그렇지 않으면 새 매개변수 default_cx_error_rate 에 지정된 대로 CX 오류율을 가정합니다. 밸런스드 오브젝트의 게이트 에러와 깊이 구성 요소의 상대적 가중치는 새로운 depth_obj_weight 파라미터로 제어할 수 있습니다.

  • 초기화 시 설정된 VQE 클래스의 모든 어트리뷰트를 이제 게터와 세터로 액세스할 수 있습니다. 또한 ansatzoptimizer 속성의 기본값은 None 을 지정하여 재설정할 수 있습니다:

    vqe = VQE(my_ansatz, my_optimizer)
    vqe.ansatz = None   # reset to default: RealAmplitudes ansatz
    vqe.optimizer = None  # reset to default: SLSQP optimizer
  • 새로운 메서드 추가 PauliList.group_qubit_wise_commuting() 를 분할하는 새로운 메서드 PauliList 를 상호 큐비트 단위로 커뮤팅하는 Pauli 연산자 집합으로 분할하는 새로운 메서드를 추가했습니다. 예를 들어,

    from qiskit.quantum_info import PauliList, Pauli
    pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")])
    pauli_list.group_qubit_wise_commuting()
  • 새로운 커플링 맵 생성자 메서드가 추가되었습니다 CouplingMap.from_hexagonal_lattice() 메서드를 추가했습니다. 예를 들어 2x2 육각형 격자 결합 맵을 만들 수 있습니다:

    from qiskit.transpiler import CouplingMap
    cmap = CouplingMap.from_hexagonal_lattice(2, 2)
    cmap.draw()
  • 새로운 가짜 백엔드 클래스는 qiskit.test.mock 에서 확인할 수 있습니다. 여기에는 ibmq_brooklyn, ibmq_manila, ibmq_jakarta, ibmq_lagos 의 모의 버전이 포함됩니다. 다른 가짜 백엔드와 마찬가지로 보정 데이터의 스냅샷(예: backend.defaults())이 포함됩니다 및 오류 데이터(예: backend.properties()) 실제 시스템에서 가져온 것으로 로컬 테스트, 컴파일 및 시뮬레이션에 사용할 수 있습니다.

  • 추가 OperatorBase.is_hermitian() 메서드를 추가하여 연산자가 헤르미티안인지 여부를 확인합니다. NumPyEigensolverNumPyMinimumEigensolver 를 사용하여 eigh 또는 eigsh 연산자가 Hermitian인 경우 고유값 문제를 해결합니다.

  • 새로운 생성자 메서드 추가 PassManagerConfig.from_backend(). 사용자 옵션과 백엔드 구성으로 PassManagerConfig 객체를 사용자 옵션과 백엔드 구성으로 구성합니다. 이 기능을 사용하면 사전 설정된 패스매니저를 더 쉽게 구축할 수 있습니다. 예를 들어,

    from qiskit.transpiler.passmanager_config import PassManagerConfig
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.test.mock import FakeMelbourne
    
    pass_manager = level_1_pass_manager(
      PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42)
    )
  • 새로운 트랜스파일러 패스 PulseGates가 추가되어 명령 스케줄 맵에서 사용자가 제공한 캘리브레이션을 자동으로 추출하고 게이트 스케줄을 주어진(트랜스파일된) 양자 회로에 펄스 게이트로 연결합니다.

    트랜스파일러 패스는 PulseGates 트랜스파일러 패스는 0에서 3까지의 모든 최적화 레벨에 적용됩니다. 최종 사용자가 명시적으로 backend.defaults().instruction_schedule_map 을 재정의하지 않는 한 게이트 구현은 업데이트되지 않습니다. 이 패스를 사용하면 사용자가 하드웨어에서 실행되는 모든 회로에 대해 개별적으로 QuantumCircuit.add_calibration() 를 개별적으로 호출하지 않아도 됩니다.

    이 새로운 패스를 보완하기 위해 일정이 추가되었습니다 InstructionScheduleMap 에 메타데이터 필드 "publisher" 로 암시적으로 업데이트되었습니다. 백엔드에서 보정된 게이트 스케줄에는 이미 알려진 스케줄의 보정으로 회로가 재정의되는 것을 방지하기 위한 특수 게시자 종류가 있습니다. 일반적으로 이 메타데이터는 자동으로 적용되므로 최종 사용자는 이 메타데이터를 관리할 필요가 없습니다. 전화 InstructionScheduleMap.has_custom_gate() 을 호출하여 맵에 사용자 지정 게이트 보정이 있는지 확인할 수 있습니다.

    실행 중인 모든 회로에 사용자 지정 게이트 구현을 적용하는 방법을 알아보려면 아래 코드 예제를 참조하세요.

    from qiskit.test.mock import FakeGuadalupe
    from qiskit import pulse, circuit, transpile
    
    backend = FakeGuadalupe()
    
    with pulse.build(backend, name="x") as x_q0:
        pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0))
    
    backend.defaults().instruction_schedule_map.add("x", (0,), x_q0)
    
    circs = []
    for _ in range(100):
        circ = circuit.QuantumCircuit(1)
        circ.sx(0)
        circ.rz(1.57, 0)
        circ.x(0)
        circ.measure_active()
        circs.append(circ)
    
    circs = transpile(circs, backend)
    circs[0].calibrations  # This returns calibration only for x gate

    인스트럭션 스케줄 맵은 변경 가능한 객체라는 점에 유의하세요. 항목 중 하나를 재정의하고 다른 실험에 해당 백엔드를 사용하면 실수로 게이트 정의가 업데이트될 수 있습니다.

    backend = FakeGuadalupe()
    
    instmap = backend.defaults().instruction_schedule_map
    instmap.add("x", (0, ), my_x_gate_schedule)
    
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.measure(0, 0)
    
    qc = transpile(qc, backend)  # This backend uses custom X gate

    특정 실험의 게이트 정의를 업데이트하려면 먼저 인스트럭션 스케줄 맵을 딥카피하여 트랜스파일러에 직접 전달해야 합니다.

  • BIPMapping 의 생성자에 새로운 옵션 qubit_subset 을 도입했습니다. 이 옵션을 사용하면 매핑 중에 사용할 물리적 큐비트(장치의 coupling_map )를 한 줄로 지정할 수 있습니다:

    mapped_circ = BIPMapping(
        coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]),
        qubit_subset=[1, 3, 4]
    )(circ)

    이전에는 동일한 작업을 수행하려면 사용할 큐비트만 포함된 축소된 coupling_map 을 제공하고, 결과 회로를 원본 coupling_map 에 임베드한 다음 QuantumCircuit._layout 을 적절히 업데이트해야 했습니다:

    reduced_coupling = coupling_map.reduce(qubit_to_use)
    mapped = BIPMapping(reduced_coupling)(circ)
    # skip the definition of fill_with_ancilla()
    # recover circuit on original coupling map
    layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)})
    for reg in mapped.qregs:
        layout.add_register(reg)
    property_set = {"layout": fill_with_ancilla(layout)}
    recovered = ApplyLayout()(mapped, property_set)
    # recover layout
    overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()})
    for reg in mapped.qregs:
        overall_layout.add_register(reg)
    recovered._layout = fill_with_ancilla(overall_layout)
  • 의 생성자에 ignore_pauli_phasecopy 인수를 추가했습니다 SparsePauliOp. ignore_pauli_phase 는 입력의 phase 속성을 읽지 못하게 합니다 PauliList 속성을 읽지 못하도록 하는데, 이는 내부 ZX 규칙에서 PauliList 가 이미 내부 ZX 규칙에서 모든 위상이 0인 것으로 알려져 있는 경우 더 성능이 좋습니다. copy 를 명시적으로 설정하면 사용자가 입력 데이터의 복사를 피할 수 있습니다 copy=False.

  • 다음 작업의 성능이 향상되었습니다 SparsePauliOp 작업의 성능이 향상되었습니다:

  • 메서드를 추가했습니다 SparsePauliOp.sum() 메서드를 추가하여 많은 SparsePauliOps. 이 방법은 인스턴스를 루프에 함께 추가하는 것보다 훨씬 더 나은 성능을 제공합니다. 예를 들어, 이전에는 여러 개의 SparsePauliOp를 함께 추가하는 것입니다:

    from qiskit.quantum_info import SparsePauliOp, random_pauli_list
    sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000]
    
    total = sparse_ops[0]
    for op in sparse_ops[1:]:
        total += op

    이제 이 작업을 훨씬 더 효율적으로 수행할 수 있습니다(속도와 타이핑 모두에서!) 로 설정합니다:

    SparsePauliOp.sum(sparse_ops)
  • 의 기본 클래스인 ParametricPulse 의 생성자에 limit_amplitude 인수를 추가했습니다 Gaussian, GaussianSquare, DragConstant를 추가하여 펄스 단위로 진폭 제한 1을 비활성화할 수 있도록 했습니다. limit_amplitude=False 를 사용하면 개별 펄스가 유니티를 초과하는 진폭을 가질 수 있습니다 PulseError. 자세한 내용은 #6544를 참조하세요.

  • 사용 QuantumCircuit.draw() 또는 circuit_drawer() 를 사용하면 이제 파일 이름 확장자에서 유추된 이미지 형식의 파일이 생성됩니다(예: latex 서랍):

    import qiskit
    
    circuit = qiskit.QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.draw('latex', filename='./file.jpg')

    이렇게 하면 회로 도면이 JPEG 형식으로 저장됩니다. 이전에는 이미지가 항상 PNG 형식이었습니다. 자세한 내용은 #6448을 참조하세요.

    이제 예를 들어 지원되지 않는 파일 이름 확장자가 있는 경우:

    circuit.draw('latex', filename='./file.spooky')

    를 입력하면 파일 이름 확장자를 지원되는 이미지 형식으로 변경하기 위해 ValueError 가 발생합니다.

  • filename 매개변수를 추가했습니다 plot_gate_map()plot_coupling_map()에 매개변수를 추가하여 결과 이미지를 파일로 저장할 수 있습니다.

  • 대략적인 양자 컴파일러와 그에 상응하는 단일 합성 플러그인 구현을 소개했습니다. 주요 AQC 클래스는 AQC 를 사용하여 단일 행렬을 대략적인 회로로 컴파일하는 독립 실행형 버전입니다. 플러그인은 다음에 의해 호출될 수 있습니다 transpile()unitary_synthesis_method 인수가 'aqc' 으로 설정된 경우 참조 qiskit.transpiler.synthesis.aqc 를 참조하세요.

  • filter_function 인수를 추가했습니다 QuantumCircuit.depth()QuantumCircuit.size() 인수를 추가하여 몇 가지 기준에 따라 회로 동작을 분석할 수 있습니다.

    예를 들어, 2큐비트 게이트의 수를 구하려면 다음과 같이 할 수 있습니다:

    circuit.size(lambda x: x[0].num_qubits == 2)

    또는 0번째 큐비트에 작용하는 T 게이트의 깊이를 얻습니다:

    circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1])
  • 새로운 트랜스파일러 패스를 추가했습니다, CollectMultiQBlocksqiskit.transpiler.passes 모듈에 새로운 트랜스파일러 패스를 추가했습니다. 이 패스는 큐비트 그룹에 작용하는 중단 없는 게이트 시퀀스를 수집하는 데 사용됩니다. 기존 패스와 유사한 기능을 제공하지만 Collect2qBlocks 패스와 유사한 기능을 제공하지만, 해당 패스는 2큐비트 블록을 찾도록 설계 및 최적화되었지만 이 새로운 패스는 모든 크기의 블록을 찾을 수 있습니다.

  • 에 새로운 제어 흐름 작업을 위한 빌더 인터페이스가 있습니다 QuantumCircuit와 같은 새로운 ForLoopOp, IfElseOpWhileLoopOp. 인터페이스는 동일한 회로 방식, QuantumCircuit.for_loop(), QuantumCircuit.if_test()QuantumCircuit.while_loop()body 매개변수가 지정되지 않으면 컨텍스트 관리자를 반환하도록 오버로드되어 있습니다. 이러한 컨텍스트 관리자 중 하나를 입력하면 스코프가 회로에 푸시되고 모든 게이트 호출(및 기타 스코프)과 이들이 사용하는 리소스를 캡처하여 마지막에 관련 작업을 빌드합니다. 예를 들어, 이제 할 수 있습니다:

    qc = QuantumCircuit(2, 2)
    with qc.for_loop(range(5)) as i:
        qc.rx(i * math.pi / 4, 0)

    이렇게 하면 ForLoopOpqc 를 생성하며, 이는 큐비트 0이 루프 본문 내에서 사용되는 유일한 리소스임을 알 수 있습니다. 이러한 컨텍스트 관리자는 중첩할 수 있으며 너비를 올바르게 결정합니다. 사용할 수 있습니다 QuantumCircuit.break_loop()QuantumCircuit.continue_loop() 를 사용할 수 있으며, 컨텍스트 내에서 중첩되어 있어도 포함 루프에 맞는 너비로 확장됩니다 QuantumCircuit.if_test() 블록에 중첩되더라도 확장됩니다.

    컨텍스트 매니저는 if_test() 컨텍스트 관리자는 원하는 경우 다음과 같이 else 블록을 만드는 데 사용할 수 있는 체인 관리자를 제공합니다:

    qreg = QuantumRegister(2)
    creg = ClassicalRegister(2)
    qc = QuantumCircuit(qreg, creg)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)
    with qc.if_test((creg, 0)) as else_:
        qc.x(1)
    with else_:
        qc.z(1)

    관리자는 ifelse 본문이 동일한 리소스 집합에 정의되어 있는지 확인합니다.

  • 새로운 트랜스파일러 패스 도입 InverseCancellation 를 일반화하는 CXCancellation 패스를 일반화하여 셀프 인버스 게이트 또는 게이트-인버스 쌍을 취소할 수 있습니다. 초기화하여 사용할 수 있습니다 InverseCancellation 를 초기화하고 취소할 게이트를 전달하여 사용할 수 있습니다:

    from qiskit.transpiler.passes import InverseCancellation
    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    from qiskit.transpiler import PassManager
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.h(0)
    pass_ = InverseCancellation([HGate()])
    pm = PassManager(pass_)
    new_circ = pm.run(qc)
  • 의 생성자 RZXCalibrationBuilder 의 생성자에는 두 개의 새로운 kwarg instruction_schedule_mapqubit_channel_mapping 이 있는데, 각각 각 큐비트에 대한 InstructionScheduleMap 와 각 큐비트에 대한 채널 이름 목록을 각각 받습니다. 이러한 새로운 인수는 백엔드 대상에서 필요한 정보를 직접 지정하는 데 사용됩니다. BaseBackend 또는 BackendV1 객체를 backend 인수와 함께 직접 전달해야 합니다.

  • 큐비트로만 구성된 상태의 Statevector는 이제 케트 표기법( LaTeX )을 사용하여 큐비트로만 구성된 상태를 그릴 수 있습니다. 케트 표기법에서는 상태 벡터의 항목이 분수나 2의 제곱근과 같은 정확한 요소가 그대로 그려지도록 처리됩니다. 특정 규칙은 convention 키워드 인수를 "ket" 또는 "vector" 로 적절히 전달하여 선택할 수 있습니다:

    import math
    from qiskit.quantum_info import Statevector
    
    sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)])
    sv.draw("latex", convention="ket")
    sv.draw("latex", convention="vector")
  • 새로운 트랜스파일러 패스 EchoRZXWeylDecomposition 를 추가하여 사용자가 카탄의 분해 기능을 활용하여 임의의 2쿼비트 게이트를 에코된 RZX 게이트로 분해할 수 있도록 했습니다. 다른 트랜스파일러 패스와 함께 사용하면 임의의 회로를 동일한 유니티를 구현하는 RZX 게이트 기반 및 펄스 효율 회로로 트랜스파일링하는 데 사용할 수 있습니다.

  • 그리고 SPSAQNSPSA 옵티마이저 클래스는 이제 반복과 초기 보정 모두에 대해 가능한 한 많은 회로 평가를 일괄 처리할 수 있습니다. 이 기능은 생성자에서 max_evals_grouped kwarg를 설정하여 활용할 수 있습니다 VQE 를 사용할 때 SPSA 또는 QNSPSAoptimizer 매개변수로 설정합니다. 예를 들어,

    from qiskit.circuit.library import TwoLocal
    from qiskit.algorithms import VQE
    from qiskit.algorithms.optimizers import QNSPSA
    from qiskit.test.mock import FakeMontreal
    
    backend = FakeMontreal()
    ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz")
    qnspsa = QNSPSA(fidelity, maxiter=5)
    vqe = VQE(
        ansatz=ansatz,
        optimizer=qnspsa,
        max_evals_grouped=100,
        quantum_instance=backend,
    )
  • 이번 릴리스에서는 사용자 정의 RZX 게이트 세트를 대상으로 하는 2큐비트 게이트의 분해 방법을 소개합니다. 트랜스파일러 사용자는 basis_gates 목록에 'rzx' 을 포함시켜 {RZX(pi/2), RZX(pi/4), and RZX(pi/6)} 에 대한 디분해를 활성화할 수 있습니다 transpile(). 양자 정보 패키지 사용자는 메서드 자체의 XXDecomposer 클래스에서 찾을 수 있습니다.

  • 트랜스파일러 패스 추가 Optimize1qGatesSimpleCommutation를 추가하여 재합성 기회를 발견하기 위해 단일 큐비트 게이트를 이동하는 전략에 따라 회로를 최적화합니다.

  • max_job_tries 매개변수를 추가하여 QuantumInstance에 매개변수를 추가하여 백엔드에서 작업이 실행되는 횟수를 제한합니다. 이전에는 백엔드에서 작업이 취소되거나 오류가 발생하더라도 결과 제출 및 가져오기가 무한정 시도되었습니다. 기본값은 이제 50이며, max_job_tries=-1 을 설정하여 이전 동작을 구현할 수 있습니다. 68726821 수정.

  • 함수에 대한 latex 출력 메서드 circuit_drawer() 함수와 QuantumCircuit.draw() 메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 라텍스 서랍과 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능의 호환성을 위해 추가되었습니다.

  • 함수에 대한 "mpl" 출력 메서드 circuit_drawer() 함수와 QuantumCircuit.draw() 메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능인 "mpl" 서랍의 호환성을 위해 추가되었습니다.

  • 함수에 대한 text 출력 메서드 circuit_drawer() 함수와 QuantumCircuit.draw() 메서드는 이제 단일 비트 조건의 게이트를 포함하는 회로를 그릴 수 있습니다. 이는 텍스트 서랍과 단일 클래식 비트에서 게이트의 클래식 컨디셔닝을 지원하는 새로운 기능의 호환성을 위해 추가되었습니다.

  • 새로운 분석 트랜스파일러 패스가 추가되었습니다, GatesInBasisqiskit.transpiler.passes. 이 패스는 트랜스파일 대상에 DAGCircuit 에 구성된 베이시스의 모든 게이트가 설정되어 있는지 여부를 확인합니다. 의 모든 게이트가 구성된 기준 세트에 있는 경우 속성 세트의 "all_gates_in_basis" 속성을 True 으로 설정하고, 그렇지 않은 경우 DAGCircuit 의 모든 게이트가 구성된 기준 집합에 있는 경우 False , 그렇지 않은 경우 로 설정합니다. 예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import GatesInBasis
    
    # Instatiate Pass
    basis_gates = ["cx", "h"]
    basis_check_pass = GatesInBasis(basis_gates)
    # Build circuit
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.measure_all()
    # Run pass on circuit
    property_set = {}
    basis_check_pass(circuit, property_set=property_set)
    assert property_set["all_gates_in_basis"]
  • 두 개의 새로운 생성자 메서드가 추가되었습니다, from_heavy_hex()from_heavy_square()를 추가했습니다 CouplingMap 클래스에 이러한 생성자 메서드는 CouplingMap 에 설명된 대로 무거운 육각형 또는 무거운 정사각형 그래프를 생성하는 데 사용됩니다 , 2020.

    예를 들어,

    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_hex(5)
    cmap.draw()
    from qiskit.transpiler import CouplingMap
    
    cmap = CouplingMap.from_heavy_square(5)
    cmap.draw()
  • 이제 HHL 알고리즘은 행렬의 고유값이 음수일 때 해를 찾을 수 있습니다. 이를 활성화하기 위해 알고리즘은 이제 값의 부호를 나타내는 큐비트를 추가하고, 헬퍼 알고리즘( ExactReciprocal 이 새로운 정보를 처리하도록 업데이트되었습니다. 자세한 내용은 #6971을 참조하세요.

  • 두 개의 새로운 클래스를 추가했습니다, CompleteMeasFitterTensoredMeasFitter 모듈에 qiskit.utils.mitigation 모듈에 이 클래스는 measurement_error_mitigation_cls kwarg의 값으로만 사용됩니다 QuantumInstance 클래스의 값으로만 사용됩니다. 이러한 클래스의 인스턴스화 및 사용(또는 qiskit.utils.mitigationmeasurement_error_mitigation_cls )의 인스턴스화 및 사용은 내부 비공개 API로 취급되어야 하며 의존해서는 안 됩니다.

  • 클래스의 ListOp 클래스의 qiskit.opflow 의 클래스에는 이제 coeffs 속성이 있는데, 이 속성은 연산자 목록의 계수 목록을 반환하며, 전체 계수(ListOp.coeff)가 목록에 곱셈으로 분포되어 있습니다. 참고 ListOp 객체는 중첩될 수 있으며( oplistListOp 객체에 포함됨) 중첩될 수 있으며, 이러한 경우 coeffs 메서드가 호출되면 예외가 발생합니다. 메서드는 ListOp.coeffs 메서드는 중첩되지 않는 클래스의 coeffs 속성 메서드에 대해 편리하게 덕 타입을 지정합니다 PauliSumOp 클래스의

  • 이제 Statevector 클래스는 이제 구독할 수 있습니다. 이제 사용자는 인덱스에서 n번째 계수를 검색할 수 있습니다 Statevectorstatevec[n] 로 검색할 수 있습니다.

  • 추가 Statevector.inner 메서드를 추가하여 Statevector 인스턴스의 내부 곱을 계산하는 메서드를 추가했습니다. 예를 들어,

    statevec_inner_other = statevec.inner(other)

    statevec 의 내부 제품을 other 로 반환합니다. statevec 은 반드시 Statevector여야 하지만 other 은 Numpy 배열과 같이 Statevector배열로 구성할 수 있습니다.

  • 에 새 매개 변수 add_bits 를 추가했습니다 QuantumCircuit.measure_all(). 기본적으로 True 으로 설정되어 측정값을 저장하기 위해 큐비트 수와 동일한 크기의 새 ClassicalRegister 를 추가하여 측정값을 저장하는 이전 동작을 유지합니다. False 로 설정하면 측정값이 기존의 클래식 비트에 저장됩니다. 예를 들어 다음과 같은 기존 클래식 비트로 회로를 만든 경우입니다:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qr = QuantumRegister(2)
    cr = ClassicalRegister(2, "meas")
    circuit = QuantumCircuit(qr, cr)

    circuit.measure_all(add_bits=False) 을 호출하면 기존 클래식 레지스터 cr 가 회로에 추가된 Measurement 객체의 출력 대상으로 사용됩니다.

  • ParameterExpression 는 이제 잠재적으로 바인딩되지 않은 매개변수가 있더라도 숫자 변환을 기본 심볼 라이브러리에 위임합니다. 이를 통해 다음과 같은 표현식을 변환할 수 있습니다:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> float(x - x + 2.3)
    2.3

    에서 기본 표현식에 고정 값이 있지만 x 매개 변수가 아직 바인딩되지 않은 경우입니다.

  • 모든 최적화 프로그램에 Optimizer.minimize() 메서드를 모든 옵티마이저에 추가했습니다: Optimizer 및 파생 클래스. 이 메서드는 SciPy’s minimize() 함수의 서명을 모방하고 OptimizerResult.

    예를 들면 다음과 같습니다

    import numpy as np
    from qiskit.algorithms.optimizers import COBYLA
    
    def loss(x):
        return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3
    
    initial_point = np.array([0, 0])
    optimizer = COBYLA()
    result = optimizer.minimize(loss, initial_point)
    
    optimal_parameters = result.x
    minimum_value = result.fun
    num_function_evals = result.nfev
  • 회로 라이브러리에 PauliEvolutionGate 를 회로 라이브러리(qiskit.circuit.library)는 (합 또는 합의 합)의 시간 진화를 수행하는 게이트를 정의합니다 Paulis. 이 게이트의 합성은 다음에 의해 수행됩니다 EvolutionSynthesis 에 의해 수행되며 게이트 자체에서 분리됩니다. 현재 사용 가능한 합성 방법은 다음과 같습니다:

    예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.synthesis import SuzukiTrotter
    
    operator = SparsePauliOp.from_list([
        ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1)
    ])
    time = 0.12  # evolution time
    synth = SuzukiTrotter(order=4, reps=2)
    
    evo = PauliEvolutionGate(operator, time=time, synthesis=synth)
    
    circuit = QuantumCircuit(3)
    circuit.append(evo, range(3))
  • 새로운 기능 plot_coupling_map() 이 도입되어 기존 함수인 plot_gate_map()의 기능을 확장한 새로운 함수가 도입되었습니다: num_qubit, qubit_coordinates, coupling_map ( backend 대신)을 사용하여 임의의 큐비트 커플링 맵을 플로팅할 수 있습니다.

  • 키스킷 테라가 이제 시리얼라이제이션에 대한 초기 지원을 제공합니다 QuantumCircuitOpenQASM 3 :

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    
    qc = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    
    print(qasm3.dumps(qc))

    이번 초기 릴리스에서는 명명된 레지스터, 기본 내장 명령어(측정, 배리어, 리셋 등), 사용자 정의 게이트, 사용자 정의 명령어(서브루틴), 이번 릴리스에 도입된 새로운 제어 흐름 구성에 대한 지원이 제한됩니다:

    from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
    from qiskit import qasm3
    import math
    
    composite_circ_qreg = QuantumRegister(2)
    composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ")
    composite_circ.h(0)
    composite_circ.x(1)
    composite_circ.cx(0, 1)
    composite_circ_gate = composite_circ.to_gate()
    
    qr = QuantumRegister(2, "qr")
    cr = ClassicalRegister(2, "cr")
    qc = QuantumCircuit(qr, cr)
    with qc.for_loop(range(4)) as i:
        qc.rx(i * math.pi / 4, 0)
        qc.cx(0, 1)
    qc.barrier()
    qc.append(composite_circ_gate, [0, 1])
    qc.measure([0, 1], [0, 1])
    
    print(qasm3.dumps(qc))
  • 클래스는 QDrift 클래스가 합성 메서드로 재구성되었습니다 PauliEvolutionGate의 합성 메서드로 재구성되었습니다 TrotterizationBase.

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.synthesis import QDrift
    from qiskit.opflow import X, Y, Z
    
    qdrift = QDrift(reps=2)
    operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3)
    time = 2.345  # evolution time
    
    evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift)
    
    circuit = QuantumCircuit(3)
    circuit.append(evolution_gate, range(3))
  • QPY 직렬화는 이제 다음과 같은 global_phase 어트리뷰트를 표현할 수 있게 되었습니다 QuantumCircuitint 객체의 속성을 표현할 수 있게 되었습니다, Parameter 객체 또는 ParameterExpression 객체입니다. 이전 버전의 QPY는 global_phasefloat .

    이를 위해서는 추가 유형을 표현하기 위해 이번 릴리스에 도입된 QPY 형식 버전 2가 필요합니다.

  • 새로운 find_bit() 메서드가 추가되었습니다 QuantumCircuit 클래스에 새로운 메서드가 추가되어, 주어진 회로에서 제공된 인덱스와 레지스터를 Bit 의 인덱스와 레지스터를 조회할 수 있는 메서드가 추가되었습니다. 이 메서드는 0) Bit 의 인덱스가 포함된 두 요소 namedtuple 를 반환합니다 qubits (a의 경우 Qubit) 또는 clbits (a의 경우 Clbit)와 1) 각 회로를 포함하는 length-2 튜플 목록( Register 를 포함하는 BitBit 을 찾을 수 있는 Register 의 인덱스가 포함된 튜플 목록을 반환합니다.

    예를 들어,

    from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit
    
    reg1 = QuantumRegister(3, 'foo')
    qubit = Qubit()
    reg2 = QuantumRegister(2, 'bar')
    
    qc = QuantumCircuit(reg1, [qubit], reg2)
    
    print(qc.find_bit(reg1[2]))
    print(qc.find_bit(qubit))

    를 생성할 수 있습니다:

    BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)])
    BitLocations(index=3, registers=[])
  • 세 가지 새로운 Instruction 서브클래스가 동적 회로에서 제어 흐름 연산을 지원하기 위해 추가되었습니다: WhileLoopOp, ForLoopOpIfElseOp. 또한 두 개의 하위 클래스 BreakLoopOpContinueLoopOp가 추가되어 각각 루프 컨텍스트의 다음 반복을 중단하고 계속하는 것을 지원합니다.

    독립형으로 만들거나 Instruction로 생성하거나 각각의 메서드를 통해 기존 QuantumCircuit 인스턴스에 추가할 수 있습니다, QuantumCircuit.while_loop(), for_loop(), if_test(), if_else(), break_loop()continue_loop().

  • 기존 측정 오류 완화기를 구현하는 BaseReadoutMitigator 추상 베이스 클래스를 추가했습니다. 이러한 개체는 측정 오류를 완화하기 위한 것입니다 Counts 측정 오류가 있는 백엔드에서 회로를 실행한 후 반환되는 객체입니다.

    읽기 완화기 클래스에는 두 가지 주요 메서드가 있습니다:

    • expectation_value() 노이즈가 많은 객체에서 대각선 연산자의 완화 된 기대값과 표준 오차를 계산합니다 Counts 객체에서 계산합니다.
    • quasi_probabilities() 를 사용하여 표준 오차를 포함한 오류 완화 QuasiDistribution표준 오차를 포함한 오류를 계산합니다.

    현재 qiskit.algorithms 모듈과 QuantumInstance 클래스는 여전히 키스킷 이그니스에서 마이그레이션된 레거시 완화자를 사용한다 qiskit.utils.mitigation. 향후 릴리스에서 새로운 완화기 클래스를 사용하도록 모듈을 업그레이드하고 레거시 완화 코드는 더 이상 사용되지 않도록 할 계획입니다.

  • 추가 LocalReadoutMitigator 클래스를 추가하여 로컬 측정 오류의 측정 판독 오류 완화를 수행합니다. 로컬 측정 오류는 단일 큐비트 측정 오류의 텐서 곱으로 설명되는 오류입니다.

    이 클래스는 NN 단일 큐비트 측정 오류 할당 행렬 목록으로 초기화하거나 백엔드 속성에서 판독 오류 정보를 사용하여 백엔드에서 초기화할 수 있습니다.

    완화는 로컬 할당 행렬 반전을 사용하여 구현되며, NN -qubit 완화의 경우 O(2N)O(2^N) 의 복잡도와 QuasiDistribution 및 기대값을 사용합니다.

  • 추가 CorrelatedReadoutMitigator 클래스를 추가하여 상호 연관된 측정 오류의 측정 판독 오류 완화를 수행합니다. 이 클래스는 오류 확률을 나타내는 단일 2N×2N2^N \times 2^N 측정 오류 할당 행렬로 초기화할 수 있습니다. 완화는 할당 행렬의 반전을 통해 구현되며, 완화 복잡도는 O(4N)O(4^N)QuasiDistribution 의 완화 복잡도와 기대값을 갖습니다.

  • 어트리뷰트와 QuasiDistribution.stddev_upper_bound 속성과 kwarg를 클래스의 생성자에 추가했습니다 QuasiDistribution 클래스의 생성자에 준확률 추정치의 표준 오차를 저장하는 데 사용되는 어트리뷰트와 kwarg를 추가했습니다. 이것은 BaseReadoutMitigator 클래스에서 표준 오차를 완화된 준확률로 저장하는 데 사용됩니다.

  • 메소드를 추가했습니다 shots() 메서드에 qiskit.result.Counts 메서드를 추가하여 카운트에서 모든 결과의 합계를 반환합니다.

  • 알고리즘 클래스를 실행할 때 Grover 알고리즘 클래스를 실행할 때 최적의 전력을 알고 있고 단일 회로만 실행되는 경우, 더 이상 AmplificationProblem.is_good_state 콜백 함수를 더 이상 설정할 필요가 없으며 Grover 검색이 가장 가능성이 높은 비트 문자열을 반환합니다. 일반적으로 Grover 연산자의 최적 파워를 알 수 없는 경우, 알고리즘은 Grover 알고리즘은 다양한 거듭제곱(즉, 반복)을 검사하고 is_good_state 함수를 적용하여 좋은 비트스트링이 측정되었는지 확인합니다. 예를 들어 이제 다음과 같은 작업을 실행할 수 있습니다:

    from qiskit.algorithms import Grover, AmplificationProblem
    from qiskit.providers.aer import AerSimulator
    from qiskit.quantum_info import Statevector
    
    # Fixed Grover power: 2.
    grover = Grover(iterations=2, quantum_instance=AerSimulator())
    
    # The ``is_good_state`` argument not required here since Grover search
    # will be run only once, with a power of 2.
    problem = AmplificationProblem(Statevector.from_label("111"))
    
    # Run Grover search and print the best measurement
    result = grover.amplify(problem)
    print(result.top_measurement)  # should print 111
  • 메서드 추가 remove_cregs() 메서드를 클래스 DAGCircuit 클래스에 메서드를 추가하여 기존 레지스터 제거를 지원합니다.

  • 메서드 추가 remove_clbits() 메서드를 클래스 DAGCircuit 클래스에 메서드를 추가하여 유휴 클래식 비트 제거를 지원합니다. 제거된 비트를 참조하는 모든 기존 레지스터도 제거됩니다.

  • 새로운 메서드를 추가했습니다, replace_block_with_op()메서드를 DAGCircuit 클래스에 메서드를 추가했습니다. 이 방법은 DAG의 노드 블록을 단일 작업으로 대체하는 데 사용됩니다. 표준 예제는 ConsolidateBlocks 노드 블록을 동등한 UnitaryGate 노드로 대체하는 패스입니다.

  • 새로운 분석 트랜스파일러 패스를 추가했습니다, Collect1qRunsqiskit.transpiler.passes 모듈에 추가했습니다. 이 패스는 단일 큐비트에서 작동하는 중단 없는 게이트 시퀀스를 찾는 데 사용됩니다. 이는 Collect2qBlocksCollectMultiQBlocks 와 유사하지만 다중 큐비트 블록이 아닌 단일 큐비트 실행에 최적화되어 있습니다.

  • 이제 다양한 트랜스필레이션 내부에서 내부 회로 표현을 작업할 때 retworkx 0.10 의 새로운 기능을 사용합니다. 이로 인해 통화 속도가 약 1040% 향상될 수 있습니다 transpile 호출 속도가 약 1040% 향상되며, 최적화 수준이 높을수록 효과가 더 커집니다. 자세한 내용은 #6302를 참조하세요.

  • 트랜스파일러의 UnitarySynthesis 트랜스파일러 패스 qiskit.transpiler.passes 의 생성자에는 새로운 kwarg 가 있습니다( min_qubits). 이 값을 지정하면 단일 합성을 실행할 최소 크기 UnitaryGate 오브젝트인 int 값으로 설정할 수 있습니다. 의 UnitaryGateQuantumCircuit 가 더 적은 수의 큐비트를 사용하면 해당 패스 인스턴스에서 건너뛰게 됩니다.

  • EigensolverMinimumEigensolver 인터페이스는 이제 각각의 compute_eigenvalues()compute_minimum_eigenvalue() 메서드에서 aux_operators 매개변수에 대해 Dict[str, Optional[OperatorBase]] 유형을 지원합니다. 이 경우 보조 고유값도 aux_operators 사전에서 제공하는 것과 동일한 키로 사전에 저장됩니다. 주 연산자와 통근하지 않는 연산자에 해당하는 키는 삭제됩니다.

  • 그리고 BasisTranslator, GateDirectionCheckGateDirection 트랜스파일러 패스는 생성자에 새로운 target kwarg가 있으며, 이를 사용하여 패스의 대상으로 Target 객체를 패스의 대상으로 설정하는 데 사용할 수 있습니다. 설정된 경우 target_basis (패스의 경우) 또는 ( BasisTranslator 패스) 또는 coupling_map ( GateDirectionCheckGateDirection 패스) 인자 대신 사용됩니다.

  • 에 두 개의 트랜스파일러 스테이지를 허용합니다 QuantumInstance에 두 개의 트랜스파일러 스테이지를 허용합니다. 하나는 파라미터화된 회로용이고 다른 하나는 바인딩된 회로(즉, 자유 파라미터가 없는)에만 사용됩니다. 언바운드 및 바운드 회로에 대한 패스가 있는 양자 인스턴스가 CircuitSampler로 전달되면 샘플러는 매개변수화된 회로에 언바운드 패스를 한 번 적용하고 캐시한 다음 향후 모든 평가에 바운드 패스만 적용하려고 시도합니다.

    이를 통해 다음과 같은 변형 알고리즘을 사용할 수 있습니다 VQE 와 같은 가변 알고리즘을 사용하여 파라미터화된 회로에 대해 커스텀 패스 매니저를 한 번 실행하고, 각 반복에서 바인딩된 회로에 대해 다른 커스텀 패스 매니저를 사용하여 트랜스파일러를 다시 한 번 실행할 수 있습니다. 모든 패스가 매개변수화된 회로를 지원하는 것은 아니므로(예를 들어 Optimize1qGatesDecomposition 는 바인딩된 회로 파라미터에서만 작동합니다.)

    예를 들어, 이 기능을 사용하면 VQE에서 다음과 같이 펄스 효율적인 CX 분해를 사용할 수 있습니다

    from qiskit.algorithms import VQE
    from qiskit.opflow import Z
    from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib
    from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap
    from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
    from qiskit.transpiler.passes import (
        Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition,
        RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator
    )
    from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition
    from qiskit.test.mock import FakeBelem
    from qiskit.utils import QuantumInstance
    
    # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend
    backend = FakeBelem()
    
    # Build the pass manager for the parameterized circuit
    rzx_basis = ['rzx', 'rz', 'x', 'sx']
    coupling_map = CouplingMap(backend.configuration().coupling_map)
    config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map)
    pre = level_1_pass_manager(config)
    
    # Build a pass manager for the CX decomposition (works only on bound circuits)
    post = PassManager([
        # Consolidate consecutive two-qubit operations.
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']),
    
        # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates.
        EchoRZXWeylDecomposition(backend),
    
        # Attach scaled CR pulse schedules to the RZX gates.
        RZXCalibrationBuilderNoEcho(backend),
    
        # Simplify single-qubit gates.
        UnrollCustomDefinitions(std_eqlib, rzx_basis),
        BasisTranslator(std_eqlib, rzx_basis),
        Optimize1qGatesDecomposition(rzx_basis),
    ])
    
    quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post)
    
    vqe = VQE(quantum_instance=quantum_instance)
    result = vqe.compute_minimum_eigenvalue(Z ^ Z)
  • 외부 패키지에 포함된 대체 합성 기술을 트랜스파일러 패스와 함께 원활하게 사용할 수 있는 새로운 단일 합성 플러그인 인터페이스가 도입되었습니다 UnitarySynthesis 트랜스파일러 패스. 사용자는 호출할 때 사용할 플러그인을 선택할 수 있습니다 transpile()unitary_synthesis_method 를 호출할 때 사용할 플러그인을 선택할 수 있습니다. 설치된 플러그인의 전체 목록은 qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() 함수에서 확인할 수 있습니다. 예를 들어 special_synth 라는 이름의 합성 플러그인이 포함된 패키지를 설치한 경우 이 플러그인을 함께 사용할 수 있습니다:

    from qiskit import transpile
    
    transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)

    이렇게 하면 모든 UnitarySynthesisspecial_synth 플러그인을 내보내는 외부 패키지에 포함된 메서드로 대체합니다.

    플러그인 인터페이스는 키스킷 외부의 패키지가 합성 플러그인을 포함한다고 광고할 수 있는 setuptools 진입점을 중심으로 구축되었습니다. 새 플러그인 작성에 대한 자세한 내용은 qiskit.transpiler.passes.synthesis.plugin 모듈 문서를 참조하세요.

  • 새로운 트랜스파일러 패스가 추가되었습니다, VF2Layout. 이 패스는 레이아웃 할당 문제를 하위 그래프 동형화 문제로 모델링하고 rustworkx의 VF2 알고리즘 구현을 사용하여 완벽한 레이아웃(추가 라우팅이 필요하지 않은 레이아웃)이 존재하는 경우 이를 찾습니다. 이 새로운 패스가 노출하는 기능은 기존 패스와 매우 유사하지만 CSPLayout 와 매우 유사하지만 VF2Layout 훨씬 더 빠릅니다.

알려진 문제점

  • "latex" 서랍의 "ket" 규칙은 Statevector.draw() 는 큐비트로만 구성된 상태에만 유효합니다. 일부 공간이 2보다 큰 상태를 사용하는 경우 convention="vector" 을 전달하거나 다른 서랍을 사용해야 합니다.

  • OpenQASM 3 내보내기 기능은 베타 상태이며, 키스킷 테라의 일부 기능은 QuantumCircuit 의 일부 기능은 아직 지원되지 않습니다. 특히, 기존 매개 변수를 사용하여 사용자 지정 서브루틴을 내보내려고 하면 오류가 표시될 수 있으며, 펄스 보정된 연산을 OpenPulse.

  • 를 실행할 때 BasisTranslator 인수를 target 로 설정하여 단독으로 실행할 때 Target 객체에서 일부 단일 큐비트 게이트가 겹치지 않는 큐비트 세트에만 적용될 수 있는 경우, 출력 회로가 큐비트에 대해 허용되지 않는 연산을 잘못 포함할 수 있습니다 Target. 예를 들어, 달리는 경우

    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    
    from qiskit.transpiler import PassManager, Target, InstructionProperties
    from qiskit.transpiler.passes import BasisTranslator
    
    gmap = Target()
    
    # U gate in qubit 0.
    theta = Parameter('theta')
    phi = Parameter('phi')
    lam = Parameter('lambda')
    u_props = {
        (0,): InstructionProperties(duration=5.23e-8, error=0.00038115),
    }
    gmap.add_instruction(UGate(theta, phi, lam), u_props)
    
    # Rz gate in qubit 1.
    phi = Parameter("phi")
    rz_props = {
        (1,): InstructionProperties(duration=0.0, error=0),
    }
    gmap.add_instruction(RZGate(phi), rz_props)
    
    # X gate in qubit 1.
    x_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(XGate(), x_props)
    
    # SX gate in qubit 1.
    sx_props = {
        (1,): InstructionProperties(
            duration=3.5555555555555554e-08, error=0.00020056469709026198
        ),
    }
    gmap.add_instruction(SXGate(), sx_props)
    
    cx_props = {
        (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115),
        (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115),
    }
    gmap.add_instruction(CXGate(), cx_props)
    
    bt_pass = BasisTranslator(sel, target_basis=None, target=gmap)
    
    qc = QuantumCircuit(2)
    qc.iswap(0, 1)
    output = bt_pass(qc)

    outputRZGateSXGate 를 가질 수 있지만, 이는 금지되어 있습니다. 이 문제를 해결하려면 일반적으로 기본 번역기를 두 번째로 실행하면 됩니다(예 output = bt_pass(output) )를 사용하여 이를 수정할 수 있습니다. 이것은 함수 실행의 출력에 영향을 미치지 않으며 transpile() 함수를 실행하는 출력에는 영향을 미치지 않으며 패스 자체를 실행하는 경우에만 문제가 됩니다.

업그레이드 주의사항

  • 이 버전부터 from qiskit import * 은 하위 모듈을 가져오지 않고 선택한 개체 목록만 가져옵니다. from qiskit import * 을 사용하여 현재 네임스페이스에 속하지 않는 객체를 참조하는 기존 코드가 손상될 수 있습니다. 참고로 import * 은 잘못된 관행으로 간주되며 프로덕션 코드에서 사용해서는 안 됩니다. 키스킷은 이러한 나쁜 관행의 영향을 완화하기 위해 qiskit/__init__.py 에서 __all__ 을 설정합니다. 코드에서 name '<something>' is not defined 이 발생하면 from qiskit import <something> 을 추가하고 다시 시도하세요.

  • 최적화 레벨 0, 1, 2, 3에 대한 사전 설정 패스 관리자는 다음과 같이 생성됩니다 level_0_pass_manager(), level_1_pass_manager(), level_2_pass_manager()level_3_pass_manager() 에 의해 각각 생성된 프리셋 패스 매니저는 더 이상 무조건 TimeUnitConversion. 이전에는 프리셋 패스 관리자가 트랜스파일러와 회로에 대한 입력에 관계없이 항상 이 패스를 실행했습니다. 이제 이 패스는 scheduling_method 파라미터가 설정되어 있거나 회로에 명령어가 포함된 경우에만 실행됩니다 Delay 명령어가 포함되어 있고 instruction_durations 파라미터가 설정된 경우에만 실행됩니다. 이 변경은 런타임 성능을 위해 이루어졌습니다 transpile() 을 실행하는 경우 지연, 타이밍 또는 스케줄링이 사용되지 않고 게이트 수가 많은 회로에서 TimeUnitConversion 가 트랜실레이션에서 가장 큰 병목 현상이 될 수 있기 때문입니다.

  • BIPMapping 의 기본 방법은 이제 depth 가 아닌 balanced 입니다. 이 새로운 목표는 일반적으로 회로 깊이와 게이트 오류를 모두 고려하기 때문에 더 나은 결과를 얻을 수 있습니다.

  • 클래스의 sort_parameters_by_name VQE 클래스는 키스킷 테라 0.18 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 새로운 매개변수 순서가 더 자연스러운 정렬 순서이기 때문에 대안이 제공되지 않습니다.

  • 회로 서랍 QuantumCircuit.draw()circuit_drawer()latex 옵션과 함께 사용하면 이제 파일 확장자가 지정된 형식으로 이미지가 저장됩니다(파일 이름이 제공된 경우). 이전에는 항상 PNG 형식으로 저장했습니다. 이제 이미지 형식을 알 수 없는 경우 ValueError 을 반환합니다. 이는 이미지를 다른 형식으로 더 쉽게 저장할 수 있도록 하기 위한 것입니다.

  • 핵심 종속성 retworkx 의 버전 요구 사항이 0.9 에서 0.10.1 으로 상향 조정되었습니다. 이를 통해 다양한 트랜스필레이션 패스에서 여러 가지 성능 향상이 가능합니다.

  • 0.15.0 릴리스의 일부로 더 이상 사용되지 않는 condition kwarg는 DAGCircuit.apply_operation_back()DAGCircuit.apply_operation_front(). 대신 추가되는 인스턴스에 condition 속성을 Instruction 인스턴스에 추가되는 DAGCircuit 를 사용하여 Instruction.c_if().

  • DAGCircuit.extend_back() 메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 동일한 기능을 제공하는 DAGCircuit.compose() 메서드를 사용하면 보다 일반적이고 동일한 기능을 제공할 수 있습니다.

  • DAGCircuit.compose_back() 메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 동일한 기능을 제공하는 DAGCircuit.compose() 메서드를 사용하면 보다 일반적이고 동일한 기능을 제공할 수 있습니다.

  • edge_map kwarg의 DAGCircuit 메서드 compose() 가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 이 방법은 이전에 edge_map 에서 제공한 사전 매핑을 사용하는 대신 qubitsclbits kwarg를 사용하여 작성할 비트의 위치 순서를 지정합니다.

  • DAGCircuit.twoQ_gates() 메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 DAGCircuit.two_qubit_ops() 를 사용해야 합니다.

  • DAGCircuit.threeQ_or_more_gates() 메소드가 제거되었습니다. 이 기능은 원래 0.13.0 릴리스에서 더 이상 사용되지 않습니다. 대신 DAGCircuit.multi_qubit_ops() 메서드를 사용해야 합니다.

  • 클래스의 생성자에 대한 첫 번째 위치 인수에 대한 명명된 액세스 SingleQubitUnitaryu 클래스의 생성자 첫 번째 위치 인수에 대한 명명된 액세스가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 대신 첫 번째 위치 인수는 unitary_matrix 이라는 이름을 사용하여 설정할 수 있습니다(또는 이름 대신 위치로만 설정).

  • 메서드의 첫 번째 위치 인자에 대한 네임드 액세스 QuantumCircuit 메서드 squu 의 첫 번째 위치 인자에 대한 명명된 액세스가 제거되었습니다. 이 기능은 원래 0.14.0 릴리스에서 더 이상 사용되지 않습니다. 대신 첫 번째 위치 인수는 unitary_matrix 이라는 이름을 사용하여 설정할 수 있습니다(또는 이름 대신 위치로만 설정).

  • qiskit.qasm.node 모듈의 QASM 노드 클래스의 qasm() 메서드에 대해 사용되지 않는 procnested_scope kwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다.

  • qiskit.qasm.node 모듈의 QASM 노드 클래스의 latex() 메서드에 대해 사용되지 않는 procnested_scope kwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다.

  • qiskit.qasm.node 모듈의 QASM 노드 클래스의 real() 메서드에 대해 사용되지 않는 procnested_scope kwarg가 제거되었습니다. 이 기능은 원래 0.15.0 릴리스에서 사용되지 않았습니다.

  • 의 출력은 Statevector.draw()"latex" 의 출력은 이제 큐비트로만 구성된 상태를 플로팅하는 경우 새로운 "ket" 규칙을 따릅니다. 케트 레이블을 표시하고 0이 아닌 요소만 표시하기 때문에 특히 교육적인 맥락에서 출력을 더 명확하게 읽을 수 있도록 변경되었습니다.

  • 실행 시 execute() 와 함께 BackendV1 백엔드로 실행할 때 shots, max_credits, meas_level, meas_return , memory_slot_size 의 기본값은 이제 타겟 백엔드의 options 속성에 설정된 기본값이 됩니다. 이전에는 이러한 기본값이 레거시 백엔드로 호출할 때 기본값과 일치하도록 설정되었습니다 execute()BaseBackend 를 호출할 때 기본값과 일치하도록 설정되었습니다. 예를 들어,

    from qiskit.test.mock import FakeMumbai
    from qiskit import QuantumCircuit, execute
    
    circuit = QuantumCircuit(2)
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    backend = FakeMumbai()
    backend.set_options(shots=4096)
    execute(qc, backend)

    이제 4096 샷으로 실행됩니다. 이전 릴리스에서는 1024 로 실행되었지만.

  • Matplotlib 의 최소 지원 버전이 2.1.0 에서 3.3.0 로 상향되었습니다. 이제 Matplotlib - 기반 시각화 기능(예: 'mpl' 백엔드)을 사용하는 경우 Matplotlib 3.3.0 을 설치해야 합니다 circuit_drawer() 함수 또는 plot_bloch_vector() 함수를 사용하는 경우 첫 번째는 Matplotlib 의 최신 버전에서 이전 릴리즈와 호환되던 3D 시각화 관련 API 사용이 중단되었기 때문이고, 두 번째는 matplotlib의 업스트림 종속성으로 인해 테스트 진행을 더욱 어렵게 만드는 호환성 문제로 인해 Matplotlib 의 이전 버전을 설치하는 것이 점점 더 어려워지고 있기 때문입니다.

  • 의 난수 생성기 내부 사용이 조정되었습니다 random_circuit() 의 난수 생성기 내부 사용이 조정되어 시드가 고정되어 있어도 이전 버전과 출력이 변경됩니다. 이는 사용되는 큐비트 수에 따른 런타임 스케일링을 크게 개선하기 위해 수행되었습니다. 이전 버전에서 동일한 출력에 의존하는 경우 이전 버전에서 생성된 임의 회로를 새 릴리스에서 다시 생성하는 대신 qpy_serialization.dump() 을 사용하여 저장한 다음 qpy_serialization.load() 을 사용하여 저장된 회로를 로드하는 것이 좋습니다.

  • * (__mul__)의 경우 dot() 메서드의 경우 @ (__matmul__) compose() 메서드( BaseOperator 의 모든 연산자 클래스의 부모인 qiskit.quantum_info 와 같은 클래스 포함) OperatorPauli)는 더 이상 지원되지 않습니다. 이러한 연산자의 사용은 이전에 0.17.0 릴리스에서 더 이상 사용되지 않았습니다. 대신 dot()compose() 메서드를 직접 사용하거나 & 연산자(__and__)를 사용할 수 있습니다 compose(). 예를 들어, 이전에 같은 연산자를 사용했다면:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    
    new_op = op_a @ op_b

    로 변경해야 합니다:

    from qiskit.quantum_info import random_hermitian
    
    op_a = random_hermitian(4)
    op_b = random_hermitian(4)
    new_op = op_a.compose(op_b)

    또는:

    new_op = op_a & op_b
  • 펄스 프로그램 명령어의 피연산자에 파라미터를 할당하는 다양한 방법이 제거되었으며, 키스킷 테라 0.17 에서 더 이상 사용되지 않습니다. 주요 내용은 다음과 같습니다.

    • pulse.Instructionassign() 메서드입니다.
    • assign() 메서드, Channel 의 기반이 되는 AcquireChannel, SnapshotChannel, MemorySlotRegisterSlot.
    • pulse.Gaussian, pulse.GaussianSquare, pulse.Drag , pulse.Constant 의 기반이 되는 ParametricPulseassign()assign_parameters() 메서드입니다.

    이러한 매개변수는 펄스 프로그램(pulse.Schedulepulse.ScheduleBlock)에서 지정해야 하며 펄스 프로그램 명령의 피연산자가 아닙니다.

  • pulse.Instructionflatten() 방법과 qiskit.pulse.Schedule 는 키스킷 테라 0.17 의 사용 중단 공지에 따라 제거되어 더 이상 존재하지 않습니다. 이 변환은 qiskit.pulse.transforms.canonicalization.flatten() 에서 독립형 함수로 정의됩니다.

  • qiskit.pulse.interfaces.ScheduleComponent 는 키스킷 테라 0.15 의 사용 중단 공지에 따라 제거되어 더 이상 존재하지 않습니다. 대체 수업은 제공되지 않습니다.

  • 레거시 펄스 드로어 인수가 pulse.Waveform.draw() 에서 제거되었습니다, Schedule.draw()ScheduleBlock.draw() 에서 제거되었으며, 키스킷 테라 0.16 의 사용 중단 공지에 따라 더 이상 존재하지 않습니다. 이제 이러한 그리기 메서드는 V2 펄스 드로어 인수만 지원합니다. 자세한 내용은 메서드 문서를 참조하세요.

  • 키스킷 테라 0.14 의 사용 중단 공지에 따라 qiskit.pulse.reschedule 모듈이 제거되었으며 이 가져오기 경로는 더 이상 존재하지 않습니다. 대신 qiskit.pulse.transforms 대신 사용하세요.

  • 키스킷 테라 0.17 의 사용 중단 공지에 따라 보호된 메서드 Schedule._children() 가 제거되고 보호된 인스턴스 변수로 대체되었습니다. 이것은 이제 공개 속성으로 제공됩니다 Schedule.children.

  • 타임슬롯 관련 메서드와 프로퍼티가 제거되어 더 이상 존재하지 않습니다 ScheduleBlock 키스킷 테라의 사용 중단 공지에 따라 0.17. 이 표현에는 인스트럭션 시간 개념이 없으므로 t0, 시간 슬롯 정보는 변환된 후 Schedule. 이 변환 이후 해당 속성이 제공되었지만 더 이상 지원되지 않습니다. 다음 속성이 제거됩니다:

    • timeslots
    • start_time
    • stop_time
    • ch_start_time
    • ch_stop_time
    • shift
    • insert
  • 정렬 펄스 스케줄 변환은 키스킷 테라의 사용 중단 공지 0.17 에 따라 제거되었으며 더 이상 존재하지 않습니다. 이러한 변환은 일정 블록의 AlignmentKind 컨텍스트에서 통합 및 구현됩니다. 다음과 같은 명시적 변환 함수가 제거됩니다:

    • qiskit.pulse.transforms.align_equispaced
    • qiskit.pulse.transforms.align_func
    • qiskit.pulse.transforms.align_left
    • qiskit.pulse.transforms.align_right
    • qiskit.pulse.transforms.align_sequential
  • 키스킷 테라의 사용 중단 공지 0.17 에 따라 중복 펄스 빌더 명령이 제거되었으며 더 이상 존재하지 않습니다. pulse.builder.call_schedulepulse.builder.call_circuitpulse.builder.call().

  • 모든 키스킷 사용 중단 경고가 표시되게 했던 내부 필터 재정의가 제거되었습니다. 즉, 이제 이 동작은 더 이상 사용되지 않는 표준 Python 동작으로 되돌아가고, 메인 스크립트 파일, 인터프리터 세션 또는 Jupyter 노트북의 코드에 의해 트리거된 경우에만 DeprecationWarning 이 표시되어야 합니다. 내부 키스킷 함수가 더 이상 사용되지 않는 동작을 호출하는 경우 사용자에게 경고가 표시되지 않습니다. 라이브러리를 작성하는 경우 기본 경고 필터를 비활성화한 상태로 실행하거나 항상 비활성화한 상태로 실행되는 테스트를 만들어야 합니다. 자세한 내용은 경고에 대한 Python 문서, 특히 사용 중단 테스트 섹션을 참조하세요.

  • 특정 경고는 여러 곳에서 트리거되더라도 한 번만 발령되곤 했습니다. 이 동작이 제거되었으므로 더 이상 사용되지 않는 함수를 호출할 경우 이전보다 더 많은 경고가 표시될 수 있습니다. 더 이상 사용되지 않는 함수 호출은 향후 키스킷 릴리스에서 제거될 예정이므로 제안된 버전으로 변경해야 합니다.

  • 더 이상 사용되지 않는 qiskit.schemas 모듈과 스키마에서 jsonschema 유효성 검사기를 빌드하는 qiskit.validation 모듈이 제거되었습니다. 이 기능은 0.17.0 릴리스에서 더 이상 사용되지 않으며 IBM 퀀텀 API 페이로드 스키마 전용 리포지토리로 대체되었습니다.

    이전에 qiskit.schemas 에 패키징된 스키마 파일 또는 그 위에 구축된 유효성 검사기에 의존하고 있었다면 해당 저장소를 사용하고 그 저장소에 포함된 스키마 파일에서 유효성 검사기를 만들어야 합니다.

  • qiskit.qobj.validate_qobj_against_schemaqiskit.qobj.common.validator 함수와 메서드의 validate kwarg QasmQobj.to_dict(), PulseQobj.to_dict()Qobj.to_dict() 함수가 제거되었습니다. 이는 0.17.0 릴리스에서 더 이상 사용되지 않습니다. 이러한 함수를 사용하는 경우 IBM Quantum API 페이로드 스키마 전용 리포지토리의 jsonschema 파일을 사용하여 Qobj 개체에 대한 jsonschema 유효성 검사 함수를 수동으로 빌드해야 합니다.

  • fastjsonschemajsonschema 패키지는 더 이상 qiskit-terra의 요구 사항 목록에 없습니다. Jsonschema의 내부 사용이 제거되었으며 더 이상 qiskit-terra를 사용할 필요가 없습니다.

  • 함수에서 발생하는 예외는 assemble() 함수에 잘못된 매개변수가 전달되었을 때 발생하는 예외가 PulseQobjSchemaValidationError 에서 QiskitError. 이는 SchemaValidationError 클래스가 더 이상 사용되지 않는 나머지 qiskit.schemasqiskit.validation 과 함께 제거되었기 때문에 필요했습니다. 이것은 또한 이미 오류를 발생시키고 있는 assemble() 에서 이미 발생했던 QiskitError.

  • 트랜스파일러 최적화 레벨 3의 기본 라우팅 패스 및 레이아웃 패스가 사용하도록 변경되었습니다 SabreSwapSabreLayout 로 각각 변경되었습니다. 이는 세이버 패스를 사용하는 것이 StochasticSwapDenseLayout를 기본값으로 사용하는 것보다 더 나은 결과를 얻을 수 있기 때문입니다. 이 변경 사항은 실행 시 결과의 품질을 개선합니다 transpile() 또는 execute()optimization_level 함수를 3 으로 설정하여 실행할 때 결과의 품질이 향상됩니다. 일반적으로 개선되었지만 어떤 이유로든 이전 동작을 유지해야 하는 경우 routing_method="stochastic"layout_method="dense" 을 호출할 때 명시적으로 설정하면 됩니다 transpile()optimization_level=3 로 대체할 수 있습니다.

  • 의 반환 유형이 pauli_basis() 의 반환 유형이 PauliTable 에서 PauliList 로 변경될 예정입니다. 새 동작으로 즉시 전환하려면 키워드 인수 pauli_list=True 를 전달합니다.

  • 속성의 name 속성이 SingleQubitUnitary 게이트 클래스의 속성이 unitary 에서 squ 로 변경되었습니다. 이는 두 게이트가 동일하지 않고 구현이 동일하지 않기 때문에(그리고 서로 바꿔서 사용할 수 없기 때문에) UnitaryGate 클래스 이름( unitary )과 충돌을 피하기 위해 필요했습니다.

  • 설치에 필요한 Symengine의 최소 버전이 0.8.0 으로 증가했습니다. 이는 실행 시 numpy.float16numpy.float32 값 처리와 관련된 일부 문제를 수정하기 위해 필요했습니다 bind() 에 매개변수를 바인딩하기 위해 ParameterExpression.

  • 새로운 종속성 하역기가 요구 사항 목록에 추가되었습니다. 이것은 단일 합성 플러그인 인터페이스를 빌드하는 데 사용되므로 qiskit-terra에 필요합니다.

지원 중단 노트

  • gate 속성 및 초기화 매개변수인 qiskit.transpiler.passes.Decompose 는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 단일 게이트 대신 새 매개변수 gates_to_decompose 에 게이트 이름 목록을 전달해야 합니다. 새로운 양식에서는 분해 대상으로 둘 이상의 게이트를 선택할 수 있어 더 유연하고 게이트 집합을 분해하기 위해 패스를 여러 번 다시 실행할 필요가 없기 때문에 이러한 작업을 수행했습니다.

  • 보정과 관련하여 트랜스파일러 패스가 크게 개편되었습니다. 가져오기 경로입니다:

    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder
    from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEcho

    는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 가져오기 경로입니다:

    from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templates

    도 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 새 가져오기 경로를 사용해야 합니다:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho
    from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates
  • 클래스는 DAGNode 클래스는 독립형 클래스로서 더 이상 사용되지 않으며 앞으로는 부모 클래스인 DAGOpNode, DAGInNodeDAGOutNode. 이 사용 중단의 일부로, 다음 kwarg 및 관련 어트리뷰트도 사용 중단됩니다 DAGNode 도 더 이상 사용되지 않습니다: type, op, 및 wire 입니다.

  • 의 생성자에서 RZXCalibrationBuilder 의 생성자에서 백엔드를 첫 번째 위치 인자로 전달하거나 backend kwarg라는 이름으로 전달하는 것은 더 이상 사용되지 않으며 향후 릴리스에서 더 이상 작동하지 않습니다. 대신 a InstructionScheduleMapinstruction_schedule_map kwarg에 직접 전달해야 하며, 각 큐비트에 대한 채널 이름 목록은 qubit_channel_mapping 에 직접 전달해야 합니다. 예를 들어 패스를 다음과 같이 호출하는 경우입니다:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.test.mock import FakeMumbai
    
    backend = FakeMumbai()
    cal_pass = RZXCalibrationBuilder(backend)

    대신 다음과 같이 호출해야 합니다:

    from qiskit.transpiler.passes import RZXCalibrationBuilder
    from qiskit.test.mock import FakeMumbai
    
    backend = FakeMumbai()
    inst_map = backend.defaults().instruction_schedule_map
    channel_map = self.backend.configuration().qubit_channel_mapping
    cal_pass = RZXCalibrationBuilder(
        instruction_schedule_map=inst_map,
        qubit_channel_mapping=channel_map,
    )

    이 변경은 일반적으로 백엔드 객체는 피클 직렬화가 불가능하고 여러 회로를 한 번에 컴파일할 때 내부의 여러 프로세스와 함께 사용하면 transpile() 내부의 여러 프로세스와 함께 사용할 때 깨질 수 있기 때문입니다.

  • 클래스의 label 속성 MCMT 및 하위 클래스 MCMTVChain 는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 따라서 두 클래스의 생성자에 있는 label kwarg도 메서드의 label kwarg와 함께 더 이상 사용되지 않습니다 MCMT.control(). 현재 label 속성은 둘 이상의 타겟 큐비트로 구성된 경우 제어 대상의 이름을 지정하는 데 사용되지만, 이는 사용자가 지정할 수 있는 것이 아니며 잘 알려진 연산 이름을 사용할 경우 잘못된 MCMT 게이트가 발생할 수 있습니다. 사용 중단 후에는 label 속성을 더 이상 사용자가 지정할 수 없습니다. 그러나 다음을 통해 제어 대상의 생성된 이름을 얻을 수 있습니다

    MCMT.data[0][0].base_gate.name
  • 클래스의 subgraph() 메서드는 CouplingMap 클래스의 메서드는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 reduce() 메서드를 사용해야 하는데, 출력의 노드 목록 순서를 유지한다는 점을 제외하면 동일한 작업을 수행합니다 CouplingMap ( subgraph() 은 목록 순서를 유지하지 않음).

  • 의 인스턴스 생성 InstructionSetcircuit_cregs 키워드 인수를 사용하여 인스턴스를 생성하는 것은 더 이상 사용되지 않습니다. 일반적으로 이러한 클래스는 사용자가 직접 생성할 필요는 없지만(내부적으로 사용됨), 필요한 경우 resource_requester 키워드 인자로 호출 가능을 전달해야 합니다. 예를 들어,

    from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet
    from qiskit.circuit.exceptions import CircuitError
    
    def my_requester(bits, registers):
        bits_set = set(bits)
        bits_flat = tuple(bits)
        registers_set = set(registers)
    
        def requester(specifier):
            if isinstance(specifer, Clbit) and specifier in bits_set:
                return specifier
            if isinstance(specifer, ClassicalRegster) and specifier in register_set:
                return specifier
            if isinstance(specifier, int) and 0 <= specifier < len(bits_flat):
                return bits_flat[specifier]
            raise CircuitError(f"Unknown resource: {specifier}")
    
        return requester
    
    my_bits = [Clbit() for _ in [None]*5]
    my_registers = [ClassicalRegister(n) for n in range(3)]
    
    InstructionSet(resource_requester=my_requester(my_bits, my_registers))
  • qiskit-ignis 에서 측정 완화 클래스 qiskit.ignis.mitigation.CompleteMeasFitterqiskit.ignis.mitigation.TensoredMeasFitter 을 생성자의 measurement_error_mitigation_cls kwarg 값으로 사용하는 것은 더 이상 사용되지 않습니다 QuantumInstance 클래스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 qiskit.utils.mitigation, CompleteMeasFitterTensoredMeasFitter 를 사용해야 합니다. qiskit-ignis 프로젝트는 현재 사용되지 않으며 가까운 시일 내에 더 이상 지원되지 않을 예정이므로 이러한 조치가 필요했습니다. qiskit-ignis 의 동급 클래스와 달리 다음 버전의 qiskit.utils.mitigation 의 버전은 함께 사용할 때만 지원되며 QuantumInstance (즉, measurement_error_mitigation_cls kwarg를 사용하는 인스턴스가 아닌 클래스로서)와 함께 사용할 때만 지원되며 독립적으로 사용하기 위한 것이 아닙니다.

  • Optimizer.optimize() 모든 옵티마이저(Optimizer 및 파생 클래스)는 이제 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 Optimizer.minimize() 메서드를 사용하여 SciPy’s minimize() 함수의 서명을 모방해야 합니다.

    현재 최적화 호출을 최소화 호출로 바꾸려면 다음을 수행하면 됩니다

    xopt, fopt, nfev = optimizer.optimize(
        num_vars,
        objective_function,
        gradient_function,
        variable_bounds,
        initial_point,
    )

    다음 항목으로 바꾸십시오.

    result = optimizer.minimize(
        fun=objective_function,
        x0=initial_point,
        jac=gradient_function,
        bounds=variable_bounds,
    )
    xopt, fopt, nfev = result.x, result.fun, result.nfev
  • qiskit.util 모듈을 가져오면 이제 DeprecationWarning. 대신 사용자는 다음에서 동일한 기능을 모두 가져와야 합니다 qiskit.utils. util 모듈은 Terra 0.17 이후 더 이상 사용되지 않지만 이전에는 경고를 표시하지 않았습니다. 테라 0.20 에서 삭제됩니다.

  • table 속성은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 그 이유는 SparsePauliOp 가 내부적으로 PauliTable 대신 PauliList 을 사용하도록 업데이트되었기 때문입니다. 이는 성능을 크게 개선하기 위한 것입니다. 이제 다음을 사용하여 PauliList 데이터에 액세스해야 합니다 SparsePauliOp.paulis 속성을 사용하여 데이터에 액세스해야 합니다.

버그 수정

  • 많은 레이아웃 메서드가 3개 이상의 큐비트 게이트를 무시하여 예기치 않은 레이아웃 할당 결정을 내리던 버그가 수정되었습니다. 트랜스파일러 패스 Unroll3qOrMore 가 호출될 때 모든 사전 설정 패스 관리자에서 레이아웃 패스보다 먼저 실행됩니다 transpile() 가 호출될 때 실행됩니다. 수정 #7156.

  • 이제 분해된 회로는 조립된 회로의 캘리브레이션을 상속받습니다 QasmQobj 및 실험을 상속합니다. 5348 수정.

  • 인스턴스의 ansatz 또는 optimizer 속성을 VQE 속성을 None 로 설정하면 버그가 발생하는 문제를 수정했습니다. 자세한 내용은 #7093을 참조하세요.

  • 의 추가를 수정했습니다 PauliListqargs 로 수정했습니다. 피연산자의 큐비트 수가 다른 경우 런타임 오류를 발생시키는 데 사용되는 메서드입니다.

  • 지원되지 않는 게이트의 클래스로 그라데이션을 계산하려고 할 때 오류가 발생하는 문제를 수정했습니다 CircuitGradient 클래스로 그라데이션을 계산하려고 할 때 오류가 발생하는 문제를 수정했습니다. 이 버그 수정은 주어진 게이트를 요청된 그라데이션 메서드에 대해 지원되는 게이트 집합으로 트랜스파일합니다. 6918 수정.

  • 오류 완화 사용 시 보정 결과 제거 execute() 메서드에서 QuantumInstance. 수정 #7129.

  • 실행 시 더 이상 사용되지 않는 경고가 표시되는 문제를 수정했습니다 QuantumCircuit.draw() 또는 circuit_drawer() sympy 1.9 가 설치된 상태에서 Sympy 함수 expr_free_symbols() 를 언급할 때 표시되는 사용 중단 경고를 수정했습니다. 회로 서랍은 이전에 기호 상수의 인스턴스를 찾을 때 이 방법을 사용했습니다.

  • mpl 회로 서랍에 대한 ax kwarg 및 style kwarg의 figwidth 옵션이 제대로 확장되지 않던 문제를 수정했습니다. 이제 사용자는 Matplotlib 하위 플롯에서 mpl 회로 드로어에 ax 를 전달하면 해당 하위 플롯의 경계 내에 회로가 그려집니다. 또는 style dict kwarg에서 figwidth (인치)를 설정하면 도면이 설정한 너비(인치)로 조정됩니다. 수정 #6367.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. latex 서랍 옵션을 사용하여 레지스터 대신 클래식 비트를 대상으로 하는 measure 명령어를 표시할 때 서랍이 실패합니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. mpl, latex, text 의 세 가지 서랍 옵션 중 하나에서 레지스터가 없는 클래식 비트에 조건이 지정된 클래식 조건의 게이트가 발생하면 서랍이 실패합니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. mpl, latex, text 의 3가지 서랍 옵션 중 하나에서 클래식 조건이 있는 게이트가 measure 와 동일한 클래식 비트에 조건이 있고 측정값이 목표로 하는 비트에 레지스터가 없는 경우 서랍은 실패합니다.

  • C3SXGate 이제 올바른 분해 및 행렬 표현이 가능합니다. 이전에는 의도한 SXGate().control(3) 이 아닌 SdgXGate().control(3) 과 동일했습니다.

  • qiskit.test.mock.utils.ConfigurableFakeBackend 의 회원 namebackend_name 로 변경되었습니다. 이것은 부모 추상으로부터 상속된 name() 메서드와의 충돌을 피하기 위한 것입니다 BackendV1 클래스에서 상속된 메서드와의 충돌을 피하기 위해서입니다. 이렇게 하면 ConfigurableFakeBackend 이 예상되는 모든 것과 호환됩니다 BackendV1 객체를 기대하는 모든 것과 호환됩니다. 그러나 이전에 name 속성을 직접 사용했다면 이제 메서드로 호출하거나 backend_name 속성에 액세스해야 합니다.

  • 회로를 포함하는 회로에서 QuantumCircuit.decompose() 를 포함하는 회로에서 Instruction 누구 definition 속성이 비어 있는 회로를 호출하면 명령어가 0 연산으로 분해되지 않고 그대로 유지되는 문제를 수정했습니다. 예를 들어 회로가 있습니다:

    from qiskit.circuit import QuantumCircuit
    empty = QuantumCircuit(1, name="decompose me!")
    circuit = QuantumCircuit(1)
    circuit.append(empty.to_gate(), [0])

    이전에는 circuit.decompose() 으로 전화해도 회로가 변경되지 않았습니다. 이제 분해는 empty 을 0개의 인스트럭션으로 올바르게 분해합니다. 자세한 내용은 #6997을 참조하세요.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. mpl 또는 latex 옵션을 사용하여 기존 condition 이 포함된 measure 인스트럭션을 표시하는 경우, condition 정보가 measure 표시를 덮어쓰는 경우가 있습니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. mpl 서랍은 16진수 표기법을 사용하여 condition 값을 표시하는 반면, textlatex 서랍은 10진수 표기법을 사용했습니다. 이제 세 서랍 모두 16진법 표기법을 사용합니다.

  • 호어 옵티마이저 트랜스필레이션 패스에서 게이트를 이전 및 후속 게이트와 개별적으로 결합하여 아이덴티티를 형성할 수 있는 경우 게이트를 두 번 제거하려고 시도할 수 있던 버그를 수정했습니다. 자세한 내용은 #7271을 참조하세요.

  • 표준 메서드를 사용하여 명령어를 조건부로 만들기 InstructionSet.c_if() 메서드를 사용하여 명령어를 조건부로 만드는 것은 이제 명령어의 일부인 QuantumCircuit 에서 사용하는 번호 체계와 일치합니다. 이전에는 겹치는 두 개의 ClassicalRegister가 겹치는 경우 Clbit가 겹치면 번호 매기기가 잘못되었습니다. 자세한 내용은 #7246을 참조하세요.

  • 표준 메서드를 사용하여 명령어를 조건부로 만들면 InstructionSet.c_if() 메서드를 사용하여 명령어를 조건부로 만들면 이제 회로에 ClassicalRegister가 없어도 성공합니다. 자세한 내용은 #7250을 참조하세요.

  • 표준 메서드를 사용하여 조건부 명령어 만들기 InstructionSet.c_if() 메서드를 사용할 때 Clbit 에 포함된 ClassicalRegister 를 사용하면 이제 레지스터가 아닌 비트에 조건이 올바르게 생성됩니다. 자세한 내용은 #7255를 참조하세요.

  • 표준 메서드를 사용하여 조건부 명령어를 만들려고 하면 InstructionSet.c_if() 메서드를 사용하여 명령어를 조건부로 만들려고 하면 이제 회로에 클래식 리소스가 없는 경우 오류가 올바르게 발생합니다. 자세한 내용은 #7255를 참조하세요.

  • 블로흐 구체에 벡터가 첨부된 경우 렌더링에 실패하는 Matplotlib 3.5 과의 호환성 문제를 수정했습니다 plot_bloch_vector. 자세한 내용은 #7272를 참조하세요.

  • 레이어를 추가할 때 NLocal.add_layer() 메서드가 레이어를 잘못 추가하는 문제를 수정했습니다 NLocal 객체가 이미 빌드된 경우 메서드가 레이어를 잘못 추가하는 문제를 수정했습니다.

  • 피클링 관련 문제 수정 InstructionScheduleMapPython 객체를 사용할 때 발생하는 문제를 수정했습니다 3.6. 자세한 내용은 #6944를 참조하세요.

  • 심엔진에서 복잡한 값의 펄스 매개변수 할당이 수정되었습니다. 예를 들면 다음과 같습니다.

    from qiskit import circuit, pulse
    import numpy as np
    
    amp = circuit.Parameter("amp")
    phase = circuit.Parameter("phase")
    
    with pulse.build() as sched:
        pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0))
    sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)

    0.18.0 릴리스에서 symengine 사용이 도입된 후 할당된 진폭은 ParameterExpression(0.1*exp(1.57*I)) 으로 표시되었습니다. 이제 올바르게 평가되어 7.96327e-05 + 0.0999999683j 로 표시됩니다.

  • 다른 연산자가 QAOA.construct_circuit() 를 사용하면 동일한 수의 큐비트를 가진 다른 연산자가 매번 동일한 회로를 생성하는 문제를 수정했습니다. 자세한 내용은 #7223을 참조하세요.

  • 다음 문제를 수정했습니다 QAOAAnsatz 의 ID가 PauliSumOp.from_list([("III", 1)]) 과 같이 PauliSumOp 인 경우 매개변수 수가 올바르지 않은 문제를 수정했습니다. 자세한 내용은 #7225를 참조하세요.

  • 메서드가 QuantumCircuit.qasm() 메서드가 잘못된 식별자가 포함된 OpenQASM 2 인스트럭션을 반환할 수 있는 버그를 수정했습니다. UnitaryGate 에서도 동일한 버그가 수정되었습니다.

  • 레지스터리스 비트를 표시하려고 하면 mpllatex 회로 서랍에 오류가 발생하던 문제를 수정했습니다. text 서랍의 등록되지 않은 비트 번호 표시에서 _ 선행이 제거되었습니다. 수정 #6732.

  • 1비트 레지스터의 경우, 이제 모든 회로 서랍에 레지스터 이름만 표시되고 0 첨자가 더 이상 표시되지 않습니다. 수정 #5784.

  • 암시적 레지스터의 명명 충돌을 수정했습니다 QuantumCircuit.qasm 에서 레지스터리스 큐비트와 클럭비트를 처리할 때 암시적 레지스터의 이름 충돌을 수정했습니다. 이전에는 레지스터리스 큐비트와 클럭 비트가 충돌에도 불구하고 qregcreg 에 모두 regless 라고 불렀습니다. 이제 회로의 사용자 정의 레지스터 이름과 충돌하지 않는 별도의 결정론적으로 생성된 이름을 갖게 됩니다.

  • 측정, 조건부 게이트, 업데이트와 같은 클럭 비트 연산이 있는 회로의 스케줄링 문제를 수정했습니다 ASAPSchedule, ALAPScheduleAlignMeasures. 업데이트된 스케줄러는 모든 clbit I/O 작업에 시간이 걸리지 않는다고 가정하고, measure 은 마지막에 측정값을 clbit에 쓰고, c_if 은 처음에 조건부 값을 clbit에서 읽습니다. 수정 #7006.

  • 호출 transpile 을 호출하면 이제 경고 없이 빈 목록을 올바르게 반환합니다. 수정 #7287.

  • 근사화할 함수가 상수일 때 PiecewiseChebyshev 에서 근사화할 함수가 상수일 때 발생하는 문제를 수정했습니다. 이러한 경우 이제 다음과 같은 함수를 사용하는 대신 상수를 f_x 인수로 직접 전달해야 합니다:

    from qiskit.circuit.library.arithmetic import PiecewiseChebyshev
    
    PiecewiseChebyshev(1.0, degree=3)

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

  • HHL 알고리즘 인스턴스가 기본값인 QuantumInstance (기본값)없이 인스턴스가 구성되면 나중에 인스턴스를 읽거나 설정하기 위해 게터 및 세터 속성을 사용하려고 시도하면 실패합니다. 이제 게터와 세터가 예상대로 작동합니다.

  • 메서드는 이제 QuantumCircuit.qasm() 메서드는 이제 circuit.data 에 있는 원본 명령어가 아니라 회로에 있는 명령어 사본의 이름을 편집합니다. 자세한 내용은 #6952를 참조하세요.

  • 버그를 수정했습니다 PauliSumOp.permute() 의 버그를 수정했습니다:

    QiskitError: 'Pauli string label "" is not valid.'

    순열에 같은 수의 폴리 항이 있는 경우. X ^ Y ^ Z 에서 permute([2, 1, 0]) 을 호출하면 더 이상 오류가 발생하지 않고 이제 Z ^ Y ^ X 이 반환됩니다.

  • 에서 믹서 매개변수의 매개변수 범위가 QAOAAnsatz 의 믹서 매개변수 바운드가 설정되지 않던 버그를 수정했습니다.

  • 통과 시 최종 작업(장벽 및 조치)의 결정이 수정되었습니다 RemoveFinalMeasurements 와 메서드 remove_final_measurements() 클래스의 QuantumCircuit 의 메서드에서 출력 노드 바로 앞의 노드만 고려하던 것을 수정했습니다.

  • 패스에서 최종 연산 결정이 수정되었습니다 RemoveFinalMeasurements 와 메서드의 remove_final_measurements() 클래스의 QuantumCircuit 에서 다른 회로 연산이 뒤따라오더라도 장벽을 최종 연산으로 잘못 간주할 수 있는 문제를 수정했습니다.

  • 패스에서 멀티비트 클래식 레지스터 제거 수정 RemoveFinalMeasurements 와 메서드 remove_final_measurements() 클래스의 QuantumCircuit 에서 다른 비트가 유휴 상태인 경우에도 모든 비트에 대한 최종 측정이 이루어지지 않는 한 클래식 레지스터가 제거되지 않도록 수정했습니다. 이제 최종 측정값과 장벽을 제거한 결과 유휴 상태가 되는 기존 레지스터는 항상 제거됩니다. 클래식 비트는 제거된 레지스터에 의해서만 참조되거나 전혀 참조되지 않고 제거로 인해 유휴 상태가 된 경우 제거됩니다. 이 수정은 또한 기본 비트가 공유되는 레지스터의 적절한 처리를 추가합니다.

  • 관련 문제를 수정했습니다 RemoveFinalMeasurements 의 문제를 수정했습니다 DAGCircuit 가 유효하지 않게 되는 문제를 수정했습니다. 자세한 내용은 #7196을 참조하세요.

  • 메서드 관련 문제 수정 remove_final_measurements() 클래스의 메서드 QuantumCircuit 메서드 관련 문제를 수정했습니다 QuantumCircuit.clbits 가 올바르지 않게 호출되던 문제를 수정했습니다. 자세한 내용은 #7089를 참조하세요.

  • 에서 빈 0 연산자를 테이퍼링할 때 qiskit.opflow에서 0 연산자를 줄이면 코드가 0임을 감지하여 경고를 기록하고 원래 연산자를 반환합니다. 이러한 연산자는 키스킷 네이처를 사용할 때 보조 연산자에서 흔히 볼 수 있으며, 위의 동작은 테이퍼링된 0이 아닌 연산자가 테이퍼링된 0 연산자와 다른 수의 큐비트이기 때문에 VQE 예외를 발생시켰습니다(테이퍼링이 입력 연산자를 변경하지 않고 반환했기 때문에). 이제 코드가 0 연산자를 올바르게 테이퍼링하여 큐비트 수가 예상대로 줄어들고 테이퍼링된 0이 아닌 연산자와 일치하도록 합니다(예: 3큐비트로 테이퍼링하는 경우 `0*"IIII"`0*"I" 이 됩니다).

  • 메서드 관련 문제를 수정했습니다 draw() 메서드 및 circuit_drawer() 함수에서 사용자 설정 파일(예: settings.conf)을 통해 사용자 정의 스타일을 설정하는 문제를 수정했습니다 는 함수/메서드의 style kwarg가 설정되지 않은 경우 circuit_mpl_style 필드의 설정 값을 무시합니다.

기타 참고사항

  • 에 대해 캐스팅된 문자열 qiskit.circuit.ParameterExpression 에 캐스팅된 문자열은 더 이상 완전한 정밀도를 갖지 않습니다. 이렇게 하면 플로트에 바인딩된 매개변수를 인쇄할 때 0s 후행이 제거됩니다. 이는 QASM 직렬화 및 회로 텍스트 서랍에 영향을 미칩니다:

    >>> from qiskit.circuit import Parameter
    >>> x = Parameter('x')
    >>> str(x.bind({x:0.5}))
    '0.5'   # instead of '0.500000000000000'
  • QAOAAnsatz 는 QAOA 문헌의 표준 표기법과 같이 비용 연산자에는 γ , 믹서 연산자에는 β 매개변수 기호를 사용하도록 업데이트되었습니다.

에어 0.9.1

변경 없음

이그니스 0.7.0

Prelude

이 릴리스에서는 키스킷 이그니스 프로젝트가 더 이상 사용되지 않으며, 키스킷 실험 프로젝트가 이를 대체하여 활발한 개발이 중단되었습니다. 더 이상 사용되지 않지만 중요한 버그 수정 및 호환성 수정은 계속 진행되어 사용자에게 Ignis에서 마이그레이션할 수 있는 충분한 기회를 제공할 것입니다. 사용 중단 기간(이번 릴리스부터 3개월 이내)이 지나면 프로젝트는 폐기되어 보관됩니다.

새 기능

  • 에서 피팅 루틴을 사용하도록 인증 프로토콜을 업데이트했습니다 https://arxiv.org/abs/2103.06603. AccreditationFitter 이제 FullAccreditation (이전 프로토콜) 및 MeanAccreditation (새 프로토콜) 메서드를 사용할 수 있습니다. 또한 데이터 입력이 결과 객체 AppendResult 또는 문자열 목록 AppendStrings 을 사용하도록 변경되었습니다. qiskit.ignis.verification.QOTPCorrectString() 도 추가되었습니다.

  • 증후군 그래프를 빠르게 분석할 수 있는 옵션이 추가되었습니다. RepetitionCode 에는 이제 무차별 대입 방식을 계속 사용할 수 있는 새로운 부울 인수 brute 가 추가되었습니다. 이를 용이하게 하기 위해 도우미 클래스 RepetitionCodeSyndromeGenerator 를 추가했습니다.

  • RepetitionCode 에는 이제 키워드 인수 resetsdelay 가 있습니다. 전자는 측정 후 리셋 게이트 삽입 여부를 결정합니다. 후자를 사용하면 각 측정 후 지연(해당되는 경우 재설정)을 위해 시간(dt)을 지정할 수 있습니다.

    RepetitionCodesyndrome_measurement() 메서드에 이제 키워드 인수 finaldelay 가 추가되었습니다. 전자는 글로벌 resets 에 따라 리셋 게이트를 추가할지, 아니면 최종 증후군 측정에 적합한 동작으로 덮어쓸지 결정합니다. 후자를 사용하면 각 측정 후 지연(해당되는 경우 재설정)을 위해 시간(dt)을 지정할 수 있습니다.

  • RepetitionCode 클래스는 이제 x 기준 상태를 사용한 인코딩을 지원합니다. RepetitionCode 객체를 생성할 때 xbasis 키워드 인수를 설정하여 사용할 수 있습니다.

업그레이드 주의사항

  • RepetitionCodesyndrome_measurement() 메서드에서 키워드 인수 reset 가 제거되었습니다. 이것은 클래스에 대한 글로벌 resets 키워드 인수와 syndrome_measurement 에 대한 키워드 인수 final 로 대체됩니다. 이전에는 최종 리셋 게이트를 피하기 위해 reset=False 을 사용하여 최종 측정 라운드를 추가했다면, 이제 final=True 을 사용해야 합니다.

  • update_u_gates() 에서 ParametrizedSchedule 을 제거합니다.

    ParametrizedSchedule 는 키스킷-테라 0.17.0 의 일부로 더 이상 사용되지 않으며 다음 릴리스에서 제거될 예정입니다. 이 함수는 이제 할당되지 않은 Parameter 객체를 포함하는 Schedule 프로그램으로 u 게이트를 업데이트합니다.

지원 중단 노트

  • AccreditationFitter 의 메서드, 즉 bound_variation_distance 및 single_proocol_run을 더 이상 사용하지 않습니다

  • 키스킷 이그니스 프로젝트는 전체적으로 더 이상 사용되지 않으며 향후 프로젝트가 폐기되고 보관될 예정입니다. 더 이상 사용되지 않는 동안에는 프로젝트에 호환성 수정과 중요한 버그 수정만 이루어집니다. 키스킷 이그니스를 사용하는 대신 키스킷 실험을 사용하도록 마이그레이션해야 합니다. 마이그레이션 가이드를 참조하세요:

    https://github.com/qiskit-community/qiskit-ignis#migration-guide

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