@@ -171,12 +171,16 @@ def __init__(
171
171
self .model = self .create_model (** model_params )
172
172
self .model_params = model_params
173
173
if not circuit_params :
174
- circuit_params = {"epochs" : 2 }
174
+ circuit_params = {"epochs" : 2 , "stddev" : 0.1 }
175
175
self .epochs = circuit_params .get ("epochs" , 2 )
176
+ self .circuit_stddev = circuit_params .get ("stddev" , 0.1 )
176
177
177
178
self .circuit_variable = tf .Variable (
178
179
tf .random .normal (
179
- mean = 0.0 , stddev = 0.2 , shape = [2 * self .epochs , self .n ], dtype = tf .float64
180
+ mean = 0.0 ,
181
+ stddev = self .circuit_stddev ,
182
+ shape = [2 * self .epochs , self .n ],
183
+ dtype = tf .float64 ,
180
184
)
181
185
)
182
186
self .circuit = self .create_circuit (** circuit_params )
@@ -201,6 +205,8 @@ def create_model(self, choose: str = "real", **kws: Any) -> Model:
201
205
return self .create_real_model (** kws )
202
206
if choose == "complex" :
203
207
return self .create_complex_model (** kws )
208
+ if choose == "real-rbm" :
209
+ return self .create_real_rbm_model (** kws )
204
210
if choose == "complex-rbm" :
205
211
return self .create_complex_rbm_model (** kws )
206
212
@@ -273,6 +279,19 @@ def create_complex_model(
273
279
model = tf .keras .Model (inputs = inputs , outputs = outputs )
274
280
return model
275
281
282
+ def create_real_rbm_model (
283
+ self , stddev : float = 0.1 , width : int = 2 , ** kws : Any
284
+ ) -> Model :
285
+ inputs = tf .keras .layers .Input (shape = [self .n ])
286
+ x = tf .keras .layers .Dense (width * self .n , activation = None )(inputs )
287
+ x = tf .math .log (2 * tf .math .cosh (x ))
288
+ x = tf .reduce_sum (x , axis = - 1 )
289
+ x = tf .reshape (x , [- 1 , 1 ])
290
+ y = tf .keras .layers .Dense (1 , activation = None )(inputs )
291
+ outputs = y + x
292
+ model = tf .keras .Model (inputs = inputs , outputs = outputs )
293
+ return model
294
+
276
295
def create_complex_rbm_model (
277
296
self , stddev : float = 0.1 , width : int = 2 , ** kws : Any
278
297
) -> Model :
@@ -286,8 +305,23 @@ def create_complex_rbm_model(
286
305
model = tf .keras .Model (inputs = inputs , outputs = outputs )
287
306
return model
288
307
289
- def create_circuit (
290
- self , epochs : int = 2 , filled_qubit : List [int ] = [0 ]
308
+ def create_circuit (self , choose = "hea" , ** kws : Any ) -> Callable [[Tensor ], Tensor ]:
309
+ if choose == "hea" :
310
+ return self .create_hea_circuit (** kws )
311
+ if choose == "hn" :
312
+ return self .create_hn_circuit (** kws )
313
+
314
+ def create_hn_circuit (self , ** kws : Any ) -> Callable [[Tensor ], Tensor ]:
315
+ def circuit (a : Tensor ) -> Tensor :
316
+ c = Circuit (self .n )
317
+ for i in range (self .n ):
318
+ c .H (i ) # type: ignore
319
+ return c
320
+
321
+ return circuit
322
+
323
+ def create_hea_circuit (
324
+ self , epochs : int = 2 , filled_qubit : List [int ] = [0 ], ** kws : Any
291
325
) -> Callable [[Tensor ], Tensor ]:
292
326
def circuit (a : Tensor ) -> Tensor :
293
327
c = Circuit (self .n )
@@ -321,6 +355,12 @@ def evaluation(self, cv: Tensor) -> Tuple[Tensor, Tensor, Tensor]:
321
355
else :
322
356
loss = tf .math .real (vqe_energy_shortcut (c2 , self .hop ))
323
357
grad = tape .gradient (loss , [cv , self .model .variables ])
358
+ for i , gr in enumerate (grad ):
359
+ if gr is None :
360
+ if i == 0 :
361
+ grad [i ] = tf .zeros_like (cv )
362
+ else :
363
+ grad [i ] = tf .zeros_like (self .model .variables [i - 1 ])
324
364
return loss , grad , nm
325
365
326
366
@tf .function # type: ignore
@@ -359,7 +399,7 @@ def training(
359
399
360
400
optc = tf .keras .optimizers .Adam (learning_rate = learnc )
361
401
optq = tf .keras .optimizers .Adam (learning_rate = learnq )
362
-
402
+ nm = tf . constant ( 1.0 )
363
403
for j in range (maxiter ):
364
404
if j < onlyq :
365
405
loss , grad = self .plain_evaluation (self .circuit_variable )
@@ -427,7 +467,7 @@ def multi_training(
427
467
self .circuit_variable = tf .Variable (
428
468
tf .random .normal (
429
469
mean = 0.0 ,
430
- stddev = 0.2 ,
470
+ stddev = self . circuit_stddev ,
431
471
shape = [2 * self .epochs , self .n ],
432
472
dtype = tf .float64 ,
433
473
)
0 commit comments