3535 get_energy_tensornetwork_noise ,
3636 get_energy_tensornetwork_shot ,
3737 get_energy_tensornetwork_noise_shot ,
38+ get_energy_qpu ,
3839 get_energy_and_grad_tensornetwork ,
3940 get_energy_and_grad_tensornetwork_noise ,
4041 get_energy_and_grad_tensornetwork_shot ,
4142 get_energy_and_grad_tensornetwork_noise_shot ,
43+ get_energy_and_grad_qpu ,
4244)
4345from tencirchem .static .hamiltonian import get_hop_from_integral
4446from tencirchem .utils .misc import reverse_fop_idx , scipy_opt_wrap , reverse_qop_idx
@@ -361,6 +363,7 @@ def get_circuit(params):
361363 self .shots = 4096
362364 self ._grad = "param-shift"
363365
366+ self .scipy_minimize_options = None
364367 self ._params = None
365368 self .opt_res = None
366369
@@ -585,8 +588,14 @@ def energy(self, params: Tensor = None, engine: str = None) -> float:
585588 self .shots ,
586589 )
587590 else :
588- assert self .engine == "qpu"
589- assert False
591+ assert engine == "qpu"
592+ e = get_energy_qpu (
593+ params ,
594+ tuple (self .h_qubit_op .terms .keys ()),
595+ list (self .h_qubit_op .terms .values ()),
596+ self .get_circuit ,
597+ self .shots ,
598+ )
590599 return e
591600
592601 def energy_and_grad (self , params : Tensor = None , engine : str = None , grad : str = None ) -> Tuple [float , Tensor ]:
@@ -633,15 +642,15 @@ def energy_and_grad(self, params: Tensor = None, engine: str = None, grad: str =
633642 raise ValueError ("Must provide a gradient algorithm" )
634643
635644 if engine == "tensornetwork" :
636- e , grad = get_energy_and_grad_tensornetwork (params , self .h_array , self .get_circuit , grad )
645+ e , grad_array = get_energy_and_grad_tensornetwork (params , self .h_array , self .get_circuit , grad )
637646 elif engine == "tensornetwork-noise" :
638- e , grad = get_energy_and_grad_tensornetwork_noise (
647+ e , grad_array = get_energy_and_grad_tensornetwork_noise (
639648 params , self .h_array , self .get_dmcircuit_no_noise , self .engine_conf , grad
640649 )
641650 elif engine == "tensornetwork-shot" :
642651 if grad == "autodiff" :
643652 raise ValueError (f"Engine { engine } is incompatible with grad method { grad } " )
644- e , grad = get_energy_and_grad_tensornetwork_shot (
653+ e , grad_array = get_energy_and_grad_tensornetwork_shot (
645654 params ,
646655 tuple (self .h_qubit_op .terms .keys ()),
647656 list (self .h_qubit_op .terms .values ()),
@@ -652,7 +661,7 @@ def energy_and_grad(self, params: Tensor = None, engine: str = None, grad: str =
652661 elif engine == "tensornetwork-noise&shot" :
653662 if grad == "autodiff" :
654663 raise ValueError (f"Engine { engine } is incompatible with grad method { grad } " )
655- e , grad = get_energy_and_grad_tensornetwork_noise_shot (
664+ e , grad_array = get_energy_and_grad_tensornetwork_noise_shot (
656665 params ,
657666 tuple (self .h_qubit_op .terms .keys ()),
658667 list (self .h_qubit_op .terms .values ()),
@@ -662,23 +671,35 @@ def energy_and_grad(self, params: Tensor = None, engine: str = None, grad: str =
662671 grad ,
663672 )
664673 else :
665- assert self .engine == "qpu"
666- assert False
667- return e , grad
674+ assert engine == "qpu"
675+ if grad == "autodiff" :
676+ raise ValueError (f"Engine { engine } is incompatible with grad method { grad } " )
677+ e , grad_array = get_energy_and_grad_qpu (
678+ params ,
679+ tuple (self .h_qubit_op .terms .keys ()),
680+ list (self .h_qubit_op .terms .values ()),
681+ self .get_circuit ,
682+ self .shots ,
683+ grad ,
684+ )
685+ return e , grad_array
668686
669687 def kernel (self ):
670688 logger .info ("Begin optimization" )
671689
672690 func , stating_time = self .get_opt_function (with_time = True )
691+
673692 time1 = time ()
674693 if self .grad == "free" :
675- if self .engine in ["tensornetwork" , "tensornetwork-noise" ]:
676- opt_res = minimize (func , x0 = self .init_guess , method = "COBYLA" )
694+ if self .engine in ["tensornetwork" , "tensornetwork-noise" , "qpu" ]:
695+ opt_res = minimize (func , x0 = self .init_guess , method = "COBYLA" , options = self . scipy_minimize_options )
677696 else :
678697 assert self .engine in ["tensornetwork-shot" , "tensornetwork-noise&shot" ]
679- opt_res = minimizeSPSA (func , x0 = self .init_guess , paired = False , niter = 125 )
698+ opt_res = minimizeSPSA (func , x0 = self .init_guess , paired = False , niter = 100 , disp = True )
680699 else :
681- opt_res = minimize (func , x0 = self .init_guess , jac = True , method = "L-BFGS-B" )
700+ opt_res = minimize (
701+ func , x0 = self .init_guess , jac = True , method = "L-BFGS-B" , options = self .scipy_minimize_options
702+ )
682703
683704 time2 = time ()
684705
0 commit comments