1313from bqskit .ir .opt .instantiater import Instantiater
1414from bqskit .ir .opt .minimizer import Minimizer
1515from bqskit .ir .opt .minimizers .ceres import CeresMinimizer
16+ from bqskit .ir .opt .multistartgens .random import RandomStartGenerator
17+ from bqskit .qis .state .state import StateLike
1618from bqskit .qis .state .state import StateVector
17- from bqskit .qis .state .system import StateSystem
18- from bqskit .qis .unitary .unitarymatrix import UnitaryMatrix
1919
2020if TYPE_CHECKING :
2121 from bqskit .ir .circuit import Circuit
22+ from bqskit .qis .state .system import StateSystem
23+ from bqskit .qis .state .system import StateSystemLike
24+ from bqskit .qis .unitary .unitarymatrix import UnitaryLike
25+ from bqskit .qis .unitary .unitarymatrix import UnitaryMatrix
2226
2327
2428class Minimization (Instantiater ):
@@ -61,7 +65,6 @@ def instantiate(
6165 ) -> npt .NDArray [np .float64 ]:
6266 """Instantiate `circuit`, see Instantiater for more info."""
6367 cost = self .cost_fn_gen .gen_cost (circuit , target )
64- # print(x0, circuit.num_params, circuit.gate_counts)
6568 return self .minimizer .minimize (cost , x0 )
6669
6770 @staticmethod
@@ -88,3 +91,48 @@ def get_violation_report(circuit: Circuit) -> str:
8891 def get_method_name () -> str :
8992 """Return the name of this method."""
9093 return 'minimization'
94+
95+ def multi_start_instantiate_inplace (
96+ self ,
97+ circuit : Circuit ,
98+ target : UnitaryLike | StateLike | StateSystemLike ,
99+ num_starts : int ,
100+ ) -> None :
101+ """
102+ Instantiate `circuit` to best implement `target` with multiple starts.
103+
104+ See Instantiater for more info.
105+ """
106+ target = self .check_target (target )
107+ start_gen = RandomStartGenerator ()
108+ starts = start_gen .gen_starting_points (num_starts , circuit , target )
109+ cost_fn = self .cost_fn_gen .gen_cost (circuit , target )
110+ params_list = [self .instantiate (circuit , target , x0 ) for x0 in starts ]
111+ params = sorted (params_list , key = lambda x : cost_fn (x ))[0 ]
112+ circuit .set_params (params )
113+
114+ async def multi_start_instantiate_async (
115+ self ,
116+ circuit : Circuit ,
117+ target : UnitaryLike | StateLike | StateSystemLike ,
118+ num_starts : int ,
119+ ) -> Circuit :
120+ """
121+ Instantiate `circuit` to best implement `target` with multiple starts.
122+
123+ See Instantiater for more info.
124+ """
125+ from bqskit .runtime import get_runtime
126+ target = self .check_target (target )
127+ start_gen = RandomStartGenerator ()
128+ starts = start_gen .gen_starting_points (num_starts , circuit , target )
129+ cost_fn = self .cost_fn_gen .gen_cost (circuit , target )
130+ params_list = await get_runtime ().map (
131+ self .instantiate ,
132+ [circuit ] * num_starts ,
133+ [target ] * num_starts ,
134+ starts ,
135+ )
136+ params = sorted (params_list , key = lambda x : cost_fn (x ))[0 ]
137+ circuit .set_params (params )
138+ return circuit
0 commit comments