Пример #1
0
    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
Пример #2
0
 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