Source code for dwave_networkx.utils.decorators

"""
Decorators allow for input checking and default parameter setting for
algorithms.
"""

from decorator import decorator

import dwave_networkx as dnx

__all__ = ['binary_quadratic_model_sampler']


[docs]def binary_quadratic_model_sampler(which_args): """Decorator to check sampler arguments. Parameters ---------- which_args : int or sequence of ints Location of the sampler arguments in args. If more than one sampler is allowed, can be a list of locations. Returns ------- _binary_quadratic_model_sampler : function Function which checks the sampler for correctness. A sampler is expected to have "sample_qubo" and "sample_ising" methods. Alternatively, if no sampler is provided (or sampler is None) the sampler as set by set_default_sampler will be provided to the function. Examples -------- Decorate functions like this:: @binary_quadratic_model_sampler(1) def maximal_matching(G, sampler, **sampler_args): pass """ @decorator def _binary_quadratic_model_sampler(f, *args, **kw): # convert into a sequence if necessary if isinstance(which_args, int): iter_args = (which_args,) else: iter_args = iter(which_args) # check each sampler for the correct methods new_args = [arg for arg in args] for idx in iter_args: sampler = args[idx] # if no sampler is provided, get the default sampler if it has # been set if sampler is None: # this sampler has already been vetted default_sampler = dnx.get_default_sampler() if default_sampler is None: raise dnx.DWaveNetworkXMissingSampler('no default sampler set') new_args[idx] = default_sampler continue if not hasattr(sampler, "sample_qubo") or not callable(sampler.sample_qubo): raise TypeError("expected sampler to have a 'sample_qubo' method") if not hasattr(sampler, "sample_ising") or not callable(sampler.sample_ising): raise TypeError("expected sampler to have a 'sample_ising' method") # now run the function and return the results return f(*new_args, **kw) return _binary_quadratic_model_sampler