15
15
import requests
16
16
import json
17
17
18
- from openjij .sampler import BaseSampler
19
- from openjij .sampler import Response
18
+ from openjij .sampler import BaseSampler , Response
20
19
from openjij .model import KingGraph
21
20
22
21
import numpy as np
23
22
24
-
25
23
class CMOSAnnealer (BaseSampler ):
26
24
"""Sampler with CMOS Annealer.
27
25
@@ -70,18 +68,18 @@ class CMOSAnnealer(BaseSampler):
70
68
"""
71
69
72
70
def __init__ (self , token , machine_type = "ASIC" , beta_min = 0.1 , beta_max = 5.0 , step_length = 10 , step_num = 100 , iteration = 1 , ** kwargs ):
73
-
71
+
74
72
self .token = token
75
73
self .machine_type = machine_type
76
-
74
+
77
75
self .cmos_parameters = {"temperature_num_steps" : step_num ,
78
76
"temperature_step_length" : step_length ,
79
77
"temperature_initial" : 1 / beta_min ,
80
78
"temperature_target" : 1 / beta_max ,
81
79
"num_executions" : iteration }
82
-
80
+
83
81
self .cmos_parameters .update (kwargs )
84
-
82
+
85
83
def sample_ising (self , h = None , J = None , king_graph = None ):
86
84
"""Sample from the specified Ising model.
87
85
@@ -116,12 +114,10 @@ def sample_ising(self, h=None, J=None, king_graph=None):
116
114
117
115
var_type = 'SPIN'
118
116
if king_graph is not None :
119
- _king_graph = KingGraph (
120
- machine_type = self .machine_type , king_graph = king_graph , var_type = var_type )
117
+ _king_graph = KingGraph (machine_type = self .machine_type , king_graph = king_graph , var_type = var_type )
121
118
return self ._sampling (_king_graph , var_type = var_type , token = self .token )
122
119
elif (h is not None ) and (J is not None ):
123
- _king_graph = KingGraph (
124
- machine_type = self .machine_type , h = h , J = J , var_type = var_type )
120
+ _king_graph = KingGraph (machine_type = self .machine_type , h = h , J = J , var_type = var_type )
125
121
return self ._sampling (_king_graph , var_type = var_type , token = self .token )
126
122
else :
127
123
raise ValueError ('intput "h and J" or king_graph model' )
@@ -157,54 +153,48 @@ def sample_qubo(self, Q=None, king_graph=None):
157
153
158
154
var_type = 'BINARY'
159
155
if king_graph is not None :
160
- _king_graph = KingGraph (
161
- machine_type = self .machine_type , king_graph = king_graph , var_type = var_type )
156
+ _king_graph = KingGraph (machine_type = self .machine_type , king_graph = king_graph , var_type = var_type )
162
157
return self ._sampling (_king_graph , var_type = var_type , token = self .token )
163
158
elif Q is not None :
164
- _king_graph = KingGraph (
165
- machine_type = self .machine_type , Q = Q , var_type = var_type )
159
+ _king_graph = KingGraph (machine_type = self .machine_type , Q = Q , var_type = var_type )
166
160
return self ._sampling (_king_graph , var_type = var_type , token = self .token )
167
161
else :
168
162
raise ValueError ('intput Q or king_graph model' )
169
163
164
+
170
165
def _sampling (self , king_graph , var_type , token ):
171
166
indices = king_graph .indices
172
167
response = Response (var_type = var_type , indices = indices )
173
- headers , request = self .make_json_request (
174
- king_graph .get_ising_king_graph (), token )
175
-
168
+ headers , request = self .make_json_request (king_graph .get_ising_king_graph (), token )
169
+
176
170
url = 'https://annealing-cloud.com/api/v2/solve'
177
171
res = requests .post (url , data = json .dumps (request ), headers = headers )
178
172
res_dict = res .json ()
179
-
173
+
180
174
if res_dict ['status' ] != 0 :
181
- raise ValueError ('Error status: {}, message: {}' .format (
182
- res_dict ['status' ], res_dict ['message' ]))
183
-
175
+ raise ValueError ('Error status: {}, message: {}' .format (res_dict ['status' ], res_dict ['message' ]))
176
+
184
177
if var_type == "SPIN" :
185
- response .states = [[s for x , y , s in spins ]
186
- for spins in res_dict ['result' ]['spins' ]]
187
- else : # qubo
188
- response .states = [[int ((s + 1 )/ 2 ) for x , y , s in spins ]
189
- for spins in res_dict ['result' ]['spins' ]]
190
- response .indices = [king_graph .convert_to_index (
191
- x , y ) for x , y , s in res_dict ['result' ]['spins' ][0 ]]
192
- response .energies = np .array (
193
- res_dict ['result' ]['energies' ]) + king_graph .energy_bias
178
+ response .states = [[s for x , y , s in spins ] for spins in res_dict ['result' ]['spins' ]]
179
+ else : #qubo
180
+ response .states = [[int ((s + 1 )/ 2 ) for x , y , s in spins ] for spins in res_dict ['result' ]['spins' ]]
181
+ response .indices = [king_graph .convert_to_index (x , y ) for x , y , s in res_dict ['result' ]['spins' ][0 ]]
182
+ response .energies = np .array (res_dict ['result' ]['energies' ]) + king_graph .energy_bias
183
+
194
184
195
185
# more infomation see : https://annealing-cloud.com/web-api/reference/v2.html
196
186
response .info = {
197
187
"averaged_spins" : res_dict ['result' ]["averaged_spins" ],
198
188
"averaged_energy" : res_dict ['result' ]["averaged_energy" ],
199
- 'execution_time' : res_dict ['result' ]['execution_time' ] * 10 ** (- 3 ),
189
+ 'execution_time' : res_dict ['result' ]['execution_time' ] * 10 ** (- 3 ),
200
190
'job_id' : res_dict ['job_id' ],
201
191
}
202
-
192
+
203
193
return response
204
-
194
+
205
195
def make_json_request (self , model , token ):
206
196
"""Make request for CMOS Annealer API.
207
-
197
+
208
198
Args:
209
199
model (list):
210
200
A list of 5 integer values representing vertices
@@ -216,22 +206,22 @@ def make_json_request(self, model, token):
216
206
"""
217
207
218
208
headers = {"Authorization" : "Bearer " + token }
219
- headers .update ({"Accept" : "application/json" })
220
- headers .update ({'content-type' : 'application/json' })
209
+ headers .update ({ "Accept" : "application/json" })
210
+ headers .update ({ 'content-type' : 'application/json' })
221
211
222
212
request = {}
223
- request ["model" ] = model # modelのみ必須項目
224
- request ["type" ] = 1 if self .machine_type == "ASIC" else 2 # FPGA
213
+ request ["model" ] = model # modelのみ必須項目
214
+ request ["type" ] = 1 if self .machine_type == "ASIC" else 2 # FPGA
225
215
request ["num_executions" ] = self .cmos_parameters ["num_executions" ]
226
216
request ["parameter" ] = {"temperature_num_steps" : self .cmos_parameters ["temperature_num_steps" ],
227
- "temperature_step_length" : self .cmos_parameters ['temperature_step_length' ],
228
- "temperature_initial" : self .cmos_parameters ['temperature_initial' ],
229
- "temperature_target" : self .cmos_parameters ["temperature_target" ]}
217
+ "temperature_step_length" : self .cmos_parameters ['temperature_step_length' ],
218
+ "temperature_initial" : self .cmos_parameters ['temperature_initial' ],
219
+ "temperature_target" : self .cmos_parameters ["temperature_target" ]}
230
220
request ["outputs" ] = {"energies" : True ,
231
- "spins" : True ,
232
- "execution_time" : True ,
233
- "num_outputs" : 0 ,
234
- "averaged_spins" : True ,
235
- "averaged_energy" : True }
221
+ "spins" : True ,
222
+ "execution_time" : True ,
223
+ "num_outputs" : 0 ,
224
+ "averaged_spins" : True ,
225
+ "averaged_energy" : True }
236
226
237
227
return headers , request
0 commit comments