D-Wave cihazı için nasıl basit bir program yazıyorsunuz?


27

Bir D-Wave cihazı için bir işin nasıl yazıldığını ve cihaza gönderildiğini bilmek isterim.

Cevapta basit bir problem için bunun belirli bir örneğini görmek en iyisi olacaktır. Bir D-Wave cihazının "Merhaba Dünyası" nın, basit bir 2D Ising modelinin temel durumlarını bulmak gibi bir şey olacağını tahmin ediyorum , çünkü bu, donanım tarafından doğrudan gerçekleştirilen bir tür problemdir. Bu yüzden belki bu görmek güzel bir örnek olur. Ancak uzmanlık meselesi olanlar alternatif bir örnek uygunsa, bir alternatif görmekten mutlu olurum.

Yanıtlar:


24

D-Wave dünyasında 'Hello World' eşdeğeri 2B dama tahtası örneğidir. Bu örnekte, 4 düğümlü aşağıdaki kare grafiği verilmiştir:

                                                  square_graph

Şimdi σ i = - 1 ise siyahını ve σ i = + 1 ise beyazı verdiğimizi tanımlayalım . Amaç, grafikteki dört köşeli bir dama tahtası deseni oluşturmaktır. H tanımlamanın çeşitli yolları vardır σbenσben=-1σben=+1hBu sonucu elde etmek için ve . Her şeyden önce, bu sorunun iki olası çözümü vardır:J

               checkerboard_solutions

D-Wave kuantum tavlayıcısı, tanımladığımız Ising Hamiltonian'ı minimize eder ve farklı kupler ayarlarının etkisini anlamak önemlidir. Örneğin düşünün bağlaştırıcısını:J0,1

ayarlarsak , her iki litre de aynı değeri alırsa Hamiltonian simge durumuna küçültülür. Negatif kuplörlerin korele olduğunu söylüyoruz . J 0 , 1 = + 1 olarak ayarlarsak , iki litre ters değerleri alırsa Hamiltonian simge durumuna küçültülür. Böylece, pozitif bağlaştırıcılar korelasyon yapmazlar .J0,1=-1J0,1=+1

Dama Tahtası örneğinde, aşağıdaki Hamiltonian'a yol açan her bir çift komşu çiftinin anti-korelasyonunu yapmak istiyoruz:

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

Gösteri uğruna, biz de bir önyargı kelimesini ekle biz sadece çözüm 1. olsun öyle ki -th QuBit. Bu çözüm σ 0 = - 1 gerektirir ve bu nedenle önyargısını h 0 olarak belirleriz.0σ0=-1 . Son Hamiltonian şimdi:h0=1

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

Öyleyse kodlayalım!

NOT: Çalışması için D-Wave'in Bulut Hizmeti'ne erişmeniz GEREKİR.

Her şeyden önce, elinizde olduğundan emin olun. dwave_sapi2 ( https://cloud.dwavesys.com/qubist/downloads/ ) Python paketinin kurulu . Her şey Python 2.7 olacak çünkü D-Wave şu anda daha yüksek bir Python sürümünü desteklemiyor. Olduğu söyleniyor, hadi şartları ithal edelim:

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

D-Wave Çözücü API'sine bağlanmak için kendi SAPI çözücüsü, SAPI URL'si için geçerli bir API belirtecine ve hangi kuantum işlemciyi kullanmak istediğinize karar vermeniz gerekir:

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

D-Wave 2000Q Sanal Tam Verimli Chimera'yı (VFYC) kullanmanızı öneririz; İşte Chimera yonga düzeni:

dwave_chimera

Bu noktada öğreticiyi iki ayrı parçaya böldüm. Birinci bölümde, sorunu Chimera donanım grafiğine manüel olarak yerleştiriyoruz ve ikinci bölümde donanım gömme bulmak için D-Wave'in gömme sezgisini kullanıyoruz.

Manuel gömme


Yukarıdaki D-Wave 2000Q yonga düzeninde sol üst köşedeki birim hücre şöyle görünür:

physical_qubits

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)

Artık okuma sayısını tanımlayabiliriz ve answer_modesonuçları bizim için oluşum sayısına göre sıralayan "histogram" olmayı seçebiliriz . Şimdi Ising örneğini D-Wave quantum annealer ile çözmeye hazırız:

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

Aşağıdaki sonucu almalısınız:

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

Gördüğünüz gibi biz doğru taban durumu enerjisi var ( energies) ait-5.0300417233[1,-1,-1,1]

Sezgisel yerleştirme


Jh

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

Uzaktan bağlantıyı tekrar kurar ve D-Wave 2000Q VFYC çözücü örneğini alırız:

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

Sorunumuzu yerleştirmek için önce mevcut donanım grafiğinin bitişik matrisini almamız gerekir:

adjacency = get_hardware_adjacency(solver)

Şimdi sorunumuza bir yer bulmaya çalışalım:

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

Büyük Ising örnekleriyle uğraşıyorsanız, birden fazla iş parçacığı içindeki gömmeleri (birden fazla CPU'ya paralel olarak) aramak ve ardından en küçük zincir uzunluğuna sahip gömmeyi seçmek isteyebilirsiniz! bir zincir , bağlantı derecesini arttırmak için birden fazla litrenin tek bir litre gibi davranmaya zorlanmasıdır. Bununla birlikte, zincir ne kadar uzun olursa, kırılma olasılığı o kadar yüksektir. Ve kırılmış zincirler kötü sonuçlar veriyor!

Şimdi sorunumuzu grafiğe yerleştirmeye hazırız:

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

j0jcJ

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

Şimdi, gömülü sorunu çözmeye hazırız:

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_resultsBiz sorunu unembed sürece bize mantıklı olmayacaktır. Bazı zincirler kırıldıysa, isteğe bağlı argüman tarafından tanımlanan çoğunluk oyu ile bunları düzeltiyoruz broken_chains:

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

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

Bunu çalıştırırsanız, tüm okumalarda doğru sonucu almalısınız:

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

Umarım bu sorunuza cevap verdi ve ya da solve_isinggibi çözümlerin kalitesini artırmak için işleve geçebileceğiniz tüm ek parametreleri kontrol etmenizi şiddetle tavsiye ederim .num_spin_reversal_transformspostprocess


9

Başlık ve soru gövdesi iki farklı soru soruyor gibi görünüyor. "D-Wave cihazı için nasıl basit bir program yazıyorsunuz?" cihaz ve ilgili kodun ne olacağı (daha özel bir soru).

İlkine cevap vereceğim, çünkü daha genel bir soru.

Göre , D-Dalga Yazılım sayfa :

D-Wave 2000Q sistemi, C / C ++, Python ve MATLAB için kullanılabilen istemci kitaplıklarıyla birlikte standart bir İnternet API (RESTful servislerine dayanarak) sağlar. Bu arayüz, kullanıcıların sisteme bir ağ üzerinden bulut kaynağı olarak veya yüksek performanslı bilgi işlem ortamlarına ve veri merkezlerine entegre olmalarına izin verir. Erişim, D-Wave'in barındırdığı bulut hizmeti aracılığıyla da yapılabilir. D-Wave'in geliştirme araçlarını ve istemci kitaplıklarını kullanarak geliştiriciler, endüstri standardı araçları kullanarak mevcut ortamlarında algoritmalar ve uygulamalar yaratabilirler.

Kullanıcılar sisteme çeşitli şekillerde problemler sunsalar da, sonuçta problem, çeyreklerin ağırlığına ve kuplörlerin gücüne karşılık gelen bir dizi değeri temsil eder. Sistem bu değerleri diğer kullanıcı tarafından belirlenen parametrelerle birlikte alır ve QPU'ya tek bir kuantum makinesi talimatı (QMI) gönderir. Problem çözümleri, bulunan qubitlerin optimum konfigürasyonuna karşılık gelir; yani, enerji peyzajındaki en düşük noktalar. Bu değerler ağ üzerinden kullanıcı programına döndürülür.

Kuantum bilgisayarların deterministikten ziyade olasılıklı olmaları nedeniyle, sadece bulunan en iyi çözümü değil, aynı zamanda seçilebilecek diğer çok iyi alternatifleri sağlamak için çoklu değerler geri alınabilir. Kullanıcılar, sistemin geri vermesini istedikleri çözüm sayısını belirleyebilir.

Kullanıcılar, D-Wave kuantum bilgisayarına birkaç şekilde sorun gönderebilir:

  1. QMI oluşturmak ve yürütmek için C, C ++, Python veya MATLAB programlarını kullanmak
  2. D-Wave aracını aşağıdaki gibi kullanma:

    • QSage , optimizasyon problemleri için tasarlanmış bir tercüman

    • Kısıtlama memnuniyeti problemleri için kullanılan ve kullanıcıların problem alanı dillerinde “konuşmalarını” sağlayacak şekilde tasarlanmış olan üst düzey bir dil çevirmeni olan ToQ

    • qbsolv , QPU'ya doğal olarak sığacak olandan daha büyük sorunlar için açık kaynaklı, karma bir bölümleme optimizasyon çözümü. Qbsolv olabilir
      indirilebilir burada .

    • Bir metin editörü ile oluşturulan QMI'leri çalıştıran dw

  3. Sistemi doğrudan QMI'ler üzerinden programlayarak

D-Wave sisteminin programlama modeli hakkında daha fazla bilgi edinmek için bu broşürü indirin


5

D-Dalgası girişleri, etkileşimlerin bir listesi ve daha yakın zamanda kubitlerin tavlama süresidir.

Jbenj=1

Bu yazıda ekleri tavsiye ederimD-Wave donanımının nasıl işlediğine dair kısa bir açıklama için . (Tam açıklama: Ben bir yazaryım.)


2
Buraya cevabın yerine daha büyük bir kısmı eklemeniz daha iyi olabilir mi? Gazetede bir yazar olarak, iyi bir özet yapmak için muhtemelen en iyisidir.
agaitaarino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.