Поделиться через


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

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

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

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

Необходимые компоненты

  • Учетная запись Azure с активной подпиской. Если у вас нет учетной записи Azure, зарегистрируйтесь бесплатно и зарегистрируйтесь для подписки с оплатой по мере использования.
  • Рабочая область Azure Quantum. Дополнительные сведения см. в статье Создание рабочей области Azure Quantum.
  • Если вы хотите отправить Q# автономные программы, вам потребуется следующее:
  • Если вы хотите отправить программы Python + Q# , вам потребуется следующее:

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

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

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

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

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

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

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

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

  1. Q# Откройте программу в Visual Studio Code.
  2. Выберите представление —> палитра команд и типQ#: задайте профиль QIR target Azure Quantum. Нажмите ВВОД.
  3. Выберите QIR Adaptive RI.

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

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

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

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

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

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

Примечание.

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

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

import Microsoft.Quantum.Measurement.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.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 поддерживает динамические логические значения и целые числа, однако он не поддерживает динамические значения для других типов данных, таких как 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. Он демонстрирует расширенные возможности QIR Adaptive RItargets и использует ограничивающие циклы, вызовы классических функций во время выполнения, вложенные условные операторы, средние измерения канала и повторное использование кубитов.