def update(self, best_objective, previous_bound, solve_info, node_data_list): """A proxy to :func:`pybnb.dispatcher.Dispatcher.update`.""" size = 3 + _SolveInfo._data_size node_count = len(node_data_list) if node_count > 0: for node_data_ in node_data_list: size += 1 size += len(node_data_) if (self._update_buffer is None) or \ len(self._update_buffer) < size: self._update_buffer = numpy.empty(size, dtype=float) data = self._update_buffer data[0] = best_objective assert float(data[0]) == best_objective data[1] = previous_bound assert float(data[1]) == previous_bound data[2] = node_count assert data[2] == node_count assert int(data[2]) == int(node_count) data[3:(_SolveInfo._data_size)+3] = solve_info.data if node_count > 0: pos = _SolveInfo._data_size+3 for node_data in node_data_list: data[pos] = len(node_data) pos += 1 data[pos:pos+len(node_data)] = node_data pos += len(node_data) self.comm.Send([data,mpi4py.MPI.DOUBLE], self.dispatcher_rank, tag=DispatcherAction.update) self.comm.Probe(status=self._status) assert not self._status.Get_error() tag = self._status.Get_tag() if tag == DispatcherResponse.nowork: data = recv_data(self.comm, self._status) best_objective = float(data[0]) global_bound = float(data[1]) termination_condition = \ _int_to_termination_condition[int(data[2])] solve_info = _SolveInfo() solve_info.data[:] = data[3:] return (True, best_objective, (global_bound, termination_condition, solve_info)) else: assert tag == DispatcherResponse.work recv_size = self._status.Get_count(mpi4py.MPI.DOUBLE) if len(self._update_buffer) < recv_size: self._update_buffer = numpy.empty(recv_size, dtype=float) # Note that this function returns a node data # array that is a view on its own update # buffer. Thus, it assumes that the caller is no # longer using the node data view that was # returned when the next update is called # (because it will be corrupted). data = self._update_buffer[:recv_size] recv_data(self.comm, self._status, datatype=mpi4py.MPI.DOUBLE, out=data) best_objective = Node._extract_best_objective(data) return False, best_objective, data
def test_best_objective_storage(self): node = Node() node._insert_best_objective(node._data, 10.5) assert node._extract_best_objective(node._data) == 10.5