Source code for dwave_micro_client_dimod.response

"""
FutureResponse
==============
"""
import dimod
import dwave_micro_client as microclient


[docs]class FutureResponse(dimod.TemplateResponse): """A response object for async samples added to it. Args: info (dict): Information about the response as a whole. vartype (:class:`dimod.Vartype`): The values that the variables in each sample can take. See :class:`dimod.Vartype`. """ def __init__(self, info=None, vartype=None): dimod.TemplateResponse.__init__(self, info, vartype) self._futures = []
[docs] def add_samples_future(self, future): """Add samples from a micro client Future. Args: future (:class:`dwave_micro_client.Future`): A Future from the dwave_micro_client. """ self._futures.append(future)
@property def datalist(self): """ list: The data in order of insertion. Each datum in data is a dict containing 'sample', 'energy', and 'num_occurences' keys as well an any other information added on insert. This attribute should be treated as read-only, as changing it can break the response's internal logic. """ futures = self._futures while futures: # wait for at least one future to be done microclient.Future.wait_multiple(futures, min_done=1) waiting = [] for future in futures: if future.done(): # we have a response! add it to datalist self._add_data_from_future(future) else: waiting.append(future) futures = waiting self._futures = futures return self._datalist @datalist.setter def datalist(self, datalist): self._datalist = datalist def _add_data_from_future(self, future): samples = future.samples energies = future.energies num_occurrences = future.occurrences nodes = future.solver.nodes sample_values = self.vartype.value def _check_iter(): for sample, energy, n_o in zip(samples, energies, num_occurrences): datum = {} sample = {v: sample[v] for v in nodes} if sample_values is not None and not all(v in sample_values for v in sample.values()): raise ValueError("expected the biases of 'sample' to be in {}".format(sample_values)) datum['sample'] = sample datum['energy'] = float(energy) datum['num_occurences'] = n_o yield datum self._datalist.extend(_check_iter())
[docs] def done(self): """True if all of the futures added to the response have arrived.""" return all(future.done() for future in self._futures)