/* MODIFY AS NEEDED */ static void process( char* edges_sql, int64_t start_vid, int64_t *end_vidsArr, size_t size_end_vidsArr, bool directed, MY_RETURN_VALUE_TYPE **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); MY_EDGE_TYPE *edges = NULL; size_t total_edges = 0; MY_EDGE_FUNCTION(edges_sql, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); if (total_edges == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char *err_msg = NULL; char *log_msg = NULL; // Code standard: // Pass the arrays and the sizes on the same line clock_t start_t = clock(); do_pgr_MY_FUNCTION_NAME( edges, total_edges, start_vid, end_vidsArr, size_end_vidsArr, directed, result_tuples, result_count, &log_msg, &err_msg); time_msg(" processing pgr_funnyDijkstra", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("LOG: %s\n", log_msg); if (log_msg) free(log_msg); if (err_msg) { if (*result_tuples) free(*result_tuples); if (end_vidsArr) free(end_vidsArr); elog(ERROR, "%s", err_msg); free(err_msg); } pfree(edges); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, int64_t start_vid, int64_t end_vid, bool directed, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); pgr_edge_t *edges = NULL; if (start_vid == end_vid) { (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } size_t total_tuples = 0; pgr_get_edges(edges_sql, &edges, &total_tuples); if (total_tuples == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Total %ld tuples in query:", total_tuples); PGR_DBG("Starting processing"); clock_t start_t = clock(); char *err_msg = NULL; do_pgr_one_to_one_dijkstra( edges, total_tuples, start_vid, end_vid, directed, only_cost, result_tuples, result_count, &err_msg); time_msg(" processing Dijkstra one to one", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); free(err_msg); pfree(edges); pgr_SPI_finish(); }
void PIKSI::spinOnce( ) { cmd_lock.lock( ); if( piksid < 0 && !PIKSIOpenNoLock( ) ) return; int ret; float cov[9]; sbp_gps_time_t time = piksi_get_time( piksid ); std::cout << "PIKSID " << piksid << "\n"; sensor_msgs::TimeReferencePtr time_msg( new sensor_msgs::TimeReference ); time_msg->header.frame_id = frame_id; time_msg->header.stamp = ros::Time::now( ); time_msg->time_ref.sec = time.tow; time_msg->source = "gps"; time_pub.publish( time_msg ); /* * Fix Data */ sbp_pos_llh_t llh = piksi_get_pos_llh( piksid ); cmd_lock.unlock( ); sensor_msgs::NavSatFixPtr fix_msg( new sensor_msgs::NavSatFix ); fix_msg->header.frame_id = frame_id; fix_msg->header.stamp = ros::Time::now( ); fix_msg->status.status = -1; // STATUS_NO_FIX; fix_msg->status.service = 1; // SERVICE_GPS; fix_msg->latitude = llh.lat; fix_msg->longitude = llh.lon; fix_msg->altitude = llh.height; for( int i = 0; i < 9; i++ ) fix_msg->position_covariance[i] = cov[i]; fix_msg->position_covariance_type = 0; //COVARIANCE_TYPE_UNKNOWN; fix_pub.publish( fix_msg ); diag_pub_freq.tick( ); }
/* MODIFY AS NEEDED */ static void process( char *edges_sql, int64_t *source_vertices, size_t size_source_verticesArr, int64_t sink_vertex, bool directed, General_path_element_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); pgr_basic_edge_t *edges = NULL; size_t total_tuples = 0; pgr_get_basic_edges(edges_sql, &edges, &total_tuples); if (total_tuples == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Total %ld tuples in query:", total_tuples); PGR_DBG("Starting processing"); clock_t start_t = clock(); char *err_msg = NULL; do_pgr_edge_disjoint_paths_many_to_one( edges, total_tuples, source_vertices, size_source_verticesArr, sink_vertex, directed, result_tuples, result_count, &err_msg); time_msg("processing edge disjoint paths", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); free(err_msg); pfree(edges); pgr_SPI_finish(); }
/// time_start - initialize the startuptime code /// /// Needs to be called once before calling other startuptime code (such as /// time_{push,pop,msg,...}). /// /// @param message the message that will be displayed void time_start(const char *message) { if (time_fd == NULL) { return; } // intialize the global variables g_prev_time = g_start_time = profile_start(); fprintf(time_fd, "\n\ntimes in msec\n"); fprintf(time_fd, " clock self+sourced self: sourced script\n"); fprintf(time_fd, " clock elapsed: other lines\n\n"); time_msg(message, NULL); }
/* MODIFY AS NEEDED */ static void process( char *edges_sql, bool directed, pgr_basic_edge_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); pgr_basic_edge_t *edges = NULL; size_t total_tuples = 0; pgr_get_basic_edges(edges_sql, &edges, &total_tuples); if (total_tuples == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Total %ld tuples in query:", total_tuples); PGR_DBG("Starting processing"); clock_t start_t = clock(); char *err_msg = NULL; do_pgr_maximum_cardinality_matching( edges, directed, total_tuples, result_tuples, result_count, &err_msg); time_msg("processing max flow", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); free(err_msg); pfree(edges); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, bool directed, Matrix_cell_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); pgr_edge_t *edges = NULL; size_t total_tuples = 0; pgr_get_data_4_columns(edges_sql, &edges, &total_tuples); if (total_tuples == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Total %ld tuples in query:", total_tuples); PGR_DBG("Starting processing"); char *err_msg = (char *)""; clock_t start_t = clock(); do_pgr_johnson( edges, total_tuples, directed, result_tuples, result_count, &err_msg); time_msg(" processing Johnson", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); free(err_msg); pfree(edges); pgr_SPI_finish(); }
static void process( char *edges_sql, ArrayType *starts, ArrayType *ends, char *algorithm, bool only_flow, pgr_flow_t **result_tuples, size_t *result_count) { if (!(strcmp(algorithm, "push_relabel") == 0 || strcmp(algorithm, "edmonds_karp") == 0 || strcmp(algorithm, "boykov_kolmogorov") == 0)) { elog(ERROR, "Unknown algorithm"); } pgr_SPI_connect(); size_t size_source_verticesArr = 0; int64_t* source_vertices = pgr_get_bigIntArray(&size_source_verticesArr, starts); size_t size_sink_verticesArr = 0; int64_t* sink_vertices = pgr_get_bigIntArray(&size_sink_verticesArr, ends); pgr_edge_t *edges = NULL; size_t total_edges = 0; /* NOTE: * For flow, cost and reverse_cost are really capacity and reverse_capacity */ pgr_get_flow_edges(edges_sql, &edges, &total_edges); if (total_edges == 0) { if (source_vertices) pfree(source_vertices); if (sink_vertices) pfree(sink_vertices); pgr_SPI_finish(); return; } PGR_DBG("Starting timer"); clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char *err_msg = NULL; do_pgr_max_flow( edges, total_edges, source_vertices, size_source_verticesArr, sink_vertices, size_sink_verticesArr, algorithm, only_flow, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_flow) { time_msg("pgr_maxFlow(many to many)", start_t, clock()); } else if (strcmp(algorithm, "push_relabel") == 0) { time_msg("pgr_maxFlowPushRelabel(many to many)", start_t, clock()); } else if (strcmp(algorithm, "edmonds_karp") == 0) { time_msg("pgr_maxFlowEdmondsKarp(many to many)", start_t, clock()); } else { time_msg("pgr_maxFlowBoykovKolmogorov(many to many)", start_t, clock()); } if (edges) pfree(edges); if (source_vertices) pfree(source_vertices); if (sink_vertices) pfree(sink_vertices); if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_tuples) = NULL; (*result_count) = 0; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t end_pid, int k, bool directed, bool heap_paths, char *driving_side, bool details, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = (char) tolower(driving_side[0]); PGR_DBG("driving side:%c",driving_side[0]); if (! ((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } pgr_SPI_connect(); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("freeing allocated memory not used anymore"); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); clock_t start_t = clock(); char *log_msg = NULL; char *notice_msg = NULL; char *err_msg = NULL; do_pgr_withPointsKsp( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pid, k, directed, heap_paths, driving_side[0], details, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg(" processing withPointsKSP", start_t, clock()); PGR_DBG("Returned message = %s\n", err_msg); if (err_msg) { if (*result_tuples) free(*result_tuples); } pgr_global_report(log_msg, notice_msg, err_msg); pfree(edges); pfree(edges_of_points); pfree(points); pgr_SPI_finish(); }
/*! * bigint start_vid, * bigint end_vid, * float agg_cost, */ void pgr_get_matrixRows( char *sql, Matrix_cell_t **rows, size_t *total_rows) { clock_t start_t = clock(); const int tuple_limit = 1000000; size_t ntuples; size_t total_tuples = 0; Column_info_t info[3]; int i; for (i = 0; i < 3; ++i) { info[i].colNumber = -1; info[i].type = 0; info[i].strict = true; info[i].eType = ANY_INTEGER; } info[0].name = strdup("start_vid"); info[1].name = strdup("end_vid"); info[2].name = strdup("agg_cost"); info[2].eType = ANY_NUMERICAL; void *SPIplan; SPIplan = pgr_SPI_prepare(sql); Portal SPIportal; SPIportal = pgr_SPI_cursor_open(SPIplan); bool moredata = TRUE; (*total_rows) = total_tuples; while (moredata == TRUE) { SPI_cursor_fetch(SPIportal, TRUE, tuple_limit); if (total_tuples == 0) pgr_fetch_column_info(info, 3); ntuples = SPI_processed; total_tuples += ntuples; if (ntuples > 0) { if ((*rows) == NULL) (*rows) = (Matrix_cell_t *)palloc0( total_tuples * sizeof(Matrix_cell_t)); else (*rows) = (Matrix_cell_t *)repalloc( (*rows), total_tuples * sizeof(Matrix_cell_t)); if ((*rows) == NULL) { elog(ERROR, "Out of memory"); } SPITupleTable *tuptable = SPI_tuptable; TupleDesc tupdesc = SPI_tuptable->tupdesc; PGR_DBG("processing %ld edge tupĺes", ntuples); size_t t; for (t = 0; t < ntuples; t++) { HeapTuple tuple = tuptable->vals[t]; pgr_fetch_row(&tuple, &tupdesc, info, &(*rows)[total_tuples - ntuples + t]); } SPI_freetuptable(tuptable); } else { moredata = FALSE; } } SPI_cursor_close(SPIportal); if (total_tuples == 0) { (*total_rows) = 0; PGR_DBG("NO rows"); return; } (*total_rows) = total_tuples; time_msg(" reading Edges", start_t, clock()); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t *end_pidsArr, size_t size_end_pidsArr, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = (char) tolower(driving_side[0]); PGR_DBG("driving side:%c", driving_side[0]); if (!((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } PGR_DBG("estimated driving side:%c", driving_side[0]); pgr_SPI_connect(); PGR_DBG("load the points"); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); #if 0 #ifndef NDEBUG size_t i = 0; for (i = 0; i < total_points; i ++) { PGR_DBG("%ld\t%ld\t%f\t%c", points[i].pid, points[i].edge_id, points[i].fraction, points[i].side); } #endif #endif /* * TODO move this code to c++ */ PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); #if 0 #ifndef NDEBUG for (i = 0; i < total_edges_of_points; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges_of_points[i].id, edges_of_points[i].source, edges_of_points[i].target, edges_of_points[i].cost, edges_of_points[i].reverse_cost); } #endif #endif PGR_DBG("load the edges that don't match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); #if 0 #ifndef NDEBUG for (i = 0; i < total_edges; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges[i].id, edges[i].source, edges[i].target, edges[i].cost, edges[i].reverse_cost); } #endif PGR_DBG("freeing allocated memory not used anymore"); #endif free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char *err_msg = NULL; char *log_msg = NULL; clock_t start_t = clock(); do_pgr_one_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, result_tuples, result_count, &log_msg, &err_msg); time_msg(" processing withPoints one to many", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("LOG: %s\n", log_msg); if (log_msg) free(log_msg); if (err_msg) { if (*result_tuples) free(*result_tuples); if (end_pidsArr) free(end_pidsArr); elog(ERROR, "%s", err_msg); free(err_msg); } pfree(edges); pgr_SPI_finish(); }
static void compute( char* edges_sql, int64_t start_vertex, int64_t end_vertex, int k, bool directed, bool heap_paths, General_path_element_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); PGR_DBG("Load data"); pgr_edge_t *edges = NULL; size_t total_edges = 0; if (start_vertex == end_vertex) { pgr_SPI_finish(); return; } pgr_get_edges(edges_sql, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); if (total_edges == 0) { PGR_DBG("No edges found"); pgr_SPI_finish(); return; } PGR_DBG("Calling do_pgr_ksp\n"); PGR_DBG("heap_paths = %i\n", heap_paths); clock_t start_t = clock(); char *log_msg = NULL; char *notice_msg = NULL; char *err_msg = NULL; do_pgr_ksp( edges, total_edges, start_vertex, end_vertex, k, directed, heap_paths, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg(" processing KSP", start_t, clock()); if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_tuples) = NULL; (*result_count) = 0; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); pgr_global_report(log_msg, notice_msg, err_msg); pfree(edges); pgr_SPI_finish(); }
static void process(char* edges_sql, int64_t start_vid, int64_t end_vid, bool directed, int heuristic, double factor, double epsilon, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { check_parameters(heuristic, factor, epsilon); pgr_SPI_connect(); PGR_DBG("Load data"); Pgr_edge_xy_t *edges = NULL; size_t total_edges = 0; pgr_get_edges_xy(edges_sql, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); if (total_edges == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; clock_t start_t = clock(); do_pgr_astarManyToMany( edges, total_edges, &start_vid, 1, &end_vid, 1, directed, heuristic, factor, epsilon, only_cost, true, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_cost) { time_msg("processing pgr_astarCost(one to one)", start_t, clock()); } else { time_msg("processing pgr_astar(one to one)", start_t, clock()); } if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_count) = 0; (*result_tuples) = NULL; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (edges) pfree(edges); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, ArrayType *starts, ArrayType *ends, bool directed, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); int64_t* start_vidsArr = NULL; size_t size_start_vidsArr = 0; start_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_start_vidsArr, starts); int64_t* end_vidsArr = NULL; size_t size_end_vidsArr = 0; end_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_end_vidsArr, ends); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_sql, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); if (total_edges == 0) { PGR_DBG("No edges found"); pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); clock_t start_t = clock(); char *log_msg = NULL; char *notice_msg = NULL; char *err_msg = NULL; do_pgr_bdDijkstra( edges, total_edges, start_vidsArr, size_start_vidsArr, end_vidsArr, size_end_vidsArr, directed, only_cost, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg(" processing pgr_bdDijkstra", start_t, clock()); PGR_DBG("Returning %ld tuples", *result_count); if (err_msg) { if (*result_tuples) free(*result_tuples); } pgr_global_report(log_msg, notice_msg, err_msg); pfree(edges); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* distances_sql, int64_t start_vid, int64_t end_vid, double time_limit, int64_t tries_per_temperature, int64_t max_changes_per_temperature, int64_t max_consecutive_non_changes, double initial_temperature, double final_temperature, double cooling_factor, bool randomize, General_path_element_t **result_tuples, size_t *result_count) { pgr_SPI_connect(); /* * errors in parameters */ if (initial_temperature < final_temperature) { elog(ERROR, "Condition not met: initial_temperature" " > final_temperature"); } if (final_temperature <= 0) { elog(ERROR, "Condition not met: final_temperature > 0"); } if (cooling_factor <=0 || cooling_factor >=1) { elog(ERROR, "Condition not met: 0 < cooling_factor < 1"); } if (tries_per_temperature < 0) { elog(ERROR, "Condition not met: tries_per_temperature >= 0"); } if (max_changes_per_temperature < 1) { elog(ERROR, "Condition not met: max_changes_per_temperature > 0"); } if (max_consecutive_non_changes < 1) { elog(ERROR, "Condition not met: max_consecutive_non_changes > 0"); } if (time_limit < 0) { elog(ERROR, "Condition not met: max_processing_time >= 0"); } Matrix_cell_t *distances = NULL; size_t total_distances = 0; pgr_get_matrixRows(distances_sql, &distances, &total_distances); if (total_distances == 0) { PGR_DBG("No distances found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting timer"); clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; do_pgr_tsp( distances, total_distances, start_vid, end_vid, initial_temperature, final_temperature, cooling_factor, tries_per_temperature, max_changes_per_temperature, max_consecutive_non_changes, randomize, time_limit, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg("eucledianTSP", start_t, clock()); if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_tuples) = NULL; (*result_count) = 0; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (distances) pfree(distances); pgr_SPI_finish(); }
static void process( char* edges_sql, char* points_sql, ArrayType *starts, ArrayType *ends, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = estimate_drivingSide(driving_side[0]); pgr_SPI_connect(); size_t size_start_pidsArr = 0; int64_t* start_pidsArr = pgr_get_bigIntArray(&size_start_pidsArr, starts); size_t size_end_pidsArr = 0; int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges( edges_of_points_query, &edges_of_points, &total_edges_of_points); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { pgr_SPI_finish(); return; } clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; do_pgr_many_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pidsArr, size_start_pidsArr, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, true, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_cost) { time_msg("processing pgr_withPointsCost(one to one)", start_t, clock()); } else { time_msg("processing pgr_withPoints(one to one)", start_t, clock()); } if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_count) = 0; (*result_tuples) = NULL; } pgr_global_report(log_msg, notice_msg, err_msg); #if 0 if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (edges) pfree(edges); if (points) pfree(points); if (edges_of_points) pfree(edges_of_points); if (start_pidsArr) pfree(start_pidsArr); if (end_pidsArr) pfree(end_pidsArr); #endif pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t end_pid, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = tolower(driving_side[0]); PGR_DBG("driving side:%c",driving_side[0]); if (! ((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } PGR_DBG("estimated driving side:%c",driving_side[0]); pgr_SPI_connect(); PGR_DBG("load the points"); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); #ifdef DEBUG size_t i = 0; for (i = 0; i < total_points; i ++) { PGR_DBG("%ld\t%ld\t%f\t%c",points[i].pid, points[i].edge_id, points[i].fraction, points[i].side); } #endif PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_data_5_columns(edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); #ifdef DEBUG for (i = 0; i < total_edges_of_points; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges_of_points[i].id, edges_of_points[i].source, edges_of_points[i].target, edges_of_points[i].cost, edges_of_points[i].reverse_cost); } #endif PGR_DBG("load the edges that dont match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_data_5_columns(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); #ifdef DEBUG for (i = 0; i < total_edges; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges[i].id, edges[i].source, edges[i].target, edges[i].cost, edges[i].reverse_cost); } #endif PGR_DBG("freeing allocated memory not used anymore"); free(edges_of_points_query); free(edges_no_points_query); if ( (total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char *err_msg = NULL; clock_t start_t = clock(); int errcode = do_pgr_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pid, directed, driving_side[0], details, only_cost, result_tuples, result_count, &err_msg); time_msg(" processing withPoints one to one", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); if (!err_msg) free(err_msg); pfree(edges); pgr_SPI_finish(); if (errcode) { pgr_send_error(errcode); } }
static void process( char* edges_sql, char* points_sql, int64_t start_pid, ArrayType *ends, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = estimate_drivingSide(driving_side[0]); PGR_DBG("estimated driving side:%c", driving_side[0]); pgr_SPI_connect(); size_t size_end_pidsArr = 0; int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends); PGR_DBG("load the points"); size_t total_points = 0; Point_on_edge_t *points = NULL; pgr_get_points(points_sql, &points, &total_points); PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges( edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); PGR_DBG("load the edges that don't match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); pgr_SPI_finish(); return; } PGR_DBG("Starting timer"); clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; do_pgr_many_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, &start_pid, 1, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, true, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_cost) { time_msg("processing pgr_withPointsCost(one to many)", start_t, clock()); } else { time_msg("processing pgr_withPoints(one to many)", start_t, clock()); } if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_count) = 0; (*result_tuples) = NULL; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (edges) pfree(edges); if (points) pfree(points); if (edges_of_points) pfree(edges_of_points); if (end_pidsArr) pfree(end_pidsArr); pgr_SPI_finish(); }
void pgr_get_restriction_data( char *restrictions_sql, Restrict_t **restrictions, size_t *total_restrictions) { const int tuple_limit = 1000000; clock_t start_t = clock(); PGR_DBG("pgr_get_restriction_data"); PGR_DBG("%s", restrictions_sql); Column_info_t info[3]; int i; for (i = 0; i < 3; ++i) { info[i].colNumber = -1; info[i].type = 0; info[i].strict = true; info[i].eType = ANY_INTEGER; } info[0].name = strdup("id"); info[1].name = strdup("cost"); info[2].name = strdup("restricted_edges"); info[1].eType = ANY_NUMERICAL; info[2].eType = ANY_INTEGER_ARRAY; #if 0 // experiment starts size_t total_tuples = (*total_restrictions) ; (*restrictions) = (Restrict_t *)palloc0(sizeof(Restrict_t)); (*restrictions)[0].id = 1; (*restrictions)[0].cost = -1; (*restrictions)[0].restricted_edges[0] = 4; (*restrictions)[0].restricted_edges[1] = 7; // experiment ends #endif #if 1 size_t ntuples; size_t total_tuples; void *SPIplan; SPIplan = pgr_SPI_prepare(restrictions_sql); Portal SPIportal; SPIportal = pgr_SPI_cursor_open(SPIplan); bool moredata = TRUE; (*total_restrictions) = total_tuples = 0; while (moredata == TRUE) { SPI_cursor_fetch(SPIportal, TRUE, tuple_limit); if (total_tuples == 0) { pgr_fetch_column_info(info, 3); } ntuples = SPI_processed; total_tuples += ntuples; PGR_DBG("SPI_processed %ld", ntuples); if (ntuples > 0) { if ((*restrictions) == NULL) (*restrictions) = (Restrict_t *)palloc0( total_tuples * sizeof(Restrict_t)); else (*restrictions) = (Restrict_t *)repalloc( (*restrictions), total_tuples * sizeof(Restrict_t)); if ((*restrictions) == NULL) { elog(ERROR, "Out of memory"); } size_t t; SPITupleTable *tuptable = SPI_tuptable; TupleDesc tupdesc = SPI_tuptable->tupdesc; PGR_DBG("processing %ld", ntuples); for (t = 0; t < ntuples; t++) { HeapTuple tuple = tuptable->vals[t]; fetch_restriction(&tuple, &tupdesc, info, &(*restrictions)[total_tuples - ntuples + t]); } SPI_freetuptable(tuptable); } else { moredata = FALSE; } } SPI_cursor_close(SPIportal); if (total_tuples == 0) { (*total_restrictions) = 0; PGR_DBG("NO restrictions"); return; } (*total_restrictions) = total_tuples; #endif PGR_DBG("Finish reading %ld data, %ld", total_tuples, (*total_restrictions)); clock_t end_t = clock(); time_msg(" reading Restrictions", start_t, end_t); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, int64_t start_vid, int64_t end_vid, #if 0 /* * handling arrays example */ ArrayType *starts, ArrayType *ends, #endif bool directed, bool only_cost, MY_RETURN_VALUE_TYPE **result_tuples, size_t *result_count) { /* * https://www.postgresql.org/docs/current/static/spi-spi-connect.html */ pgr_SPI_connect(); #if 0 /* * handling arrays example */ PGR_DBG("Initializing arrays"); int64_t* start_vidsArr = NULL; size_t size_start_vidsArr = 0; start_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_start_vidsArr, starts); PGR_DBG("start_vidsArr size %ld ", size_start_vidsArr); int64_t* end_vidsArr = NULL; size_t size_end_vidsArr = 0; end_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_end_vidsArr, ends); PGR_DBG("end_vidsArr size %ld ", size_end_vidsArr); #endif (*result_tuples) = NULL; (*result_count) = 0; PGR_DBG("Load data"); MY_EDGE_TYPE *edges = NULL; size_t total_edges = 0; if (start_vid == end_vid) { /* * https://www.postgresql.org/docs/current/static/spi-spi-finish.html */ pgr_SPI_finish(); return; } MY_EDGE_FUNCTION(edges_sql, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); if (total_edges == 0) { PGR_DBG("No edges found"); pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); clock_t start_t = clock(); char *log_msg = NULL; char *notice_msg = NULL; char *err_msg = NULL; do_pgr_MY_FUNCTION_NAME( edges, total_edges, start_vid, end_vid, #if 0 /* * handling arrays example */ start_vidsArr, size_start_vidsArr, end_vidsArr, size_end_vidsArr, #endif directed, only_cost, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg(" processing pgr_MY_FUNCTION_NAME", start_t, clock()); PGR_DBG("Returning %ld tuples", *result_count); if (err_msg) { if (*result_tuples) pfree(*result_tuples); } pgr_global_report(log_msg, notice_msg, err_msg); if (edges) pfree(edges); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); #if 0 /* * handling arrays example */ if (end_vidsArr) pfree(end_vidsArr); if (start_vidsArr) pfree(start_vidsArr); #endif pgr_SPI_finish(); }
static void get_edges_basic( char *sql, pgr_basic_edge_t **edges, size_t *totalTuples, bool ignore_id) { clock_t start_t = clock(); const int tuple_limit = 1000000; size_t ntuples; size_t total_tuples; size_t valid_edges; Column_info_t info[5]; int i; for (i = 0; i < 5; ++i) { info[i].colNumber = -1; info[i].type = 0; info[i].strict = true; info[i].eType = ANY_INTEGER; } info[0].name = strdup("id"); info[1].name = strdup("source"); info[2].name = strdup("target"); info[3].name = strdup("going"); info[4].name = strdup("coming"); info[0].strict = !ignore_id; info[4].strict = false; info[3].eType = ANY_NUMERICAL; info[4].eType = ANY_NUMERICAL; void *SPIplan; SPIplan = pgr_SPI_prepare(sql); Portal SPIportal; SPIportal = pgr_SPI_cursor_open(SPIplan); bool moredata = TRUE; (*totalTuples) = total_tuples = valid_edges = 0; int64_t default_id = 0; while (moredata == TRUE) { SPI_cursor_fetch(SPIportal, TRUE, tuple_limit); if (total_tuples == 0) pgr_fetch_column_info(info, 5); ntuples = SPI_processed; total_tuples += ntuples; if (ntuples > 0) { if ((*edges) == NULL) (*edges) = (pgr_basic_edge_t *)palloc0( total_tuples * sizeof(pgr_basic_edge_t)); else (*edges) = (pgr_basic_edge_t *)repalloc( (*edges), total_tuples * sizeof(pgr_basic_edge_t)); if ((*edges) == NULL) { elog(ERROR, "Out of memory"); } size_t t; SPITupleTable *tuptable = SPI_tuptable; TupleDesc tupdesc = SPI_tuptable->tupdesc; for (t = 0; t < ntuples; t++) { HeapTuple tuple = tuptable->vals[t]; fetch_basic_edge(&tuple, &tupdesc, info, &default_id, &(*edges)[total_tuples - ntuples + t], &valid_edges); } SPI_freetuptable(tuptable); } else { moredata = FALSE; } } SPI_cursor_close(SPIportal); if (total_tuples == 0 || valid_edges == 0) { PGR_DBG("No edges found"); } (*totalTuples) = total_tuples; PGR_DBG("Reading %ld edges", total_tuples); time_msg("reading edges", start_t, clock()); }