From dc53ec4d9e761c60c298a68edf573cec86182b80 Mon Sep 17 00:00:00 2001 From: Abdullah Javed Nesar Date: Mon, 28 Feb 2022 20:41:55 +0530 Subject: [PATCH 1/2] Handle exception when BQM is passed to DQM sampler --- dwave/system/samplers/leap_hybrid_sampler.py | 8 ++++++-- tests/test_leaphybriddqmsolver.py | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dwave/system/samplers/leap_hybrid_sampler.py b/dwave/system/samplers/leap_hybrid_sampler.py index fb331a39..0d99e4a7 100644 --- a/dwave/system/samplers/leap_hybrid_sampler.py +++ b/dwave/system/samplers/leap_hybrid_sampler.py @@ -533,8 +533,12 @@ def min_time_limit(self, dqm): first two pairs that represent problems with "density" between 1 to 100). """ - ec = (dqm.num_variable_interactions() * dqm.num_cases() / - max(dqm.num_variables(), 1)) + from dimod.discrete.discrete_quadratic_model import DiscreteQuadraticModel + if isinstance(dqm, DiscreteQuadraticModel): + ec = (dqm.num_variable_interactions() * dqm.num_cases() / + max(dqm.num_variables(), 1)) + else: + raise TypeError(f"Expecting DiscreteQuadraticModel object, got {type(dqm)}") limits = np.array(self.properties['minimum_time_limit']) t = np.interp(ec, limits[:, 0], limits[:, 1]) return max([5, t]) diff --git a/tests/test_leaphybriddqmsolver.py b/tests/test_leaphybriddqmsolver.py index 28ce1335..22adad26 100644 --- a/tests/test_leaphybriddqmsolver.py +++ b/tests/test_leaphybriddqmsolver.py @@ -54,6 +54,7 @@ def get_solver(self, *args, **kwargs): sampler = LeapHybridDQMSampler() dqm = dimod.DQM() + bqm = dimod.BinaryQuadraticModel('SPIN') with self.assertRaises(ValueError): sampler.sample_dqm(dqm, time_limit=1) @@ -61,6 +62,9 @@ def get_solver(self, *args, **kwargs): with self.assertRaises(ValueError): sampler.sample_dqm(dqm, time_limit=10000000) + with self.assertRaises(TypeError): + sampler.sample_dqm(bqm) + def test_DQM_subclass_without_serialization_can_be_sampled(self): """Test that DQM subclasses that do not implement serialization can still be sampled by LeapHybridDQMSampler. From ff432b4a4fb6ce0b3bfa6b9ed3a61d6c5cd3fd27 Mon Sep 17 00:00:00 2001 From: Abdullah Javed Nesar Date: Wed, 2 Mar 2022 00:46:15 +0530 Subject: [PATCH 2/2] moved import on top and exception handling in sample_dqm --- dwave/system/samplers/leap_hybrid_sampler.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/dwave/system/samplers/leap_hybrid_sampler.py b/dwave/system/samplers/leap_hybrid_sampler.py index 0d99e4a7..a466e4c3 100644 --- a/dwave/system/samplers/leap_hybrid_sampler.py +++ b/dwave/system/samplers/leap_hybrid_sampler.py @@ -37,6 +37,7 @@ bqm_to_file = FileView +from dimod.discrete.discrete_quadratic_model import DiscreteQuadraticModel from dwave.cloud import Client from dwave.system.utilities import classproperty, FeatureFlags @@ -465,6 +466,8 @@ def sample_dqm(self, dqm, time_limit=None, compress=False, compressed=None, **kw See the example in :class:`LeapHybridDQMSampler`. """ + if not isinstance(dqm, DiscreteQuadraticModel): + raise TypeError(f"Expecting DiscreteQuadraticModel object, got {type(dqm)}") if time_limit is None: time_limit = self.min_time_limit(dqm) elif time_limit < self.min_time_limit(dqm): @@ -533,12 +536,8 @@ def min_time_limit(self, dqm): first two pairs that represent problems with "density" between 1 to 100). """ - from dimod.discrete.discrete_quadratic_model import DiscreteQuadraticModel - if isinstance(dqm, DiscreteQuadraticModel): - ec = (dqm.num_variable_interactions() * dqm.num_cases() / - max(dqm.num_variables(), 1)) - else: - raise TypeError(f"Expecting DiscreteQuadraticModel object, got {type(dqm)}") + ec = (dqm.num_variable_interactions() * dqm.num_cases() / + max(dqm.num_variables(), 1)) limits = np.array(self.properties['minimum_time_limit']) t = np.interp(ec, limits[:, 0], limits[:, 1]) return max([5, t])