Выполнение гибридных заданий квантовых вычислений с помощью адаптивного target профиля

Гибридные вычисления объединяют классические и квантовые вычислительные процессы для решения сложных проблем.

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

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

Предварительные условия

Если вы хотите отправить Q# автономные программы, вам также потребуется следующее условие:

Если вы хотите отправить Python и Q# программы, вам также потребуются следующие предварительные требования:

  • Среда Python с установленными Python и Pip.

  • Последний qdk пакет Python с дополнительным azure дополнительным.

    pip install --upgrade "qdk[azure]"
    

Добавлена поддержка targets.

Для выполнения гибридных заданий квантовых вычислений необходимо выбрать квантовый поставщик, поддерживающий Adaptive RItarget профиль.

В настоящее время адаптивный target профиль в Azure Quantum поддерживается в Quantinuumtargets.

Отправка адаптивных заданий типа RI

Чтобы отправить задания гибридных квантовых вычислений, необходимо настроить target профиль как Adaptive RI, где ri обозначает "qubit Reset и Integer computations".

Профиль Adaptive RItarget предлагает поддержку измерений в середине схемы, управления потоком на основе измерений, сброса кубита и классических целочисленных вычислений.

Гибридные квантовые задания можно отправлять в Azure Quantum в виде Q# автономных программ или программ Python + Q#. Сведения о настройке target профиля гибридных квантовых заданий см. в следующих разделах.

Чтобы настроить target профиль для гибридных заданий в Visual Studio Code, выберите один из следующих вариантов:

  • Если ваш файл Q# не является частью проекта Q#, откройте файл и введите @EntryPoint(Adaptive_RI) перед операцией входа в программу.

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

    {
      "targetProfile": "adaptive_ri"
    }
    

При настройке target профиля на Adaptive RI, можно отправить программу Q# в качестве гибридного квантового задания в Quantinuum. Для этого выполните следующие действия.

  1. Откройте меню "Вид" и выберите Палитру команд, введите QDK: Подключитесь к рабочей области Azure Quantum и нажмите клавишу ВВОД.
  2. Выберите учетную запись Azure и следуйте инструкциям по подключению к предпочтительному каталогу, подписке и рабочей области.
  3. После подключения для просмотра рабочих областей Azure Quantum выберите значок Microsoft панели Quantum (в нижнем левом углу).
  4. Расширьте ваше рабочее пространство и разверните поставщика Quantinuum.
  5. Выберите любой доступный Quantinuum target, например, quantinuum.sim.h2-1e.
  6. Щелкните значок воспроизведения справа от target имени, чтобы начать отправку текущей Q# программы.
  7. Введите имя для обозначения задания и число снимков.
  8. Нажмите клавишу ВВОД , чтобы отправить задание. Состояние задания отображается в нижней части экрана.
  9. Разверните Jobs и наведите указатель мыши на ваше задание, чтобы отобразить время и состояние вашего задания.

Поддерживаемые функции

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

Поддерживаемые функции Примечания.
Динамические значения Логические и целые числа, значение которых зависит от результата измерения
Циклы Только классически ограниченные циклы
Произвольный поток управления Использование ветвления if/else
Измерение в середине цепи Использует классические ресурсы регистрации
Повторное использование кубита Поддерживается
Классические вычисления в режиме реального времени Арифметика 64-разрядных целых чисел со знаком использует классические ресурсы регистра.

QDK предоставляет targetспециальные отзывы, если Q# языковые функции не поддерживаются для выбранного параметра target. Если программа Q# содержит неподдерживаемые функции при выполнении гибридных квантовых заданий, вы получите сообщение об ошибке во время разработки. Дополнительные сведения см. на QIR вики-странице.

Примечание.

Необходимо выбрать соответствующий Adaptive RItarget профиль, чтобы получить соответствующую обратную связь при использовании Q# функций, которые target не поддерживает.

Чтобы просмотреть поддерживаемые функции в действии, скопируйте следующий код в Q# файл и добавьте последующие фрагменты кода.

import Std.Measurement.*;
import Std.Math.*;
import Std.Convert.*;

operation Main() : Result {
    use (q0, q1) = (Qubit(), Qubit());
    H(q0);
    let r0 = MResetZ(q0);

    // Copy here the code snippets below to see the supported features 
    // in action.
    // Supported features include dynamic values, classically-bounded loops, 
    // arbitrary control flow, and mid-circuit measurement.

    r0
}

Quantinuum поддерживает динамические логические и целые числа, то есть логические и целые числа, зависящие от результатов измерений. Обратите внимание, что r0 это Result тип, который можно использовать для создания динамических логических и целых значений.

    let dynamicBool = r0 != Zero; 
    let dynamicBool = ResultAsBool(r0); 
    let dynamicInt = dynamicBool ? 0 | 1; 

Quantinuum поддерживает динамические булевы значения и целые числа, однако Quantinuum не поддерживает динамические значения для других типов данных, таких как double. Скопируйте следующий код, чтобы просмотреть отзывы об ограничениях динамических значений.

    let dynamicDouble = r0 == One ? 1. | 0.; // cannot use a dynamic double value
    let dynamicInt = r0 == One ? 1 | 0;
    let dynamicDouble = IntAsDouble(dynamicInt); // cannot use a dynamic double value
    let dynamicRoot = Sqrt(dynamicDouble); // cannot use a dynamic double value

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

    let staticRoot = Sqrt(4.0);
    let staticBigInt = IntAsBigInt(2);

Даже динамические значения поддерживаемых типов не могут использоваться в определенных ситуациях. Например, Quantinuum не поддерживает динамические массивы, то есть массивы, размер которых зависит от результата измерения. Quantinuum не поддерживает динамически привязанные циклы. Скопируйте следующий код, чтобы просмотреть ограничения динамических значений.

    let dynamicInt = r0 == Zero ? 2 | 4;
    let dynamicallySizedArray = [0, size = dynamicInt]; // cannot use a dynamically-sized array
    let staticallySizedArray = [0, size = 10];
    // Loops with a dynamic condition are not supported by Quantinuum.
    for _ in 0..dynamicInt {
         Rx(PI(), q1);
    }
        
    // Loops with a static condition are supported.
    let staticInt = 3;
    for _ in 0..staticInt {  
         Rx(PI(), q1);  
    }

Quantinuum поддерживает поток управления, включая ветвление, используя как статические, так и if/else динамические условия. Ветвление по динамическим условиям также называется ветвлением, основанным на результатах измерений.

    let dynamicInt = r0 == Zero ? 0 | 1; 
    if dynamicInt > 0 {
        X(q1);
     }
    let staticInt = 1;
    if staticInt > 5 {
         Y(q1);
    } else {
         Z(q1);
    }

Quantinuum поддерживает циклы с классическими условиями, включая if выражения.

    for idx in 0..3 {
        if idx % 2 == 0 {
            Rx(ArcSin(1.), q0);
            Rz(IntAsDouble(idx) * PI(), q1)
        } else {
            Ry(ArcCos(-1.), q1);
             Rz(IntAsDouble(idx) * PI(), q1)
        }
     }

Quantinuum поддерживает измерение среднего канала, то есть ветвление на основе результатов измерения.

    if r0 == One {
        X(q1);
    }
    let r1 = MResetZ(q1);
    if r0 != r1 {
        let angle = PI() + PI() + PI()* Sin(PI()/2.0);
        Rxx(angle, q0, q1);
    } else {
        Rxx(PI() + PI() + 2.0 * PI() * Sin(PI()/2.0), q1, q0);
    }

Оценка стоимости задачи гибридного квантового вычисления

Вы можете оценить затраты на выполнение задания гибридных квантовых вычислений на оборудовании Quantinuum, сначала выполнив задание в эмуляторе.

После успешного выполнения эмулятора:

  1. В рабочей области Azure Quantum выберите управление заданиями.
  2. Выберите отправленное задание.
  3. Во всплывающем окну "Сведения о задании" выберите "Оценка затрат", чтобы просмотреть, сколько eHQCs (кредиты эмулятора Quantinuum) использовались. Это число непосредственно соответствует количеству HQCs (квантинум квантовых кредитов), необходимых для выполнения задачи на оборудовании Quantinuum.

Оценка затрат

Примечание.

Quantinuum разворачивает всю схему и вычисляет затраты на всех путях кода, независимо от того, будут они выполняться условно или нет.

Примеры гибридных квантовых вычислений

Следующие примеры можно найти в Q# репозитории примеров кода. Они демонстрируют текущий набор функций для гибридных квантовых вычислений.

Трехкубитный код повторения

В этом примере показано, как создать трехкубитный код повторения, который можно использовать для обнаружения и исправления ошибок перевернутого бита.

Он использует интегрированные функции гибридных вычислений для подсчета количества операций исправления ошибок во время согласованного состояния логического регистра кубита.

В этом примере можно найти код.

Итеративная оценка фазы

В этом примере программы демонстрируется итеративная оценка фазы внутри Q#. Используется итеративная оценка фазы для вычисления внутреннего продукта между двумя 2-мерными векторами, закодированными на target кубите и вспомогательном кубите. Дополнительный кубит элемента управления также инициализирован, который является единственным кубитом, используемым для измерения.

Схема начинается с кодирования пары векторов на target кубите и анциллярного кубита. Затем он применяет оператор Oracle ко всему регистру, контролируемый с помощью кубита управления, который настраивается в состоянии $\ket +$. Контролируемый оператор Oracle генерирует фазу на состоянии $\ket 1$ управляющего кубита. Затем это можно считывать, применяя шлюз H к кубите управления, чтобы сделать этап наблюдаемым при измерении.

В этом примере можно найти код.

Примечание.

Этот пример кода был написан членами команды KPMG Quantum в Австралии и находится под лицензией MIT. Он демонстрирует расширенные возможности Adaptive RItargets и использует циклы с ограничениями, классические вызовы функций во время выполнения, вложенные условные операторы if, промежуточные измерения и повторное использование кубитов.

  • Приступим к работе с сеансами