示例#1
0
class TestEventDispatch(unittest.TestCase):
    def setUp(self):
        # mock client
        self.client = Client(endpoint='e',
                             token='t',
                             solver=dict(name__contains='test'))
        self.client._fetch_solvers = lambda **kw: self.solvers
        self.client._submit = lambda *pa, **kw: None
        self.client.upload_problem_encoded = lambda *pa, **kw: Present(
            result=mock_problem_id)

        # mock solvers
        self.structured_solver = StructuredSolver(
            client=self.client,
            data={
                "properties": {
                    "supported_problem_types": ["qubo", "ising"],
                    "qubits": [0, 1, 2],
                    "couplers": [[0, 1], [0, 2], [1, 2]],
                    "num_qubits": 3,
                    "num_reads_range": [0, 100],
                    "parameters": {
                        "num_reads": "Number of samples to return.",
                        "postprocess": "either 'sampling' or 'optimization'"
                    },
                    "topology": {
                        "type": "chimera",
                        "shape": [16, 16, 4]
                    },
                    "category": "qpu",
                    "tags": ["lower_noise"]
                },
                "id": "test-qpu-solver",
                "description": "A test solver 1",
                "status": "online"
            })
        self.unstructured_solver = UnstructuredSolver(
            client=self.client,
            data={
                "properties": {
                    "supported_problem_types": ["bqm"],
                    "parameters": {
                        "num_reads": "Number of samples to return."
                    },
                    "category": "hybrid",
                },
                "id": "test-unstructured-solver",
                "description": "A test unstructured solver"
            })
        self.solvers = [self.structured_solver]
        # we can't use unstructured solvers without dimod installed,
        # so don't even try testing it
        if dimod:
            self.solvers.append(self.unstructured_solver)

        # reset all event handlers
        from dwave.cloud.events import _client_event_hooks_registry as reg
        reg.update({k: [] for k in reg})

    def test_validation(self):
        """Event name and handler are validated."""

        with self.assertRaises(ValueError):
            add_handler('invalid_event_name', lambda: None)
        with self.assertRaises(TypeError):
            add_handler('before_client_init', None)

    def test_client_init(self):
        """Before/After client init events are dispatched with correct signatures."""

        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_client_init', handler)
        add_handler('after_client_init', handler)

        # client init
        client = Client(endpoint='endpoint', token='token', unknown='unknown')

        # test entry values
        before = memo['before_client_init']
        self.assertEqual(before['obj'], client)
        self.assertIn('endpoint', before['args'])
        self.assertIn('token', before['args'])
        self.assertIn('kwargs', before['args'])
        self.assertEqual(before['args']['token'], 'token')
        self.assertEqual(before['args']['kwargs']['unknown'], 'unknown')

        # test exit values
        after = memo['after_client_init']
        self.assertEqual(after['obj'], client)
        self.assertEqual(after['args']['token'], 'token')
        self.assertEqual(after['args']['kwargs']['unknown'], 'unknown')
        self.assertEqual(after['args']['endpoint'], 'endpoint')
        self.assertEqual(after['return_value'], None)

    def test_get_solvers(self):
        """Before/After get_solvers events are dispatched with correct signatures."""

        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_get_solvers', handler)
        add_handler('after_get_solvers', handler)

        # get solver(s)
        self.client.get_solver()

        # test entry values
        before = memo['before_get_solvers']
        self.assertEqual(before['obj'], self.client)
        self.assertIn('refresh', before['args'])
        self.assertIn('filters', before['args'])
        self.assertIn('name__contains', before['args']['filters'])

        # test exit values
        after = memo['after_get_solvers']
        self.assertEqual(after['obj'], self.client)
        self.assertIn('name__contains', after['args']['filters'])
        self.assertEqual(after['return_value'], self.solvers)

    def subtest_sample(self, solver):
        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_sample', handler)
        add_handler('after_sample', handler)

        # sample
        lin = {0: 1}
        quad = {(0, 1): 1}
        offset = 2
        params = dict(num_reads=100)
        future = solver.sample_ising(lin, quad, offset, **params)

        # test entry values
        before = memo['before_sample']
        if solver.qpu:
            args = dict(type_='ising',
                        linear=lin,
                        quadratic=quad,
                        offset=offset,
                        params=params,
                        undirected_biases=False,
                        label=None)
        elif solver.hybrid:
            if not dimod:
                self.skipTest("dimod not installed")
            bqm = dimod.BQM.from_ising(lin, quad, offset)
            args = dict(problem=bqm,
                        problem_type=None,
                        label=None,
                        params=params)

        self.assertEqual(before['obj'], solver)
        self.assertDictEqual(before['args'], args)

        # test exit values
        after = memo['after_sample']
        self.assertEqual(after['obj'], solver)
        self.assertDictEqual(after['args'], args)
        self.assertEqual(after['return_value'], future)

    def test_sample(self):
        """Before/After solver sample events are dispatched with correct signatures."""

        for solver in self.solvers:
            with self.subTest("solver=%r" % solver.id):
                self.subtest_sample(solver)
示例#2
0
class TestEventDispatch(unittest.TestCase):
    def setUp(self):
        # mock client
        self.client = Client(token='token', solver={'qpu': True})
        self.client._fetch_solvers = lambda **kw: self.solvers
        self.client._submit = lambda *pa, **kw: None

        # mock solvers
        self.solver = Solver(client=self.client,
                             data={
                                 "properties": {
                                     "supported_problem_types":
                                     ["qubo", "ising"],
                                     "qubits": [0, 1, 2],
                                     "couplers": [[0, 1], [0, 2], [1, 2]],
                                     "num_qubits": 3,
                                     "num_reads_range": [0, 100],
                                     "parameters": {
                                         "num_reads":
                                         "Number of samples to return.",
                                         "postprocess":
                                         "either 'sampling' or 'optimization'"
                                     },
                                     "topology": {
                                         "type": "chimera",
                                         "shape": [16, 16, 4]
                                     },
                                     "category": "qpu",
                                     "tags": ["lower_noise"]
                                 },
                                 "id": "solver1",
                                 "description": "A test solver 1",
                                 "status": "online"
                             })
        self.solvers = [self.solver]

    def test_validation(self):
        """Event name and handler are validated."""

        with self.assertRaises(ValueError):
            add_handler('invalid_event_name', lambda: None)
        with self.assertRaises(TypeError):
            add_handler('before_client_init', None)

    def test_client_init(self):
        """Before/After client init events are dispatched with correct signatures."""

        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_client_init', handler)
        add_handler('after_client_init', handler)

        # client init
        client = Client(token='token', unknown='unknown')

        # test entry values
        before = memo['before_client_init']
        self.assertEqual(before['obj'], client)
        self.assertEqual(before['args']['endpoint'], None)
        self.assertEqual(before['args']['token'], 'token')
        self.assertEqual(before['args']['kwargs']['unknown'], 'unknown')

        # test exit values
        after = memo['after_client_init']
        self.assertEqual(after['obj'], client)
        self.assertEqual(after['args']['token'], 'token')
        self.assertEqual(after['args']['kwargs']['unknown'], 'unknown')
        self.assertEqual(after['return_value'], None)

    def test_get_solvers(self):
        """Before/After get_solvers events are dispatched with correct signatures."""

        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_get_solvers', handler)
        add_handler('after_get_solvers', handler)

        # get solver(s)
        self.client.get_solver()

        # test entry values
        before = memo['before_get_solvers']
        self.assertEqual(before['obj'], self.client)
        self.assertIn('refresh', before['args'])
        self.assertIn('filters', before['args'])
        self.assertIn('qpu', before['args']['filters'])

        # test exit values
        after = memo['after_get_solvers']
        self.assertEqual(after['obj'], self.client)
        self.assertIn('qpu', after['args']['filters'])
        self.assertEqual(after['return_value'], self.solvers)

    def test_sample(self):
        """Before/After solver sample events are dispatched with correct signatures."""

        # setup event handlers
        memo = {}

        def handler(event, **data):
            memo[event] = data

        add_handler('before_sample', handler)
        add_handler('after_sample', handler)

        # sample
        lin = {0: 1}
        quad = {(0, 1): 1}
        offset = 2
        params = dict(num_reads=100)
        future = self.solver.sample_ising(lin, quad, offset, **params)

        # test entry values
        before = memo['before_sample']
        args = dict(type_='ising',
                    linear=lin,
                    quadratic=quad,
                    offset=offset,
                    params=params,
                    undirected_biases=False)
        self.assertEqual(before['obj'], self.solver)
        self.assertDictEqual(before['args'], args)

        # test exit values
        after = memo['after_sample']
        self.assertEqual(after['obj'], self.solver)
        self.assertDictEqual(after['args'], args)
        self.assertEqual(after['return_value'], future)