Книга: Разработка с использованием квантовых компьютеров
Назад: 2. Квантовые вычисления: искривление ткани самой реальности
Дальше: 4. QISKit — отличный SDK для квантового программирования на Python

3. IBM Q Experience: уникальная платформа для квантовых вычислений в облаке

В этой главе мы рассмотрим квантовые вычисления в облаке с помощью IBM Q Experience — первой платформы такого типа. Глава начинается с обзора Composer — веб-консоли, используемой для визуального создания схем, запуска экспериментов, исследования аппаратных устройств и многого другого. Далее вы узнаете, как создать свой первый эксперимент и запустить его на симуляторе или реальном квантовом устройстве. IBM Q Experience обладает мощным REST API для управления жизненным циклом эксперимента, и в главе будет показано, как это делать, с подробным описанием конечных точек и параметров запроса. Глава заканчивается примером практической реализации официальной библиотеки Python (названной IBMQuantumExperience) для Node JS. Эта пользовательская библиотека Node JS позволит проверить ваши навыки работы с асинхронным JavaScript и REST API. Приступим!

IBM, безусловно, занимает первое место в гонке квантовых вычислений в облаке. Они придумали действительно классную платформу для удаленного запуска экспериментов под названием Q Experience. Мне кажется или в названиях этих инструментов действительно много аналогий с теорией музыки? Проверим: визуальный редактор, используемый для создания квантовых схем, называется Composer («Композитор»). Не странно ли? Квантовые схемы, построенные с помощью редактора, называются партитурами (как в нотах), не говоря уже о том, что визуально окно редактора очень похоже на страницу нотной тетради. Я давно играю на классической гитаре и, только взглянув на Composer, сразу вспомнил гитарную партитуру (с вентилями, напоминающими ноты). Все еще думаете, что я сумасшедший? Платформа называется Q Experience, а вы когда-нибудь слышали о Experience Джимми Хендрикса? Возможно, Composer — это сборник партитур, в котором вы создадите великолепный шедевр, чтобы все мы смогли им наслаждаться. Квантовые вычисления действительно способны изменить текущее положение дел.

Первое знакомство с IBM Q Experience

Q Experience — это платформа IBM для квантовых вычислений в облаке, и она действительно крутая. Давайте посмотрим (все материалы публикуются с разрешения © International Business Machines Corporation).

1. Создайте аккаунт на https://quantumexperience.ng.bluemix.net/qx/experience. Вам понадобится указать адрес электронной почте. Затем дождитесь письма-подтверждения и продолжите регистрацию.

2. Войдите в веб-консоль и перейдите на вкладку Composer вверху (рис. 3.1).

03_01.tif 

Рис. 3.1. Главное окно IBM Q Experience

Квантовый Composer

Composer — это визуальный инструмент для создания квантовых схем, или партитур. Вверху показана гистограмма эксперимента с доступными для использования кубитами (рис. 3.2).

03_02.tif 

Рис. 3.2. Окно эксперимента в Composer

• В левой части гистограммы видны пять кубитов, доступных из процессора ibmqx4. Все они инициализированы в основное состояние |0. Линия внизу — это линия измерения, где будут собраны результаты схемы. Помните, что измерение должно выполняться последним в схеме, так как все операции вентилей выполняются параллельно и с наложением состояний.

• В правой части — квантовые вентили. Перетащите их к местоположению определенного кубита на гистограмме, чтобы начать строить схему.

Квантовые вентили

Квантовые вентили, поддерживаемые IBM Q Experience, описаны в табл. 3.1.

Таблица 3.1. Квантовые вентили для IBM Q Experience

Вентиль

Описание

Паули Х

28522.png 

Вращает кубит на 180° вокруг оси X. Преобразует 31400.png в 31408.png и 31418.png — в 31428.png. Известен также как инвертирование разрядов или НЕ-вентиль. Представлен матрицей 31437.png

Паули Y

28545.png 

Производит поворот вокруг оси Y сферы Блоха на π радиан. Представлен матрицей Паули 31446.png, где 31458.png — мнимая единица

Паули Z

28553.png 

Производит поворот вокруг оси Z сферы Блоха на π радиан. Представлен матрицей Паули 31468.png

Адамара

28566.png 

Представляет собой поворот на π радиан вокруг оси 31479.png. Иначе говоря, преобразует состояния:

31488.png в 31496.png;

31506.png в 31514.png.

Этот вентиль требуется для создания суперпозиций

Фазового сдвига 31524.png 

28573.png 

Обладает свойством преобразования XY и ZZ. Данный вентиль расширяет вентиль Адамара для создания сложных суперпозиций

Эрмитово-сопряженная матрица для вентиля фазового сдвига 31538.png 

28580.png 

Осуществляет преобразования XY и ZZ

Управляемое НЕ (CNOT)

28587.png 

Двухкубитный вентиль, который инвертирует целевой кубит (применяет оператор Паули Х), если управляющий находится в состоянии 1. Этот вентиль требуется для создания запутывания

Фазового сдвига 31547.png 

28610.png 

Вентиль 38440.png выполняет половину обмена состояниями между двумя кубитами. Является универсальным: любой квантовый мультикубитный вентиль можно построить только из вентилей типа sqrt(swap) и однокубитных вентилей. Он представлен матрицей:

31556.png 

Эрмитово-сопряженная матрица для вентиля фазового сдвига 31564.png или оператор ИЛИ-НЕ, примененный к вентилю фазового сдвига 31574.png 

28621.png 

Представлен матрицей 31586.png 

Барьера

28630.png 

Предотвращает преобразования вдоль его исходной линии

Измерительный

28639.png 

Принимает на вход кубит в суперпозиции состояний и выдает либо 0, либо 1. Кроме того, вывод не является случайным. Есть вероятность того, что вывод примет значение 0 или 1, которое зависит от первоначального состояния кубита

Условный

28647.png 

Применяет квантовую операцию при выполнении условия

Физическое частичное вращение (вентили U)

28655.png 

U1 — однопараметрический однокубитный вентиль.

U2 — однокубитный двухпараметрический одноимпульсный вентиль.

U3 — однокубитный трехпараметрический двухимпульсный вентиль

Единичный (identity)

28665.png 

Выполняет операцию простоя (idle) на кубите в течение одной единицы времени

Вы можете перетаскивать вентили из правой части Composer, чтобы создать схему, а если предпочитаете писать код на ассемблере, переключитесь в режим редактора QASM (рис. 3.3).

03_03.tif 

Рис. 3.3. Редактор экспериментов в режиме QASM

Примечание

QASM — это квантовый язык ассемблера, созданный на базе платформы OPENQASM. Используется для экспериментов с неглубокими квантовыми схемами. Несмотря на то что умение писать на ассемблере стало чем-то вроде утраченного искусства, некоторым QASM может показаться более удобным, чем Python SDK или даже визуальный редактор.

Теперь рассмотрим различные квантовые процессоры.

Доступное квантовое серверное ПО

Есть несколько квантовых процессоров, которые можно выбрать для проведения экспериментов. В табл. 3.2 приведен официальный список, ранжированный в соответствии с количеством кубитов (по информации с сайта о серверном ПО для IBM Q Experience).

Таблица 3.2. Официальный список квантового серверного ПО, доступного для пользователей IBM Q Experience

Наименование

Подробности

Ibmqx2

Условное название: Sparrow.

Количество кубитов: 5.

Доступен онлайн с 24 января 2017 года

Ibmqx4

Условное название: Raven.

Количество кубитов: 5.

Доступен онлайн с 25 сентября 2017 года

Ibmqx3

Условное название: Albatross.

Количество кубитов: 16.

Доступен онлайн с июня 2017 года

Ibmqx5

Условное название: Albatross.

Количество кубитов: 16.

Доступен онлайн с 28 сентября 2017 года

В табл. 3.2 приведен официальный список процессоров, доступных на момент написания книги, но существует куда более интересный способ получить обновленный список доступных машин в реальном времени с помощью превосходного REST API. Более подробное описание этого API дано в разделе «Удаленный доступ через REST API» текущей главы, а пока продемонстрирую, как получить всегда актуальный список серверного ПО, используя конечную точку REST Available Backend List: https://quantumexperience.ng.bluemix.net/api/Backends?access_token=ACCESS-TOKEN.

Совет

Чтобы получить токен доступа, смотрите подраздел «Аутентификация» раздела «Удаленный доступ через REST API» на с. 130. Обратите внимание, что токен API не совпадает с токеном доступа. Токены API используются для выполнения квантовых программ через Python SDK. Токены доступа применяются для вызова REST API.

Перейдя по URL, приведенному в предыдущем абзаце, вы увидите список квантовых процессоров в формате JSON. Вот как это выглядит на момент написания книги (листинг 3.1). Учтите, что полученный вами результат может отличаться.

Листинг 3.1. HTTP-ответ на вызов Backend Information REST API

[{

    "name": "ibmqx2",

    "version": "1",

    "status": "on",

    "serialNumber": "Real5Qv2",

    "description": "5 transmon bowtie",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-01-10T12:00:00.000Z",

    "chipName": "Sparrow",

    "id": "28147a578bdc88ec8087af46ede526e1",

    "topologyId": "250e969c6b9e68aa2a045ffbceb3ac33",

    "url": "https://ibm.biz/qiskit-ibmqx2",

    "simulator": false,

    "nQubits": 5,

    "couplingMap": [

        [0, 1],

        [0, 2],

        [1, 2],

        [3, 2],

        [3, 4],

        [4, 2]

    ]

}, {

    "name": "ibmqx5",

    "version": "1",

    "status": "on",

    "serialNumber": "ibmqx5",

    "description": "16 transmon 2x8 ladder",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-09-21T11:00:00.000Z",

    "chipName": "Albatross",

    "id": "f451527ae7b9c9998e7addf1067c0df4",

    "topologyId": "ad8b182a0653f51dfbd5d66c33fd08c7",

    "url": "https://ibm.biz/qiskit-ibmqx5",

    "simulator": false,

    "nQubits": 16,

    "couplingMap": [

        [1, 0],

        …

        [15, 14]

        ]

}, {

    "name": "Device Real5Qv1",

    "status": "off",

    "serialNumber": "Real5Qv1",

    "description": "Device Real5Qv1",

    "id": "cc7f910ff2e6860e0d4918e9ee0ebae0",

    "topologyId": "250e969c6b9e68aa2a045ffbceb3ac33",

    "simulator": false,

    "nQubits": 5,

    "couplingMap": [

        [0, 1],

        [0, 2],

        [1, 2],

        [3, 2],

        [3, 4],

        [4, 2]

    ]

}, {

    "name": "ibmqx_hpc_qasm_simulator",

    "status": "on",

    "serialNumber": "hpc-simulator",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-12-09T12:00:00.000Z",

    "id": "084e8de73c4d16330550c34cf97de3f2",

    "topologyId": "7ca1eda6c4bff274c38d1fe66c449dff",

    "simulator": true,

    "nQubits": 32,

    "couplingMap": "all-to-all"

}, {

    "name": "ibmqx4",

    "version": "1",

    "status": "on",

    "serialNumber": "ibmqx4",

    "description": "5 qubits transmon bowtie chip 3",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-09-18T11:00:00.000Z",

    "chipName": "Raven",

    "id": "c16c5ddebbf8922a7e2a0f5a89cac478",

    "topologyId": "3b8e671a5a3b56899e6e601e6a3816a1",

    "url": "https://ibm.biz/qiskit-ibmqx4",

    "simulator": false,

    "nQubits": 5,

    "couplingMap": [

        [1, 0],

        [2, 0],

        [2, 1],

        [2, 4],

        [3, 2],

        [3, 4]

    ]

}, {

    "name": "ibmqx3",

    "version": "1",

    "status": "off",

    "serialNumber": "ibmqx3",

    "description": "16 transmon 2x8 ladder",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-06-06T11:00:00.000Z",

    "chipName": "Albatross",

    "id": "2bcc3cdb587d1bef305ac14447b9b0a6",

    "topologyId": "db99eef232f426b45d2d147359580bc6",

    "url": "https://ibm.biz/qiskit-ibmqx3",

    "simulator": false,

    "nQubits": 16,

    "couplingMap": [

    …

    ]

}, {

    "name": "QS1_1",

    "version": "1",

    "status": "standby",

    "serialNumber": "QS1_1",

    "description": "20 qubit device v1",

    "basisGates": "SU2+CNOT",

    "onlineDate": "2017-10-20T11:00:00.000Z",

    "chipName": "Qubert",

    "id": "cb141f7bb641b8a10487a6fab8483b86",

    "topologyId": "25197b9b73c4b52ca713ca4d126417b5",

    "simulator": false,

    "nQubits": 20,

    "couplingMap": [

    …

    ]

}, {

    "name": "ibmqx_qasm_simulator",

    "status": "on",

    "description": "online qasm simulator",

    "basisGates": "u1,u2,u3,cx,id",

    "id": "18da019106bf6b5a55e0ef932763a670",

    "topologyId": "250e969c6b9e68aa2a045ffbceb3ac33",

    "simulator": true,

    "nQubits": 24,

    "couplingMap": "all-to-all"

}]

В листинге 3.1 показан текущий список доступных процессоров, который по большей части совпадает с официальным перечнем с сайта IBM Q Experience. Тем не менее там есть много дополнительной интересной информации о конструктивных схемах машин.

• Дополнительные процессоры и симуляторы.

• Похоже, что для использования доступны два удаленных симулятора — ibmqx_qasm_simulator и ibmqx_hpc_qasm_simulator, хотя в официальной документации упоминается только ibmqx_qasm_simulator. Эта информация может пригодиться при тестировании сложных схем: чем больше симуляторов, тем лучше.

• Уже давно ходят слухи о 20-кубитном процессоре. Поговаривают даже о запланированном выходе 50-кубитного монстра к концу 2018 года. Этот список, по-видимому, подтверждает по крайней мере существование 20-кубитной машины. Но пока рано радоваться, она будет доступна только для корпоративных клиентов.

• Помимо обычной информации, такой как название машины, версия, состояние, количество кубитов и т.д., есть термины, с которыми мы должны ознакомиться.

• basisGates — физические кубитные вентили процессора. Это основа, на которой могут быть построены более сложные логические элементы. Большинство процессоров в списке используют u1, u2, u3, cx, id:

— вентили u1, u2, u3 называются частичными НЕ-вентилями, они вращают кубит вокруг осей X, Y, Z на θ, φ или λ радиан;

— cx называется управляемым НЕ-вентилем (CNOT или CX). Он задействует два кубита и выполняет операцию НЕ на втором кубите, только когда первый кубит находится в состоянии 31598.png, и оставляет его неизменным в противном случае;

— id — это единичный вентиль, который выполняет операцию простоя (idle) на кубите в течение одной единицы времени.

• couplingMap — карта связей. Определяет взаимодействия между отдельными кубитами, сохраняя при этом квантовую когерентность (или чистое состояние — представьте, что солдаты, переходя реку по старому мосту, идут не в ногу, чтобы амплитуды их шагов не совпали и это не привело к разрушению моста). Связывание кубитов в пары используется для упрощения квантовой схемы и позволяет разбить систему на более мелкие единицы.

Теперь вернемся к Composer, чтобы создать первую квантовую композицию.

Опус 1: вариации на тему состояний Белла и GHZ

Здесь мы рассмотрим два умопомрачительных квантовых эксперимента, используемых для демонстрации странности квантовой механики:

• состояния Белла — показывают, что физика не описывается локальной реальностью. Это то, что Эйнштейн назвал мистическим дальнодействием;

• GHZ-состояния — даже еще более странные, чем состояния Белла, GHZ-состояния (названные в честь своих создателей Гринбергера, Хорна и Цейлингера) являются трехкубитным обобщением состояний Белла.

Рассмотрим их подробнее.

Состояния Белла и мистическое дальнодействие

Состояния Белла являются экспериментальной проверкой известных неравенств Белла. В 1964 году ирландский физик Джон Белл предложил способ проверки квантовой запутанности (мистического дальнодействия). Он вывел ряд неравенств, которые стали очень востребованы в физическом сообществе. Они известны как неравенства Белла (сегодня называют теоремой Белла).

Рассмотрим поляризацию фотона (когда свет колеблется в определенной плоскости) под тремя углами: A = 0°, B = 120° и C = 240°. Здравый смысл подсказывает нам, что фотон имеет определенные значения одновременно для этих трех настроек поляризации и они должны соответствовать восьми случаям, приведенным в табл. 3.3.

Таблица 3.3. Перестановки для поляризации фотонов под тремя углами

Номер

А (0°)

В (120°)

С (240°)

[AB]

[BC]

[AC]

Сумма

Среднее

1

А+

В+

С+

1(++)

1(++)

1(++)

3

1

2

А+

В+

С

1(++)

0

0

1

1/3

3

А+

В

С+

0

0

1(++)

1

1/3

4

А+

В

С

0

1(––)

0

1

1/3

5

А

В+

С+

0

1(++)

0

1

1/3

6

А

В+

С

0

0

1(––)

1

1/3

7

А

В

С+

1(––)

0

0

1

1/3

8

А

В

С

1(––)

1(––)

1(––)

3

1

Теперь по теореме Белла зададимся вопросом: какова вероятность того, что поляризация у любого соседа будет такой же, как у первого? Мы также рассчитываем сумму и среднее значение поляризаций. Если предположить, что в реальности все именно так, то в соответствии с табл. 3.3 ответ на этот вопрос таков: вероятность должна быть больше или равна 1/3. Это то, что дает неравенство Белла: средство проверить данное утверждение. Но вот что невероятно: хотите верьте, хотите нет, квантовая механика противоречит неравенству Белла, давая вероятности менее 1/3. Это было экспериментально доказано в 1982 году французским физиком Аленом Аспе.

Примечание

Более подробное описание эксперимента Аспе и неравенства Белла приведено в разделе «ЭПР-парадокс разгромлен: Бор смеется последним» главы 1.

Итак, теперь переведем поляризацию фотонов из табл. 3.3 в эксперимент, который можно запустить на квантовом компьютере. В 1969 году Джон Клаузер, Майкл Хорн, Абнер Шимони и Ричард Холт представили доказательство теоремы Белла — неравенство Клаузера — Хорна — Шимони — Холта, которое формально утверждает:

31606.png 

Проиллюстрировать это нам помогут два персонажа, Алиса и Боб. На стороне Алисы имеются настройки детектора A и A', на стороне Боба — B и B', а также четыре комбинации для проверки в отдельных экспериментах. Реальное положение дел свидетельствует о том, что для пары запутанных частиц таблица четности, показывающая все возможные перестановки, выглядит следующим образом.

А

B

1

А

B'

0

A'

B

0

A'

B'

1

В классическом реализме неравенство Клаузера — Хорна — Шимони — Холта превращается в |S| = 2. Однако математический формализм квантовой механики предсказывает максимальное значение для S, соответствующее 31618.png, что нарушает это неравенство. Это можно проверить с помощью четырех отдельных квантовых схем (по одной на измерение) по два кубита в каждой. Для упрощения задачи примем, что измерения на детекторе Алисы A = Z и A' = X, а на детекторе Боба B = W и B' = V (табл. 3.4). Чтобы начать эксперимент, следует построить базовое состояние Белла (рис. 3.4), которое соответствует тождеству 31627.png.

Предыдущее выражение, по существу, означает, что кубит, находящийся у Алисы, может иметь значение 0 или 1. Если бы Алиса измерила свой кубит в стандартном базисе, результат был бы совершенно случайным с вероятностью 1/2 для каждого возможного варианта. И если бы Боб измерил свой кубит, результат был бы таким же, как у Алисы. Итак, если бы измерения выполнил Боб, то также получил бы результат, на первый взгляд кажущийся случайным, а если бы Алиса и Боб общались, они бы обнаружили, что, хоть результаты казались случайными, они коррелируют.

28854.png 

Рис. 3.4. Базовое состояние Белла

На рис. 3.4 два кубита первоначально находятся в основном состоянии 31637.png. Вентиль H создает суперпозицию первого кубита, соответствующую состоянию 31647.png. Затем вентиль CNOT инвертирует второй кубит, если первый возбужден, создавая состояние 31656.png. Это исходное запутанное состояние, необходимое для четырех измерений в табл. 3.4 (все материалы публикуются с разрешения © International Business Machines Corporation).

• Для вращения измерительного базиса вокруг оси ZW используйте серию вентилей S-H-T-H.

• Для поворота измерительного базиса вокруг оси ZV задействуйте серию вентилей S-H-T-H.

• Измерения XW и XV выполняются так же, как описано ранее, и измерение X через вентиль Адамара проводится перед стандартным измерением.

Совет

Перед выполнением эксперимента в Composer убедитесь, что для его топологии (количество кубитов и целевое устройство) в партитуре установлено значение 2 для симулятора. Некоторые топологии (например, пять кубитов в реальном квантовом устройстве) не поддерживают запутывание для кубитов 0 и 1, что приводит к ошибкам при проектировании. Обратите внимание, что целевым устройством может быть настоящий квантовый процессор или симулятор. В общем, до тех пор, пока вы используете симулятор, у вас все будет хорошо.

Таблица 3.4. Квантовые схемы для состояний Белла

Измерение состояния Белла

Результаты для 100 запусков

28995.png 

c[2]

11

10

00

01

Вероятность

0,39

0,06

0,46

0,09

29013.png 

c[2]

11

10

00

01

Вероятность

0,49

0,07

0,36

0,08

29109.png 

c[2]

11

10

00

01

Вероятность

0,42

0,05

0,49

0,04

29121.png 

c[2]

11

10

00

01

Вероятность

0,05

0,52

0,03

0,40

Теперь нужно построить таблицу с результатами каждого измерения плюс вероятность корреляции между A и B31669.png. Сумма вероятностей для четности запутанных частиц определяется как:

31677.png.

Помните, что конечная цель — определить, что верно: S ≤ 2 или |S| = 2. Таким образом, скомпоновав результаты всех измерений, мы получаем табл. 3.5.

Таблица 3.5. Объединение результатов для экспериментов Белла

 

P(00)

P(11)

P(01)

P(10)

<AB>

AB (ZW)

0,46

0,39

0,09

0,06

0,68

AB' (ZV)

0,36

0,49

0,08

0,07

0,73

A'B (XW)

0,49

0,42

0,04

0,05

0,47

A'B'(XV)

0,03

0,05

0,40

0,52

–0,32

Складываем абсолютные значения из столбца 31687.png и получаем |S| = 2,2. Этот результат противоречит неравенству Белла (как предсказывает квантовая механика) и очень близок к результатам официальных испытаний, проведенных 2 мая 2017 года учеными из IBM, которые провели 8192 запуска. Как насчет ваших?

Еще более необычно: проверка GHZ-состояний

GHZ-состояния названы в честь физиков Гринбергера, Хорна и Цейлингера, которые придумали обобщенную проверку для N запутанных кубитов. Наиболее простым является GHZ-состояние с тремя кубитами:

31724.png.

Примечание

Важность GHZ-состояний заключается в том, что они показывают: запутывание более чем двух частиц приводит к конфликту с концепцией локального реализма не только для статистических (вероятностных), но и для нестатистических (детерминистских) предсказаний.

Проще говоря, GHZ-состояния демонстрируют более сильное нарушение неравенства Белла. Рассмотрим это на примере простой головоломки. Представьте три независимых блока, каждый из которых содержит две переменные, X и Y. Каждая переменная имеет два возможных значения: 1 и –1. Нужно найти для X и Y набор значений, который является решением следующего набора тождеств.

1. XYY = 1.

2. YXY = 1.

3. YYX = 1.

4. XXX = –1.

Для нетерпеливых: решения не существует. Например, замените Y = 1 в тождествах 1, 2 и 3, а затем перемножьте их. Набор примет следующий вид.

1. X11 = 1.

2. 1X1 = 1.

3. 11X = 1.

4. XXX = –1.

5. Перемножили тождества 1, 2 и 3 и получили XXX = 1.

Решения не существует, потому что тождество 4 XXX = –1 противоречит тождеству 5 XXX = 1. Пугает то, что GHZ-состояние действительно может дать решение этой задачи, что кажется невозможным в детерминистском представлении классической реальности. Но в мире квантовой механики нет ничего невозможного, есть просто маловероятное.

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

Базовое GHZ-состояние для запуска эксперимента (так же как и результаты для вероятности, которые должны составлять около половины) показано в табл. 3.6.

Таблица 3.6. Базовое GHZ-состояние

38507.png 

29148.png 

1. В базовой схеме вентиль Адамара, примененный к кубитам 1 и 2, переводит их в суперпозицию 31733.png. В то же время вентиль X производит операцию отрицания над кубитом 3. Таким образом, мы получаем состояния 31741.png.

2. Два вентиля CNOT запутывают все кубиты в следующее состояние: 31752.png.

3. Наконец, три вентиля Адамара преобразуют шаг 2 в следующее состояние: 31760.png.

Теперь создайте квантовые схемы для тождеств XYY, YXY, XYY и XXX из предыдущего раздела, как показано в табл. 3.7 (все материалы публикуются с разрешения © International Business Machines Corporation).

• Для измерения Х примените вентиль Н к соответствующему кубиту.

• Для каждого экземпляра Y примените S (ИЛИ-НЕ к S) и вентиль H к соответствующему кубиту.

Наконец, сравните результаты предыдущего эксперимента с официальными данными из IBM Q Experience. Каков ваш итоговый результат? В целом принципы квантовой механики, описанные в этом разделе, были поставлены под сомнение теорией, названной супердетерминизмом, которая дает возможность выйти из сложившейся ситуации.

Таблица 3.7. Квантовые схемы для GHZ-состояний

Измерение

Результаты для 100 запусков

29279.png 

c[3]

011

101

110

000

Вероятность

0,34

0,23

0,23

0,20

29286.png 

c[3]

011

101

110

000

Вероятность

0,23

0,28

0,25

0,24

29290.png 

c[3]

011

101

110

000

Вероятность

0,23

0,26

0,35

0,16

29298.png 

c[3]

010

100

111

001

Вероятность

0,25

0,32

0,22

0,21

Супердетерминизм: уход от мистичности. Был ли Эйнштейн прав все это время?

В интервью BBC в 1969 году физик Джон Белл рассказал о своей работе в области квантовой механики. Он сказал, что мы должны принять предположение о том, что действия между запутанными частицами передаются со скоростью большей, чем скорость света, но в то же время мы никак не можем это использовать. Информация не может распространяться со скоростью большей, чем скорость света, что также предсказывает квантовая механика. Как будто природа подшучивает над нами.

Он также упомянул, что существует возможность решить эту загадку — принцип под названием «супердетерминизм».

Запутывание частиц подразумевает, что измерения, выполненные на одной частице, мгновенно влияют на другую, даже отстоящую от нее на большое расстояние (представьте противоположные стороны Галактики или Вселенной), даже когда они разделены во времени. Эйнштейн был яростным противником этой теории: вспомните его знаменитое послание Нильсу Бору о том, что Бог не бросает кости. Он не мог принять вероятностный характер квантовой механики, поэтому в 1935 году вместе с коллегами Подольским и Розеном придумал печально известный парадокс ЭПР, чтобы оспорить ее основы.

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

Тем не менее в 1982 году предположения квантовой механики были подтверждены французским физиком Аленом Аспе. Он провел эксперимент, который показал, что неравенство Белла нарушается запутанными фотонами. Он также доказал, что измерение на одном из запутанных фотонов распространяется со скоростью большей, чем скорость света, чтобы передать его состояние другому.

С тех пор результаты, полученные Аспе, вновь и вновь подтверждаются (подробности эксперимента приведены в главе 1). Ирония заключается в следующем: есть вероятность, что Эйнштейн был прав с самого начала, а запутанность — всего лишь иллюзия. Это принцип супердетерминизма.

Примечание

Проще говоря, супердетерминизм говорит, что с самого начала существования Вселенной свободы выбора не было. Все корреляции и запутанность частиц были заданы в момент Большого взрыва. Таким образом, нет необходимости в сигнале, передающемся со скоростью, превышающей скорость света, чтобы сообщать частице B, каков результат частицы A.

Если это верно, данная уловка докажет, что Эйнштейн был прав, когда предположил парадокс ЭПР, и вся наша тяжелая работа в области квантового программирования — всего лишь иллюзия. Но этот принцип звучит скорее как догма, ведь согласно ему все результаты предопределены судьбой, тогда как Белл с научной точки зрения утверждал, что супердетерминизм неправдоподобен. Он рассуждает о том, что свобода выбора фактически ничем не ограничена для поставленной цели из-за изменений, вызванных множеством очень мелких эффектов. Супердетерминизм назвали непроверяемым, поскольку экспериментаторы никогда не смогут устранить корреляции, которые были созданы в начале существования Вселенной. Однако это не заставило ученых отказаться от попыток доказать, что Эйнштейн прав, а запутывание частиц — иллюзия. На самом деле существует труднореализуемый оригинальный эксперимент, который призван разрешить все противоречия. Рассмотрим его.

На рис. 3.5 проиллюстрирован стандартный эксперимент по проверке неравенства Белла (внизу) и вариант эксперимента с использованием космических фотонов (вверху), выполненные Эндрю Фридманом и его коллегами из MIT.

29318.png 

Рис. 3.5. Эксперимент по проверке нарушения неравенства Белла с космическими фотонами в сравнении со стандартной проверкой

Примечание

Полное описание стандартной проверки неравенства Белла смотрите в разделе «ЭПР-парадокс разгромлен: Бор смеется последним» главы 1.

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

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

К счастью для нас, любителей квантовой механики, до сих пор ничего подобного не происходило. Имейте в виду, что Фридман и его коллеги — не единственная команда, участвующая в эксперименте.

Есть несколько коллективов, пытающихся разгадать эту загадку. И большинство их результатов согласуется с квантовой механикой. Иначе говоря, они нарушают неравенство Белла. Кажется, что разрыв между позициями Эйнштейна и Бора в борьбе теории относительности с квантовой механикой давно устранен. Я все еще делаю ставку на квантовую механику.

В следующем разделе показано, как получить доступ к IBM Q Experience удаленно с помощью удобного REST API.

Удаленный доступ через REST API

Q Experience имеет относительно малоизвестный REST API, который скрыто обрабатывает все удаленные коммуникации. Используется текущими Python SDK.

• QISKit (Quantum Information Science Kit) является платформой квантовых вычислений с открытым кодом для квантового программирования на Python.

• IBMQExperience — менее известная библиотека в комплекте с QISKit, которая упаковывает REST API в клиент Python.

В этом разделе мы заглянем в IBMQExperience и рассмотрим различные конечные точки REST для удаленного доступа. Но сначала требуется аутентификация.

Аутентификация

Прежде чем выполнить любой вызов REST API, мы должны получить токен доступа. Это будет ключ доступа для любых вызовов в этом разделе. Обратите внимание, что токен доступа не совпадает с токеном API (токен API задействуется для выполнения квантовых программ на Python). Существует два способа получения токена доступа.

• Использование токена API. Чтобы получить токен API, войдите в консоль IBM Q Experience и выполните инструкции, приведенные в следующем разделе.

• Использование имени пользователя и пароля вашей учетной записи. Давайте посмотрим, как это делается с помощью REST.

Совет

Чтобы получить токен API, войдите в консоль IBM Q Experience, выберите свое имя пользователя, затем My Account (Моя учетная запись) и перейдите на вкладку Advanced (Дополнительно), расположенную в правом верхнем углу. Далее нажмите кнопку Generate (Генерировать), а затем скопируйте токен API (рис. 3.6). Следите за тем, чтобы токен был в безопасности.

Аутентификация через токены API:

• метод HTTP: POST;

• URL: https://quantumexperience.ng.bluemix.net/api/users/loginWithToken;

• полезные данные: {"apiToken":"YOUR_API_TOKEN"}.

03_06.tif 

Рис. 3.6. Получение токена API из консоли

Аутентификация с помощью пароля пользователя:

• метод HTTP: POST;

• URL: https://quantumexperience.ng.bluemix.net/api/users/login;

• полезные данные: {"email":"USER-NAME","password":"YOUR-PASSWORD"}.

Ответ для обоих методов:

{

    "id": "ACCESS_TOKEN",

    "ttl": 1209600,

    "created": "2018-04-15T20:21:03.204Z",

    "userId": "USER-ID"

}

Здесь id — это ваш токен доступа, ttl — время жизни (или время окончания действия) в миллисекундах, а userId — ваш идентификатор пользователя. Сохраните токен доступа и идентификатор пользователя для выполнения заданий этого раздела. Обратите внимание, что по истечении сеанса необходимо создать новый токен доступа.

Перечисление доступного серверного ПО

Этот вызов возвращает список всего доступного серверного ПО и симуляторов в IBM Q Experience в формате JSON:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/Backends?access_token=ACESS-TOKEN.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

Типом содержимого ответа для всех вызовов API является application/json. Следующий абзац показывает частичный результат вызова этой конечной точки. Обратите внимание, что она будет возвращать как реальные процессоры, так и симуляторы:

[{

    "name": "ibmqx2",

    "version": "1",

    "status": "on",

    "serialNumber": "Real5Qv2",

    "description": "5 transmon bowtie",

    "basisGates": "u1,u2,u3,cx,id",

    "onlineDate": "2017-01-10T12:00:00.000Z",

    "chipName": "Sparrow",

    "id": "28147a578bdc88ec8087af46ede526e1",

    "topologyId": "250e969c6b9e68aa2a045ffbceb3ac33",

    "url": "https://ibm.biz/qiskit-ibmqx2",

    "simulator": false,

    "nQubits": 5,

    "couplingMap": [

        [0, 1],

        [0, 2],

        [1, 2],

        [3, 2],

        [3, 4],

        [4, 2]

    ]

},..]

Наиболее важные ключи из предыдущего ответа описаны в табл. 3.8.

Таблица 3.8. Ключи для ответа на запрос о доступном серверном ПО

Ключ

Описание

Name

Идентификатор имени процессора, который будет применяться при выполнении кода

Version

Строка или положительное целое число, по всей вероятности, используемое для отслеживания изменений в процессоре

Description

Это, вероятно, описание оборудования, применяемого для сборки чипа. Вы можете увидеть что-то вроде:

• развязка из пяти трансмонов;

• цепная схема 2 × 8 из 16 трансмонов.

Примечание: трансмон — тип помехоустойчивого сверхпроводящего кубита. Разработан Робертом Дж. Шоэлкопфом, Мишелем Деворе, Стивеном М. Гирвином и их коллегами из Йельского университета в 2007 году

basisGates

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

nQubits

Количество кубитов, используемых процессором

couplingMap

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

Получение информации о калибровке заданного процессора

Результатом этого вызова является список в формате JSON калибровочных параметров для заданного процессора в Q Experience. Эти параметры подробно описаны на информационном сайте серверного ПО IBMQX:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/Backends/NAME/calibra­tion?access_token=ACCESS-TOKEN.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py (значение по умолчанию для официального клиента, также, я предполагаю, оно может быть любым)

Пример ответа

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

• gateError — частота возникновения ошибок для операции применения вентиля на кубите в данный момент времени;

• readoutError — частота возникновения ошибок для операции считывания данных кубита в данный момент времени.

Примечание

Оценка качества кубитов включает четыре этапа (операции): подготовку, запоминание, применение вентиля и считывание. Для отслеживания качества кубита частота ошибок рассчитывается на этапах применения вентилей и считывания. Это информация, возвращаемая в ответе на данный вызов API. Обратите внимание на то, что после использования кубиты необходимо сбросить (охладить) до базового состояния.

Листинг 3.2. Упрощенная форма ответа на запрос о калибровочных параметрах для ibmqx4

{

    "lastUpdateDate": "2018-04-15T10:47:03.000Z",

    "qubits": [{

        "gateError": {

            "date": "2018-04-15T10:47:03Z",

            "value": 0.0012019552727863259

        },

        "name": "Q0",

        "readoutError": {

            "date": "2018-04-15T10:47:03Z",

            "value": 0.049

        }

    }, …

],

    "multiQubitGates": [{

        "qubits": [1, 0],

        "type": "CX",

        "gateError": {

            "date": "2018-04-15T10:47:03Z",

            "value": 0.03024023736391171

        },

        "name": "CX1_0"

    },…

]}

Информацию, приведенную в листинге 3.2, можно увидеть на вкладке Devices (Устройства) консоли IBM Q Experience, в главном меню (рис. 3.7). Получите информацию о калибровке через REST и сравните ее с отображенной на веб-консоли (все материалы публикуются с разрешения © International Business Machines Corporation).

Получение параметров серверного ПО

В результате данного вызова будет возвращен список параметров серверного ПО для заданного процессора в Q Experience в формате JSON. Некоторые из этих параметров:

• температура охлаждения кубита в Кельвинах: Например, я получил значение 0,021 K для ibmqx4, что является сверхнизкой температурой и соответствует –459,6 °F или –273,1 °C;

• время буфера (нс);

• время вентилей (нс).

Другие квантовые спецификации более подробно описаны на информационном сайте для серверного ПО.

03_07.tif 

Рис. 3.7. Информация о калибровке, переданная веб-консолью

Тип запроса и конечная точка URL:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/Backends/NAME/para­meters?access_token=ACCESS-TOKEN.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

В листинге 3.3 приведен упрощенный ответ с параметрами ibmqx4 в формате JSON.

Листинг 3.3. Упрощенный ответ на запрос о параметрах ibmqx4

{

    "lastUpdateDate": "2018-04-15T10:47:03.000Z",

    "fridgeParameters": {

        "cooldownDate": "2017-09-07",

        "Temperature": {

            "date": "2018-04-15T10:47:03Z",

            "value": 0.021,

            "unit": "K"

        }

    },

    "qubits": [{

        "name": "Q0",

        "buffer": {

            "date": "2018-04-15T10:47:03Z",

            "value": 10,

            "unit": "ns"

        },

        "gateTime": {

            "date": "2018-04-15T10:47:03Z",

            "value": 50,

            "unit": "ns"

        },

        "T2": {

            "date": "2018-04-15T10:47:03Z",

            "value": 16.5,

            "unit": "μs"

        },

        "T1": {

            "date": "2018-04-15T10:47:03Z",

            "value": 45.2,

            "unit": "μs"

        },

        "frequency": {

            "date": "2018-04-15T10:47:03Z",

            "value": 5.24208,

            "unit": "GHz"

        }

    },..]

}

Получение статуса очереди процессора

Этот вызов возвращает состояние определенной очереди событий квантового процессора:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/Backends/NAME/queue/status.

Параметры запроса

Как ни странно, данный вызов API не запрашивает токен доступа.

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

Например, чтобы получить очередь событий для ibmqx4, скопируйте следующий URL в адресную строку своего браузера: https://quantumexperi­ence.ng.bluemix.net/api/Backends/ibmqx4/queue/status.

Ответ выглядит как {"state":true,"status":"active","lengthQueue":0}, где:

• state: — состояние процессора. Если он работает, значение true, иначе — false;

• status: — состояние очереди выполнения, значения — активно или занято;

• lengthQueue: — размер очереди выполнения или количество симуляций, ожидающих выполнения.

Примечание

Когда вы отправляете эксперимент в IBM Q Experience, он попадает в очередь выполнения. Этот вызов API полезен для отслеживания загруженности процессора в данный момент.

Перечисление заданий в очереди выполнения

Этот вызов возвращает список заданий в очереди выполнения процессора:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/Jobs?access_token=ACCESS-TOKEN&filter=FILTER.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

filter

Указание размера результата в JSON. Например, {"limit":2} возвратит не более двух записей

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

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

Листинг 3.4. Упрощенная форма ответа на вызов API Get Jobs

[{

    "qasms": [{

        "qasm": "…",

        "status": "DONE",

        "executionId": "331f15a5eed1a4f72aa2fb4d96c75380",

        "result": {

            "date": "2018-04-05T14:25:37.948Z",

            "data": {

                "creg_labels": "c[5]",

                "additionalData": {

                    "seed": 348582688

                },

                "time": 0.0166247,

                "counts": {

                    "11100": 754,

                    "01100": 270

                }

            }

        }

    }],

    "shots": 1024,

    "backend": {

        "name": "ibmqx_qasm_simulator"

    },

    "status": "COMPLETED",

    "maxCredits": 3,

    "usedCredits": 0,

    "creationDate": "2018-04-05T14:25:37.597Z",

    "deleted": false,

    "id": "d405c5829274d0ee49b190205796df87",

    "userId": "ef072577bd26831c59ddb212467821db",

    "calibration": {}

}, …]

Примечание

В зависимости от размера очереди выполнения вы можете получить пустой результат ([ ]), если в очереди нет заданий, или результат в формате, показанном в листинге 3.4.

В любом случае убедитесь, что код ответа HTTP — 200 (OK).

Получение информации о балансе аккаунта

При создании учетной записи каждому пользователю присваивается определенное количество кредитов на выполнение (по умолчанию 15), которые расходуются при проведении экспериментов. Этот вызов предоставляет информацию о балансе вашего аккаунта:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/users/USER-ID?access_token=ACCESS-TOKEN.

Совет

Идентификатор пользователя можно получить из ответа на запрос аутентификации через токен API или с помощью пароля пользователя. Подробнее см. в подразделе «Аутентификация» данного раздела на с. 130.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

В листинге 3.5 показан типичный ответ на данный вызов.

Листинг 3.5. Типичный ответ на запрос о балансе аккаунта

{

    "institution": "Private Research",

    "status": "Registered",

    "blocked": "None",

    "dpl": {

        "blocked": false,

        "checked": false,

        "wordsFound": {},

        "results": {}

    },

    "credit": {

        "promotional": 0,

        "remaining": 150,

        "promotionalCodesUsed": [],

        "lastRefill": "2018-04-12T14:05:09.136Z",

        "maxUserType": 150

    },

    "additionalData": {

    },

    "creationDate": "2018-04-01T15:36:16.344Z",

    "username": "",

    "email": "",

    "emailVerified": true,

    "id": "",

    "userTypeId": "…",

    "firstName": "…",

    "lastName": "…"

}

Список экспериментов пользователя

Ответом на такой вызов является список всех экспериментов для заданного идентификатора пользователя:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/users/USER-ID/codes/lastest?access_token=ACCESS-TOKEN&includeExecutions=true.

Параметры запроса

Наименование

Значение

USER-ID

Ваш идентификатор пользователя, полученный на этапе аутентификации

access_token

Токен доступа к вашему аккаунту

includeExecutions

Если задано значение true, включает выполнение в результат

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Пример ответа

В листинге 3.6 показан типичный ответ на данный вызов.

Листинг 3.6. Ответ на запрос о списке экспериментов

{

    "total": 17,

    "count": 17,

    "codes": [{

        "type": "Algorithm",

        "active": true,

        "versionId": 1,

        "idCode": "…",

        "name": "3Q GHZ State YXY-Measurement 1",

        "jsonQASM": {

        …

    },

    "qasm": "",

    "codeType": "QASM2",

    "creationDate": "2018-04-14T19:09:51.382Z",

    "deleted": false,

    "orderDate": 1523733740504,

    "userDeleted": false,

    "displayUrls": {

        "png": "URL"

    },

    "isPublic": false,

    "id": "…",

    "userId": "…"

}]}

Запуск эксперимента

В результате данного вызова эксперимент будет удаленно запущен на IBM Q Experience:

• метод HTTP: POST;

• URL: https://quantumexperience.ng.bluemix.net/api/codes/execute?access_token=ACCESS-TOKEN&shots=SHOTS&deviceRunType=RUN-TYPE.

Параметры запроса

Наименование

Значение

shots

Количество запусков на выполнение. Чем их больше, тем выше точность результатов. Обратите внимание на то, что уровень ваших кредитов будет уменьшаться на 3 за каждые 1024 запуска. В квантовом мире пространство ценится на вес золота

access_token

Токен доступа к вашему аккаунту

deviceRunType

Устройство, на котором запускается эксперимент. Это может быть:

• для реальных процессоров — реальное наименование устройства, такое как ibmqx2 и ibmqx3;

• для моделирующих устройств — моделирующее устройство или sim_trivial_2

seed (необязательный параметр)

Необязательное случайное значение, которое требуется только для моделирующих устройств

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Content-Type

Приложение/формат json

Формат полезных данных

Телом ответа является документ в формате JSON, описывающий эксперимент, как показано в следующем отрывке:

{

    "name": "Experiment NAME",

    "codeType": "QASM2",

    "qasm": "CODE"

}

Пример ответа

Это, пожалуй, самый важный вызов API. В качестве упражнения возьмем одно из состояний Белла из предыдущего раздела и запустим его как на моделирующем, так и на реальном устройстве с использованием REST API (листинг 3.7).

Листинг 3.7. Измерение состояния Белла XW

IBMQASM 2.0;

include "qelib1.inc";

 

qreg q[2];

creg c[2];

 

h q[0];

cx q[0],q[1];

h q[0];

s q[1];

h q[1];

t q[1];

h q[1];

measure q[0] -> c[0];

measure q[1] -> c[1];

В листинге 3.7 приведен код на ассемблере из эксперимента с одним из состояний Белла (XW), выполненного в веб-консоли в предыдущем разделе. Возьмите этот код и создайте полезные данные в формате JSON в виде {"name":"NAME","codeType":"QASM2","qasm":"ONE-LINE-QASM"}. Обратите внимание, что нужно передать название эксперимента и код на QASM должен быть отформатирован как одна строка, включая символ конца строки. Таким образом, полезные данные принимают окончательный вид:

{"name": "REST Bell State XW", "codeType": "QASM2", "qasm": "IBMQASM 2.0;\ ninclude \"qelib1.inc\";\nqreg q[2];\ncreg c[2];\nh q[0];\ncx q[0],q[1];\nh q[0];\ns q[1];\nh q[1];\nt q[1];\nh q[1];\nmeasure q[0] -> c[0];\nmeasure q[1] -> c[1];"}

Теперь мы готовы отправить наш эксперимент через REST. Не забудьте, что вы должны сначала аутентифицироваться для получения токена доступа.

Совет

REST-клиенты доступны для большинства, если не для всех браузеров. Установите клиент REST в любимый браузер и создайте запрос на аутен­тификацию, как описано в подразделе «Аутентификация» на с. 130. Сохраните его и держите наготове, чтобы получить токен доступа.

Я буду использовать YARC (Yet Another REST Client) от Chrome для отправки полезных данных сначала на моделирующее, а затем на реальное устройство (рис. 3.8).

03_08.tif 

Рис. 3.8. REST-клиент в YARC от Chrome с полезными данными для эксперимента с состоянием Белла XW

Отправка на моделирующее устройство

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

access_token=ACESS_TOKEN&shots=1&deviceRunType=simulator

Убедитесь, что код ответа — 200 (OK), и взгляните на вывод ответа. Удостоверьтесь, что эксперимент был записан в консоли Q Experience (рис. 3.9).

03_09.tif 

Рис. 3.9. Веб-консоль, показывающая эксперимент с состоянием Белла XW, отправленный через REST

Отправка на реальное устройство

Для отправки на реальное устройство (в данном случае ibmqx4) измените параметры запроса на:

access_token=ACESS_TOKEN &shots=1&deviceRunType=ibmqx4

Примечание

Реальные квантовые устройства могут быть отключены для технического обслуживания или по любой другой причине. Если это так, то отправка не удастся и вы получите ответ HTTP 400 (неверный запрос). Перед отправкой на реальное квантовое устройство убедитесь, что оно находится в Сети!

Если все пройдет хорошо, задание будет помещено в очередь выполнения и записано в веб-консоли. В листинге 3.8 показан результат отправки на реальное устройство со статусом PENDING_IN_QUEUE.

Листинг 3.8. Упрощенный HTTP-ответ из эксперимента с состоянием Белла XW, отправленного через REST

{

    "startDate": "2018-04-16T13:05:43.440Z",

    "modificationDate": 1523883943441,

    "typeCredits": "plan",

    "status": {

        "id": "WORKING_IN_PROGRESS"

    },

    "deviceRunType": "real",

    "ip": {

        "ip": "…",

        "city": "Raleigh",

        "country": "United States",

        "continent": "North America"

    },

    "shots": 1,

    "paramsCustomize": {},

    "deleted": false,

    "userDeleted": false,

    "id": "…",

    "codeId": "…",

    "userId": "…",

    "infoQueue": {

        "status": "PENDING_IN_QUEUE",

        "position": 21,

        "estimatedTimeInQueue": 735

    },

    "code": {

        "type": "Algorithm",

        "active": true,

        "versionId": 1,

        "idCode": "…",

        "name": "REST Bell State XW #1",

        "jsonQASM": {

            …

            "numberGates": 7,

            "hasMeasures": true,

            "numberColumns": 11,

            "include": "include \"qelib1.inc\";"

        },

        "qasm": "…",

        "codeType": "QASM2",

        "creationDate": "2018-04-16T13:05:42.547Z",

        "deleted": false,

        "orderDate": 1523883943351,

        "userDeleted": false,

        "isPublic": false,

        "id": "…",

        "userId": "…"

    }

}

На этом этапе вы успешно отправили свой первый эксперимент через REST. Попробуйте увеличить количество запусков вашего эксперимента, чтобы добиться большей точности.

Запуск задания

Этот вызов очень похож на предыдущий запуск эксперимента, однако у него есть две конечные точки.

1. Для обычных пользователей IBM Q Experience.

2. Для корпоративных клиентов. Требуются идентификаторы хаба, группы и проекта.

У корпоративных клиентов есть как премиальный аккаунт, так и доступ к мощным 20-кубитным процессорам и, возможно, 50-кубитному чипу, который, по слухам, выйдет в конце 2018 года:

• метод HTTP: POST;

• URL 1 (5, 16 кубитов): https://quantumexperience.ng.bluemix.net/api/Jobs?access_token=ACCESS-TOKEN;

• URL 2 (20+ корпоративных кубитов): https://quantumexperience.ng.bluemix.net/api/Network/HUB/Groups/GROUP/Projects/PROJECT/jobs?access_token=ACCESS-TOKEN.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Content-Type

Приложение/формат json

Формат полезных данных

Формат полезных данных включает все параметры выполнения: название серверного ПО, запуски и код в одном документе формата JSON, как показано в следующем отрывке:

{

    "backend": {

        "name": "simulator"

    },

    "shots": 1,

    "qasms": [{

        "qasm": "qams"

    }, …]

}

Примечание

Эксперименты, отправленные через конечную точку Run Job, не записываются в раздел «Итоги» Composer, но помещаются в очередь выполнения для обработки.

В то же время отправка через конечную точку Run Experiment приведет к записи в Composer. Обратите внимание и на то, что для любого эксперимента, отправленного на моделирующее устройство, результаты возвращаются немедленно. Эксперименты, отправленные на реальное квантовое устройство, всегда будут входить в очередь выполнения в состоянии PENDING. По завершении пользователю будет отправлено уведомление по электронной почте. Давайте быстро отправим работу на реальное устройство ibmqx4. Вставьте в свой клиент REST следу­ющую конечную точку: https://quantumexperience.ng.bluemix.net/api/Jobs?access_token=access_token.

Установите метод HTTP POST, токен доступа и заголовки, как описано в предыдущем разделе. Используйте следующие полезные данные:

{

    "qasms": [{

        "qasm": "\n\ninclude \"qelib1.inc\";\nqreg q[5];\ncreg c[5];\

        nu2(-4*pi/3,2*pi) q[0];\nu2(-3*pi/2,2*pi) q[0];\nu3(-pi,0,-pi)

        q[0];\nu3(-pi,0, -pi/2) q[0];\nu2(pi,-pi/2) q[0];\nu3(-pi,0,-pi/2)

        q[0];\nmeasure q -> c;\n" }],

        "shots": 1024,

        "backend": {

        "name": "ibmqx4"

    },

    "maxCredits": 3

}

Эти полезные данные передают случайный эксперимент реальному устройству ibmqx4. Перед отправкой убедитесь, что оно в Сети (или используйте моделирующее устройство). Удостоверьтесь также, что код QASM, включая символ перевода строки (\n), расположен в одной строке. Обратите внимание на то, что двойные кавычки должны быть экранированы. Если отправка не удалась, это, вероятно, означает, что устройство находится в автономном режиме или QASM в ваших полезных данных неверный. Дважды и трижды проверьте, чтобы убедиться, что все правильно. Ответ, который я получил, говорит мне, что мое задание выполняется:

{

    "qasms": [

        {

            "qasm": "…",

            "status": "WORKING_IN_PROGRESS",

            "executionId": "5ba6955fd867ef0046615172"

        }

    ],

    "shots": 1024,

    "backend": {

        "id": "5ae875670f020500393162b3",

        "name": "ibmqx4"

    },

    "status": "RUNNING",

    "maxCredits": 3,

    "usedCredits": 3,

    "creationDate": "2018-09-22T19:17:51.448Z",

    "id": "5ba6955fd867ef0046615171",

    "userId": "5ae875060f0205003931559a",

    "infoQueue": {

        "status": "PENDING_IN_QUEUE",

        "position": 11

    }

}

Обратите внимание, что мое задание не будет показано Composer, тем не менее я получу по электронной почте уведомление со ссылкой на результаты.

Получение версии API

Возвращает версию REST API в Q Experience:

• метод HTTP: GET;

• URL: https://quantumexperience.ng.bluemix.net/api/version?access_token=ACCESS-TOKEN.

Параметры запроса

Наименование

Значение

access_token

Токен доступа к вашему аккаунту

Заголовки HTTP

Наименование

Значение

x-qx-client-application

Значения по умолчанию для qiskit-api-py

Формат ответа

Возвращает строку с версией API (на момент написания этой книги — 6.4.8).

Заглянем внутрь написанного на Python REST API в IBMQuantumExpe­rience, чтобы посмотреть, что происходит за кулисами. В качестве упражнения создадим собственный клиент для Node JS.

Клиент Node JS для IBMQuantumExperience

В этом разделе описано простое упражнение, призванное сымитировать один из компонентов Python SDK, известный как QISKit (Quantum Information Software Kit). В следующей главе мы более подробно рассмотрим Python SDK, а здесь укажем, что данный SDK создан на основе двух базовых библиотек.

• IBMQuantumExperience. Это реализация REST-клиента в Python, в которую я заглянул, чтобы представить REST API из предыдущего раздела. Данная модульная библиотека плохо документирована, что логично, поскольку она может измениться в будущем.

• QISKit SDK. Это главная точка входа во все ваши квантовые программы. Она обертывает логику вентилей, трансляцию текстов на ассемблере, симуляторы — локальный симулятор Python и быстрый симулятор C++ — и многое другое. Эта библиотека также вызывает IBMQuantumExperience для всех взаимодействий с платформой IBM Q Experience через REST.

Python — прекрасный язык, но центры обработки данных сейчас повально увлеклись Node JS. В этом разделе представлена простая реализация REST API для Node JS. Вот несколько причин, почему эта библиотека будет полезной.

• Node JS — рабочая лошадка для сетевых асинхронных вызовов ввода/вывода. Она быстрая, и это идеальная платформа для клиентов REST.

• Python — хороший язык с множеством великолепных числовых, математических, графических библиотек, но у него есть некоторые особенности. Например, важность отступов в Python (вы не можете одновременно использовать табуляцию и пробелы — здесь нет скобок для разграничения блоков). Поначалу это сводило меня с ума, ведь почти во всех компьютерных языках применяются фигурные скобки для разделения логических блоков. В Python такого нет — вы должны использовать пробелы или табуляцию, причем не одновременно. Мне это не нравится. Я думаю, это неудачная реализация: если вы допустили ошибку, то не знаете, где заканчивается логический блок. Вот для чего нужны скобки.

• Разнообразие всегда приветствуется: преодолев все проблемы с Python, я подумал, что эта библиотека может стать основой для клона QISKit для Node JS.

Приступим.

Построение модуля Node для IBMQuantumExperience

Я пытался сохранить названия как можно более близкими к применяемым в версии Python. Чтобы создать модуль Node JS, сделайте папку с именем IBMQuantumExperience и инициализируйте Node JS, как показано далее:

$ mkdir IBMQuantumExperience

$ cd IBMQuantumExperience

$ npm init

Примечание

Пользователям Linux: я использовал Windows, чтобы написать этот раздел. Более того, я предполагаю, что вы установили Node JS, знакомы с модулями Node и умеете писать код на JavaScript. В общем, вы можете получить установщики Node для всех платформ по адресу https://nodejs.org/en/. Также обратите внимание на то, что Linux не нравятся названия пакетов прописными буквами. Избавьте себя от головной боли и воспользуйтесь Windows, чтобы проработать этот раздел.

Node предоставляет менеджер пакетов под названием npm (он в значительной степени совпадает с pip в Python), который можно использовать для инициализации вашего модуля. Третья команда создаст в текущей папке два файла:

• index.js — это код вашего модуля. Примечание для пользователей Linux: создайте этот файл самостоятельно;

• Package.json — это дескриптор модуля, содержащий такую информацию, как название, версия, автор, зависимости и многое другое.

Там же создайте папку test для юнит-тестов и установите мощный REST-клиент Node request:

$ mkdir test

$ npm install request

Вторая команда устанавливает популярный пакет HTTP-запросов и все его зависимости в текущую папку. Теперь мы готовы реализовать REST API из предыдущего раздела. Откройте index.js в своем любимом редакторе и начинайте.

Экспорт методов API

Чтобы предоставить API через Node, используйте библиотеку module.exports, как показано в листинге 3.9. Обратите внимание, что это частичная реализация библиотеки и все фрагменты будут собраны в следующих разделах. Полная реализация доступна в папке Workspace\Ch03\IBMQuantumExperience. При этом вы должны суметь вставить все эти листинги в index.js. Опять же я предполагаю, что вы понимаете, как модули написаны в Node JS.

Листинг 3.9. Предоставление открытых методов API через Node

const log = require('./log');

// Простая настраиваемая библиотека журналов (см. раздел отладки)

const request = require('request');

 

//…

module.exports = {

    init: function (cfg) {

        _config = cfg;

        var debug = _config.debug ? _config.debug : false;

        log.init (debug);

        return loginWithToken ();

    },

 

    getCalibration : calibration,

    getBackends : backends,

    getParameters : parameters,

    runExperiment : experiment

 

    // Оставлено в качестве упражнения getJobs : jobs,

    // Оставлено в качестве упражнения getMyCredits : credits

}

В листинге 3.9 происходит импорт внешней библиотеки с помощью ключевого слова require.

• Во второй строке импортируется клиентская библиотека HTTP-запросов для взаимодействия с Q Experience.

• В пятой строке декларируются предоставляемые данным модулем публичные методы:

• init — осуществляет аутентификацию на платформе Q Experience, как описано в разделе «Удаленный доступ через REST API» на с. 129;

• getCalibration — возвращает параметры калибровки платформы для заданного устройства;

• getBackends — возвращает список доступных для использования квантовых (и моделирующих) устройств;

• getParameters — возвращает параметры устройств в соответствии с описанием в разделе Devices (Устройства) веб-консоли Composer;

• runExperiment — запускает эксперимент удаленно на моделирующем или реальном квантовом устройстве;

• getJobs — возвращает список текущих заданий в очереди выполнения эксперимента;

• getMyCredits — возвращает пользовательский баланс кредитов на выполнение и другую полезную информацию.

Аутентификация с использованием токена

Перед аутентификацией библиотека инициализируется так же, как в Python, с конфигурационным объектом JSON, содержащим URL-адрес платформы, API-токен и многое другое. Например, так мы бы протестировали вызов REST API для получения информации о серверном ПО (взято из test.js):

// Запросите файл `index.js` из той же папки

const qx = require('index.js');

// Вставьте ваш токен API здесь

var config = { APItoken: 'YOUR_API_TOKEN'

    , debug : true

    , 'url' : 'https://quantumexperience.ng.bluemix.net/api'

    , 'hub' : 'MY_HUB'

    , 'group' : 'MY_GROUP'

    , 'project' : 'MY_PROJECT'

}

// Получите информацию о серверном ПО

async function testBackends() {

    await qx.init(config);

    var result = await qx.getBackends();

    console.log("---- BACKENDS ----\n" + JSON.stringify(result) +

    "\n-----" );

}

Помните, что хаб, группа и проект являются параметрами только для корпоративных клиентов. Таким образом, они не используются в этой реализации, однако поддержку для них легко добавить. После инициализации просто отправьте запрос POST для входа в систему с помощью токена, как описано в REST API (листинг 3.10). Данный код, как и все листинги в этих разделах, находится в файле index.js.

Листинг 3.10. Аутентификация с помощью токена через REST

function loginWithToken () {

    let options = {

        url: _config.url + '/users/loginWithToken',

        form: {'apiToken': _config.APItoken}

    };

    return new Promise(function(resolve, reject) {

        // Выполнить асинхронно задание

        // {"id":"Access tok","ttl":1209600,"created":"2018-04-

        // 17T23:30:21.089Z","userId":"userid"}

        request.post(options, function(err, res, body) {

            if (err) {

                reject(err);

            }

            else {

                var json = JSON.parse(body);

                _accessToken = json.id;

                _userId = json.userId;

                log.debug("Got User:" + _userId + " Tok:" + _accessToken);

                resolve(JSON.parse(body));

            }

        });

    })

}

В листинге 3.10:

• системный вызов request.post задействуется для отправки запроса HTTP POST в конечную точку https://quantumexperience.ng.bluemix.net/api/users/loginWithToken с использованием полезных данных в формате JSON {'apiToken':'YOUR_TOKEN'}. В соответствии с описанием REST API в ответ на данный вызов будет возвращен документ в формате JSON: {"id":"TOKEN","ttl":1209600,"created":"DATE","userId":"USERID"}. Этот документ анализируется, а токен доступа (id) и идентификатор пользователя (userId) сохраняются для последующего применения;

• обратите внимание: поскольку все сетевые операции ввода/вывода в Node асинхронные, все методы возвращают объект Promise. По сути, это асинхронная задача, инкапсулирующая необходимость ожидания выполнения задачи до считывания результатов. Таким образом, если вызов HTTP-запроса завершится успешно, будет выполнен обратный вызов resolve из Promise с данными HTTP-ответа, в противном случае — обратный вызов reject из Promise.

Примечание

Объекты Promise являются убедительной альтернативой обратным вызовам для асинхронного кода. Тем не менее они могут иногда вводить в заблуждение. В общем, объекты Promise становятся стандартом де-факто для асинхронного программирования на JavaScript.

Если вы находите, что код обработки Promise сложен, существует более простой способ. Он будет показан в следующем разделе, где мы реализуем метод для извлечения списка серверного ПО.

Перечисление серверного ПО

В листинге 3.11 показан запрос Node для получения серверного ПО из Q Experience.

• Посылается HTTP-запрос GET на https://quantumexperience.ng.bluemix.net/api/Backends?access_token=TOKEN.

• Возвращается объект Promise, который можно вызвать из любой асинхронной функции с помощью нового функционала async/await в JavaScript.

Листинг 3.11. Получение списка серверного ПО через Node

const _defaultHdrs = {

    'x-qx-client-application': _userAgent

};

function backends () {

    let options = {

        url: _config.url + '/Backends?access_token=' + _accessToken,

        headers: _defaultHdrs

    };

    return new Promise(function(resolve, reject) {

        // Выполнить асинхронно задание

        request.get(options, function(err, res, body) {

            if (err) {

                reject(err);

            }

            else {

                resolve(JSON.parse(body));

            }

        });

    })

}

Чтобы протестировать предыдущий метод, можно воспользоваться функционалом async/await из Node.js 7.6, как показано в следующем фрагменте:

async function testBackends() {

    await qx.init(config);

    var result = await qx.getBackends();

    console.log("---- BACKENDS ----\n" + JSON.stringify(result) +

    "\n-----" );

}

Примечание

Асинхронная функция может содержать выражение await: тогда ее выполнение приостанавливается, программа ожидает сообщения об успешном выполнении от переданного объекта Promise, а затем возобновляет выполнение функции и возвращает значение результата.

Перечисление параметров калибровки

В листинге 3.12 показано, как получить параметры калибровки и оборудования для конкретного серверного ПО в IBM Q Experience.

• Получить калибровочные данные, отправив запрос GET на https://quantumexperience.ng.bluemix.net/api/Backends/NAME/calibra­tion?access_token=TOKEN, где NAME — это серверное ПО, о котором вы хотите сделать запрос, TOKEN — токен доступа, полученный на шаге аутентификации.

• Получить параметры серверного ПО, отправив аналогичный запрос GET на https://quantumexperience.ng.bluemix.net/api/Backends/NAME/parameters?access_token=TOKEN.

Формат ответа на оба запроса описан в разделе «Удаленный доступ через REST API» данной главы.

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

function calibration (name) {

    let options = {

        url: _config.url + '/Backends/' +

        name +'/calibration?access_token=' + _accessToken,

        headers: _defaultHdrs

    };

    return new Promise(function(resolve, reject) {

        request.get(options, function(err, res, body) {

            if (err) {

                reject(err);

            }

            else {

                resolve(JSON.parse(body));

            }

        });

    })

}

function parameters (name) {

    let options = {

        url: _config.url + '/Backends/' +

        name +'/parameters?access_token=' + _accessToken,

        headers: _defaultHdrs

    };

    return new Promise(function(resolve, reject) {

        request.get(options, function(err, res, body) {

            if (err) {

                reject(err);

            }

            else {

                resolve(JSON.parse(body));

            }

        });

    })

}

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

async function testCalibration() {

    await qx.init(config);

    var result1 = await qx.getCalibration('ibmqx4');

    var result2 = await qx.getParameters('ibmqx4');

    console.log(JSON.stringify(result1) );

    console.log(JSON.stringify(result1) );

}

В качестве последнего шага рассмотрим выполнение эксперимента.

Старт эксперимента

Это наиболее важный вызов API, и после его выполнения эксперимент должен быть записан в раздел результатов вашей веб-консоли IBM Q Experience (листинг 3.13).

Чтобы отправить эксперимент программным путем, выполните HTTP-запрос POST в конечную точку /codes/execute с полезными данными в формате JSON:

{'name': name, "codeType": "QASM2", "qasm": "YOUR_QASM_CODE"}

• Помните, что код на ассемблере должен быть отформатирован как одна строка с символами конца строки (\n) для разделения инструкций. Например, в следующем коде объявляются пять кубитов и пять классических регистров: "\n\ninclude\"qelib1.inc\";\nqregq[5];\ncregc[5];\n".

• Параметр name определяет название эксперимента, которое будет записано в веб-консоли.

• Параметр shots — это количество запусков, выполняемых квантовым процессором.

• Параметр device может быть названием моделирующего (для удаленного моделирующего устройства) или реального квантового устройства, таким как ibmqx4.

Совет

Если вы запустите эксперимент на реальном устройстве, он будет помещен в очередь выполнения для дальнейшей обработки. По завершении вы получите письмо. А если запустите эксперимент на удаленном моделирующем устройстве, результаты будут возвращаться синхронно.

Листинг 3.13. Запуск эксперимента

const _userAgent = 'qiskit-api-py'; // Глобальная переменная

 

function experiment (name, qasm, shots, device) {

    let options = {

        url: _config.url + '/codes/execute?access_token=' + _accessToken

            + '&shots=' + shots + '&deviceRunType=' + device,

        headers: {'Content-Type': 'application/json',

        'x-qx-client-application': _userAgent} ,

        form: {'name': name, "codeType": "QASM2", "qasm": qasm}

    };

    return new Promise(function(resolve, reject) {

        request.post(options, function(err, res, body) {

            if (err) {

                reject(err);

            }

            else {

                resolve(JSON.parse(body));

            }

        });

    })

}

Вставьте код из листинга 3.13 в файл index.js, используйте следующий фрагмент кода для запуска эксперимента на реальном квантовом устройстве ibmqx4, затем убедитесь, что эксперимент записан в веб-консоли, и дождитесь уведомления по электронной почте:

async function testExperiment () {

    await qx.init(config);

    var name = "REST Experiment from Node JS #1"

    var qasm = "\n\ninclude \"qelib1.inc\";\nqreg q[5];\ncreg c[5];\

    nu2(-4*pi/3,2*pi) q[0];\nu2(-3*pi/2,2*pi) q[0];\nu3(-pi,0,-pi)

    q[0];\nu3(-pi,0,-pi/2) q[0];\nu2(pi,-pi/2) q[0];\nu3(-pi,0,-pi/2)

    q[0];\nmeasure q -> c;\n";

    var shots = 1;

    var device = "ibmqx4";

    var result = await qx.runExperiment(name, qasm, shots, device);

    console.log("---- EXPERIMENT " + name + " ----\n" +

    JSON.stringify(result) + "\n-----" )

}

Примечание

Код для модуля Node для IBMQuantumExperience находится в разделе Workspace\Ch03\IBMQuantumExperience исходного кода книги. Тестовый скрипт проекта размещен в файле test/tests.js. Отредактируйте этот файл, добавьте свой токен API и выполните его из IBMQuantumExperience с помощью команды node test/tests.js.

Отладка и тестирование

Для простой отладки я создал подмодуль log.js (на том же уровне, что и index.js) и использовал основной объект консоли для отображения информации, как показано в следующем фрагменте:

var _debug = false;

 

function LOGD( tag, txt ) {

    if ( _debug ) {

        console.log('[DBG-QX] ' + tag + ' ' + (txt ? txt : "));

    }

}

function LOGE( tag, txt ) {

    console.error('[ERR-QX] ' + tag + ' ' + (txt ? txt : "));

}

function init (debug) {

    _debug = debug;

}

 

exports.init = init;

exports.debug = LOGD;

exports.error = LOGE;

Основной модуль (index.js) использует этот подмодуль для отображения отладочных сообщений в консоли. Наконец, чтобы протестировать пакет, отредактируйте test/tests.js и вставьте фрагменты теста, описанные в этих разделах, как показано в следующей части листинга из tests.js:

// test/tests.js запрашивает файл `index.js` из той же папки.

const qx = require('../');

 

// Вставьте ваш токен API сюда

var config = { APItoken: 'API-TOKEN'

    , debug: true

    , 'url': 'https://quantumexperience.ng.bluemix.net/api'

    , 'hub': 'MY_HUB'

    , 'group': 'MY_GROUP'

    , 'project': 'MY_PROJECT'

};

 

async function testBackends() {

    await qx.init(config);

    var result = await qx.getBackends();

    console.log("---- BACKENDS ----\n" + JSON.stringify(result) +

    "\n-----" );

}

 

async function testJobs () {

    await qx.init(config);

    var filter = '{"limit":2}';

    var jobs = await qx.getJobs(filter);

    console.log ("---- JOBS----\n" + JSON.stringify(jobs) + "\n----");

}

 

// Вставьте все фрагменты тестов сюда…

// .…

 

try {

    testBackends();

    testJobs ();

    // другие тесты…

}

catch (e){

    console.error(e);

}

Чтобы выполнить тест, запустите nodetest\tests.js в папке IBMQuan­tumExperience. Обратите внимание: я пропустил методы getJobs и getMy­credits, они остаются для вас в качестве упражнения. У вас достаточно знаний, чтобы легко реализовать и протестировать их.

Поделитесь с миром — опубликуйте свой модуль

Если хотите поделиться своей работой со всем миром, можете опубликовать свой модуль в реестре npm. Для этого вы должны создать учетную запись пользователя на www.npmjs.com/ или выполнить это вручную, используя команды:

npm adduser

npm publish

Убедитесь, что вы документировали свой код, добавив документ на языке разметки markdown (readme.md) в корневую папку. После публикации перейдите по адресу https://npmjs.com/package/<package> и проверьте, действует ли ваш модуль. Теперь другие смогут установить его командой:

npm install IBMQuantumExperience

Разработчики Node JS могут отправлять эксперименты в Q Experience с помощью такого кода:

const qx = require('IBMQuantumExperience');

async function sendExperiment () {

    var config = { APItoken: 'API-TOKEN'

    , 'url': 'https://quantumexperience.ng.bluemix.net/api',

    'debug': false};

    await qx.init(config);

    var name = "REST Experiment from Node JS #1"

    var qasm = "MY_QASM";

    var device = "ibmqx4";

    var result = await qx.runExperiment(name, qasm, 1024, device);

}

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

IBM уже предоставляет доступ к Q System One с 20 кубитами и в ближайшее время откроет для партнеров доступ к квантовому компьютеру с 50 кубитами.Примеч. ред.

Скобки задают корреляции между результатами измерения (среднее произведения отдельных исходов экспериментов А и В). Примеч. науч. ред.

Gallicchio J., Friedman A.S., Kaiser D.I. Testing Bell’s Inequality with Cosmic Photons: Closing the Setting-Independence Loophole // http://web.mit.edu/asf/www/Papers/Gallicchio_Friedman_Kaiser_2014.pdf.

Назад: 2. Квантовые вычисления: искривление ткани самой реальности
Дальше: 4. QISKit — отличный SDK для квантового программирования на Python

Treyfecah
Ничо так --- Я думаю, что Вы не правы. Пишите мне в PM, поговорим. скачать фифа, скачать fifa и fifa 15 скачать фифа
Kbcxsame
compare prescription prices Viagra Oral Jelly canada pharma limited
JbnvJinge
payday loans batesville ar payday loans delray beach fl cashback payday advance careers
Kvaxsame
vanquis payday loans loan advance.com cash advance in ky
itelsAni
Female Cialis Soft Fildena nearest cvs pharmacy store canadian pharmacy for dogs ’
DefAmurnGtv
london drugs canada Nemasole Oxytrol Zithromax ’
iMabeHtf
canada drugs review safeway pharmacy store 1818 24 hours pharmacy store solutions rx pharmacy ’
RnhAmurnDev
long term use of prilosec omeprazole and alzheimer's prilosec price best time to take omeprazole ’
nutleVfs
amlodipine norvasc side effects amlodipine besylate drug class norvasc 10 mg tablet amlodipine benazepril side effects ’