94 int32_t exploration_level,
104 std::ostringstream log;
105 std::ostringstream err;
106 std::ostringstream notice;
116 pgassert(total_jobs || total_shipments);
120 auto start_time = std::chrono::high_resolution_clock::now();
124 for (
size_t i = 0; i < total_jobs; ++i) {
128 for (
size_t i = 0; i < total_shipments; ++i) {
133 double min_speed_factor, max_speed_factor;
134 min_speed_factor = max_speed_factor = vehicles[0].
speed_factor;
136 for (
size_t i = 0; i < total_vehicles; ++i) {
137 min_speed_factor = std::min(min_speed_factor, vehicles[i].speed_factor);
138 max_speed_factor = std::max(max_speed_factor, vehicles[i].speed_factor);
139 if (vehicles[i].start_id != -1) {
140 location_ids += vehicles[i].
start_id;
142 if (vehicles[i].end_id != -1) {
143 location_ids += vehicles[i].
end_id;
151 if (max_speed_factor > 5 * min_speed_factor) {
152 (*return_tuples) = NULL;
154 err <<
"The speed_factor " << max_speed_factor <<
" is more than five times "
155 "the speed factor " << min_speed_factor;
163 for (
size_t i = 0; i < total_vehicles; ++i) {
164 vehicles[i].
speed_factor = std::round(vehicles[i].speed_factor / min_speed_factor);
171 location_ids, min_speed_factor);
177 (*return_tuples) = NULL;
179 err <<
"An Infinity value was found on the Matrix. Might be missing information of a node";
187 if (matrix.
size() > (std::numeric_limits<vroom::Index>::max)()) {
188 (*return_tuples) = NULL;
190 err <<
"The size of time matrix exceeds the limit";
198 breaks, total_breaks,
199 breaks_tws, total_breaks_tws);
201 jobs_tws, total_jobs_tws);
203 shipments_tws, total_shipments_tws);
205 auto end_time = std::chrono::high_resolution_clock::now();
206 loading_time +=
static_cast<int32_t
>(
207 std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time)
210 std::vector < Vroom_rt > results = problem.
solve(exploration_level, timeout, loading_time);
212 auto count = results.size();
214 (*return_tuples) = NULL;
216 notice <<
"No results found";
217 *notice_msg = notice.str().empty()?
223 (*return_tuples) =
pgr_alloc(count, (*return_tuples));
224 for (
size_t i = 0; i < count; i++) {
225 *((*return_tuples) + i) = results[i];
228 (*return_count) = count;
231 *log_msg = log.str().empty()?
234 *notice_msg = notice.str().empty()?
238 (*return_tuples) =
pgr_free(*return_tuples);
240 err << except.
what();
241 *err_msg =
pgr_msg(err.str().c_str());
242 *log_msg =
pgr_msg(log.str().c_str());
243 }
catch (
const vroom::Exception &except) {
244 (*return_tuples) =
pgr_free(*return_tuples);
246 err << except.message;
247 *err_msg =
pgr_msg(err.str().c_str());
248 *log_msg =
pgr_msg(log.str().c_str());
249 }
catch (std::exception &except) {
250 (*return_tuples) =
pgr_free(*return_tuples);
252 err << except.what();
253 *err_msg =
pgr_msg(err.str().c_str());
254 *log_msg =
pgr_msg(log.str().c_str());
256 (*return_tuples) =
pgr_free(*return_tuples);
258 err <<
"Caught unknown exception!";
259 *err_msg =
pgr_msg(err.str().c_str());
260 *log_msg =
pgr_msg(log.str().c_str());