def one_step_grid_search(self, current_step): """ Grid search on n-th pair of QAOA angles, where n=current_step. Args: current_step (int): specify on which layer do we perform search. Returns: best_beta, best_gamma (floats): best values of the beta and gamma found. """ self.qaoa_inst.steps = current_step best_beta = None best_gamma = None best_energy = np.inf fixed_betas = self.qaoa_inst.betas fixed_gammas = self.qaoa_inst.gammas beta_range = np.linspace(0, np.pi, self.grid_size) gamma_range = np.linspace(0, 2 * np.pi, self.grid_size) vqe = VQE(self.qaoa_inst.minimizer, minimizer_args=self.qaoa_inst.minimizer_args, minimizer_kwargs=self.qaoa_inst.minimizer_kwargs) cost_hamiltonian = reduce(lambda x, y: x + y, self.qaoa_inst.cost_ham) for beta in beta_range: for gamma in gamma_range: betas = np.append(fixed_betas, beta) gammas = np.append(fixed_gammas, gamma) stacked_params = np.hstack((betas, gammas)) program = self.qaoa_inst.get_parameterized_program() energy = vqe.expectation(program(stacked_params), cost_hamiltonian, self.samples, self.qaoa_inst.qc) print(beta, gamma, end="\r") if energy < best_energy: best_energy = energy best_beta = beta best_gamma = gamma return best_beta, best_gamma
def simple_grid_search_angles(self, save_data=False): """ Finds optimal angles for QAOA by performing grid search on all the angles. This is not recommended for higher values of steps parameter, since it results in grid_size**(2*steps) evaluations. Returns: best_betas, best_gammas (np.arrays): best values of the betas and gammas found. """ best_betas = None best_gammas = None best_energy = np.inf # For some reasons np.meshgrid returns columns in order, where values in second # grow slower than in the first one. This a fix to it. if self.qaoa_inst.steps == 1: column_order = [0] else: column_order = [1, 0] + list(range(2, self.qaoa_inst.steps)) new_indices = np.argsort(column_order) beta_ranges = [np.linspace(0, np.pi, self.grid_size) ] * self.qaoa_inst.steps all_betas = np.vstack(np.meshgrid(*beta_ranges)).reshape( self.qaoa_inst.steps, -1).T all_betas = all_betas[:, column_order] gamma_ranges = [np.linspace(0, 2 * np.pi, self.grid_size) ] * self.qaoa_inst.steps all_gammas = np.vstack(np.meshgrid(*gamma_ranges)).reshape( self.qaoa_inst.steps, -1).T all_gammas = all_gammas[:, column_order] vqe = VQE(self.qaoa_inst.minimizer, minimizer_args=self.qaoa_inst.minimizer_args, minimizer_kwargs=self.qaoa_inst.minimizer_kwargs) cost_hamiltonian = reduce(lambda x, y: x + y, self.qaoa_inst.cost_ham) all_energies = [] data_to_save = [] if save_data: file_name = "_".join( [str(self.m), "grid", str(self.grid_size), str(time.time())]) + ".csv" for betas in all_betas: for gammas in all_gammas: stacked_params = np.hstack((betas, gammas)) program = self.qaoa_inst.get_parameterized_program() energy = vqe.expectation(program(stacked_params), cost_hamiltonian, self.samples, self.qaoa_inst.qc) all_energies.append(energy) if self.verbose: print(betas, gammas, energy, end="\r") if save_data: data_to_save.append(np.hstack([betas, gammas, energy])) if energy < best_energy: best_energy = energy best_betas = betas best_gammas = gammas if self.verbose: print("Lowest energy:", best_energy) print("Angles:", best_betas, best_gammas) if save_data: np.savetxt(file_name, np.array(data_to_save), delimiter=",") if self.visualize: if self.qaoa_inst.steps == 1: self.ax = plot_energy_landscape(all_betas, all_gammas, np.array(all_energies), log_legend=True) else: plot_variance_landscape(all_betas, all_gammas, np.array(all_energies)) return best_betas, best_gammas