Skip to content
होम/ब्लॉग/Quantum Annealing की व्याख्या: D-Wave के Ocean SDK से Max-Cut हल करना
AlgorithmsOptimizationHardware

Quantum Annealing की व्याख्या: D-Wave के Ocean SDK से Max-Cut हल करना

Max-Cut समस्या को QUBO के रूप में बनाएं, इसे D-Wave के मुफ़्त simulated-annealing sampler से हल करें, और समझें कि gate-model quantum computing की तुलना में quantum annealing क्या करता है और क्या नहीं करता।

FreeQuantumComputing
·· 9 min read

Quantum annealing इस साइट पर बाकी सब चीज़ों से बिल्कुल अलग तरह का quantum computing मॉडल है। इसमें न कोई circuit है, न कोई gates, न ही hardware पर Grover या Shor's algorithm चलता है। एक annealer ठीक एक ही तरह की समस्या हल करता है, यानी optimization, समस्या को सीधे hardware की भौतिकी में encode करके और सिस्टम को एक low-energy जवाब में बैठ जाने देकर।

यह गाइड हमारे QAOA ट्यूटोरियल वाली उसी Max-Cut समस्या को एक annealing समस्या के रूप में बनाती है, इसे D-Wave के Ocean SDK से मुफ़्त में हल करती है, और उस व्यावहारिक गलती को कवर करती है जो लगभग हर कोई toy example से असली hardware पर जाते समय करता है।

भौतिक विचार

एक optimization समस्या को qubits के एक सिस्टम पर इस तरह mapped किया जाता है कि सिस्टम की सबसे कम-energy वाली configuration, यानी उसका ground state, सबसे अच्छे हल के बराबर हो। qubits एक आसानी से तैयार होने वाली स्थिति से शुरू होते हैं और धीरे-धीरे समस्या के energy profile की ओर evolve करते हैं। adiabatic theorem वह चीज़ है जो इसे काम करने देती है: अपने ground state से शुरू होने वाला एक quantum system, evolution के दौरान ground state में ही बना रहता है, बशर्ते evolution सिस्टम के energy gaps की तुलना में पर्याप्त धीमा हो। अंत में qubits को पढ़ने पर आपको एक low-energy, उम्मीद है कि optimal, हल मिलता है।

यह gate-model computing से एक बुनियादी तरीके से अलग है। एक gate-model QPU आपके द्वारा तय की गई operations की कोई भी क्रमबद्ध सूची चला सकता है। एक annealer एक ही तय की हुई प्रक्रिया चलाता है, भौतिक रूप से एक minimum की ओर relax होते हुए, और आपका एकमात्र नियंत्रण यह है कि समस्या को इस energy profile में कैसे encode किया जाता है।

Max-Cut को QUBO के रूप में बनाना

Annealers उन समस्याओं को हल करते हैं जो QUBO (Quadratic Unconstrained Binary Optimization) के रूप में व्यक्त की गई हों: binary variables x_i ∈ {0, 1} की एक expression को minimize करना, जिसमें केवल linear और pairwise quadratic terms हों, कोई higher-order interactions नहीं।

Max-Cut के लिए, हर edge (i, j) objective में 2·x_i·x_j − x_i − x_j जोड़ता है। चारों स्थितियाँ देखें: जब x_i और x_j मेल खाते हैं (दोनों एक ही तरफ़ हों), तो यह term 0 होता है। जब वे अलग हों (यानी edge कट गया हो), तो term −1 होता है। इसलिए सभी edges पर योग को minimize करना असल में कटे हुए edges की संख्या को maximize करने के बराबर है, ठीक Max-Cut का लक्ष्य, बस एक minimization के रूप में दोबारा लिखा हुआ।

QAOA गाइड जैसे ही चार-node वाले cycle graph का इस्तेमाल करते हुए:

import dimod
from neal import SimulatedAnnealingSampler

edges = [(0, 1), (1, 2), (2, 3), (3, 0)]

Q = {}
for i, j in edges:
    Q[(i, i)] = Q.get((i, i), 0) - 1
    Q[(j, j)] = Q.get((j, j), 0) - 1
    Q[(i, j)] = Q.get((i, j), 0) + 2

bqm = dimod.BinaryQuadraticModel.from_qubo(Q)

इस graph का हर edge एक साथ कट सकता है, यह graph bipartite है: {0, 2} बनाम {1, 3}, इसलिए ground-state energy ठीक −4 निकलती है, यानी हर edge से −1 का योगदान। यह संख्या सीधे QUBO के निर्माण से आती है, अभी तक कुछ चलाने से नहीं, और यही वह लक्ष्य है जिसे नीचे दिया गया sampler हासिल करने की कोशिश करता है।

इसे simulated annealing से मुफ़्त में हल करना

D-Wave के Ocean SDK में neal शामिल है, एक classical simulated-annealing sampler जो पूरी तरह आपकी अपनी मशीन पर चलता है, बिना किसी QPU account, बिना queue, बिना किसी लागत के। असली hardware को छूने से पहले किसी annealing समस्या को विकसित करने का यह भी मानक पहला कदम है, ठीक वही भूमिका जो इस साइट पर बाकी जगहों पर gate-model circuits के लिए AerSimulator निभाता है।

sampler = SimulatedAnnealingSampler()
sampleset = sampler.sample(bqm, num_reads=1000)

best = sampleset.first
print(best.sample, best.energy)

num_reads=1000 annealing प्रक्रिया को स्वतंत्र रूप से 1,000 बार चलाता है और हर परिणाम को रखता है, क्योंकि simulated और quantum annealing दोनों ही heuristic हैं: कोई एक भी run ground state पर पहुँचने की गारंटी नहीं देता, इसलिए reads के एक batch में से सबसे कम energy वाला परिणाम लेना ही मानक तरीका है। इस graph के लिए, उम्मीद है कि best.energy −4 पर आएगी, और best.sample दो बराबर bipartitions में से एक दिखाएगा, {0, 2} एक तरफ़ और {1, 3} दूसरी तरफ़, या इसका उल्टा। दोनों ही सही हैं: Max-Cut में यह कोई मायने नहीं रखता कि कौन-सा पक्ष "पहला" है, तो यह समस्या में मौजूद एक असली symmetry है, sampler की कोई गड़बड़ी नहीं।

गलती: Embedding को नज़रअंदाज़ करना

ऊपर की सारी चीज़ें एक classical simulated annealer पर चलती हैं, जिसमें connectivity की कोई सीमा नहीं होती: कोई भी variable किसी भी दूसरे variable के साथ स्वतंत्र रूप से interact कर सकता है। असली D-Wave hardware अलग तरह से काम करता है। physical qubits एक तय, sparse topology पर बैठे होते हैं (generation के हिसाब से Pegasus या Zephyr), और ज़्यादातर qubit जोड़े सीधे आपस में wired नहीं होते।

एक ऐसी समस्या रखने के लिए जहाँ variable i को variable j के साथ interact करना हो लेकिन कोई भी physical qubit pair यह connection न देता हो, Ocean का minor-embedding चरण कई physical qubits को एक साथ जोड़कर उन्हें एक logical variable की तरह काम करने देता है। यह अपने आप होता है, dwave-system का EmbeddingComposite इस प्रक्रिया को संभालता है, लेकिन यह प्रक्रिया मुफ़्त नहीं है: chains को अतिरिक्त qubits चाहिए होते हैं, और कभी-कभी एक chain "टूट" जाती है, जो physical qubits आपस में मेल खाने चाहिए थे वे annealing के बाद असहमत निकलते हैं, और चुपचाप उस variable की reading बिगाड़ देते हैं। बड़ी या घनी (denser) समस्याओं को लंबी chains चाहिए होती हैं, जो ज़्यादा बार टूटती हैं, और पर्याप्त घनी समस्याएँ आख़िरकार किसी दिए गए chip पर embed होना ही बंद कर देती हैं। किसी काम कर रही simulated-annealing समस्या को पहली बार असली hardware पर ले जाने वाले लगभग हर व्यक्ति के लिए यही सबसे आम हैरानी है: algorithm ख़राब नहीं हुआ, chip की physical connectivity ही bottleneck बन गई।

Annealing क्या नहीं करता

एक annealer न तो Grover की search चलाता है, न Shor की factoring, और इसमें circuit जैसी कोई सामान्य अवधारणा भी नहीं होती। इसके qubits gate-model qubits से सीधे तुलनीय नहीं हैं: D-Wave के सिस्टम 5,000 qubits से भी ज़्यादा तक जाते हैं, जो किसी भी gate-model QPU से कहीं ज़्यादा है, लेकिन यह आँकड़ा विशेष रूप से QUBO/Ising समस्या वर्ग पर optimization क्षमता बताता है, सामान्य computational शक्ति नहीं। क्या annealing व्यावहारिक समस्याओं पर सबसे अच्छे classical optimization heuristics के मुक़ाबले कोई असली speed फ़ायदा देता है, यह साहित्य में अब भी वाकई विवादित है और लगता है कि यह काफ़ी हद तक समस्या की विशिष्ट संरचना पर निर्भर करता है, ऐसी चीज़ नहीं जिसे डिफ़ॉल्ट रूप से मान लिया जाए।

असली D-Wave hardware पर चलाना

sampler बदलें, बाकी कोड बिल्कुल वैसा ही रहता है:

from dwave.system import DWaveSampler, EmbeddingComposite

sampler = EmbeddingComposite(DWaveSampler())
sampleset = sampler.sample(bqm, num_reads=1000)

D-Wave की Leap cloud service ठीक इसी तरह के प्रयोगों के लिए हर महीने मुफ़्त QPU समय का एक कोटा देती है, यह gate-model hardware के लिए IBM Quantum के मुफ़्त tier का annealing-बराबर संस्करण है। EmbeddingComposite minor-embedding चरण को अपने आप संभाल लेता है, लेकिन किसी छोटी toy समस्या से आगे किसी भी परिणाम पर भरोसा करने से पहले, chain-break के आँकड़ों के लिए लौटाए गए sampleset.info की जाँच ज़रूर करें।

अगले कदम