def test_stochastic_descent_neg_max_num_flips(self): # Every 2-SAT with just one clause will not be satisfied by 1/4 of all # possible literal assignments. # With only one bang, the only way to do better than random guessing is to # apply the DNF hamiltonian. dnf = dnf_lib.DNF(3, [dnf_lib.Clause(0, 1, False, True)]) circuit = dnf_circuit_lib.BangBangProtocolCircuit(1, dnf) with self.assertRaisesRegex( ValueError, 'max_num_flips should be positive, not -10'): stochastic_descent_lib.stochastic_descent( circuit=circuit, max_num_flips=-10, initial_protocol=stochastic_descent_lib.get_random_protocol(5), minimize=False)
def main(argv): if len(argv) > 1: raise app.UsageError('Too many command-line arguments.') logging.info('Generate a random DNF') dnf = dnf_lib.get_random_dnf(FLAGS.num_literals, FLAGS.num_clauses) logging.info(dnf) logging.info('initialization_method: %s', FLAGS.initialization_method) if FLAGS.initialization_method == 'random': get_initial_protocol = stochastic_descent_lib.get_random_protocol elif FLAGS.initialization_method == 'adiabatic': get_initial_protocol = functools.partial( stochastic_descent_lib.get_random_adiabatic_protocol, ascending=True) elif FLAGS.initialization_method == 'anti_adiabatic': get_initial_protocol = functools.partial( stochastic_descent_lib.get_random_adiabatic_protocol, ascending=False) logging.info('Stochastic descent') for i in range(FLAGS.num_samples): logging.info('Trial index: %d', i) bangbang_protocol, protocol_eval, num_epoch = ( stochastic_descent_lib.stochastic_descent( circuit=dnf_circuit_lib.BangBangProtocolCircuit( chunk_time=FLAGS.total_time / FLAGS.num_chunks, dnf=dnf), max_num_flips=FLAGS.max_num_flips, initial_protocol=get_initial_protocol(FLAGS.num_chunks), minimize=False, skip_search=FLAGS.skip_search)) logging.info( 'Optimal protocol: %s', circuit_lib.protocol_to_string(bangbang_protocol)) logging.info('Protocol eval: %f', protocol_eval) logging.info('Number of epoch: %d', num_epoch)
def test_stochastic_descent_skip_search(self): dnf = dnf_lib.DNF(2, [dnf_lib.Clause(0, 1, True, True)]) circuit = dnf_circuit_lib.BangBangProtocolCircuit(1, dnf) random_protocol = stochastic_descent_lib.get_random_protocol(2) random_eval = circuit.get_constraint_expectation( circuit.get_wavefunction(random_protocol)) protocol, evaluation, num_epoch = stochastic_descent_lib.stochastic_descent( circuit=circuit, max_num_flips=1, initial_protocol=random_protocol, minimize=False, skip_search=True) self.assertListEqual(protocol, random_protocol) self.assertIsInstance(evaluation, float) self.assertAlmostEqual(evaluation, random_eval) # Zero epoch of stochastic descent. self.assertEqual(num_epoch, 0)
def test_stochastic_descent_maximize(self): # Every 2-SAT with just one clause will not be satisfied by 1/4 of all # possible literal assignments. # With only one bang, the only way to do better than random guessing is to # apply the DNF hamiltonian. dnf = dnf_lib.DNF(2, [dnf_lib.Clause(0, 1, True, True)]) circuit = dnf_circuit_lib.BangBangProtocolCircuit(1, dnf) random_protocol = stochastic_descent_lib.get_random_protocol(2) random_eval = circuit.get_constraint_expectation( circuit.get_wavefunction(random_protocol)) protocol, evaluation, num_epoch = stochastic_descent_lib.stochastic_descent( circuit=circuit, max_num_flips=2, initial_protocol=stochastic_descent_lib.get_random_protocol(5), minimize=False) self.assertLen(protocol, 5) self.assertIsInstance(evaluation, float) self.assertGreaterEqual(evaluation, random_eval) # Contain at least 1 epoch of stochastic descent. self.assertGreaterEqual(num_epoch, 1)