138 std::ostringstream log;
139 std::ostringstream notice;
140 std::ostringstream err;
142 *return_tuples =
nullptr;
144 std::string err_string;
145 std::string hint_string;
146 if (!
are_shipments_ok(customers_arr, total_customers, &err_string, &hint_string)) {
147 *err_msg =
pgr_msg(err_string.c_str());
148 *log_msg =
pgr_msg(hint_string.c_str());
155 std::vector<PickDeliveryOrders_t> orders(
156 customers_arr, customers_arr + total_customers);
157 std::vector<Vehicle_t> vehicles(
158 vehicles_arr, vehicles_arr + total_vehicles);
160 std::map<std::pair<Coordinate, Coordinate>,
Id> matrix_data;
162 for (
const auto &o : orders) {
165 matrix_data[std::pair<Coordinate, Coordinate>(o.pick_x, o.pick_y)] = 0;
166 matrix_data[std::pair<Coordinate, Coordinate>(o.deliver_x, o.deliver_y)] = 0;
169 for (
const auto &v : vehicles) {
170 matrix_data[std::pair<Coordinate, Coordinate>(v.start_x, v.start_y)] = 0;
171 matrix_data[std::pair<Coordinate, Coordinate>(v.end_x, v.end_y)] = 0;
179 for (
auto &e : matrix_data) {
183 for (
const auto &e : matrix_data) {
184 unique_ids += e.second;
185 log << e.second <<
"(" << e.first.first <<
"," << e.first.second <<
")\n";
188 for (
size_t i = 0; i < total_customers; ++i) {
189 customers_arr[i].pick_node_id =
190 matrix_data[std::pair<Coordinate, Coordinate>(customers_arr[i].
pick_x, customers_arr[i].
pick_y)];
192 customers_arr[i].deliver_node_id =
193 matrix_data[std::pair<Coordinate, Coordinate>(customers_arr[i].
deliver_x, customers_arr[i].
deliver_y)];
195 for (
auto &v : vehicles) {
196 v.start_node_id = matrix_data[std::pair<Coordinate, Coordinate>(v.start_x, v.start_y)];
197 v.end_node_id = matrix_data[std::pair<Coordinate, Coordinate>(v.end_x, v.end_y)];
202 log <<
"Initialize problem\n";
204 customers_arr, total_customers,
205 vehicles_arr, total_vehicles,
208 err << pd_problem.msg.get_error();
209 if (!err.str().empty()) {
212 log << pd_problem.msg.get_error();
213 log << pd_problem.msg.get_log();
214 *log_msg =
pgr_msg(log.str().c_str());
215 *err_msg =
pgr_msg(err.str().c_str());
218 log << pd_problem.msg.get_log();
219 log <<
"Finish Reading data\n";
227 sol = Optimize(sol,
static_cast<size_t>(max_cycles), (
Initials_code)initial_solution_id);
230 log << pd_problem.msg.get_log();
233 log <<
"Caught unknown exception!";
237 log << pd_problem.msg.get_log();
238 log <<
"Finish solve\n";
240 auto solution = sol.get_postgres_result();
241 log << pd_problem.msg.get_log();
242 log <<
"solution size: " << solution.size() <<
"\n";
245 if (!solution.empty()) {
246 (*return_tuples) =
pgr_alloc(solution.size(), (*return_tuples));
248 for (
const auto &row : solution) {
249 (*return_tuples)[seq] = row;
253 (*return_count) = solution.size();
255 log << pd_problem.msg.get_log();
258 *log_msg = log.str().empty()?
261 *notice_msg = notice.str().empty()?
265 if (*return_tuples) free(*return_tuples);
267 err << except.
what();
268 *err_msg =
pgr_msg(err.str().c_str());
269 *log_msg =
pgr_msg(log.str().c_str());
270 }
catch (std::exception& except) {
271 if (*return_tuples) free(*return_tuples);
273 err << except.what();
274 *err_msg =
pgr_msg(err.str().c_str());
275 *log_msg =
pgr_msg(log.str().c_str());
276 }
catch (
const std::pair<std::string, std::string>& ex) {
282 *err_msg =
pgr_msg(err.str().c_str());
283 *log_msg =
pgr_msg(log.str().c_str());
285 if (*return_tuples) free(*return_tuples);
287 err <<
"Caught unknown exception!";
288 *err_msg =
pgr_msg(err.str().c_str());
289 *log_msg =
pgr_msg(log.str().c_str());