-static double finish_on_at(const sg4::ExecPtr task, const sg4::Host* host)
-{
- double data_available = 0.;
- double last_data_available = -1.0;
- /* compute last_data_available */
- for (const auto& parent : task->get_dependencies()) {
- /* normal case */
- if (const auto* comm = dynamic_cast<sg4::Comm*>(parent.get())) {
- auto source = comm->get_source();
- XBT_DEBUG("transfer from %s to %s", source->get_cname(), host->get_cname());
- /* Estimate the redistribution time from this parent */
- double redist_time;
- if (comm->get_remaining() <= 1e-6) {
- redist_time = 0;
- } else {
- double bandwidth = std::numeric_limits<double>::max();
- auto [links, latency] = source->route_to(host);
- for (auto const& link : links)
- bandwidth = std::min(bandwidth, link->get_bandwidth());
-
- redist_time = latency + comm->get_remaining() / bandwidth;
- }
- // We use the user data field to store the finish time of the predecessor of the comm, i.e., its potential start
- // time
- data_available = *comm->get_data<double>() + redist_time;
- }
-
- /* no transfer, control dependency */
- if (const auto* exec = dynamic_cast<sg4::Exec*>(parent.get()))
- data_available = exec->get_finish_time();
-
- if (last_data_available < data_available)
- last_data_available = data_available;
- }
- return std::max(*host->get_data<double>(), last_data_available) + task->get_remaining() / host->get_speed();
-}
-
-static sg4::Host* get_best_host(const sg4::ExecPtr exec)