Skip to main content
IBM Quantum Platform

Qiskit SDK 2.2 릴리스 노트


2.2.3

Prelude

Qiskit 2.2.3 는 Qiskit 2.2.2 에서 도입된 버그를 수정합니다. 이 버그는 하나의 PassManager 회로에 대해 run() 메서드를 여러 번 사용할 때 발생했습니다.

업그레이드 주의사항

  • ConsolidateBlocks 이제 입력 시 ConsolidateBlocks_qubit_map 키를 PropertySet 읽습니다. 이 키와 그 값은 공개되지 않으며, 다른 패스에 의해 읽히거나 쓰여서는 안 됩니다.

버그 수정

  • 동일한 ConsolidateBlocks 인스턴스의 고정된 재사용이 다중 회로에서 발생하며, 이는 하나의 회로 이상을 사용하는 transpile() 호출을 포함하고 프로세스 기반 병렬화가 적용되지 않은 상태입니다. Qiskit 2.2.2 에서 도입된 버그로 인해 동일한 인스턴스를 서로 다른 회로에서 재사용할 경우 패스가 패닉 상태에 빠지거나 잘못된 출력을 생성했습니다.

2.2.2

Prelude

키스킷 2.2.2 은 v2.2 마이너 버전 시리즈의 버그 수정 릴리스입니다.

버그 수정

  • 회로 매개변수를 심층 복사하지 않았던 구현을 __deepcopy__()QuantumCircuit 수정했습니다. 결과적으로, 복사된 회로에서 BoxOp 변형된 는 더 이상 원본 회로에 영향을 미치지 않습니다.

  • 패스가 Optimize1qGatesDecomposition 고정된 각도 매개변수를 가진 1-큐비트 게이트를 포함하는 Target 상태로 초기화될 때 발생하는 문제를 수정했습니다. 이전에는 대상에 포함되지 않은 게이트가 패스를 통해 출력될 가능성이 있었는데, 이는 대상 내 게이트가 임의의 매개변수 값을 지원하는지 여부를 확인하지 않았기 때문입니다. #14743 수정됨.

  • 다중 큐비트 게이트가 블록 ControlFlowOp 내에서 소스 회로의 절대 인덱스 대신 BasisTranslator 로컬 큐비트 인덱스를 사용하여 추적하는 잘못된 동작을 수정했습니다.

  • 트랜스파일러 ConsolidateBlocks 패스는 이제 제어 흐름 연산으로 재귀 진입하는 동안 주어진 게이트가 하드웨어 지원 여부를 올바르게 평가합니다.

  • qpy.dump() QPY 버전 16 이상에서는 표준 라이브러리 gzip 모듈을 사용하여 열린 파일에 .gz 대한 쓰기 작업을 처리할 수 있습니다. 자세한 내용은 #15157을 참조하십시오.

  • 개방 제어 게이트의 제어 상태를 보존하는 MCPhaseGate.inverse() 메서드를 수정하여 해당 게이트의 역을 계산할 때 적용했습니다.

  • ConsolidateBlocks 이제 레거시 키 run_list 또는 block_listPropertySet 키에서 유효하지 않거나 오래된 분석을 감지할 때 패닉 상태가 아닌 ' Python -space' 예외를 반환합니다. #14646 수정됨.

  • Optimize1qGatesDecomposition 이제 보다 큰 회로에서 실행을 시도할 때 Rust Target 공간 패닉 대신 TranspilerError 를 발생시킵니다. #15116 수정됨.

  • 스케줄링 패스, ALAPScheduleAnalysisASAPScheduleAnalysis는 이제 작업이 포함되지 않은 회로를 올바르게 처리합니다. 이전에 그들은 "기간이 제공되지 않았습니다"라고 허위로 주장하며 TranspilerError 제기했습니다. #15145 수정됨.

  • 제어 흐름 연산 내부의 회로 블록이 외부 회로와 다른 레지스터에 정의될 때 발생할 수 있는 회로 텍스트 드로어의 오류를 수정했습니다. 이러한 상황은 예를 들어 연산자를 직접 ControlFlowOp 연결할 때나, 트랜스파일링 후 회로에서 발생할 수 있습니다.


2.2.1

Prelude

키스킷 2.2.1 은 2.2.0 릴리스에서 확인된 몇 가지 버그를 수정하는 소규모 패치 릴리스입니다.

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

  • 정확한 일치 실행에 대한 최대 호출 및 시험 횟수 제한이 에서 optimization_level=3VF2PostLayout 로 축소되었습니다. 이는 대칭성이 높은 시험 회로가 대규모 결합 맵에 매핑될 때 발생하는 과도한 실행 시간을 방지하기 위함입니다.

버그 수정

  • DAGCircuit.apply_operation_back(), apply_operation_back() 그리고 이제 결정론적 순서로 circuit_to_dag() 새로운 변을 추가할 것입니다. 이전 동작은 특정 트랜스파일러 패스(예: SabreSwap)가 DAG를 비결정적 순서로 탐색하게 할 수 있습니다.

  • DAGCircuit.apply_operation_front() 고전적 조건을 포함하는 노드를 처리할 때 더 이상 무효한 자기 루프를 삽입할 수 없습니다.

  • 메서드 SabreSwap.run() 실행 후 SabreSwap 인스턴스가 SabreSwap pickle 피클링될 때 발생하는 오류 문제를 수정했습니다. #15071 수정됨.

  • 연산자가 단일성(유니터리)을 갖는지 검사할 때 입력 허용 오차 값을 제대로 반영하지 is_unitary() 않던 문제를 수정했습니다. 이제 해당 메서드는 연산자를 단순화하고 동일성 여부를 확인할 때 제공된 atolrtol 매개변수를 올바르게 사용합니다. 이것은 #14107을 수정합니다.


2.2.0

Prelude

키스킷( v2.2 )에는 C API와 트랜스파일러에 대한 몇 가지 개선 사항과 기타 여러 가지 개선 및 버그 수정이 추가되었습니다. 이번 새 릴리스의 주요 기능은 다음과 같습니다:

  • C API 트랜스파일 함수: C API에는 이제 양자 회로를 트랜스파일하는 함수가 포함됩니다: qk_transpile(). 이 함수는 독립형 C 컨텍스트에서 사용되는 Python 함수와 동일합니다 transpile().
  • 리틴스키 변환 패스: 설명된 변환을 구현하는 LitinskiTransformationarXiv:1808.02892 새로운 변환 패스. 이 패스는 일반적으로 내결함성 아키텍처의 컴파일 시에 사용됩니다.
  • 타깃에 대한 각도 경계 지원: 해당 Target 클래스는 이제 타깃에 추가된 매개변수화된 연산에 허용되는 값의 경계를 지정하는 기능을 지원합니다. 명령어에 를 추가할 Target 때, 선택적 인자 angle_bounds를 사용하여 매개변수화된 회전 게이트의 상한 및 하한을 지정할 수 있습니다. 트랜스파일 파이프라인의 일환으로 각도 제약 조건을 강제 적용하기 위한 새로운 트랜스파일러 패스가 WrapAngles 추가되었습니다.

v2.2 릴리스 시리즈는 지원되는 마지막 마이너 릴리스 시리즈입니다 Python 3.9. 소스에서 키스킷을 빌드하는 데 지원되는 최소 Rust 버전은 이제 1.79 에서 2.1.0 로 상향된 Rust v1.85 이다. 위 사항 및 기타 변경 사항에 대한 자세한 내용은 아래 릴리즈 노트를 참조하고 업데이트된 문서를 검토하세요.

C API 기능

회로 기능

  • 새로운 방법, QuantumCircuit.ensure_physical(),가 제공되어 회로가 물리적 큐비트 위에 정의되도록 보장하며, 큐비트 인덱스가 물리적 큐비트를 참조하도록 합니다. 메타데이터 개념에 대한 자세한 내용은 문서에서 추상 회로 및 물리 회로 표현에 관한 새로운 논의를 참조하십시오. "추상" 및 "물리" 회로 개념은 Qiskit에 전혀 새로운 것이 아니라, 단지 명시적인 문서화가 추가된 것뿐입니다.

  • Duration 클래스는 피코초 단위로 기간을 나타내는 데 사용할 수 있는 새로운 ps 변형을 얻었습니다.

  • 개선된 PauliEvolutionGate.control(), PauliEvolutionGate.power()PauliEvolutionGate.inverse() 를 통해 의 관점에서 보다 효율적인 표현을 반환하도록 합니다 PauliEvolutionGate. 이 변경 사항은 진화 게이트의 제어 및 지수화 버전을 계산할 때 기존에 사용된 일반적인 메커니즘에 비해 회로 깊이를 현저히 낮추고 게이트 수를 감소시킵니다. 역분해는 변경되지 않지만 이제 더 효율적으로 생성되며 컴파일러 최적화를 향상시킵니다.

  • 새로운 패스트패스 메서드가 ParameterExpression.bind_all() 추가되어 동일한 매핑 사전으로 다양한 ParameterExpression 인스턴스를 숫자 값에 바인딩하는 사용 사례를 지원합니다. 기존 bind() 방법은 타입 일관성을 위해 항상 ParameterExpression 를 반환하기 때문에 상당한 오버헤드와 불필요한 할당이 발생합니다.

OpenQASM 기능

  • OpenQASM3 () 내보내기 기능에서 기호에 defcal 대한 부분적 지원을 추가했습니다. 이를 통해 하위 패키지는 양자 비트와 고전 비트 모두에 대해 작동하는 사용자 정의 명령어를.을 qiskit.qasm3.dumps()사용하여 내보낼 수 있습니다. 사용자는 이제 사용자 정의 명령어(예: 큐비트에 작용하여 클래식 비트를 반환하는 명령어) CustomMeasure 를 정의하고 를 DefcalInstruction사용하여 해당 동작을 지정할 수 있습니다. 이러한 defcal은 의 인수를 implicit_defcals 통해 qiskit.qasm3.dumps()익스포터로 전달됩니다.

    예를 들어,

    from qiskit.circuit import Instruction, QuantumCircuit
    from qiskit.qasm3 import dumps
    from qiskit.qasm3.exporter import DefcalInstruction, types
    
    custom_measure = Instruction("measure_2", 1, 1, [])
    qc = QuantumCircuit(1, 1)
    qc.h(0)
    qc.append(custom_measure, [0], [0])
    qc.measure(0, 0)
    
    defcals = {
        "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()),
    }
    
    out_qasm = dumps(qc, implicit_defcals=defcals)
    print(out_qasm)

    다음과 같은 유효한 OpenQASM3 문자열을 출력합니다:

    OPENQASM 3.0;
    bit[1] c;
    qubit[1] q;
    h q[0];
    c[0] = measure_2 q[0];
    c[0] = measure q[0];

    이 접근 방식은 defcal에 대한 문법 정의가 외부(예: 헤더 파일)에서 제공된다고 가정하지만, 내보내기가 작동하는 데 이러한 파일이 반드시 필요한 것은 아닙니다.

  • 함수 qasm3.loads() 와 에는 qasm3.load() 이제 라는 추가 인자가 num_qubits 있습니다. 제공될 경우, 함수는 큐비트가 에 해당하는 회로를 num_qubits 반환합니다. 지정되지 않을 경우, 반환된 회로의 큐비트 수는 직렬화된 회로에서 관측된 최대 인덱스와 동일합니다. 자세한 내용은 #14435를 참조하십시오

QPY 기능

  • 사용자 구성 파일에 라는 min_qpy_version 이름의 설정을 추가했습니다. 설정 시,. qpy.load()에 허용되는 최소 QPY 버전을 정의합니다. QPY 파일의 형식 버전이 minimum_qpy_version``minimum_qpy_version 설정값보다 낮을 경우 예외가 발생합니다.

  • QPY 형식 버전 16이 도입되었습니다. 이 새 버전은 파일 헤더에 새로운 회로 시작 테이블을 도입하여 QPY 파일에서 각 회로의 시작 바이트 오프셋을 포함합니다. 이를 통해 QPY 파일에서 회로를 보다 효율적으로 로드할 수 있으며, 향후 멀티스레드 Rust 구현이 가능해질 수 있습니다. 또한 새 형식 버전은 새로운 피코초( DURATION ) 변형에 대한 지원을 추가합니다.

양자 정보 특성

합성 기능

  • 부수 큐비트가 필요하지 않으며 기존 알고리즘 대비 우수한 CX 카운트를 가진 ModularAdderGate 새로운 adder_qft_d00() 합성 알고리즘을 추가했습니다:

  • 보조 큐비트가 전혀 MCXGate 필요하지 않은 새로운 합성 알고리즘을 추가했습니다. synth_mcx_noaux_hp24() 이 방법은 기존 synth_mcx_noaux_v24() 알고리즘과 비교하여 CX 게이트의 수가 이차적이지 않고 선형적으로 증가합니다. 특히, 제어 큐비트 수가 5개보다 클 때 새로운 방법이 더 우수하다. 이 알고리즘은 Huang과 Palsberg의 논문 "보조 큐비트 없이 조건부 양자 게이트 컴파일하기"( https://dl.acm.org/doi/10.1145/3656436 )를 기반으로 합니다.

  • 원래 Shende et al.에 기반한 기능을 qs_decomposition() 개선하였습니다. 등 (https://arxiv.org/abs/quant-ph/0406176). 새로운 합성 방법은 Krol과 Al-Ars ( https://arxiv.org/abs/2403.13692 )에 기반하며, 일반적인 n-큐비트 유니터리의 총 s CXGate개수를 4n213\frac{4^{n − 2} − 1}{3}CXGate s만큼 감소시킨다. 개선된 분해 알고리즘을 통해 일반적인 3큐비트 유니터리를 CXGate19초(기존 20초 대비)에 분해할 수 있다.

  • 기본 게이트가 일 때 다중 제어 다중 대상 XGate게이트를 합성하기 위해 synth_mcmt_xgate() 추가됨. 고수준 합성 플러그인과 함께 선형 개수의 CX 게이트와 MCMTSynthesisXGate0개의 보조 큐비트로 분해됩니다.

트랜스파일러 기능

  • 새로운 고수준 합성 플러그인을 추가하여 다음을 합성합니다 ModularAdderGate:

    또한 큐비트 수가 4\leq 4 일 때는 다음과 같은 순서로 모듈형 가산기 "ModularAdder.qft_d00" 합성기를 따르도록 업데이트되었습니다 ModularAdderSynthesisDefault : 모든 "ModularAdder.modular_v17" 다른 경우에는

  • 에 설명된 변환을 구현하는 새로운 arXiv:1808.02892 트랜스파일러 패스를 LitinskiTransformation 추가했습니다.

    패스에 입력되는 회로는 클리포드 게이트와 단일 큐비트 RZ 회전 게이트를 포함하며, 출력 회로는 다중 큐비트 파울리 회전(gates로 PauliEvolutionGate 구현됨)에 이어 클리포드 게이트가 적용된 형태입니다. 회로에 지원되지 않는 게이트가 포함된 경우 패스가 예외를 TranspilerError 발생시킵니다.

    해당 패스는 반환된 목록에 있는 모든 클리포드 get_clifford_gate_names()게이트, 즉 ["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]을 지원합니다. 지원되는 RZ 회전 목록은 다음과 같습니다 ["t", "tdg", "rz"] (T 및 Tdg 게이트는 자동으로 RZ 회전으로 변환됩니다).

    또한 생성자는 LitinskiTransformation 인자를 받습니다 fix_clifford. (기본값이 False 아닐 경우), 반환된 회로에는 최종 클리포드 게이트가 생략된 상태로 PauliEvolutionGate 게이트만 포함됩니다. 이 경우 원본 회로와 합성 회로의 연산자는 일반적으로 동등하지 않다는 점에 유의하십시오.

    예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import LitinskiTransformation
    from qiskit.quantum_info import Operator
    
    # The following quantum circuit consists of 5 Clifford gates
    # and two single-qubits RZ-rotation gates (note that Tdg is
    # an RZ-rotation).
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    qc.rz(0.1, 0)
    qc.cz(0, 1)
    qc.tdg(1)
    qc.h(1)
    qc.s(1)
    qc.cz(1, 0)
    
    # The transformed circuit consists of two PauliEvolution gates
    # and the same Clifford gates as in the original circuit.
    qct = LitinskiTransformation()(qc)
    
    # The circuits before and after the transformation are equivalent
    assert Operator(qc) == Operator(qct)
  • 객체를 MCXGate 위한 새로운 고수준 MCXSynthesisNoAuxHP24 합성 플러그인을 추가했습니다. 또한 객체에 MCXGate 대한 기본 MCXSynthesisDefault 합성 플러그인이 업데이트되어 사용 가능한 보조 큐비트 수에 따라 항상 최적의 합성 방법을 선택하도록 변경되었습니다.

  • 명령어에 각도 범위를 지정하기 위한 Target 지원을 추가했습니다. 이 릴리스 이전에는 매개변수를 받는 작업이 유효한 값을 허용하거나 특정 값을 허용하도록 지정할 Target 수 있었습니다. 예를 들어, 대상에 가 RZGate(Parameter("theta")) 추가된다면, 에 RZGate 대해 어떤 값의 theta도 허용됨을 나타낼 것이다. 만약 대상에 RZGate(math.pi) 가 추가된다면, 이는 대상에서 허용되는 값이 오직 π\pi 뿐임을 나타낼 RZGate 것입니다. 이 새로운 기능은 허용되는 각도를 양 끝점을 포함한 범위 내의 임의의 float 값으로 제한할 수 있게 합니다. 예를 들어, 에 를 TargetRZGate(math.pi) 추가하고 각도 값을 0과 2π2\pi 사이로 제한할 수 있습니다.

    대상에 대한 각도 경계값을 처리하는 데 사용할 수 있는 여러 방법이 있습니다. 첫 번째는 Target.add_instruction() 에 새로운 angle_bounds 키워드 인자를 추가하여 명령어에 각도 제한을 적용하는 기능입니다 Target. 각도 경계와 함께 작업하려면, 각도 경계에 대한 게이트 조정 방법을 트랜스파일러와 WrapAngles 패스에 알려줄 콜백 함수를 글로벌 WRAP_ANGLE_REGISTRY 레지스트리에 등록해야 합니다. 콜백 함수는 회로에서 게이트 각도를 나타내는 임의의 float 값 목록과 해당 게이트가 작동한 회로 내 큐비트 인덱스를 입력으로 받으며, 각도 제한 및 기타 Target 제약 조건을 준수하는 해당 각도의 게이트에 대한 동등한 회로를 나타내는 DAGCircuit 객체를 반환합니다. 예를 들어,

    import math
    
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target
    from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY
    
    target = Target(num_qubits=1)
    target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)])
    
    def callback(angles: List[float], qubits: List[int]) -> DAGCircuit:
        """Callback function to wrap RZ gate angles
    
        Args:
            angles: The list of floating point parameter values for the instance of RZGate in
                the circuit
            qubits: The physical qubit indices that this gate is operating on
    
        Returns:
            The DAGCircuit of the equivalent circuit"""
    
        angle = angles[0]
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        if angle > 0:
            divisor = math.pi
        else:
            divisor = -math.pi
        gate_counts = int(angles[0] // divisor)
        rem = angles[0] % divisor
        for _ in range(gate_counts):
            dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True)
        dag.apply_operation_back(rem, [dag.qubits[0]], check=True)
    
    WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)

    Target.has_angle_bounds() 대상에 각도 제한이 설정되어 있는지 여부를 확인하는 데 사용할 수 있습니다 Target.gate_has_angle_bounds().

    회로 내의 어떤 게이트에 타깃의 각도 경계를 적용하려면 트랜스파일러 WrapAngles 패스를 사용해야 합니다.

  • 메서드에 Target.instruction_supported() 새로운 check_angle_bounds 키워드 인자(kwarg)를 추가했습니다. 기본값인 True 로 설정된 경우, 해당 메서드는 지정된 parameters 가 쿼리 대상 명령어에 적용될 수 있는 각도 제한 조건을 준수하는지 여부를 확인합니다.

  • 새로운 트랜스파일러 패스를 추가하여. Target의 게이트에 WrapAngles 각도 제약 조건을 적용합니다. 만약 정의된 각도 범위가 Target 있다면, 이 패스는 회로 내 게이트의 모든 매개변수를 분석하고 이를 대상에 지정된 범위와 비교하여 검증합니다. 예를 들어, 대상에 각도 경계가 있는 사용자 정의 게이트가 포함된 경우 패스는 해당 게이트를 경계에 부합하는 게이트로 분해합니다:

    from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit
    from qiskit.dagcircuit import DAGCircuit
    from qiskit.transpiler import Target, WrapAngleRegistry
    from qiskit.transpiler.passes import WrapAngles
    
    class MyCustomGate(Gate):
    
        def __init__(self, angle):
            super().__init__("my_custom", 1, [angle])
    
    param = Parameter("a")
    circuit = QuantumCircuit(1)
    circuit.append(MyCustomGate(6.0), [0])
    target = Target(num_qubits=1)
    target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)])
    
    def callback(angles, _qubits):
        angle = angles[0]
        if angle > 0:
            number_of_gates = angle / 0.5
        else:
            number_of_gates = (6.28 - angle) / 0.5
        dag = DAGCircuit()
        dag.add_qubits([Qubit()])
        for _ in range(int(number_of_gates)):
            dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]])
        return dag
    
    registry = WrapAngleRegistry()
    registry.add_wrapper("my_custom", callback)
    wrap_pass = WrapAngles(target, registry)
    res = wrap_pass(circuit)
    res.draw('mpl')
    _images/release_notes-1.png
  • DAGCircuit 이제 수동 구현이 있습니다 __deepcopy__(). 이는 특히 대규모 회로에서 피클 프로토콜의 기존 암시적 구현보다 훨씬 더 빠른 속도입니다. 또한 최적화 수준 3에서 내부적으로 각 최적화 루프 반복마다 DAGCircuit 의 를 깊이 복사하는 과정에서 optimization``optimization_level=3 , 를 transpile()generate_preset_pass_manager() 실행하거나 가 반환하는 사전 설정 패스 관리자를 실행할 때 컴파일 성능에 직접적인 이점을 제공합니다.

  • 새로운 방법, DAGCircuit.make_physical(), 가 제공되며, 이는 내의 큐비트를 표준 DAGCircuit 물리적 큐비트 레지스터로 효율적으로 대체하며, 확장 가능성을 포함할 수 있다. 비슷한 방법도 사용할 수 있습니다 QuantumCircuit.ensure_physical() .

  • 새로운 방법, DAGCircuit.structurally_equal(), 는 두 DAGCircuit 개의 인스턴스가 정확히 동일한 순서로 생성 및 수정된 경우에 사용할 수 있습니다. 이는 == 오버로드의 표준 의미적 동등성 검사보다 훨씬 강력한 테스트이며, 트랜스파일러 패스 작성자가 자신의 수정 순서가 결정론적인지 검증하는 데 사용할 수 있습니다.

  • 의 사용자 정의 하위 클래스는 이제 초기 속성을 BasePassManager 초기화하기 위해 property_set``_passmanager_frontend() 메서드 내에서 속성을 수정할 수 있습니다. 이는 대칭성을 제공하는데, 이전에는. 중에 최종 속성만 읽을 _passmanager_backend()수 있었기 때문이다.

  • 패스에서 HighLevelSynthesis 최적화 기준을 지정하는 새로운 OptimizationMetric 클래스를 추가했습니다. 현재 지원되는 두 가지 메트릭은 다음과 같습니다:

    • COUNT_2Q2-큐비트 게이트 수를 최적화합니다.
    • COUNT_T는 클리포드+T 기저 집합으로 변환할 때 T-게이트 수를 최적화합니다.

    트랜스파일러는 기본 게이트 집합에 따라 대상 계량을 자동으로 선택합니다. 예를 들어, 클리포드+T 기본 집합이 감지되면 COUNT_T 이를 사용합니다. 그러나 이 클래스는 현재 실행 transpile() 중이거나 에 의해 생성된 사전 설정 패스 관리자를 generate_preset_pass_manager()실행할 때 수동으로 설정할 수 없습니다.

  • 트랜스파일러 HighLevelSynthesis 패스 생성자에 객체를 OptimizationMetric 인수로 optimization_metric 받는 새 매개변수를 추가했습니다. 설정 시 COUNT_T, 패스는 Clifford+T 게이트 세트에 더 적합한 분해를 선택합니다.

  • 기본 고수준 합성 플러그인들은 Clifford+T 기저 집합으로 트랜스파일링할 때 더 나은 T-카운트를 생성합니다 ModularAdderGateMultiplierGate .

  • 기본 고수준 합성 플러그인은 클리포드+T 기반 집합으로 MCXGate 트랜스파일링할 때 더 나은 T-카운트를 생성하며, 최소한 1개의 보조 큐비트가 사용 가능한 경우에 해당합니다.

  • 트랜스파일러 InverseCancellation 패스에 기본 역문(反門) 세트가 추가되었습니다. 이전에는 패스 객체의 생성자에 명시적으로 취소할 게이트 또는 게이트 쌍의 목록이 필수 인자로 필요했습니다. 이 목록은 선택 사항이며, 목록이 제공되지 않을 경우 자체 역문은 다음과 같습니다:

    와 그 반대 쌍입니다:

    패스가 취소됩니다.

  • 생성자에 InverseCancellation 새로운 인자 를 추가했습니다. run_default 이 인자를 로 설정하면 사용자 정의 게이트 외에도 True 새로운 기본 역취소 게이트 목록이 실행됩니다. 이 기능은 기본 게이트 외에도 사용자 정의 역취소 세트를 실행하고자 하는 사용 사례를 위해 제공됩니다.

  • TranspileLayout 두 가지 새로운 메서드, from_property_set()write_into_property_set()를 도입하여, 현재의 임시방편적인 트랜스파일 속성 구조와 이를 로 변환하는 방식을 TranspileLayout공식화합니다. 이를 통해 트랜스파일러 파이프라인 내의 각 단계는 해당 값이 TranspileLayout 될 내용을 접근하고, 완전히 구조화된 형태로 수정하며, 이후 표준화된 형태로 다시 출력할 수 있습니다.

    향후 Qiskit 버전 3.0 에서는 (또는 이와 유사한 TranspileLayout 것)이 DAGCircuit 트랜스파일러 중간 표현의 직접적인 속성이 될 것으로 예상되며, 패스들은 이를 나머지 트랜스파일러 중간 표현과 동기화 상태로 DAGCircuit 유지해야 할 것입니다.

  • 해당 transpile() 함수와 generate_preset_pass_manager() 함수가 반환한 생성된 패스 관리자 객체를 사용하여 optimization_level=3 해당 optimization 단계에서 실행 중인 VF2PostLayout 트랜스파일러 패스를 재활성화합니다. 해당 패스는 해당 단계에서 수행된 모든 물리적 최적화 작업 이후에 strict_direction=True 실행되어, 정확한 출력 회로로 레이아웃을 최종적으로 개선하기 위해 시도합니다. 이 기능은 이전에 Qiskit에서 활성화되었으나( v2.1.0 ), 초기 구현상의 문제로 인해 2.1.2 에서 되돌려졌습니다. 이러한 문제들은 수정되었으며, 더 나은 레이아웃이 발견될 경우 적절하게 적용될 것입니다.

시각화 기능

  • 회로 그리기 도구인 qiskit.visualization.circuit_drawer() 및 에 대한 mpltext 백엔드에 새로운 qiskit.circuit.QuantumCircuit.draw() 옵션, measure_arrows 가 추가되었습니다. 이 옵션이 설정되면 True, 드로어는 measure 상자에서 아래의 클래식 비트까지 화살표를 그립니다. 이것은 서랍에서 이전의 동작이었습니다. 이 값이 False 로 설정된 경우 화살표는 그려지지 않으며, 대신 해당 레지스터가 사용하는 클래식 measure 레지스터와 비트가 상자 measure 안에 표시됩니다. 이를 통해 measure 상자를 수직 레이어 내에 쌓을 수 있습니다.

    옵션을 설정하지 않으면 기본값은 True 입니다. 사용자는 기본적으로 ~/.qiskit 디렉터리의 settings.conf 파일에 있는 사용자 구성 파일에서 기본값을 변경할 수 있습니다. [Default] 제목 아래에 circuit_measure_arrows = False 을 입력하여 기본값을 변경할 수 있습니다.

업그레이드 주의사항

  • 소스에서 키스킷을 빌드(독립형 모드에서 C API 빌드 포함)하기 위한 최소 지원 Rust 버전이 Rust 1.79 에서 Rust 1.85 로 증가했습니다. 이 변경은 키스킷 내부에서 사용되는 Rust 선형 대수 라이브러리 faer의 최신 버전을 사용하기 위해 필요했습니다. 이전 버전의 faer로 Windows에서 키스킷을 실행할 때 확인된 문제가 있었습니다. 이 문제는 최신 릴리스에서 수정되었지만 최신 버전의 faer를 빌드하려면 최신 버전의 Rust 컴파일러가 필요합니다.

회로 업그레이드 노트

C API 업그레이드 노트

QPY 업그레이드 노트

  • 에 의해 생성되는 QPY의 기본 버전은 이제 qpy.dump() QPY 형식 버전 16입니다. 다른 형식 버전이 필요한 경우 인수를 version 사용하여 이전 형식 버전을 지정할 수 있습니다.

양자 정보 업그레이드 노트

합성 업그레이드 노트

  • 의 인수 opt_a1opt_a2 의 기본값은 이제 opt_a1 = None qs_decomposition() 와 입니다 opt_a2 = None. 새로운 기본값은 인수에 mat 대한 입력 유닛이 제어되는지 여부에 따라 최적의 값을 선택하여 기본적으로 최소 CXGate 카운트를 생성합니다. 이전 동작이 필요한 경우, 명시적으로 와 opt_a2 = Trueopt_a1 = True 호출하여 이전 릴리스와 동일한 동작을 유지할 수 있습니다.

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

  • 회로는 PassManager 이제 개별 패스에서 실행이 시작되기 전에 항상 num_input_qubits 속성 original_circuit_indices 과 를 설정합니다. 이것들은 입력 회로의 속성들로, 이전에는 개별 패스들이 주로 설정해야 했던 것들로서, 종종 그들의 주요 목적의 부수적 효과로 설정되곤 했습니다.

회로 사용 중단

버그 수정

  • ApplyLayout 이제 0큐비트 적용 사례를 올바르게 Layout 처리할 것입니다. 이전에는 의 필드가 "layout"PropertySet 와 같더라도 레이아웃이 설정되지 Layout() 않았다고 주장했습니다.

  • 빈 인스턴스가 전달될 때마다 QkOpCounts 인스턴스 생성 qk_opcounts_clear() 시 및 호출 시 발생하는 메모리 누수 문제를 수정했습니다.

  • 이전에는 연산자 목록으로부터 PauliEvolutionGate 무효한 것을 정의할 수 있었는데, 여기서 연산자들은 모두 동일한 수의 큐비트에 대해 정의된 것이 아니었다. 이 문제는 이제 수정되었으며, 게이트가 정의될 때 오류가 발생합니다:

    from qiskit.quantum_info import Pauli, SparsePauliOp
    from qiskit.circuit.library import PauliEvolutionGate
    
    pauli = Pauli("XYZ")  # 3 qubits
    op = SparsePauliOp(["XYIZ"], [1])  # 4 qubits
    evo = PauliEvolutionGate([pauli, op], time=1)
  • 트랜스파일러 VF2Layout 패스에서 고정된 시드 세트가 설정된 경우에도 패스의 출력이 비결정적일 수 있는 문제를 수정했습니다. 특히 입력 회로에 단일 큐비트 연산만 포함된 활성 큐비트가 존재할 경우 해당 현상이 발생했습니다. 수정됨 #14729

  • 여러 회로로 실행 시 함수가 callback 호출되지 않던 PassManager.run() 버그를 수정했습니다. 이제 각 회로에 대한 각 패스에서, 병렬 실행을 포함하여 콜백이 올바르게 트리거됩니다.

  • 트랜스파일러 CommutativeInverseCancellation 패스에서 여러 문제를 수정했습니다. 이 패스는 이제 연산, 제어 흐름 연산 및 와 Clifford 같은 비가역 연산을 포함하는 Initialize회로에서 올바르게 작동합니다.

    또한 패스는 이제 역 게이트 쌍을 식별할 때 항상 구문(비매트릭스 기반) 검사를 먼저 수행합니다. 게이트가 구문적으로 동일하지 않은 경우, matrix_based 인수가 True 으로 설정되고 연산이 max_qubits 큐비트 이상에서 동작하지 않으면 매트릭스 기반 검사도 수행됩니다. 이렇게 하면 패스의 감소 가능성이 약간 향상됩니다.

    14407, #14635#14645를 수정했습니다.

  • 트랜스파일러 CommutativeCancellation 패스(그리고 그에 따라 transpile())에서 회로의 글로벌 단계가 올바르게 업데이트되지 않던 여러 문제를 수정했습니다. 특히, X-게이트와 RX-게이트를 병합하면 위상 불일치가 발생했으며, 각도가 다음과 같은 형태인 파울리 회전 게이트( (2+4k)π(2 + 4k)\pi )를 제거할 때, kZk \in \mathbb Z 는 잘못된 위상 이동( 1-1 )을 생성했습니다.

  • 표준 제어 게이트가 올원(all-ones) 상태가 아닌 다른 상태에서 제어될 경우 올바르게 처리되지 않던 문제를 수정했습니다 CommutationChecker. 수정됨 #14974

  • . CommutativeCancellation의 비결정성을 수정했습니다. 이는 내장된 표준 정렬 함수 덕분에 노드 순서 결정성이 중요한 경우 일반적으로 사용해야 하는 또는 topological_op_nodes() DAGCircuit.topological_nodes() 가 반환하는 순서에는 영향을 미치지 않았습니다. 그러나 임의의 순서로 노드를 검사하는 경우(DAGCircuit.op_nodes()) 또는 에지 구조를 검사하는 경우(DAGCircuit.edges()), 호출 후 반복 순서는 CommutativeCancellation비결정적이 될 것이다.

  • 오픈 컨트롤 MCX 게이트에 추가 MCXGate 컨트롤을 추가할 때 MCXGate.control(), 해당 컨트롤 MCX ctrl_state 게이트의 크기를 고려하지 않아 확장된 MCX 게이트의 ctrl_state 크기가 잘못 계산되던 버그를 수정했습니다. 명시적인 MCX 클래스 CXGate, CCXGate, C3XGate, 및 C4XGate 는 이미 올바르게 처리되었음을 유의하십시오.

  • Python 3.9 에 대한 사용 중단 경고가 사용자 코드에 의한 것으로 올바르게 식별되도록 수정했습니다. 이전에는 사용자 코드로 인해 발생한 것으로 식별되지 않았기 때문에 Python 의 기본 경고 필터가 사용자에게 경고를 표시하지 않았습니다.

  • dimacs 파일에서 로드하려고 할 때 발생하는 PhaseOracle 오류가 PhaseOracleGateBitFlipOracleGate TypeError수정되었습니다.

  • 트랜스파일러 ElidePermutations 패스에서 s가 PermutationGate 존재할 때 큐비트 매핑이 올바르게 업데이트되지 않아 잘못된 회로가 생성되고 패스 매니저의 속성 세트가 잘못 업데이트되는 버그를 수정했습니다.

  • 내장 트랜스파일러는 해당 final_layout 속성을 설정하는 경우, 해당 필드가 이미 설정된 상태라면 이제 이 필드의 업데이트를 올바르게 처리합니다. 이것은 이제 를 설정하는 한 번 이상의 패스를 TranspileLayout.routing_permutation 실행한 후 올바른 final_layout순열을 반환하는 방법으로 관찰될 수 있다.

    이는 Qiskit의 내장 플러그인을 사용한 generate_preset_pass_manager() 또는 transpile() 에 대한 일반적인 호출에는 영향을 미치지 않았습니다. 이러한 형태로 구성된 파이프라인은 를 두 번 이상 final_layout 설정하려고 시도하지 않습니다.

  • 회로에 HighLevelSynthesis 클래식 레지스터를 가진 상위 레벨 객체가 포함된 경우, 해당 객체 내 상대 인덱스로 매핑되는 버그를 수정하였습니다. 이는 외부 회로의 대응 인덱스로 매핑되어야 하는 부분입니다. 클래식 레지스터가 이제 외부 회로 인덱스에 올바르게 매핑됩니다.

  • 기존 명령어와 일치하는 및 parameters operation_name 인수로 메서드가 호출될 때 명령어의 큐비트 순서 검사가 생략되던 버그를 수정했습니다. Target.instruction_supported()

  • 인수가 max_trials 또는 음수로 VF2Layout None 설정되었을 때의 동작을 수정했습니다. 해당 패스는 옵션이 설정된 경우 회로 또는 대상의 크기를 기준으로 검색을 제한하는 것으로 문서화되었으며 None , 무제한 검색을 지정하기 위해 음수 값을 허용하는 것으로 기록되었습니다. 그러나 2.1.0 에서 이 동작이 잘못 변경되어 무한한 검색을 수행하게 None 되었으며, 음수를 사용하려고 하면 오류가 발생하게 되었습니다. 이러한 누락 사항들은 패스가 문서화된 대로 동작하고 이전 릴리스와 일관성을 유지하도록 수정되었습니다.

  • 고수준 합성 MCXSynthesis1DirtyKG24MCXSynthesis2DirtyKG24 플러그인에서 사용 가능한 깨끗한 보조 큐비트를 사용 가능한 더러운 MCXGate 보조 큐비트로 간주하지 않는 문제를 수정했습니다. 특히, 깨끗한 보조 큐비트 하나와 더러운 보조 큐비트 하나가 사용 가능한 경우 플러그인이 적용되지 MCXSynthesis2DirtyKG24 않았다.

  • 이제 이 PauliEvolutionGate.to_matrix() 메서드는 정확한 행렬 지수 exp(itH)\exp(-it H) 를 반환합니다. 여기서 HH 는 게이트에 전달된 operator``timett 입니다. 이것은 예상치 못한 동작을 수정합니다. 왜냐하면 는 PauliEvolutionGate 정확한 시간 진화를 나타내도록 문서화되어 있지만, 이전에는 행렬이 컴파일러가 시간 진화를 어떻게 근사화하는지에 따라 달라졌기 때문입니다. 해당 to_matrix 메서드는 이제 문서와 일관성을 유지합니다.

  • 다수의 하위 표현식을 결합하여 점진적으로 빌드할 때 ParameterExpression 발생하는 성능 저하 문제를 수정했습니다. 수정됨 #14653

  • 지연 명령어가 포함된 회로를 'ps' 단위를 사용하여 QASM3 으로 내보낼 때 정확성 버그가 수정되었습니다.

  • 회로 QFT 표시 시 발생하는 특수한 경우를 수정했습니다. 이전에는 가 QFT.inverse() 호출된 후 QFT 회로의 속성이 수정되면, QFT가 로 표시되었습니다 "IQFT_dg". 이것은 잘못된 것이었고, 이제 올바르게 표시됩니다 "IQFT". #14758 수정됨.

  • 플러그인의 PauliEvolutionSynthesisRustiq 버그를 수정했습니다. 해당 버그는 연산자의 객체가 PauliEvolutionGate 유형의 객체를 포함하는 경우 잘못된 SparseObservable 회로를 생성하는 문제였습니다.

    예를 들어,

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable, Operator
    from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq
    
    obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4)
    evo = PauliEvolutionGate(obs, 1)
    qct = PauliEvolutionSynthesisRustiq().run(evo)
    assert Operator(qct) == Operator(evo)
  • 함수에서 generate_preset_pass_manager() 인수가 backend 설정되지 않았을 때 제공된 객체에 Target 포함된 타이밍 제약 조건 데이터를 잘못 무시하는 문제를 수정했습니다. 수정됨 #14329

  • ObservablesArray.coerce_observable() 에서 관측값이 헤르미티안이 아닌 예외가 과도하게 트리거되던 버그를 수정했습니다. zero 과 같은 관찰 가능 항목은 허용되지 않으며 이제 정상적으로 실패를 호출합니다.

  • qiskit.circuit.library.quantum_volume() 해당 인자( seednumpy.random.Generator argument)의 입력값으로 를 처리하도록 업데이트되었습니다. 이전에는 이러한 생성자 인자가. TypeError을 발생시켰을 것입니다.

  • QuantumCircuit.compose() 이제 인수가 var_remap 지정된 경우 Delay 명령어에서 사용되는 모든 변수와 구간을 올바르게 재매핑합니다.

  • SabreLayout 시험 중 하나로 "고밀도 부분집합" 레이아웃을 사용하며, 동일한 알고리즘을 따릅니다 DenseLayout. 그러나 이전에는 Sabre가 사용한 버전이 더미 보조 큐비트를 포함한 모든 가상 큐비트를 물리적 큐비트에 할당하여 알고리즘의 효율성을 저해했으나, 정확성 자체는 훼손하지 않았습니다. 이제 Sabre는 이 초기 시험을 위해 사용자가 정의한 가상 큐비트만을 사용할 것이며, 이는 대규모 회로 클래스에서 평균화할 때 레이아웃 선택에 소폭의 개선을 가져올 수 있습니다.

  • 중복을 병합하기 전에 계수의 크기에 따라 파울리 항을 제거하는 메서드의 버그를 SparsePauliOp.simplify() 수정했습니다. 이로 인해 두 가지 주요 경계 사례에서 잘못된 동작이 발생했습니다:

    1. 여러 개의 동일한 폴리 항이 개별적으로 단순화 임계값보다 작지만 합이 임계값을 초과하는 작은 계수를 가진 경우, 해당 항이 잘못 제거되었습니다.
    2. 여러 개의 동일한 폴리 항이 임계값을 초과하지만 합이 0에 가까운 계수를 갖는 경우 잘못 보관된 것입니다.

    자세한 내용은 #14194를 참조하세요.

  • TranspileLayout.initial_index_layout() 이제 생성자에서 인덱스 순서로 initial_layout 지정되지 않은 가상 큐비트가 포함된 경우 해당 filter_ancillas=True 인수를 올바르게 처리합니다.

  • VF2Layout 그리고 이제 완전히 유휴 상태인 큐비트에 대한 ( VF2PostLayout 임의의) 레이아웃 할당을 올바르게 포함할 것입니다. 이전에는 컴파일 후 호출이 TranspileLayout.initial_index_layout() 실패하는 것으로 관찰되었을 수 있습니다.

  • 트랜스파일러 VF2PostLayout 패스에서 문제를 수정했습니다. 특정 상황에서 패스가 인자로 실행될 때 회로의 상호작용 그래프에 1큐비트 연산만 수행하는 strict_direction=True 큐비트가 포함된 경우 잠재적인 런타임 확장성 문제가 발생할 수 있었습니다. 이러한 매핑 문제로 인해 점수 산정 과정에 조합적 복잡성이 발생하며, 이로 인해 패스가 거의 항상 점수 산정 시간 제한에 걸리게 되고 일반적으로 레이아웃 개선 효과가 나타나지 않습니다. 모드에서는 strict_direction=False 이러한 문제들에 대해 최적화된 검색 구현이 존재하지만, 에 대한 추가 제약 strict_direction=True 조건들로 인해 이 접근법은 실행 가능하지 않습니다. 대신 이러한 경우 레이아웃 문제가 패스에 VF2PostLayout 적합하지 않으므로 검색을 건너뜁니다.

기타 참고사항

  • 현재 SabreSwapSabreLayout 에서 사용 중인 Sabre 라우팅 구현은 내부 가상 상호작용 표현 내에서 동시에 자동으로 라우팅 대상이 될 수 있는 연속된 노드들을 압축합니다. 이는 라우팅 효율을 향상시키고 중간 메모리 사용량을 줄이며, 2q 게이트의 연속으로 인한 휴리스틱 구성 lookahead 요소의 편향을 방지합니다.

2.1.0rc1

지원 중단 노트

  • Python 3.9 으로 키스킷 실행에 대한 지원은 더 이상 사용되지 않으며, 키스킷 2.3.0 릴리스에서 제거될 예정입니다. 2.3.0 은 Python 3.9 이 수명이 종료되어 더 이상 지원되지 않는 후 첫 번째 릴리스입니다. [1] 즉, 2.3.0 릴리스부터는 사용 중인 Python 버전을 Python 3.9 이상으로 업그레이드해야 합니다.

    [1] https://devguide.python.org/versions/

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