dwave_networkx.utils.decorators.binary_quadratic_model_sampler¶
-
binary_quadratic_model_sampler(which_args)[source]¶ Decorator to validate sampler arguments.
Parameters: which_args (int or sequence of ints) – Location of the sampler arguments of the input function in the form function_name(args, *kw). If more than one sampler is allowed, can be a list of locations. Returns: _binary_quadratic_model_sampler – Caller function that validates the sampler format. A sampler is expected to have sample_qubo and sample_ising methods. Alternatively, if no sampler is provided (or sampler is None), the sampler set by the set_default_sampler function is provided to the function. Return type: function Examples
Decorate functions like this:
@binary_quadratic_model_sampler(1) def maximal_matching(G, sampler, **sampler_args): pass
This example validates two placeholder samplers, which return a correct response only in the case of finding an independent set on a complete graph (where one node is always an independent set), the first valid, the second missing a method.
>>> import networkx as nx >>> import dwave_networkx as dnx >>> from dwave_networkx.utils import decorators >>> # Create two placeholder samplers >>> class WellDefinedSampler: ... # an example sampler, only works for independent set on complete ... # graphs ... def __init__(self, name): ... self.name = name ... def sample_ising(self, h, J): ... sample = {v: -1 for v in h} ... sample[0] = 1 # set one node to true ... return [sample] ... def sample_qubo(self, Q): ... sample = {v: 0 for v in set().union(*Q)} ... sample[0] = 1 # set one node to true ... return [sample] ... def __str__(self): ... return self.name ... >>> class IllDefinedSampler: ... # an example sampler missing a `sample_qubo` method ... def __init__(self, name): ... self.name = name ... def sample_ising(self, h, J): ... sample = {v: -1 for v in h} ... sample[0] = 1 # set one node to true ... return [sample] ... def __str__(self): ... return self.name ... >>> sampler1 = WellDefinedSampler('sampler1') >>> sampler2 = IllDefinedSampler('sampler2') >>> # Define a placeholder independent-set function with the decorator >>> @dnx.utils.binary_quadratic_model_sampler(1) ... def independent_set(G, sampler, **sampler_args): ... Q = {(node, node): -1 for node in G} ... Q.update({edge: 2 for edge in G.edges}) ... response = sampler.sample_qubo(Q, **sampler_args) ... sample = next(iter(response)) ... return [node for node in sample if sample[node] > 0] ... >>> # Validate the samplers >>> G = nx.complete_graph(5) >>> independent_set(G, sampler1) [0] >>> independent_set(G, sampler2) # doctest: +SKIP --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-35-670b71b268c7> in <module>() ----> 1 independent_set(G, IllDefinedSampler) <decorator-gen-628> in independent_set(G, sampler, **sampler_args) /usr/local/lib/python2.7/dist-packages/dwave_networkx/utils/decorators.pyc in _binary_quadratic_model_sampler(f, *args, **kw) 61 62 if not hasattr(sampler, "sample_qubo") or not callable(sampler.sample_qubo): ---> 63 raise TypeError("expected sampler to have a 'sample_qubo' method") 64 if not hasattr(sampler, "sample_ising") or not callable(sampler.sample_ising): 65 raise TypeError("expected sampler to have a 'sample_ising' method") TypeError: expected sampler to have a 'sample_qubo' method