Skip to content

Commit 640c980

Browse files
authored
Add files via upload
1 parent 4014b2c commit 640c980

6 files changed

Lines changed: 476 additions & 0 deletions

File tree

src/RcppExports.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,45 @@ BEGIN_RCPP
6060
return rcpp_result_gen;
6161
END_RCPP
6262
}
63+
// NBA
64+
Rcpp::NumericVector NBA(std::vector<int> dep, std::vector<int> arr, std::vector<int> gfrom, std::vector<int> gto, std::vector<double> gw, int NbNodes, std::vector<double> lat, std::vector<double> lon, double k);
65+
RcppExport SEXP _cppRouting_NBA(SEXP depSEXP, SEXP arrSEXP, SEXP gfromSEXP, SEXP gtoSEXP, SEXP gwSEXP, SEXP NbNodesSEXP, SEXP latSEXP, SEXP lonSEXP, SEXP kSEXP) {
66+
BEGIN_RCPP
67+
Rcpp::RObject rcpp_result_gen;
68+
Rcpp::RNGScope rcpp_rngScope_gen;
69+
Rcpp::traits::input_parameter< std::vector<int> >::type dep(depSEXP);
70+
Rcpp::traits::input_parameter< std::vector<int> >::type arr(arrSEXP);
71+
Rcpp::traits::input_parameter< std::vector<int> >::type gfrom(gfromSEXP);
72+
Rcpp::traits::input_parameter< std::vector<int> >::type gto(gtoSEXP);
73+
Rcpp::traits::input_parameter< std::vector<double> >::type gw(gwSEXP);
74+
Rcpp::traits::input_parameter< int >::type NbNodes(NbNodesSEXP);
75+
Rcpp::traits::input_parameter< std::vector<double> >::type lat(latSEXP);
76+
Rcpp::traits::input_parameter< std::vector<double> >::type lon(lonSEXP);
77+
Rcpp::traits::input_parameter< double >::type k(kSEXP);
78+
rcpp_result_gen = Rcpp::wrap(NBA(dep, arr, gfrom, gto, gw, NbNodes, lat, lon, k));
79+
return rcpp_result_gen;
80+
END_RCPP
81+
}
82+
// NBA_path
83+
Rcpp::List NBA_path(std::vector<int> dep, std::vector<int> arr, std::vector<int> gfrom, std::vector<int> gto, std::vector<double> gw, int NbNodes, std::vector<double> lat, std::vector<double> lon, double k, std::vector<std::string> dict);
84+
RcppExport SEXP _cppRouting_NBA_path(SEXP depSEXP, SEXP arrSEXP, SEXP gfromSEXP, SEXP gtoSEXP, SEXP gwSEXP, SEXP NbNodesSEXP, SEXP latSEXP, SEXP lonSEXP, SEXP kSEXP, SEXP dictSEXP) {
85+
BEGIN_RCPP
86+
Rcpp::RObject rcpp_result_gen;
87+
Rcpp::RNGScope rcpp_rngScope_gen;
88+
Rcpp::traits::input_parameter< std::vector<int> >::type dep(depSEXP);
89+
Rcpp::traits::input_parameter< std::vector<int> >::type arr(arrSEXP);
90+
Rcpp::traits::input_parameter< std::vector<int> >::type gfrom(gfromSEXP);
91+
Rcpp::traits::input_parameter< std::vector<int> >::type gto(gtoSEXP);
92+
Rcpp::traits::input_parameter< std::vector<double> >::type gw(gwSEXP);
93+
Rcpp::traits::input_parameter< int >::type NbNodes(NbNodesSEXP);
94+
Rcpp::traits::input_parameter< std::vector<double> >::type lat(latSEXP);
95+
Rcpp::traits::input_parameter< std::vector<double> >::type lon(lonSEXP);
96+
Rcpp::traits::input_parameter< double >::type k(kSEXP);
97+
Rcpp::traits::input_parameter< std::vector<std::string> >::type dict(dictSEXP);
98+
rcpp_result_gen = Rcpp::wrap(NBA_path(dep, arr, gfrom, gto, gw, NbNodes, lat, lon, k, dict));
99+
return rcpp_result_gen;
100+
END_RCPP
101+
}
63102
// Bidir_path
64103
Rcpp::List Bidir_path(std::vector<int> dep, std::vector<int> arr, std::vector<int> gfrom, std::vector<int> gto, std::vector<double> gw, int NbNodes, std::vector<std::string> dict);
65104
RcppExport SEXP _cppRouting_Bidir_path(SEXP depSEXP, SEXP arrSEXP, SEXP gfromSEXP, SEXP gtoSEXP, SEXP gwSEXP, SEXP NbNodesSEXP, SEXP dictSEXP) {
@@ -184,6 +223,8 @@ static const R_CallMethodDef CallEntries[] = {
184223
{"_cppRouting_Astar", (DL_FUNC) &_cppRouting_Astar, 9},
185224
{"_cppRouting_Astar_paths", (DL_FUNC) &_cppRouting_Astar_paths, 10},
186225
{"_cppRouting_Bidir", (DL_FUNC) &_cppRouting_Bidir, 6},
226+
{"_cppRouting_NBA", (DL_FUNC) &_cppRouting_NBA, 9},
227+
{"_cppRouting_NBA_path", (DL_FUNC) &_cppRouting_NBA_path, 10},
187228
{"_cppRouting_Bidir_path", (DL_FUNC) &_cppRouting_Bidir_path, 7},
188229
{"_cppRouting_Dijkstra_early_stop", (DL_FUNC) &_cppRouting_Dijkstra_early_stop, 6},
189230
{"_cppRouting_Dijkstra_early_stop_path", (DL_FUNC) &_cppRouting_Dijkstra_early_stop_path, 7},

src/RcppExports.o

1.75 KB
Binary file not shown.

src/bidir_astar2.cpp

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
#include <iostream>
2+
#include <queue>
3+
#include <vector>
4+
#include <fstream>
5+
#include <limits>
6+
#include <functional>
7+
#include <Rcpp.h>
8+
9+
10+
11+
12+
using namespace std;
13+
14+
// [[Rcpp::plugins(cpp11)]]
15+
// [[Rcpp::export]]
16+
17+
Rcpp::NumericVector NBA(std::vector<int> dep, std::vector<int> arr,std::vector<int> gfrom,std::vector<int> gto,std::vector<double> gw,int NbNodes,std::vector<double> lat,std::vector<double> lon,double k){
18+
19+
20+
Rcpp::NumericVector result(dep.size());
21+
22+
23+
24+
25+
struct comp{
26+
27+
bool operator()(const std::pair<int, double> &a, const std::pair<int, double> &b){
28+
return a.second > b.second;
29+
}
30+
};
31+
32+
//Graphs
33+
34+
int NbEdges=gfrom.size();
35+
36+
std::vector<std::vector<std::pair<int, double> > > G(NbNodes);
37+
std::vector<std::vector<std::pair<int, double> > > Gr(NbNodes);
38+
39+
for (unsigned int i = 0; i < NbEdges; ++i) {
40+
41+
G[gfrom[i]].push_back(std::make_pair(gto[i], gw[i]));
42+
Gr[gto[i]].push_back(std::make_pair(gfrom[i], gw[i]));
43+
44+
45+
}
46+
47+
48+
//Boucle sur chaque trajet
49+
50+
for (unsigned int j=0; j!=dep.size();j++){
51+
if (j % 256){
52+
Rcpp::checkUserInterrupt ();
53+
}
54+
55+
int StartNode=dep[j];
56+
int EndNode=arr[j];
57+
double lata=lat[EndNode];
58+
double lona=lon[EndNode];
59+
double lata2=lat[StartNode];
60+
double lona2=lon[StartNode];
61+
62+
63+
std::vector<double> Distances(NbNodes, std::numeric_limits<double>::max());
64+
//std::vector<double> Dh(NbNodes, std::numeric_limits<double>::max());
65+
std::vector<double> Distances2(NbNodes, std::numeric_limits<double>::max());
66+
//std::vector<double> Dh2(NbNodes, std::numeric_limits<double>::max());
67+
vector <int> Visited(NbNodes,0);
68+
vector <int> Visited1check(NbNodes,0);
69+
vector <int> Visited2check(NbNodes,0);
70+
Distances[StartNode] = 0.0;
71+
Visited1check[StartNode]=1;
72+
//Dh[StartNode]=sqrt(pow(lat[StartNode]-lata,2)+pow(lon[StartNode]-lona,2))/k;
73+
Distances2[EndNode] = 0.0;
74+
Visited2check[EndNode]=1;
75+
//Dh2[EndNode]=sqrt(pow(lat[EndNode]-lata2,2)+pow(lon[EndNode]-lona2,2))/k;
76+
77+
std::vector<int> Parents(NbNodes, -1);
78+
std::vector<int> Parents2(NbNodes, -1);
79+
80+
81+
82+
83+
priority_queue<std::pair<int, double>, vector<std::pair<int, double> >, comp > Q;
84+
priority_queue<std::pair<int, double>, vector<std::pair<int, double> >, comp > Qr;
85+
Q.push(std::make_pair(StartNode, sqrt(pow(lat[StartNode]-lata,2)+pow(lon[StartNode]-lona,2))/k));
86+
Qr.push(std::make_pair(EndNode, sqrt(pow(lat[EndNode]-lata2,2)+pow(lon[EndNode]-lona2,2))/k));
87+
88+
89+
90+
//double Pr=0.5*sqrt(pow(lat[StartNode]-lata,2)+pow(lon[StartNode]-lona,2))/k;
91+
double total1=sqrt(pow(lata2-lata,2)+pow(lona2-lona,2))/k;
92+
double total2=sqrt(pow(lata2-lata,2)+pow(lona2-lona,2))/k;
93+
int mid;
94+
double mu=std::numeric_limits<double>::max();
95+
96+
while (!Q.empty() && !Qr.empty()) {
97+
//Forward
98+
if (Q.size() < Qr.size()){
99+
int v=Q.top().first;
100+
Q.pop();
101+
if (Visited[v]==0){
102+
Visited[v]=1;
103+
104+
if ((Distances[v] + sqrt(pow(lat[v]-lata,2)+pow(lon[v]-lona,2))/k) >= mu || (Distances[v] + total2 - sqrt(pow(lat[v]-lata2,2)+pow(lon[v]-lona2,2))/k) >= mu){}
105+
106+
else {
107+
for (int i=0; i < G[v].size(); i++){
108+
int v2=G[v][i].first;
109+
double w2=G[v][i].second;
110+
if (Visited[v2]==1){
111+
continue;
112+
}
113+
double tentative=Distances[v]+w2;
114+
115+
if (Visited1check[v2]==0 || Distances[v2] > tentative){
116+
Distances[v2]=tentative;
117+
Visited1check[v2]=1;
118+
Parents[v2]=v;
119+
Q.push(std::make_pair(v2, tentative + sqrt(pow(lat[v2]-lata,2)+pow(lon[v2]-lona,2))/k));
120+
121+
if (Visited2check[v2]==1){
122+
double temp=tentative + Distances2[v2];
123+
if (mu > temp){
124+
mu=temp;
125+
mid=v2;
126+
127+
}
128+
}
129+
130+
}
131+
132+
}
133+
}
134+
135+
if (!Q.empty()){
136+
total1=Q.top().second;
137+
}
138+
139+
140+
}
141+
}
142+
143+
//Backward
144+
else {
145+
146+
int vv=Qr.top().first;
147+
148+
Qr.pop();
149+
150+
if (Visited[vv]==0){
151+
152+
Visited[vv]=1;
153+
154+
if ((Distances2[vv] + sqrt(pow(lat[vv]-lata2,2)+pow(lon[vv]-lona2,2))/k) >= mu || (Distances2[vv] + total1 - sqrt(pow(lat[vv]-lata,2)+pow(lon[vv]-lona,2))/k) >= mu){}
155+
156+
else {
157+
for (int i=0; i < Gr[vv].size(); i++){
158+
int vv2=Gr[vv][i].first;
159+
double ww2=Gr[vv][i].second;
160+
if (Visited[vv2]==1){
161+
continue;
162+
}
163+
double tentative=Distances2[vv]+ww2;
164+
165+
if (Visited2check[vv2]==0 || Distances2[vv2] > tentative){
166+
Distances2[vv2]=tentative;
167+
Visited2check[vv2]=1;
168+
Parents2[vv2]=vv;
169+
Qr.push(std::make_pair(vv2, tentative + sqrt(pow(lat[vv2]-lata2,2)+pow(lon[vv2]-lona2,2))/k));
170+
171+
if (Visited1check[vv2]==1){
172+
double temp=tentative + Distances[vv2];
173+
if (mu > temp){
174+
mu=temp;
175+
mid=vv2;
176+
177+
}
178+
}
179+
180+
}
181+
182+
}
183+
}
184+
185+
if (!Qr.empty()){
186+
total2=Qr.top().second;
187+
}
188+
189+
}
190+
}
191+
192+
193+
}
194+
195+
196+
if (mu>=std::numeric_limits<double>::max()){
197+
result[j] = Rcpp::NumericVector::get_na();
198+
}
199+
else {
200+
result[j]=mu;
201+
}
202+
203+
204+
205+
}
206+
207+
208+
return result;
209+
210+
}
211+
212+

src/bidir_astar2.o

32.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)