Начало работы с программами Q# и Visual Studio Code

В этой статье описано, как использовать VC Code для создания и отправки заданий квантовых вычислений Q#, Jupyter Notebook или Python в Azure Quantum с помощью VS Code.

Отправка заданий Q# в Azure Quantum

Узнайте, как использовать VS Code для запуска, отладки и отправки программы Q# в Azure Quantum.

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

Сведения об установке см. в статье Установка современного QDK в VS Code.

Загрузка примера программы Q#

  1. В VS Code выберите Файл > Новый текстовый файл и сохраните файл как RandomNum.qs.

  2. Откройте RandomNum.qs и введите sample, а затем выберите выборка Random Bit из списка параметров и сохраните файл.

    Снимок экрана: файл Q# в Visual Studio Code со списком примеров кода при написании примера слова в файле.

Примечание

Вы также можете открыть собственный файл Q#. Если вы запускаете старую программу Q# и возникают ошибки, см. статью Тестирование и отладка или Перенос программ в современный QDK.

Запуск программы Q#

  1. Чтобы протестировать запуск программы локально во встроенном симуляторе, щелкните Выполнить в списке команд ниже @EntryPoint()или нажмите клавиши CTRL+F5. Выходные данные отобразятся в консоли отладки.

  2. Чтобы выполнить отладку программы перед отправкой в Azure Quantum, щелкните Отладка в списке команд ниже @EntryPoint()или нажмите клавишу F5. Используйте элементы управления отладки в верхней части для пошагового перехода, входа в код и выхода из него. Дополнительные сведения об отладке программ Q# см. в разделе Тестирование и отладка.

    Снимок экрана: файл Q# в Visual Studio Code где можно найти объект кода с командами выполнения и отладки.

Визуализация гистограммы частоты

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

  1. Выберите Вид —> палитра команд и введите "гистограмма", чтобы открыть файл Q#: Выполнить и показать гистограмму . Вы также можете щелкнуть гистограмму в списке команд ниже @EntryPoint(). Выберите этот параметр, чтобы открыть окно гистограммы Q#.

    Снимок экрана: файл Q# в Visual Studio Code где найти объект кода с помощью команды гистограммы.

  2. Введите несколько снимков для выполнения программы, например 100 выстрелов, и нажмите клавишу ВВОД. Гистограмма будет отображаться в окне гистограммы Q#.

  3. Щелкните значок параметров вверху слева, чтобы отобразить параметры.

    Снимок экрана: окно гистограммы Q# в Visual Studio Code с отображением параметров.

  4. Щелкните полосу, чтобы отобразить процент от этого результата. В этом случае возможны два результата, 0 и 1, и процент каждого результата близок к 50 %.

    Снимок экрана: окно гистограммы Q# в Visual Studio Code.

Совет

Гистограмму можно масштабировать с помощью колесика прокрутки мыши или жеста трекпада. При увеличении диаграммы можно сдвигать, нажав клавишу ALT во время прокрутки.

Визуализация квантовой цепи

Схемы квантовых цепей представляют собой визуальное представление квантовых операций. Они показывают поток кубитов через квантовую программу, включая вентили и измерения, применяемые к ним. Дополнительные сведения см. в разделе Схемы квантовых схем в Visual Studio Code.

  1. Выберите Вид —> палитра команд и введите "circuit", чтобы открыть параметр Q#: Show circuit ( Показать канал ). Вы также можете щелкнуть Канал в списке команд ниже @EntryPoint().

    Снимок экрана: файл Q# в Visual Studio Code где найти команду канала code lens.

  2. Канал отображается в окне канала Q#. Схема цепи показывает один регистр кубитов, который инициализирован в состоянии |0⟩. Затем к кубитам применяется шлюз Хадамарда H, за которым следует операция измерения, представленная символом измерения. Дополнительные сведения см. в разделе Соглашения о квантовых каналах.

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

Подключение к Azure Quantum и отправка задания

Вы можете подключать и отправлять задания непосредственно из VS Code. В этом примере вы отправите задание в симулятор Rigetti.

  1. Выберите Вид —> палитра команд и введите Q#: Подключение к рабочей области Azure Quantum. Нажмите клавишу ВВОД.

  2. Выберите учетную запись Azure и следуйте инструкциям, чтобы подключиться к предпочтительному каталогу, подписке и рабочей области.

    Примечание

    Если у вас есть строка подключения, можно выбрать Строку подключения и вставить строка подключения, соответствующую рабочей области Azure Quantum. Дополнительные сведения см. в статье Подключение к рабочей области Quantum с помощью строка подключения.

  3. После подключения в области Обозреватель разверните узел Квантовые рабочие области.

  4. Разверните рабочую область и разверните поставщик Rigetti .

    Примечание

    Если при подключении к Azure Quantum возникла проблема, рядом с именем рабочей области появится значок предупреждения. Наведите указатель мыши на имя рабочей области, чтобы отобразить сведения об ошибке.

  5. Выберите rigetti.sim.qvm в качестве .target

    Снимок экрана: Visual Studio Code, на котором показано, как выбрать симулятор Rigetti в качестве target.

  6. Щелкните значок воспроизведения справа от имени, target чтобы начать отправку текущей программы Q#. Если появится всплывающее окно, выберите Изменить профиль QIR target и продолжите работу.

    Снимок экрана: Visual Studio Code, показывающий, как запустить симулятор Rigetti от имени target.

  7. Добавьте имя для идентификации задания.

  8. Добавьте количество снимков или количество запусков программы.

  9. Нажмите клавишу ВВОД , чтобы отправить задание. Состояние задания отобразится в нижней части экрана.

  10. Разверните узел Задания и наведите указатель мыши на задание, чтобы отобразить время и состояние задания.

  11. Чтобы просмотреть результаты, щелкните значок облака рядом с именем задания, чтобы скачать результаты из хранилища рабочей области и отобразить их в VS Code.

    Снимок экрана: Visual Studio Code, показывающий, как скачать и просмотреть результаты квантового задания.

Отправка заданий Jupyter Notebook в Azure Quantum

Узнайте, как использовать VS Code для запуска, отладки и отправки Jupyter Notebook Q# в Azure Quantum. Действия, описанные в этой статье, также относятся к записным книжкам Jupyter Notebook на локальном сервере Jupyter или записных книжках на портале Azure Quantum.

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

Сведения об установке см. в статье Установка современного QDK в VS Code.

Запуск и тестирование программы в локальном симуляторе

  1. В VS Code выберите Просмотр > палитры команд и Create: Создать Jupyter Notebook.

  2. В правом верхнем углу VS Code обнаружит и отобразит версию Python и виртуальную среду Python, выбранную для записной книжки. Если у вас несколько сред Python, может потребоваться выбрать ядро с помощью средства выбора ядра в правом верхнем углу. Если среда не обнаружена, см. сведения о настройке записных книжек Jupyter Notebook в VS Code .

  3. В первой ячейке записной книжки выполните следующий код Python, чтобы импортировать необходимые модули:

    import qsharp
    import azure.quantum
    
    • Модуль qsharp активирует магическую %%qsharp команду, которая позволяет ввести код Q# непосредственно в ячейку.
    • Модуль azure-quantum обеспечивает подключение к рабочей области Azure Quantum.

    Примечание

    Если ядро ipykernel Jupyter Python не обнаружено, VS Code предложит установить его.

  4. Добавьте еще одну ячейку и введите следующий код Q#, который возвращает указанное пользователем число случайных битов:

    Примечание

    Обратите внимание, что как только вы ввели магическую команду %%qsharp, ячейка записной книжки изменит тип с Python на Q#.

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  5. Чтобы протестировать операцию, можно использовать eval метод , который может вызывать любую операцию Q#, ранее определенную в записной книжке:

    qsharp.eval("RandomNBits(4)")
    
    [Zero, One, One, Zero]
    
  6. Чтобы запустить программу в локальном симуляторе run , используйте метод . shotsУкажите или количество запусков программы, и симулятор возвращает результаты в виде списка Python.

    qsharp.run("RandomNBits(4)", shots=10)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Визуализация квантовой цепи

Вы можете визуализировать квантовые цепи с помощью qsharp-widgets пакета . Этот пакет предоставляет мини-приложение, которое отрисовывает квантовую схему в виде изображения SVG. Дополнительные сведения см. в статье Схемы квантовых схем с jupyter Notebook.

Добавьте следующий код в новую ячейку, чтобы визуализировать цепь:

from qsharp_widgets import Circuit

Circuit(qsharp.circuit("RandomNBits(4)"))

Снимок экрана: Jupyter Notebook, показывающий, как визуализировать цепь для операции Q#.

Дополнительные сведения см. в разделе Соглашения о квантовых каналах.

Компиляция задания с помощью базового профиля

При запуске программ в локальном квантовом симуляторе можно отправить любой тип программы Q#. Однако оборудование targets Azure Quantum пока не поддерживает все возможности, необходимые для запуска всех программ Q#. Чтобы скомпилировать и отправить программы Q# в Azure Quantum, необходимо задать профиль target , чтобы сообщить Q# о возможностях, поддерживаемых оборудованием target . В настоящее время это базовый профиль. Дополнительные сведения см. в статье Типы профилей в Azure Quantum.

Чтобы повторно инициализировать интерпретатор Q# и скомпилировать программу с базовым профилем:

  1. Используйте метод , init чтобы задать профиль:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. После повторной инициализации интерпретатора необходимо снова запустить код с новым профилем:

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  3. Затем используйте compile метод , чтобы указать операцию или функцию, которая является точкой входа в программу. При этом код компилируется в формат QIR, который затем можно отправить на любое квантовое оборудование:

    MyProgram = qsharp.compile("RandomNBits(4)")
    

Подключение к Azure Quantum и отправка задания

Теперь, когда программа скомпилирована в правильном формате, создайте azure.quantum.Workspace объект для подключения к Azure Quantum. Для подключения вы будете использовать идентификатор ресурса рабочей области Azure Quantum. Идентификатор ресурса и расположение можно скопировать на странице обзора рабочей области в портал Azure.

  1. В новой ячейке укажите идентификатор ресурса и расположение из рабочей области Azure Quantum:

    MyWorkspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. Используйте метод , get_targets чтобы просмотреть доступное оборудование targets в рабочей области:

    MyTargets = MyWorkspace.get_targets()
    print("This workspace's targets:")
    MyTargets
    
  3. Выберите :rigetti.sim.qvmtarget

    MyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
    
  4. Наконец, используйте метод , submit чтобы отправить программу с ее параметрами и отобразить результаты:

    job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100)
    job.get_results()
    
    {'Histogram': ['[0, 0, 0, 0]',
      0.3,
      '[1, 0, 0, 0]',
      0.1,
      '[1, 1, 1, 1]',
      0.3,
      '[0, 1, 1, 1]',
      0.3]}
    
  5. Все свойства задания доступны в job.details, например:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...}
    Job name: MyQuantumJob
    Job status: Succeeded
    Job ID: 0150202e-9638-11ee-be2f-b16153380354
    

Отправка Python с заданиями Q# в Azure Quantum

Узнайте, как использовать VS Code для написания программы Python, которая вызывает операции Q#, подключается к Azure с помощью команд Python или Azure CLI и отправляет задание.

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

Сведения об установке см. в статье Установка современного QDK в VS Code.

Create и импорт операций Q#

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

  1. Выполните действия, чтобы создать проект Q#.

  2. Откройте новый текстовый файл, добавьте следующий код Q#, который возвращает указанное пользователем число случайных битов, и сохраните файл в проекте как source.qs.

    Примечание

    Обратите внимание, что в этом коде Q# нет @EntryPoint такой функции, как программа Q# (см. раздел Отправка заданий Q# в Azure Quantum), но в отличие от Jupyter Notebook требуется пространство имен (см. раздел Отправка заданий Jupyter Notebook в Azure Quantum).

    namespace Sample {
    
      operation Random() : Result {
            use q = Qubit();
            H(q);
            let result = M(q);
            Reset(q);
            return result
      }
    
      operation RandomNBits(N: Int): Result[] {
            mutable results = [];
            for i in 0 .. N - 1 {
               let r = Random();
               set results += [r];
            }
            return results
      }
    }
    
  3. В той же папке откройте другой файл и сохраните его как randomNum.py.

  4. Добавьте следующий код для импорта qsharp модулей и azure.quantum .

    import qsharp
    import azure.quantum
    
  5. Затем добавьте код для определения корневой папки проекта Q# и протестируйте выполнение операции в target локальном симуляторе. Операция вызывается пространством< имен>.<operation_name( )> и в этом случае передается число возвращаемых случайных битов.

    qsharp.init(project_root = '/MyProjectRootFolder')
    print(qsharp.eval("Sample.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. Вы также можете протестировать операцию с помощью run метода , который передает дополнительный shots параметр и возвращает результаты в списке Python. В randomNum.pyзамените предыдущую инструкцию print следующим:

    result = qsharp.run("Sample.RandomNBits(4)", shots=10)
    for x in result:
        print(x)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Компиляция задания с помощью базового профиля

При запуске программ в локальном квантовом симуляторе можно отправить любой тип программы Q#. Однако оборудование targets Azure Quantum пока не поддерживает все возможности, необходимые для запуска всех программ Q#. Чтобы компилировать и отправлять программы Q# в Azure Quantum, необходимо задать профиль target , чтобы сообщить Q# о возможностях, поддерживаемых оборудованием target . В настоящее время это базовый профиль. Дополнительные сведения см. в статье Типы профилей в Azure Quantum.

Примечание

Для программ только на Q# в VS Code VS Code VS Code задает базовый профиль автоматически.

  1. Используйте метод , init чтобы задать профиль:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. Затем используйте метод , compile чтобы указать операцию или функцию, которая является точкой входа в программу. Затем скомпилированную программу можно отправить на любое квантовое оборудование:

    MyProgram = qsharp.compile("Sample.RandomNBits(4)")
    

Подключение к Azure Quantum и отправка задания

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

Теперь, когда программа скомпилирована в правильном формате, создайте azure.quantum.Workspace объект для подключения к Azure Quantum. Для подключения вы будете использовать идентификатор ресурса рабочей области Azure Quantum. Идентификатор ресурса и расположение можно скопировать на странице обзора рабочей области в портал Azure.

  1. Добавьте следующий код randomNum.pyв , заполнив идентификатор ресурса и расположение из рабочей области Azure Quantum:

    workspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. Используйте метод , get_targets чтобы отобразить доступное оборудование targets в рабочей области:

    MyTargets = workspace.get_targets()
    print("This workspace's targets:")
    for x in MyTargets:
        print(x)
    
  3. Выберите :rigetti.sim.qvmtarget

    MyTarget = workspace.get_targets("rigetti.sim.qvm")
    
  4. Наконец, используйте метод , submit чтобы отправить программу с ее параметрами. Результаты задания возвращаются в виде словаря Python.

    job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100)
    results = job.get_results()
    print("\nResults: ", results)
    
  5. Чтобы извлечь только значения и отобразить их, выполните следующие действия:

    resultList = results.get("Histogram")
    for x in resultList:
        print(x)
    
    [0, 0, 0, 0]
    0.3
    [1, 0, 0, 0]
    0.1
    [1, 1, 1, 1]
    0.3
    [0, 1, 1, 1]
    0.3
    
  6. Все свойства задания доступны в job.details, например:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...}
    Job name: MyPythonJob
    Job status: Succeeded
    Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
    

Дальнейшие действия