Как вы пишете простую программу для устройства D-Wave?


27

Я хотел бы знать, как работа для устройства D-Wave написана в коде и передана на устройство.

В ответе было бы лучше увидеть конкретный пример этого для простой задачи. Я предполагаю, что «Hello World» устройства D-Wave был бы чем-то вроде нахождения основных состояний простой двухмерной модели Изинга , так как эта проблема решается непосредственно аппаратными средствами. Так что, возможно, это был бы хороший пример, чтобы увидеть. Но если те, у кого есть опыт, подойдет альтернативный пример, я был бы рад увидеть альтернативу.

Ответы:


24

Эквивалент «Hello World» в мире D-Wave является примером 2D шахматной доски. В этом примере вам дан следующий квадратный граф с 4 узлами:

                                                  square_graph

Давайте определим, что мы окрашиваем вершину черный цвет, если и в белый цвет, если . Цель состоит в том, чтобы создать шаблон шахматной доски с четырьмя вершинами на графике. Существуют различные способы определения и для достижения этого результата. Прежде всего, есть два возможных решения этой проблемы: σ i = - 1 σ i = + 1 ч Jσяσязнак равно-1σязнак равно+1часJ

               checkerboard_solutions

Квантовый отжиг D-Wave минимизирует определяемый нами гамильтониан Изинга, и важно понимать влияние различных настроек соединителя. Рассмотрим, например, ответвитель:J0,1

Если мы установим его в , гамильтониан будет минимизирован, если оба кубита принимают одно и то же значение. Мы говорим, что негативные сцепки коррелируют . Принимая во внимание, что если мы установим его в , гамильтониан будет минимизирован, если два кубита принимают противоположные значения. Таким образом, положительные сцепки антикоррелируют .J 0 , 1 = + 1J0,1знак равно-1J0,1знак равно+1

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

ЧАСзнак равноσ0σ1+σ0σ2+σ1σ3+σ2σ3

Для демонстрации мы также добавляем смещающий член в кубит так, что мы получаем только решение № 1. Это решение требует и поэтому мы устанавливаем его смещение . Окончательный гамильтониан теперь:σ 0 = - 1 ч 0 = 10σ0знак равно-1час0знак равно1

ЧАСзнак равноσ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3

Итак, давайте закодируем это!

ПРИМЕЧАНИЕ. Вам НУЖЕН доступ к облачной службе D-Wave, чтобы все работало.

Прежде всего, убедитесь, что у вас установлен пакет Python dwave_sapi2( https://cloud.dwavesys.com/qubist/downloads/ ). Все будет Python 2.7, так как D-Wave в настоящее время не поддерживает более высокую версию Python. Это, как говорится, давайте импортировать основы:

from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection

Чтобы подключиться к API D-Wave Solver, вам потребуется действительный токен API для их SAPI-решателя, URL-адрес SAPI и вам необходимо решить, какой квантовый процессор вы хотите использовать:

DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'

Я рекомендую использовать D-Wave 2000Q Virtual Full Yield Chimera (VFYC), который является полностью функциональным чипом без мертвых кубитов! Вот расположение чипов Chimera:

dwave_chimera

На данный момент я делю учебник на две отдельные части. В первом разделе мы вручную встраиваем проблему в граф аппаратного обеспечения Chimera, а во втором разделе мы используем эвристику встраивания D-Wave для поиска аппаратного встраивания.

Ручное встраивание


Элементарная ячейка в левом верхнем углу на схеме чипа D-Wave 2000Q выше выглядит следующим образом:

physical_qubits

0100142733часJ

J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]

час имеет 8 записей, так как мы используем кубиты от 0 до 7. Теперь мы устанавливаем соединение с Solver API и запрашиваем решатель D-Wave 2000Q VFYC:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

Теперь мы можем определить количество показаний и выбрать answer_mode«гистограмму», которая уже сортирует результаты по количеству появлений для нас. Теперь мы готовы решить проблему Изинга с помощью квантового отжига D-Wave:

params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results

Вы должны получить следующий результат:

{
  'timing': {
    'total_real_time': 1655206,
    'anneal_time_per_run': 20,
    'post_processing_overhead_time': 13588,
    'qpu_sampling_time': 1640000,
    'readout_time_per_run': 123,
    'qpu_delay_time_per_sample': 21,
    'qpu_anneal_time_per_sample': 20,
    'total_post_processing_time': 97081,
    'qpu_programming_time': 8748,
    'run_time_chip': 1640000,
    'qpu_access_time': 1655206,
    'qpu_readout_time_per_sample': 123
  },
  'energies': [-5.0],
  'num_occurrences': [10000],
  'solutions': [
      [1, 3, 3, 1, -1, 3, 3, -1, {
          lots of 3 's that I am omitting}]]}

energies-5,0300417233[1,-1,-1,1]

Эвристическое встраивание


Jчас

J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]

Мы снова устанавливаем удаленное соединение и получаем экземпляр решателя D-Wave 2000Q VFYC:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

Чтобы найти вложение нашей задачи, нам нужно сначала получить матрицу смежности текущего аппаратного графа:

adjacency = get_hardware_adjacency(solver)

Теперь давайте попробуем найти вложение нашей проблемы:

embedding = find_embedding(J.keys(), adjacency)

Если вы имеете дело с большими экземплярами Ising, возможно, вы захотите найти вложения в несколько потоков (распараллеленных на нескольких процессорах), а затем выбрать вложение с наименьшей длиной цепочки! Цепь , когда несколько кубитов вынуждены действовать как единый кубит в целях повышения степени связности. Однако чем длиннее цепь, тем больше вероятность ее разрыва. И сломанные цепи дают плохие результаты!

Теперь мы готовы встроить нашу проблему в график:

[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)

j0jcJ

J = j0.copy()
J.update(jc)

Теперь мы готовы решить встроенную проблему:

params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)

print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])

Это raw_resultsне будет иметь смысла для нас, если мы не решим проблему. В случае разрыва некоторых цепочек мы фиксируем их большинством голосов, как это определено необязательным аргументом broken_chains:

unembedded_results = unembed_answer(raw_results['solutions'],
                                    embedding, broken_chains='vote')

print 'Solution string: {}'.format(unembedded_results)

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

Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]

Я надеюсь, что это ответило на ваш вопрос, и я настоятельно рекомендую проверить все дополнительные параметры, которые вы можете передать solve_isingфункции, чтобы улучшить качество ваших решений, таких как num_spin_reversal_transformsили postprocess.


9

Заголовок и тело вопроса, похоже, задают два разных вопроса. В заголовке вы спрашиваете «Как вы пишете простую программу для устройства D-Wave?», А в теле вопроса вы спрашиваете, как найти основные состояния простой двухмерной модели Изинга, используя базовое оборудование D-Wave. устройство, и какой будет соответствующий код (это более конкретный вопрос).

Я отвечу на первый, так как это более общий вопрос.

Согласно странице D-Wave Software :

Система D-Wave 2000Q предоставляет стандартный интернет-API (на основе сервисов RESTful) с клиентскими библиотеками, доступными для C / C ++, Python и MATLAB. Этот интерфейс позволяет пользователям получать доступ к системе как к облачному ресурсу через сеть, или интегрировать в свои высокопроизводительные вычислительные среды (HPC) и центры обработки данных. Доступ также предоставляется через облачный сервис D-Wave. Используя инструменты разработки и клиентские библиотеки D-Wave, разработчики могут создавать алгоритмы и приложения в своих существующих средах с использованием стандартных инструментов.

Хотя пользователи могут отправлять проблемы в систему несколькими различными способами, в конечном счете, проблема представляет собой набор значений, которые соответствуют весам кубитов и силе сцепок. Система принимает эти значения вместе с другими заданными пользователем параметрами и отправляет одну квантовую машинную инструкцию (QMI) в QPU. Решения задачи соответствуют найденной оптимальной конфигурации кубитов; то есть самые низкие точки в энергетическом ландшафте. Эти значения возвращаются пользовательской программе по сети.

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

Пользователи могут отправлять проблемы на квантовый компьютер D-Wave несколькими способами:

  1. Использование программы на C, C ++, Python или MATLAB для создания и выполнения QMI
  2. Использование инструмента D-Wave, такого как:

    • QSage , переводчик для задач оптимизации

    • ToQ , переводчик языка высокого уровня, используемый для решения проблем удовлетворения и позволяющий пользователям «говорить» на языке своей проблемной области

    • qbsolv , гибридный решатель оптимизации с открытым исходным кодом для решения проблем, которые больше, чем изначально подходят для QPU. Qbsolv можно
      скачать здесь .

    • DW , который выполняет QMI, созданные с помощью текстового редактора

  3. Путем непосредственного программирования системы через QMI

Загрузите этот технический документ, чтобы узнать больше о модели программирования для системы D-Wave.


5

Входными данными для D-Wave являются список взаимодействий и, в последнее время, время отжига кубитов.

JяJзнак равно1

Я рекомендую приложения в этом документе для краткого описания того, как работает оборудование D-Wave. (Полное раскрытие: я соавтор.)


2
Может быть, даже лучше, если вы включите большую часть ответа здесь, а не в ссылку? Будучи соавтором в газете, вы, вероятно, лучше всего подходите, чтобы составить хорошее резюме.
agaitaarino
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.