def init_params(self, params, algo_input): """ Initialize via parameters dictionary and algorithm input instance Args: params (dict): parameters dictionary algo_input (EnergyInput): EnergyInput instance """ if algo_input is None: raise AlgorithmError("EnergyInput instance is required.") operator = algo_input.qubit_op qaoa_params = params.get(QuantumAlgorithm.SECTION_KEY_ALGORITHM) operator_mode = qaoa_params.get(QAOA.PROP_OPERATOR_MODE) p = qaoa_params.get(QAOA.PROP_P) initial_point = qaoa_params.get(QAOA.PROP_INIT_POINT) # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) optimizer.init_params(opt_params) self.init_args(operator, operator_mode, p, optimizer, opt_init_point=initial_point, aux_operators=algo_input.aux_ops)
def init_params(self, params, algo_input): # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) # hard-coded params if SPSA is used. if opt_params['name'] == 'SPSA' and opt_params['parameters'] is None: opt_params['parameters'] = np.asarray( [4.0, 0.1, 0.602, 0.101, 0.0]) optimizer.init_params(opt_params) # Set up variational form fea_map_params = params.get(QuantumAlgorithm.SECTION_KEY_FEATURE_MAP) num_qubits = self._auto_detect_qubitnum(algo_input.training_dataset) fea_map_params['num_qubits'] = num_qubits feature_map = get_feature_map_instance(fea_map_params['name']) feature_map.init_params(fea_map_params) # Set up variational form var_form_params = params.get(QuantumAlgorithm.SECTION_KEY_VAR_FORM) var_form_params['num_qubits'] = num_qubits var_form = get_variational_form_instance(var_form_params['name']) var_form.init_params(var_form_params) self.init_args(algo_input.training_dataset, algo_input.test_dataset, algo_input.datapoints, optimizer, feature_map, var_form)
def init_params(self, params, algo_input): """ Initialize via parameters dictionary and algorithm input instance Args: params (dict): parameters dictionary algo_input (EnergyInput): EnergyInput instance """ if algo_input is None: raise AlgorithmError("EnergyInput instance is required.") operator = algo_input.qubit_op qaoa_params = params.get(QuantumAlgorithm.SECTION_KEY_ALGORITHM) operator_mode = qaoa_params.get(QAOA.PROP_OPERATOR_MODE) p = qaoa_params.get(QAOA.PROP_P) initial_point = qaoa_params.get(QAOA.PROP_INIT_POINT) # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) optimizer.init_params(opt_params) if 'statevector' not in self._backend and operator_mode == 'matrix': logger.debug('Qasm simulation does not work on {} mode, changing \ the operator_mode to paulis'.format(operator_mode)) operator_mode = 'paulis' self.init_args(operator, operator_mode, p, optimizer, opt_init_point=initial_point, aux_operators=algo_input.aux_ops)
def test_svm_variational_directly(self): np.random.seed(self.random_seed) svm = get_algorithm_instance("QSVM.Variational") svm.random_seed = self.random_seed svm.setup_quantum_backend(backend='local_qasm_simulator', shots=1024) optimizer = get_optimizer_instance('SPSA') optimizer.init_args(max_trials=10, c0=4.0, skip_calibration=True) optimizer.set_options(save_steps=1) num_qubits = 2 feature_map = get_feature_map_instance('SecondOrderExpansion') feature_map.init_args(num_qubits=num_qubits, depth=2) var_form = get_variational_form_instance('RYRZ') var_form.init_args(num_qubits=num_qubits, depth=3) svm.init_args(self.training_data, self.testing_data, None, optimizer, feature_map, var_form) result = svm.run() np.testing.assert_array_almost_equal(result['opt_params'], self.ref_opt_params, decimal=4) np.testing.assert_array_almost_equal(result['training_loss'], self.ref_train_loss, decimal=8) self.assertEqual(result['testing_accuracy'], 0.5)
def init_params(self, params, algo_input): algo_params = params.get(QuantumAlgorithm.SECTION_KEY_ALGORITHM) override_spsa_params = algo_params.get('override_SPSA_params') # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) # If SPSA then override SPSA params as reqd to our predetermined values if opt_params['name'] == 'SPSA' and override_spsa_params: opt_params['c0'] = 4.0 opt_params['c1'] = 0.1 opt_params['c2'] = 0.602 opt_params['c3'] = 0.101 opt_params['c4'] = 0.0 opt_params['skip_calibration'] = True optimizer.init_params(opt_params) # Set up variational form fea_map_params = params.get(QuantumAlgorithm.SECTION_KEY_FEATURE_MAP) num_qubits = get_feature_dimension(algo_input.training_dataset) fea_map_params['num_qubits'] = num_qubits feature_map = get_feature_map_instance(fea_map_params['name']) feature_map.init_params(fea_map_params) # Set up variational form var_form_params = params.get(QuantumAlgorithm.SECTION_KEY_VAR_FORM) var_form_params['num_qubits'] = num_qubits var_form = get_variational_form_instance(var_form_params['name']) var_form.init_params(var_form_params) self.init_args(algo_input.training_dataset, algo_input.test_dataset, algo_input.datapoints, optimizer, feature_map, var_form)
def test_vqe_direct(self): num_qbits = self.algo_input.qubit_op.num_qubits init_state = get_initial_state_instance('ZERO') init_state.init_args(num_qbits) var_form = get_variational_form_instance('RY') var_form.init_args(num_qbits, 3, initial_state=init_state) optimizer = get_optimizer_instance('L_BFGS_B') optimizer.init_args() algo = get_algorithm_instance('VQE') algo.setup_quantum_backend(backend='local_statevector_simulator') algo.init_args(self.algo_input.qubit_op, 'matrix', var_form, optimizer) result = algo.run() self.assertAlmostEqual(result['energy'], -1.85727503)
def init_params(self, params, algo_input): """ Initialize via parameters dictionary and algorithm input instance Args: params (dict): parameters dictionary algo_input (EnergyInput): EnergyInput instance """ if algo_input is None: raise AlgorithmError("EnergyInput instance is required.") operator = algo_input.qubit_op vqe_params = params.get(QuantumAlgorithm.SECTION_KEY_ALGORITHM) operator_mode = vqe_params.get('operator_mode') initial_point = vqe_params.get('initial_point') # Set up initial state, we need to add computed num qubits to params init_state_params = params.get( QuantumAlgorithm.SECTION_KEY_INITIAL_STATE) init_state_params['num_qubits'] = operator.num_qubits init_state = get_initial_state_instance(init_state_params['name']) init_state.init_params(init_state_params) # Set up variational form, we need to add computed num qubits, and initial state to params var_form_params = params.get(QuantumAlgorithm.SECTION_KEY_VAR_FORM) var_form_params['num_qubits'] = operator.num_qubits var_form_params['initial_state'] = init_state var_form = get_variational_form_instance(var_form_params['name']) var_form.init_params(var_form_params) # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) optimizer.init_params(opt_params) if 'statevector' not in self._backend and operator_mode == 'matrix': logger.debug('Qasm simulation does not work on {} mode, changing \ the operator_mode to paulis'.format(operator_mode)) operator_mode = 'paulis' self.init_args(operator, operator_mode, var_form, optimizer, opt_init_point=initial_point, aux_operators=algo_input.aux_ops) logger.info(self.print_setting())
def test_qaoa(self, w, p, solutions): self.log.debug('Testing {}-step QAOA with MaxCut on graph\n{}'.format(p, w)) np.random.seed(0) optimizer = get_optimizer_instance('COBYLA') qubitOp, offset = maxcut.get_maxcut_qubitops(w) qaoa = get_algorithm_instance('QAOA') qaoa.init_args(qubitOp, 'matrix', p, optimizer) qaoa.setup_quantum_backend(backend='local_statevector_simulator', shots=100) result = qaoa.run() x = maxcut.sample_most_likely(result['eigvecs'][0]) graph_solution = maxcut.get_graph_solution(x) self.log.debug('energy: {}'.format(result['energy'])) self.log.debug('time: {}'.format(result['eval_time'])) self.log.debug('maxcut objective: {}'.format(result['energy'] + offset)) self.log.debug('solution: {}'.format(graph_solution)) self.log.debug('solution objective: {}'.format(maxcut.maxcut_value(x, w))) self.assertIn(''.join([str(int(i)) for i in graph_solution]), solutions)
def init_params(self, params, algo_input): SVMQK_params = params.get(QuantumAlgorithm.SECTION_KEY_ALGORITHM) circuit_depth = SVMQK_params.get('circuit_depth') print_info = SVMQK_params.get('print_info') # Set up optimizer opt_params = params.get(QuantumAlgorithm.SECTION_KEY_OPTIMIZER) optimizer = get_optimizer_instance(opt_params['name']) # hard-coded params if SPSA is used. if opt_params['name'] == 'SPSA' and opt_params['parameters'] is None: opt_params['parameters'] = np.asarray( [4.0, 0.1, 0.602, 0.101, 0.0]) optimizer.init_params(opt_params) optimizer.set_options(save_steps=10) self.init_args(algo_input.training_dataset, algo_input.test_dataset, algo_input.datapoints, optimizer, circuit_depth, print_info)
def test_tnc(self): optimizer = get_optimizer_instance('TNC') optimizer.set_options(**{'maxiter': 1000}) optimizer.init_args(tol=1e-06) res = self._optimize(optimizer) self.assertLessEqual(res[2], 10000)
def test_spsa(self): optimizer = get_optimizer_instance('SPSA') optimizer.set_options(**{}) optimizer.init_args(max_trials=10000) res = self._optimize(optimizer) self.assertLessEqual(res[2], 100000)
def test_powell(self): optimizer = get_optimizer_instance('POWELL') optimizer.set_options(**{'maxfev': 10000}) optimizer.init_args(tol=1e-06) res = self._optimize(optimizer) self.assertLessEqual(res[2], 10000)
def test_nelder_mead(self): optimizer = get_optimizer_instance('NELDER_MEAD') optimizer.set_options(**{'maxfev': 10000}) optimizer.init_args(tol=1e-06) res = self._optimize(optimizer) self.assertLessEqual(res[2], 10000)
def test_nlopt(self, name): optimizer = get_optimizer_instance(name) optimizer.set_options(**{'max_evals': 50000}) optimizer.init_args() res = self._optimize(optimizer) self.assertLessEqual(res[2], 50000)
def configurar_COBYLA(configuracionaqua): """Esta funciĆ³n obtiene una instancia del optimizador COBYLA configurada""" cobyla = get_optimizer_instance('COBYLA') cobyla.set_options(maxiter=configuracionaqua["COBYLA"]["max_eval"]) return cobyla
def test_l_bfgs_b(self): optimizer = get_optimizer_instance('L_BFGS_B') optimizer.set_options(**{'maxfun': 1000}) optimizer.init_args() res = self._optimize(optimizer) self.assertLessEqual(res[2], 10000)
def test_vqe_2_iqpe(self): num_qbits = self.algo_input.qubit_op.num_qubits var_form = get_variational_form_instance('RYRZ') var_form.init_args(num_qbits, 3) optimizer = get_optimizer_instance('SPSA') optimizer.init_args(max_trials=10) # optimizer.set_options(**{'max_trials': 500}) algo = get_algorithm_instance('VQE') algo.setup_quantum_backend(backend='qasm_simulator') algo.init_args(self.algo_input.qubit_op, 'paulis', var_form, optimizer) result = algo.run() self.log.debug('VQE result: {}.'.format(result)) self.ref_eigenval = -1.85727503 num_time_slices = 50 num_iterations = 11 state_in = VarFormBased() state_in.init_args(var_form, result['opt_params']) iqpe = get_algorithm_instance('IQPE') iqpe.setup_quantum_backend(backend='qasm_simulator', shots=100, skip_transpiler=True) iqpe.init_args( self.algo_input.qubit_op, state_in, num_time_slices, num_iterations, paulis_grouping='random', expansion_mode='suzuki', expansion_order=2, ) result = iqpe.run() self.log.debug('top result str label: {}'.format( result['top_measurement_label'])) self.log.debug('top result in decimal: {}'.format( result['top_measurement_decimal'])) self.log.debug('stretch: {}'.format( result['stretch'])) self.log.debug('translation: {}'.format( result['translation'])) self.log.debug('final eigenvalue from QPE: {}'.format( result['energy'])) self.log.debug('reference eigenvalue: {}'.format( self.ref_eigenval)) self.log.debug('ref eigenvalue (transformed): {}'.format( (self.ref_eigenval + result['translation']) * result['stretch'])) self.log.debug('reference binary str label: {}'.format( decimal_to_binary((self.ref_eigenval + result['translation']) * result['stretch'], max_num_digits=num_iterations + 3, fractional_part_only=True))) np.testing.assert_approx_equal(self.ref_eigenval, result['energy'], significant=2)