Не секрет, что Q# и Quantum Development Kit позволяют легко писать квантовые программы и запускать их на симуляторах и на оборудовании через службу Azure Quantum, с использованием Python, .NET или даже через Jupyter Notebook. Более того, инфраструктура, которая поддерживает все эти различные способы использования Q#, также позволяет создавать новые и захватывающие способы написания и выполнения квантовых программ. В этой статье мы немного рассмотрим эту инфраструктуру и то, как вы можете использовать эту инфраструктуру для подключения Q# к вашим любимым языкам и платформам.
Само по себе это сильно отличается от того, как можно использовать Q# из командной строки или при создании приложения .NET, использующего квантовые вычисления. Чтобы Q# работал в интерактивной среде, Quantum Development Kit также включает IQ#, сокращенно от Interactive Q# и следуя схеме именования, популяризированной IPython, IJulia и другими подобными инструментами. Ядро IQ# использует компилятор и среду выполнения Q# в качестве библиотеки, что позволяет ему на лету вызывать компилятор и среду выполнения Q#. Это тот же подход, который используется многими другими инструментами, включенными в Quantum Development Kit, такими как интерфейс командной строки компилятора Q# (qsc.exe) или языковой сервер, используемый расширениями Visual Studio Code и Visual Studio 2019.
Использование ядра IQ# из Q# notebook
Когда ядро IQ# получает сообщения от клиентов Jupyter, оно передает исходный код Q# компилятору, возвращая программы, которые можно запускать на симуляторах или отправлять в службы Azure Quantum. Такой подход позволяет нам подключать интерактивные среды, такие как Jupyter, к остальной части Quantum Development Kit. С точки зрения платформы Jupyter ядро IQ# - это просто еще один исполняемый файл; То, что ядро IQ# написано с использованием .NET, на тот момент является деталью реализации.
Тот же подход также позволяет использовать Python в качестве основного языка для ваших квантовых программ. В частности, пакет jupyter_client можно использовать для вызова из хост-программы Python в любое ядро, распознаваемое платформой Jupyter. Пакет qsharp для Python использует jupyter_client для загрузки IQ#, отправки команд ядру и получения обратно расширенных отображаемых данных. За кулисами ваша хост-программа Python действует как другой клиент Jupyter, обмениваясь сообщениями с ядром IQ#, чтобы вы могли создавать свою программу Q# из среды со сценариями.
Использование ядра IQ# из программы Python
Например, мы можем написать небольшое приложение C#, которое использует библиотеку IQ#, чтобы предоставить компилятору Q# и среде выполнения серию простых сообщений JSON, которые легко отправлять и получать с других языков. Используя JSON.jl, мы можем написать клиент для этого нового приложения в Julia и использовать его для интерактивного создания квантовых приложений из среды Julia.
Вызов в Q# из Julia
Этот подход не ограничивается только Julia, но может использоваться в большинстве мест, где вы можете вызывать приложения командной строки. То же самое приложение C#, которое мы использовали выше, также можно быстро адаптировать, чтобы мы могли вызывать Q# из других языков, таких как Lua или даже PowerShell.
Вызов Q# из Lua
Вызов Q# из PowerShell
→ Изучите примеры кода
Изучим, что нужно сделать, чтобы добавить IQ# к боту в Discord:
public void ConfigureServices(IServiceCollection services)
{
services
// Добавьте службы, необходимые для работы в качестве приложения Discord.
.AddDiscord()
// Добавьте службы логирования.
.AddLogging(
builder => builder
.SetMinimumLevel(LogLevel.Debug)
.AddAzureWebAppDiagnostics()
.AddConsole()
)
// Добавьте сервисы, уникальные для этого бота.
.AddSingleton<CommandHandler>()
.AddSingleton<Bot>();
// Добавьте сервисы, необходимые для работы с компилятором Q# и средой выполнения.
services.AddIQSharp();
// Добавьте необходимые службы.
services.AddRazorPages();
services.AddServerSideBlazor();
}
Здесь AddIQSharp - это метод расширения, предоставляемый библиотекой IQ#, который добавляет службы IQ# в существующую коллекцию служб. Поскольку Discord.NET написан с использованием той же инфраструктуры внедрения зависимостей, вызов AddIQSharp позволяет нам немедленно запрашивать службы IQ# так же, как мы бы предоставляли сервисы Discord.NET:
public class SimulateModule : ModuleBase<SocketCommandContext>
{
private readonly ISnippets snippets;
private readonly IWorkspace workspace;
private readonly ILogger logger;
private static readonly Emoji waiting = new Emoji("");
public SimulateModule(
ISnippets snippets, IWorkspace workspace,
ILogger<SimulateModule> logger)
{
this.snippets = snippets;
this.workspace = workspace;
this.logger = logger;
}
// ...
Здесь команда нашего бота %simulate использует свой конструктор для запроса служб IQ#, таких как его фрагменты кода и менеджеры рабочей области, а также средство ведения журнала ASP.NET Core, используемое для предоставления отладочной информации.
Тот же подход можно использовать даже для предоставления REST API для компилятора Q# и среды выполнения! Например, веб-проект в репозитории microsoft/iqsharp использует IQ# вместе с ASP.NET Core, чтобы разрешить использование Q# через HTTP.
Python и Interactive Q#
Для начала давайте посмотрим, как Q# подключается к таким платформам, как Python и Jupyter. Обе платформы в значительной степени ориентированы на интерактивное использование, при котором программы не обязательно предварительно компилируются, а создаются разработчиками по частям.Само по себе это сильно отличается от того, как можно использовать Q# из командной строки или при создании приложения .NET, использующего квантовые вычисления. Чтобы Q# работал в интерактивной среде, Quantum Development Kit также включает IQ#, сокращенно от Interactive Q# и следуя схеме именования, популяризированной IPython, IJulia и другими подобными инструментами. Ядро IQ# использует компилятор и среду выполнения Q# в качестве библиотеки, что позволяет ему на лету вызывать компилятор и среду выполнения Q#. Это тот же подход, который используется многими другими инструментами, включенными в Quantum Development Kit, такими как интерфейс командной строки компилятора Q# (qsc.exe) или языковой сервер, используемый расширениями Visual Studio Code и Visual Studio 2019.
Когда ядро IQ# получает сообщения от клиентов Jupyter, оно передает исходный код Q# компилятору, возвращая программы, которые можно запускать на симуляторах или отправлять в службы Azure Quantum. Такой подход позволяет нам подключать интерактивные среды, такие как Jupyter, к остальной части Quantum Development Kit. С точки зрения платформы Jupyter ядро IQ# - это просто еще один исполняемый файл; То, что ядро IQ# написано с использованием .NET, на тот момент является деталью реализации.
Тот же подход также позволяет использовать Python в качестве основного языка для ваших квантовых программ. В частности, пакет jupyter_client можно использовать для вызова из хост-программы Python в любое ядро, распознаваемое платформой Jupyter. Пакет qsharp для Python использует jupyter_client для загрузки IQ#, отправки команд ядру и получения обратно расширенных отображаемых данных. За кулисами ваша хост-программа Python действует как другой клиент Jupyter, обмениваясь сообщениями с ядром IQ#, чтобы вы могли создавать свою программу Q# из среды со сценариями.
Вызов квантовых программ из Julia? Lua…? PowerShell…‽
Однако IQ# - это не просто исполняемая программа. Большая часть логики, которую IQ# использует для взаимодействия с компилятором Q# и средой выполнения, упакована в виде собственной библиотеки, доступной на NuGet.org в виде пакетов Microsoft.Quantum.IQSharp.Core и Microsoft.Quantum.IQSharp.Jupyter. Эти два пакета могут использоваться любыми другими приложениями .NET для реализации интеграции вашего собственного языка для Q#.Например, мы можем написать небольшое приложение C#, которое использует библиотеку IQ#, чтобы предоставить компилятору Q# и среде выполнения серию простых сообщений JSON, которые легко отправлять и получать с других языков. Используя JSON.jl, мы можем написать клиент для этого нового приложения в Julia и использовать его для интерактивного создания квантовых приложений из среды Julia.
Этот подход не ограничивается только Julia, но может использоваться в большинстве мест, где вы можете вызывать приложения командной строки. То же самое приложение C#, которое мы использовали выше, также можно быстро адаптировать, чтобы мы могли вызывать Q# из других языков, таких как Lua или даже PowerShell.
→ Изучите примеры кода
Написание ботов с внедрением зависимостей
Однако мы можем пойти еще дальше и использовать IQ# в качестве библиотеки для встраивания Q# в веб-приложения и чат-ботов. Различные компоненты, составляющие IQ#, представлены пакетами Microsoft.Quantum.IQSharp.Core и Microsoft.Quantum.IQSharp.Jupyter как службы, которые можно добавлять в ваши собственные приложения с помощью внедрения зависимостей ASP.NET Core.Изучим, что нужно сделать, чтобы добавить IQ# к боту в Discord:
public void ConfigureServices(IServiceCollection services)
{
services
// Добавьте службы, необходимые для работы в качестве приложения Discord.
.AddDiscord()
// Добавьте службы логирования.
.AddLogging(
builder => builder
.SetMinimumLevel(LogLevel.Debug)
.AddAzureWebAppDiagnostics()
.AddConsole()
)
// Добавьте сервисы, уникальные для этого бота.
.AddSingleton<CommandHandler>()
.AddSingleton<Bot>();
// Добавьте сервисы, необходимые для работы с компилятором Q# и средой выполнения.
services.AddIQSharp();
// Добавьте необходимые службы.
services.AddRazorPages();
services.AddServerSideBlazor();
}
Здесь AddIQSharp - это метод расширения, предоставляемый библиотекой IQ#, который добавляет службы IQ# в существующую коллекцию служб. Поскольку Discord.NET написан с использованием той же инфраструктуры внедрения зависимостей, вызов AddIQSharp позволяет нам немедленно запрашивать службы IQ# так же, как мы бы предоставляли сервисы Discord.NET:
public class SimulateModule : ModuleBase<SocketCommandContext>
{
private readonly ISnippets snippets;
private readonly IWorkspace workspace;
private readonly ILogger logger;
private static readonly Emoji waiting = new Emoji("");
public SimulateModule(
ISnippets snippets, IWorkspace workspace,
ILogger<SimulateModule> logger)
{
this.snippets = snippets;
this.workspace = workspace;
this.logger = logger;
}
// ...
Здесь команда нашего бота %simulate использует свой конструктор для запроса служб IQ#, таких как его фрагменты кода и менеджеры рабочей области, а также средство ведения журнала ASP.NET Core, используемое для предоставления отладочной информации.
Тот же подход можно использовать даже для предоставления REST API для компилятора Q# и среды выполнения! Например, веб-проект в репозитории microsoft/iqsharp использует IQ# вместе с ASP.NET Core, чтобы разрешить использование Q# через HTTP.
Итого
Какие бы инструменты и платформы вы ни любили, Q# и Quantum Development Kit помогут вам максимально эффективно использовать квантовые вычисления. Используя такие инструменты, как библиотека и ядро IQ#, вы можете легко расширить Q# для работы с широким спектром языков, платформ и экосистем.Внедрение Q# в ваши любимые языки и платформы (Python, .NET, ASP.NET, Julia, Lua, PowerShell)
Не секрет, что Q# и Quantum Development Kit позволяют легко писать квантовые программы и запускать их на симуляторах и на оборудовании через службу Azure Quantum, с использованием Python, .NET или...
habr.com