Làm thế nào để bạn viết một chương trình đơn giản cho thiết bị D-Wave?


27

Tôi muốn biết làm thế nào một công việc cho một thiết bị D-Wave được viết bằng mã và gửi đến thiết bị.

Trong câu trả lời, tốt nhất nên xem một ví dụ cụ thể về vấn đề này cho một vấn đề đơn giản. Tôi đoán rằng "Hello World" của thiết bị D-Wave sẽ giống như tìm trạng thái cơ bản của mô hình 2D Ising đơn giản , vì đây là loại vấn đề được phần cứng trực tiếp nhận ra. Vì vậy, có lẽ đây sẽ là một ví dụ tốt đẹp để xem. Nhưng nếu những người có chuyên môn về một ví dụ thay thế sẽ phù hợp, tôi rất vui khi thấy một sự thay thế.

Câu trả lời:


24

Tương đương 'Hello World' trong thế giới D-Wave là ví dụ về trình kiểm tra 2D. Trong ví dụ này, bạn được cung cấp biểu đồ hình vuông sau với 4 nút:

                                                  hình vuông

Hãy xác định rằng chúng ta tô màu đỉnh đen nếu σ i = - 1 và trắng nếu σ i = + 1 . Mục tiêu là tạo ra một mô hình bàn cờ với bốn đỉnh trong biểu đồ. Có nhiều cách định nghĩa hJ để đạt được kết quả này. Trước hết, có hai giải pháp khả thi cho vấn đề này:σtôiσtôi= =-1σtôi= =+1hJ

               checkerboard_solutions

Công cụ xác định lượng tử D-Wave giảm thiểu Ising Hamiltonian mà chúng ta xác định và điều quan trọng là phải hiểu tác động của các cài đặt bộ ghép khác nhau. Hãy xem xét ví dụ về bộ ghép :J0,1

Nếu chúng ta đặt nó thành , Hamilton sẽ được giảm thiểu nếu cả hai qubit có cùng giá trị. Chúng tôi nói các khớp nối tiêu cực tương quan . Trong khi đó, nếu chúng ta đặt nó thành J 0 , 1 = + 1 , Hamilton sẽ được giảm thiểu nếu hai qubit có giá trị ngược nhau. Do đó, các khớp nối tích cực chống tương quan .J0,1= =-1J0,1= =+1

Trong ví dụ về bàn cờ, chúng tôi muốn chống tương quan từng cặp qubit lân cận, điều này dẫn đến Hamiltonian sau:

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

0σ0= =-1h0= =1

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

Vì vậy, hãy mã hóa nó lên!

LƯU Ý: Bạn KHÔNG CẦN truy cập Dịch vụ đám mây của D-Wave để mọi thứ hoạt động.

Trước hết, hãy đảm bảo bạn đã cài đặt gói dwave_sapi2( https://cloud.dwavesys.com/qubist/doads/ ). Mọi thứ sẽ là Python 2.7 vì D-Wave hiện không hỗ trợ bất kỳ phiên bản Python nào cao hơn. Điều đó đang được nói, hãy nhập các yếu tố cần thiết:

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

Để kết nối với API Bộ giải sóng D, bạn sẽ cần mã thông báo API hợp lệ cho bộ giải SAPI của họ, URL SAPI và bạn cần quyết định bộ xử lý lượng tử nào bạn muốn sử dụng:

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

Tôi khuyên bạn nên sử dụng D-Wave 2000Q Virtual Full Yield Chimera (VFYC), đây là một con chip đầy đủ chức năng mà không có bất kỳ qubit chết nào! Đây là cách bố trí chip Chimera:

dwave_chimera

Tại thời điểm này tôi đang chia hướng dẫn thành hai phần riêng biệt. Trong phần đầu tiên, chúng tôi đang nhúng thủ công sự cố vào biểu đồ phần cứng Chimera và trong phần thứ hai, chúng tôi đang sử dụng phương pháp phỏng đoán nhúng của D-Wave để tìm cách nhúng phần cứng.

Hướng dẫn nhúng


Ô đơn vị ở góc trên cùng bên trái trên bố trí chip D-Wave 2000Q ở trên trông như thế này:

vật lý

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)

Bây giờ, chúng ta có thể xác định số lượng bài đọc và chọn answer_modelà "biểu đồ" đã sắp xếp kết quả theo số lần xuất hiện cho chúng ta. Bây giờ chúng tôi đã sẵn sàng để giải quyết trường hợp Ising với công cụ xác định lượng tử D-Wave:

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

Bạn sẽ nhận được kết quả sau:

{
  '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]

Heuristic nhúng


Jh

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

Chúng tôi lại thiết lập kết nối từ xa và lấy phiên bản của bộ giải D-Wave 2000Q VFYC:

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

Để tìm ra sự nhúng của vấn đề của chúng tôi, trước tiên chúng tôi cần lấy ma trận kề của biểu đồ phần cứng hiện tại:

adjacency = get_hardware_adjacency(solver)

Bây giờ chúng ta hãy cố gắng tìm ra sự nhúng vào vấn đề của chúng ta:

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

Nếu bạn đang xử lý các trường hợp Ising lớn, bạn có thể muốn tìm kiếm các nhúng trong nhiều luồng (song song trên nhiều CPU) và sau đó chọn nhúng với độ dài chuỗi nhỏ nhất! Một chuỗi là khi nhiều qubit buộc phải hoạt động như một qubit duy nhất để tăng mức độ kết nối. Tuy nhiên, chuỗi càng dài thì càng dễ bị hỏng. Và chuỗi bị hỏng cho kết quả xấu!

Bây giờ chúng tôi đã sẵn sàng để nhúng vấn đề của chúng tôi vào biểu đồ:

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

j0jcJ

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

Bây giờ, chúng tôi đã sẵn sàng để giải quyết vấn đề nhúng:

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'])

Điều đó raw_resultssẽ không có ý nghĩa với chúng tôi trừ khi chúng tôi giải quyết vấn đề. Trong trường hợp, một số chuỗi bị hỏng, chúng tôi đang sửa chúng thông qua một cuộc bỏ phiếu đa số như được xác định bởi đối số tùy chọn broken_chains:

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

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

Nếu bạn chạy cái này, bạn sẽ nhận được kết quả chính xác trong tất cả các bài đọc:

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

Tôi hy vọng điều này đã trả lời câu hỏi của bạn và tôi khuyên bạn nên kiểm tra tất cả các tham số bổ sung mà bạn có thể chuyển đến solve_isinghàm để cải thiện chất lượng của các giải pháp của bạn như num_spin_reversal_transformshoặc postprocess.


9

Tiêu đề và cơ thể câu hỏi dường như hỏi hai câu hỏi khác nhau. Trong tiêu đề bạn hỏi "Làm thế nào để bạn viết một chương trình đơn giản cho thiết bị D-Wave?", Trong khi trong phần thân câu hỏi, bạn hỏi cách tìm trạng thái cơ bản của mô hình 2D Ising đơn giản bằng phần cứng cơ bản của D-Wave thiết bị, và mã tương ứng sẽ là gì (đó là một câu hỏi cụ thể hơn).

Tôi sẽ trả lời trước, vì đó là câu hỏi tổng quát hơn.

Theo trang Phần mềm D-Wave :

Hệ thống D-Wave 2000Q cung cấp API Internet tiêu chuẩn (dựa trên các dịch vụ RESTful), với các thư viện máy khách có sẵn cho C / C ++, Python và MATLAB. Giao diện này cho phép người dùng truy cập hệ thống dưới dạng tài nguyên đám mây qua mạng hoặc được tích hợp vào môi trường và trung tâm dữ liệu điện toán hiệu năng cao (HPC) của họ. Quyền truy cập cũng có sẵn thông qua dịch vụ đám mây được lưu trữ của D-Wave. Sử dụng các công cụ phát triển và thư viện máy khách của D-Wave, các nhà phát triển có thể tạo các thuật toán và ứng dụng trong môi trường hiện tại của họ bằng các công cụ tiêu chuẩn công nghiệp.

Mặc dù người dùng có thể gửi các vấn đề đến hệ thống theo một số cách khác nhau, cuối cùng, một vấn đề đại diện cho một tập hợp các giá trị tương ứng với trọng số của các qubit và sức mạnh của các bộ ghép. Hệ thống nhận các giá trị này cùng với các tham số do người dùng chỉ định khác và gửi một lệnh máy lượng tử (QMI) duy nhất đến QPU. Các giải pháp vấn đề tương ứng với cấu hình tối ưu của các qubit được tìm thấy; đó là, những điểm thấp nhất trong cảnh quan năng lượng. Các giá trị này được trả về chương trình người dùng qua mạng.

Bởi vì máy tính lượng tử có xác suất chứ không phải xác định, nhiều giá trị có thể được trả về, cung cấp không chỉ giải pháp tốt nhất được tìm thấy, mà còn cả các lựa chọn thay thế rất tốt khác để lựa chọn. Người dùng có thể chỉ định số lượng giải pháp họ muốn hệ thống trả về.

Người dùng có thể gửi vấn đề đến máy tính lượng tử D-Wave theo nhiều cách:

  1. Sử dụng một chương trình trong C, C ++, Python hoặc MATLAB để tạo và thực thi QMI
  2. Sử dụng công cụ D-Wave như:

    • QSage , một dịch giả được thiết kế cho các vấn đề tối ưu hóa

    • ToQ , một trình dịch ngôn ngữ cấp cao được sử dụng cho các vấn đề thỏa mãn ràng buộc và được thiết kế để cho phép người dùng Nói tiếng nói trong ngôn ngữ của miền vấn đề của họ

    • qbsolv , một trình giải tối ưu hóa phân vùng lai, mã nguồn mở cho các vấn đề lớn hơn sẽ phù hợp với QPU. Qbsolv có thể
      được tải xuống ở đây .

    • dw , thực thi các QMI được tạo thông qua trình soạn thảo văn bản

  3. Bằng cách lập trình trực tiếp hệ thống thông qua QMI

Tải xuống sách trắng này để tìm hiểu thêm về mô hình lập trình cho hệ thống D-Wave


5

Các đầu vào của D-Wave là một danh sách các tương tác và gần đây là thời gian ủ của các qubit.

Jtôij= =1

Tôi đề nghị các phụ lục trong bài viết này để mô tả ngắn gọn về cách thức hoạt động của phần cứng D-Wave. (Tiết lộ đầy đủ: Tôi là đồng tác giả.)


2
Có thể còn tốt hơn nếu bạn bao gồm một phần lớn hơn của câu trả lời ở đây, thay vì trong liên kết? Là một đồng tác giả trong bài báo, có lẽ bạn phù hợp nhất để đưa ra một bản tóm tắt tốt.
agaitaarino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.