Azure Quantum QIR целевые профили в QDK

Квантовые вычисления по-прежнему являются новыми технологиями. Не все квантовое оборудование может запускать все квантовые программы. Например, только определённое аппаратное обеспечение может выполнять измерения в середине квантовой схемы, которые необходимы для запуска программ с условными ветвями на основе результатов измерения кубита.

Когда вы отправляете программу для выполнения на Azure Quantum, она преобразуется в формат промежуточного квантового представления (QIR). QIR не зависит от языка программирования или типа квантового оборудования, на котором выполняется программа. Модель MicrosoftQuantum Development Kit (QDK) поддерживает несколько целевых профилей QIR для различных аппаратных возможностей.

Дополнительные сведения см. в QIRразделе "Квантовое промежуточное представление".

Обзор целевых профилей

Azure Quantum и QDK поддерживают несколько QIR целевых профилей. Тип целевого профиля, который вы выбираете, определяет, какой из следующих конструкций программирования может использовать ваша программа.

  • Условные ветви с операторами if в зависимости от результатов измерения кубита
  • Арифметические операции с числами с плавающей запятой, вычисляемых из результатов измерения кубита
  • Фиксированные и несвязанные циклы на основе результатов измерения кубитов

В следующей таблице перечислены все целевые профили QIR в QDK и конструкции программирования, которые они поддерживают, в порядке от наиболее строгих к наименее строгим.

QIR целевой профиль Условные ветви Операции с плавающей запятой Loops
Base
Adaptive RI
Adaptive RIF
Adaptive
Unrestricted

Настройте целевые профили в QDK

Чтобы запустить программу на QDK симуляторах или Azure Quantum целевом объекте, необходимо задать целевой QIR профиль. Если вы не настраиваете профиль целевого объекта вручную, QDK пытается автоматически задать соответствующий профиль для выбранного целевого объекта.

при отправке программ для выполнения через Azure Quantum службу QDK пытается автоматически выбрать соответствующий профиль для выбранного целевого объекта выполнения.

Base QIR профиль

Базовый QIR целевой профиль является самым строгим. Используйте базовый профиль для более простых программ, которые не используют классические структуры программирования, такие как ветви и циклы. Если целевой объект квантового оборудования не может выполнять измерения среднего канала, вероятно, вам потребуется использовать базовый профиль.

Следующие Azure Quantum целевые объекты могут запускать программы, использующие базовый QIR профиль.

Provider Симулятор Квантовый процессор (QPU)
IonQ ionq.simulator ionq.qpu.*
Rigetti rigetti.sim.* rigetti.qpu.*

Дополнительные сведения об этих Azure Quantum поставщиках см. в разделе поставщика IonQ и поставщика Rigetti.

Настройка базового профиля

Чтобы задать базовый QIR целевой профиль в QDK расширении для Visual Studio Code (VS Code), выберите один из следующих параметров.

  • Если вы настроили проект Q#, добавьте следующую команду в файл проекта qsharp.json .

    {
      "targetProfile": "base"
    }
    
  • Если вы работаете в .qs файле, который не является частью проекта Q#, задайте целевой профиль непосредственно в коде Q#. Для этого добавьте @EntryPoint(Base) в строке перед операцией точки входа в вашей программе.

    @EntryPoint(Base)
    operation Main() : Unit {
    
    ...
    
    }
    

Чтобы задать базовый целевой профиль в пакете QDK Python, выполните следующий код.

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Base) 

Ограничения на программы Q# с базовым профилем

Базовый целевой профиль может выполнять широкий спектр программ Q#. Основное ограничение заключается в том, что программы Q# не могут выполнять логические сравнения со значениями Result типов из операций измерения.

Например, нельзя выполнить следующую FlipQubitOnZero операцию в базовом целевом объекте, так как программа содержит if инструкцию, которая использует результат измерения.

    @EntryPoint(Base)
    operation FlipQubitOnZero() : Unit {
        use q = Qubit();
        if M(q) == Zero {
            X(q);
        }
    }

Adaptive RI QIR профиль

Адаптивный целевой профиль RI поддерживает запуск более широкого набора программ, чем базовый профиль, но всё же имеет некоторые ограничения. Adaptive RI целевые объекты поддерживают программы, использующие измерения среднего канала в условных if инструкциях. Если ваше квантовое оборудование поддерживает измерения в середине схемы, а программа использует операторы if, зависящие от результатов измерений, то вам, вероятно, нужно использовать адаптивный профиль RI.

Например, следующая программа Q# может выполняться в адаптивном целевом объекте ri.

@EntryPoint(Adaptive_RI)
operation MeasureQubit(q : Qubit) : Result { 
    return M(q); 
}

operation SetToZero(q : Qubit) : Unit {
     if MeasureQubit(q) == One { X(q); }
}

Следующие Azure Quantum целевые объекты могут запускать программы, использующие адаптивный профиль целевого объекта RI.

Provider Симулятор Квантовый процессор (QPU)
Квантинум quantinuum.sim.h2-1e quantinuum.qpu.h2-1
Квантинум quantinuum.sim.h2-2e quantinuum.qpu.h2-2

Дополнительные сведения о Quantinuum см. в Azure Quantumразделе "Поставщик Quantinuum".

Настройка адаптивного профиля RI

Чтобы задать целевой профиль adaptive RI QIR в расширении QDK для VS Code, выберите один из следующих вариантов.

  • Если вы настроили проект Q#, добавьте в файл проекта qsharp.json следующую команду:

    {
      "targetProfile": "adaptive_ri"
    }
    
  • Если вы работаете в .qs файле, который не является частью проекта Q#, задайте целевой профиль непосредственно в коде Q#. Для этого добавьте @EntryPoint(Adaptive_RI) в строке перед операцией точки входа в вашей программе.

    @EntryPoint(Adaptive_RI)
    operation Main() : Unit {
    
    ...
    
    }
    

Чтобы задать целевой профиль адаптивного RI в пакете Python QDK, запустите следующий код.

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive_RI)

Adaptive RIF QIR профиль

Адаптивный целевой профиль RIF имеет те же возможности, что и адаптивный профиль RI, но также поддерживает программы, содержащие арифметические операции с плавающей запятой. Если ваше квантовое оборудование может выполнять измерения в середине схемы, а ваша программа использует операторы if и числа с плавающей запятой, вычисляемые на основе результатов измерений, то вам, вероятно, нужно использовать адаптивный профиль RIF.

Например, следующая программа Q# может выполняться в адаптивном целевом объекте RIF.

@EntryPoint(Adaptive_RIF)
operation DynamicFloat() : Double {
    use q = Qubit();
    H(q);
    mutable f = 0.0;
    if M(q) == One {
        f = 0.5;
    }
    Reset(q);
    return f;
}

Azure Quantum в настоящее время не имеют адаптивных целевых объектов RIF, но вы можете запускать программы для адаптивных целевых объектов RIF на локальных QDK симуляторах. Дополнительные сведения об симуляторах см. в QDKразделе "Общие сведения о квантовых симуляторах" в этой QDKстатье.

Настройка адаптивного профиля RIF

Чтобы задать адаптивный целевой профиль RIF QIR в QDK расширении VS Code, выберите один из следующих параметров.

  • Если вы настроили проект Q#, добавьте в файл проекта qsharp.json следующую команду:

    {
      "targetProfile": "adaptive_rif"
    }
    
  • Если вы работаете в .qs файле, который не является частью проекта Q#, задайте целевой профиль непосредственно в коде Q#. Для этого добавьте @EntryPoint(Adaptive_RIF) в строке перед операцией точки входа в вашей программе.

    @EntryPoint(Adaptive_RIF)
    operation Main() : Unit {
    
    ...
    
    }
    

Чтобы задать адаптивный целевой профиль RIF в пакете QDK Python, выполните следующий код.

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive_RIF) 

Adaptive QIR профиль

Адаптивный целевой профиль имеет те же возможности, что и адаптивный профиль RIF, но также поддерживает программы, использующие циклы на основе результатов измерения. Adaptive Программы могут использовать циклы с заданным числом итераций и циклами повторения до успешного выполнения (RUS).

Azure Quantum в настоящее время не имеет адаптивных целевых объектов, но вы можете запускать программы для адаптивных целевых объектов на локальных QDK симуляторах. Дополнительные сведения об симуляторах см. в QDKразделе "Общие сведения о квантовых симуляторах" в этой QDKстатье.

Настройка адаптивного профиля

Чтобы задать адаптивный QIR целевой профиль в QDK расширении VS Code, выберите один из следующих параметров.

  • Если вы настроили проект Q#, добавьте в файл проекта qsharp.json следующую команду:

    {
      "targetProfile": "adaptive"
    }
    
  • Если вы работаете в .qs файле, который не является частью проекта Q#, задайте целевой профиль непосредственно в коде Q#. Для этого добавьте @EntryPoint(Adaptive) в строке перед операцией точки входа в вашей программе.

    @EntryPoint(Adaptive)
    operation Main() : Unit {
    
    ...
    
    }
    

Чтобы задать адаптивный целевой профиль в пакете QDK Python, выполните следующий код.

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Adaptive) 

Unrestricted QIR профиль

Неограниченный целевой профиль позволяет запускать все квантовые программы. Текущий квантовый целевой объект не поддерживает неограниченный QIR, но можно использовать неограниченный профиль для выполнения сложных программ на QDK симуляторах для квантовой разработки.

Настройка неограниченного профиля

Чтобы задать неограниченный профиль целевого QIR объекта в QDK расширении VS Code, выберите один из следующих параметров.

  • Если вы настроили проект Q#, добавьте в файл проекта qsharp.json следующую команду:

    {
      "targetProfile": "unrestricted"
    }
    
  • Если вы работаете в .qs файле, который не является частью проекта Q#, задайте целевой профиль непосредственно в коде Q#. Для этого добавьте @EntryPoint(Unrestricted) в строке перед операцией точки входа в вашей программе.

    @EntryPoint(Unrestricted)
    operation Main() : Unit {
    
    ...
    
    }
    

Чтобы задать неограниченный профиль целевого объекта в пакете QDK Python, выполните следующий код.

from qdk import init, TargetProfile

init(target_profile=TargetProfile.Unrestricted)