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)
示例#2
0
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)