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


27

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

У відповіді найкраще було б побачити конкретний приклад цього для простої проблеми. Я здогадуюсь, що "Hello World" пристрою D-Wave був би чимось на зразок пошуку основних станів простої моделі 2D Ising , оскільки це така проблема, яку безпосередньо реалізує апаратне забезпечення. Тож, можливо, це був би приємний приклад. Але якщо для тих, хто має щось з досвіду, альтернативний приклад, я би радий бачити альтернативу.

Відповіді:


24

Еквівалент "Hello World" у світі D-Wave - приклад 2D-шашки. У цьому прикладі вам надається наступний квадратний графік з 4 вузлами:

                                                  square_graph

Давайте визначимо, що ми забарвлюємо вершину чорну, якщо σ i = - 1, а білу, якщо σ i = + 1 . Мета - створити шаблон шашки з чотирма вершинами на графіку. Існують різні способи визначення h та J для досягнення цього результату. Перш за все, є два можливі рішення цієї проблеми:σiσi=1σi=+1hJ

               checkerboard_solutions

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

Якщо встановити його на , гамільтоніан мінімізується, якщо обидва кубіти приймають однакове значення. Ми кажемо, що негативні сполучники співвідносяться . Якщо, якщо ми встановимо його J 0 , 1 = + 1 , гамільтоніан мінімізується, якщо два кубіти приймають протилежні значення. Таким чином, позитивні муфти антикорелюють .J0,1=1J0,1=+1

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

H=σ0σ1+σ0σ2+σ1σ3+σ2σ3

0σ0=1h0=1

H=σ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3

Тож давайте зашифруємо це!

ПРИМІТКА. Вам потрібен доступ до хмарного сервісу D-Wave для роботи.

Перш за все, переконайтеся, що встановлено пакет dwave_sapi2( https://cloud.dwavesys.com/qubist/downloads/ ) Python. Все буде 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 вище виглядає так:

Фізичні_кубіти

0100142733hJ

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

h

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}]]}

energies5.0300417233[1,1,1,1]

Евристичне вбудовування


Jh

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Чи не буде мати сенс для нас , якщо ми не unembed проблеми. У разі, якщо деякі ланцюги зламалися, ми фіксуємо їх більшістю голосів, як визначено необов'язковим аргументом 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?", А в тілі запитань ви запитаєте, як знайти основні стани простої моделі 2D Ising за допомогою базового обладнання апаратів D-Wave пристрою та яким би був відповідний код (що є більш конкретним питанням).

Я відповім на перший, оскільки це більш загальне питання.

Відповідно до сторінки програмного забезпечення D-Wave :

Система 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-хвилю - це перелік взаємодій і останнім часом час відпалу кубітів.

Jij=1

Я рекомендую додатки в цій статті для стислого опису того, як працює апаратне забезпечення D-Wave. (Повне розкриття: Я співавтор.)


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