awsからD-Waveに投げる方法を簡単に確認します。
まずはツールの読み込みです。
awsからはbraket SDK
dwaveからはOcean SDK
その二つを繋げる Braket Ocean Pluginを用意します。
from braket.aws import AwsDevice
from dwave.system.composites import EmbeddingComposite
from braket.ocean_plugin import BraketSampler, BraketDWaveSampler
用意するパラメータは、chain,読み込み回数、あとはs3の保存用のフォルダです。QUBOを用意します。
#input
chain = 8
num_read = 10
my_prefix = "自分のを入れる" #user account
qubo = [[-10., 20., 5., 0., 2., 0., 3., 0.],
[ 0., -10., 0., 5., 0., 2., 0., 3.],
[ 0., 0., -10., 20., 1., 0., 5., 0.],
[ 0., 0., 0., -10., 0., 1., 0., 5.],
[ 0., 0., 0., 0., -10., 20., 2., 0.],
[ 0., 0., 0., 0., 0., -10., 0., 2.],
[ 0., 0., 0., 0., 0., 0., -10., 20.],
[ 0., 0., 0., 0., 0., 0., 0., -10.]]
早速投げます。
def dwave(Q, N, prefix, C=8):
device = "arn:aws:braket:::device/qpu/d-wave/Advantage_system1"
s3 = (f"自分のバケット入れる", prefix)
response = EmbeddingComposite(BraketDWaveSampler(s3, device)).sample_qubo(Q, chain_strength = C, num_reads = N)
return response
指定するのは、awsのbraketからd-waveのadnvatage system1です。
EmbeddingCompositeは同じですが、BraketDWaveSamplerを指定し、結果の保存用にs3を指定するところがちょっとD-Waveと違います。
そして、投げます。
response = dwave(qubo, num_read, my_prefix)
これで実行されて結果が戻ります。
response
結果は、
SampleSet(rec.array([([0, 1, 1, 0, 1, 0, 0, 1], -36., 3, 0.),
([1, 0, 0, 1, 0, 1, 1, 0], -36., 4, 0.),
([0, 1, 0, 1, 1, 0, 1, 0], -33., 2, 0.),
([1, 0, 0, 1, 0, 1, 0, 1], -32., 1, 0.)],
dtype=[('sample', 'i1', (8,)), ('energy', '<f8'), ('num_occurrences', '<i8'), ('chain_break_fraction', '<f8')]), [0, 1, 2, 3, 4, 5, 6, 7], {'taskMetadata': {'braketSchemaHeader': {'name': 'braket.task_result.task_metadata', 'version': '1'}, 'id': 'ここにプロジェクトのID', 'shots': 10, 'deviceId': 'arn:aws:braket:::device/qpu/d-wave/Advantage_system1', 'deviceParameters': {'braketSchemaHeader': {'name': 'braket.device_schema.dwave.dwave_device_parameters', 'version': '1'}, 'providerLevelParameters': {'braketSchemaHeader': {'name': 'braket.device_schema.dwave.dwave_provider_level_parameters', 'version': '1'}, 'annealingOffsets': None, 'annealingSchedule': None, 'annealingDuration': None, 'autoScale': None, 'beta': None, 'chains': None, 'compensateFluxDrift': None, 'fluxBiases': None, 'initialState': None, 'maxResults': None, 'postprocessingType': None, 'programmingThermalizationDuration': None, 'readoutThermalizationDuration': None, 'reduceIntersampleCorrelation': None, 'reinitializeState': None, 'resultFormat': None, 'spinReversalTransformCount': None}}, 'createdAt': '2021-01-02T08:24:31.666Z', 'endedAt': '2021-01-02T08:24:34.798Z', 'status': 'COMPLETED', 'failureReason': None}, 'additionalMetadata': {'action': {'braketSchemaHeader': {'name': 'braket.ir.annealing.problem', 'version': '1'}, 'type': <ProblemType.QUBO: 'QUBO'>, 'linear': {5283: -10.0, 657: -10.0, 5298: -10.0, 642: -10.0, 702: -10.0, 5253: -10.0, 717: -10.0, 5268: -10.0}, 'quadratic': {'5283,657': 20.0, '5283,5298': 5.0, '5283,702': 2.0, '5283,717': 3.0, '657,642': 5.0, '657,5253': 2.0, '657,5268': 3.0, '5298,642': 20.0, '5298,702': 1.0, '5298,717': 5.0, '642,5253': 1.0, '642,5268': 5.0, '702,5253': 20.0, '702,717': 2.0, '5253,5268': 2.0, '717,5268': 20.0}}, 'dwaveMetadata': {'braketSchemaHeader': {'name': 'braket.task_result.dwave_metadata', 'version': '1'}, 'activeVariables': [642, 657, 702, 717, 5253, 5268, 5283, 5298], 'timing': {'qpuSamplingTime': 760, 'qpuAnnealTimePerSample': 20, 'qpuAccessTime': 26797, 'qpuAccessOverheadTime': 7664, 'qpuReadoutTimePerSample': 35, 'qpuProgrammingTime': 26037, 'qpuDelayTimePerSample': 21, 'postProcessingOverheadTime': 535, 'totalPostProcessingTime': 535, 'totalRealTime': 26797, 'runTimeChip': 760, 'annealTimePerRun': 20, 'readoutTimePerRun': 35}}, 'rigettiMetadata': None, 'simulatorMetadata': None}}, 'BINARY')
その他必要なデータと一緒に戻ります。これでできます。意外と簡単にできました。サンプラーの動かし方だけ気をつけましょう。