def sample(self, bqm, initial_sample=None): """Sample from a binary quadratic model using composed runnable sampler. Args: bqm (:obj:`~dimod.BinaryQuadraticModel`): Binary quadratic model to be sampled from. initial_sample (dict, default=None): `bqm`-compatible sample used for initial state construction. Defaults to `hybrid.utils.min_sample(bqm)`. Returns: :obj:`~dimod.Response`: A `dimod` :obj:`.~dimod.Response` object. """ if not isinstance(bqm, dimod.BinaryQuadraticModel): raise TypeError("'bqm' should be BinaryQuadraticModel") if initial_sample is None: initial_sample = min_sample(bqm) else: initial_sample = sample_as_dict(initial_sample) if len(initial_sample) != len(bqm): raise ValueError( "size of 'initial_sample' incompatible with 'bqm'") initial_state = State.from_sample(initial_sample, bqm) final_state = self._runnable_solver.run(initial_state) return dimod.Response.from_future( final_state, result_hook=lambda f: f.result().samples)
def sample(self, bqm, initial_sample=None, return_state=False, **params): """Sample from a binary quadratic model using composed runnable sampler. Args: bqm (:obj:`~dimod.BinaryQuadraticModel`): Binary quadratic model to be sampled from. initial_sample (dict, default=None): `bqm`-compatible sample used for initial state construction. Defaults to `hybrid.utils.min_sample(bqm)`. return_state (bool, optional, default=False): If True, the final state is added to :attr:`dimod.SampleSet.info` of the returned sample set. Note that if a `state` key already exists in the sample set then it is overwritten. **params (dict): Sampling parameters passed down to the underlying workflow as run-time parameters. Note: Sampling via hybrid workflow is run asynchronously, and a sample set is returned as soon as workflow starts running. A blocking result resolve occurres on the first attribute access to the returned sample set. Returns: :class:`~dimod.SampleSet`: Possibly yet unresolved sample set. """ if not isinstance(bqm, dimod.BinaryQuadraticModel): raise TypeError("'bqm' should be BinaryQuadraticModel") if initial_sample is None: initial_sample = min_sample(bqm) else: initial_sample = sample_as_dict(initial_sample) if len(initial_sample) != len(bqm): raise ValueError( "size of 'initial_sample' incompatible with 'bqm'") initial_state = State.from_sample(initial_sample, bqm) final_state = self._workflow.run(initial_state, **params) def result_hook(state): resolved = state.result() ss = resolved.samples if return_state: # note: this creates a cyclic reference to `samples` from the # sample set via `info['state']`, but that shouldn't be a # problem for GC ss.info.update(state=resolved) return ss return dimod.SampleSet.from_future(final_state, result_hook=result_hook)
def test_from_samples(self): s1 = [0, 1] s2 = {0: 1, 1: 0} bqm = dimod.BinaryQuadraticModel({0: 1, 1: 2}, {}, 0.0, 'BINARY') self.assertEqual(State.from_sample(s1, bqm).samples.first.energy, 2.0) self.assertEqual(State.from_sample(s2, bqm).samples.first.energy, 1.0) self.assertEqual(State.from_samples([s1, s1], bqm).samples.first.energy, 2.0) self.assertEqual(State.from_samples([s2, s2], bqm).samples.first.energy, 1.0) self.assertEqual(State.from_samples([sample_as_dict(s1), s2], bqm).samples.first.energy, 1.0)