diff --git a/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
index d8e0c3d1c..e1ece576f 100644
--- a/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
+++ b/Analysis/0307_red_yellow/0307_red_yellow_2.ipynb
@@ -87,7 +87,7 @@
"
0 | \n",
" 178 | \n",
" c30 | \n",
- " 1704418730 | \n",
+ " 1704416690 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -100,7 +100,7 @@
" 1 | \n",
" 178 | \n",
" c30 | \n",
- " 1704418730 | \n",
+ " 1704416690 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -113,7 +113,7 @@
" 2 | \n",
" 178 | \n",
" c30 | \n",
- " 1704418730 | \n",
+ " 1704416690 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -126,7 +126,7 @@
" 0 | \n",
" 178 | \n",
" c30 | \n",
- " 1704418730 | \n",
+ " 1704416690 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -139,7 +139,7 @@
" 1 | \n",
" 178 | \n",
" c30 | \n",
- " 1704418730 | \n",
+ " 1704416690 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -165,7 +165,7 @@
" 2 | \n",
" 210 | \n",
" u60 | \n",
- " 1704419299 | \n",
+ " 1704417140 | \n",
" 3 | \n",
" 3 | \n",
" 7 | \n",
@@ -178,7 +178,7 @@
" 0 | \n",
" 210 | \n",
" u60 | \n",
- " 1704419299 | \n",
+ " 1704417140 | \n",
" 3 | \n",
" 3 | \n",
" 7 | \n",
@@ -191,7 +191,7 @@
" 1 | \n",
" 210 | \n",
" u60 | \n",
- " 1704419299 | \n",
+ " 1704417140 | \n",
" 3 | \n",
" 3 | \n",
" 7 | \n",
@@ -204,7 +204,7 @@
" 2 | \n",
" 210 | \n",
" u60 | \n",
- " 1704419299 | \n",
+ " 1704417140 | \n",
" 4 | \n",
" 4 | \n",
" 8 | \n",
@@ -217,7 +217,7 @@
" 237 | \n",
" 210 | \n",
" u60 | \n",
- " 1704419299 | \n",
+ " 1704417140 | \n",
" 4 | \n",
" 4 | \n",
" 8 | \n",
@@ -233,17 +233,17 @@
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
- "0 178 c30 1704418730 1 1 8 4 33 \n",
- "1 178 c30 1704418730 1 1 8 4 4 \n",
- "2 178 c30 1704418730 2 2 7 3 1 \n",
- "0 178 c30 1704418730 2 2 7 3 34 \n",
- "1 178 c30 1704418730 2 2 7 3 4 \n",
+ "0 178 c30 1704416690 1 1 8 4 33 \n",
+ "1 178 c30 1704416690 1 1 8 4 4 \n",
+ "2 178 c30 1704416690 2 2 7 3 1 \n",
+ "0 178 c30 1704416690 2 2 7 3 34 \n",
+ "1 178 c30 1704416690 2 2 7 3 4 \n",
".. ... ... ... ... ... ... ... ... \n",
- "2 210 u60 1704419299 3 3 7 4 1 \n",
- "0 210 u60 1704419299 3 3 7 4 65 \n",
- "1 210 u60 1704419299 3 3 7 4 4 \n",
- "2 210 u60 1704419299 4 4 8 3 1 \n",
- "237 210 u60 1704419299 4 4 8 3 19 \n",
+ "2 210 u60 1704417140 3 3 7 4 1 \n",
+ "0 210 u60 1704417140 3 3 7 4 65 \n",
+ "1 210 u60 1704417140 3 3 7 4 4 \n",
+ "2 210 u60 1704417140 4 4 8 3 1 \n",
+ "237 210 u60 1704417140 4 4 8 3 19 \n",
"\n",
" state phase_sumo \n",
"0 gggggg 0_g \n",
@@ -372,88 +372,249 @@
" \n",
" | \n",
" inter_no | \n",
- " node_id | \n",
" start_unix | \n",
" phas_A | \n",
" phas_B | \n",
" move_A | \n",
" move_B | \n",
" duration | \n",
+ " node_id | \n",
" state_A | \n",
" state_B | \n",
"
\n",
" \n",
" \n",
" \n",
- " 0 | \n",
+ " 10 | \n",
" 175 | \n",
- " i0 | \n",
- " 1704418520 | \n",
+ " 1704416540 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
" 4 | \n",
" 43 | \n",
+ " i0 | \n",
" grrrgrrrgGGGGrgrr | \n",
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 1 | \n",
+ " 11 | \n",
" 175 | \n",
- " i0 | \n",
- " 1704418520 | \n",
+ " 1704416540 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
" 3 | \n",
- " 45 | \n",
+ " 46 | \n",
+ " i0 | \n",
" grrGgrrrgrrrrrgrr | \n",
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 2 | \n",
+ " 12 | \n",
" 175 | \n",
- " i0 | \n",
- " 1704418520 | \n",
+ " 1704416540 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
" 1 | \n",
" 33 | \n",
+ " i0 | \n",
" grrrgGGrgrrrrrgrr | \n",
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 3 | \n",
+ " 13 | \n",
" 175 | \n",
- " i0 | \n",
- " 1704418520 | \n",
+ " 1704416540 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
" 2 | \n",
- " 22 | \n",
+ " 23 | \n",
+ " i0 | \n",
" grrrgGGrgrrrrrgrr | \n",
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 4 | \n",
+ " 14 | \n",
" 175 | \n",
- " i0 | \n",
- " 1704418520 | \n",
+ " 1704416540 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
" 37 | \n",
+ " i0 | \n",
" grrrgrrrgrrrrrgrG | \n",
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 62 | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 255 | \n",
+ " 201 | \n",
+ " 1704417410 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 8 | \n",
+ " 3 | \n",
+ " 33 | \n",
+ " i8 | \n",
+ " grrrrrrrgGGrgrrr | \n",
+ " grrrrrrrgrrGgrrr | \n",
+ "
\n",
+ " \n",
+ " 256 | \n",
+ " 201 | \n",
+ " 1704417410 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " 5 | \n",
+ " 2 | \n",
+ " 36 | \n",
+ " i8 | \n",
+ " grrrrrrrgrrrgrrG | \n",
+ " grrrrrrrgrrrgGGr | \n",
+ "
\n",
+ " \n",
+ " 257 | \n",
+ " 201 | \n",
+ " 1704417410 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " 6 | \n",
+ " 2 | \n",
+ " 25 | \n",
+ " i8 | \n",
+ " grrrGGGrgrrrgrrr | \n",
+ " grrrrrrrgrrrgGGr | \n",
+ "
\n",
+ " \n",
+ " 258 | \n",
+ " 201 | \n",
+ " 1704417410 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ " 6 | \n",
+ " 1 | \n",
+ " 58 | \n",
+ " i8 | \n",
+ " grrrGGGrgrrrgrrr | \n",
+ " grrrrrrGgrrrgrrr | \n",
+ "
\n",
+ " \n",
+ " 259 | \n",
+ " 201 | \n",
+ " 1704417410 | \n",
+ " 5 | \n",
+ " 5 | \n",
+ " 7 | \n",
+ " 4 | \n",
+ " 18 | \n",
+ " i8 | \n",
+ " grrGrrrrgrrrgrrr | \n",
+ " gGGrrrrrgrrrgrrr | \n",
+ "
\n",
+ " \n",
+ "\n",
+ "203 rows × 10 columns
\n",
+ ""
+ ],
+ "text/plain": [
+ " inter_no start_unix phas_A phas_B move_A move_B duration node_id \\\n",
+ "10 175 1704416540 1 1 8 4 43 i0 \n",
+ "11 175 1704416540 2 2 7 3 46 i0 \n",
+ "12 175 1704416540 3 3 6 1 33 i0 \n",
+ "13 175 1704416540 3 4 6 2 23 i0 \n",
+ "14 175 1704416540 4 4 5 2 37 i0 \n",
+ ".. ... ... ... ... ... ... ... ... \n",
+ "255 201 1704417410 1 1 8 3 33 i8 \n",
+ "256 201 1704417410 2 2 5 2 36 i8 \n",
+ "257 201 1704417410 3 3 6 2 25 i8 \n",
+ "258 201 1704417410 4 4 6 1 58 i8 \n",
+ "259 201 1704417410 5 5 7 4 18 i8 \n",
+ "\n",
+ " state_A state_B \n",
+ "10 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "11 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "12 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "13 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "14 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ ".. ... ... \n",
+ "255 grrrrrrrgGGrgrrr grrrrrrrgrrGgrrr \n",
+ "256 grrrrrrrgrrrgrrG grrrrrrrgrrrgGGr \n",
+ "257 grrrGGGrgrrrgrrr grrrrrrrgrrrgGGr \n",
+ "258 grrrGGGrgrrrgrrr grrrrrrGgrrrgrrr \n",
+ "259 grrGrrrrgrrrgrrr gGGrrrrrgrrrgrrr \n",
+ "\n",
+ "[203 rows x 10 columns]"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.histid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " node_id | \n",
+ " start_unix | \n",
+ " phas_A | \n",
+ " phas_B | \n",
+ " move_A | \n",
+ " move_B | \n",
+ " duration | \n",
+ " state_A | \n",
+ " state_B | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 44 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418699 | \n",
+ " 1704416540 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -463,23 +624,23 @@
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 63 | \n",
+ " 45 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418699 | \n",
+ " 1704416540 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
" 3 | \n",
- " 45 | \n",
+ " 46 | \n",
" grrGgrrrgrrrrrgrr | \n",
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 64 | \n",
+ " 46 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418699 | \n",
+ " 1704416540 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
@@ -489,23 +650,23 @@
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 65 | \n",
+ " 47 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418699 | \n",
+ " 1704416540 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
" 2 | \n",
- " 22 | \n",
+ " 23 | \n",
" grrrgGGrgrrrrrgrr | \n",
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 66 | \n",
+ " 48 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418699 | \n",
+ " 1704416540 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
@@ -515,10 +676,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 131 | \n",
+ " 109 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418880 | \n",
+ " 1704416720 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -528,10 +689,10 @@
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 132 | \n",
+ " 110 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418880 | \n",
+ " 1704416720 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -541,10 +702,10 @@
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 133 | \n",
+ " 111 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418880 | \n",
+ " 1704416720 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
@@ -554,10 +715,10 @@
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 134 | \n",
+ " 112 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418880 | \n",
+ " 1704416720 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
@@ -567,10 +728,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 135 | \n",
+ " 113 | \n",
" 175 | \n",
" i0 | \n",
- " 1704418880 | \n",
+ " 1704416720 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
@@ -580,10 +741,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 193 | \n",
+ " 173 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419060 | \n",
+ " 1704416900 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -593,10 +754,10 @@
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 194 | \n",
+ " 174 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419060 | \n",
+ " 1704416900 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -606,10 +767,10 @@
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 195 | \n",
+ " 175 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419060 | \n",
+ " 1704416900 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
@@ -619,10 +780,10 @@
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 196 | \n",
+ " 176 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419060 | \n",
+ " 1704416900 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
@@ -632,10 +793,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 197 | \n",
+ " 177 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419060 | \n",
+ " 1704416900 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
@@ -645,10 +806,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 259 | \n",
+ " 244 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419240 | \n",
+ " 1704417080 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -658,10 +819,10 @@
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 260 | \n",
+ " 245 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419240 | \n",
+ " 1704417080 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -671,10 +832,10 @@
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 261 | \n",
+ " 246 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419240 | \n",
+ " 1704417080 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
@@ -684,10 +845,10 @@
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 262 | \n",
+ " 247 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419240 | \n",
+ " 1704417080 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
@@ -697,10 +858,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 263 | \n",
+ " 248 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419240 | \n",
+ " 1704417080 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
@@ -710,10 +871,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 337 | \n",
+ " 306 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419420 | \n",
+ " 1704417260 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
@@ -723,10 +884,10 @@
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 338 | \n",
+ " 307 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419420 | \n",
+ " 1704417260 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
@@ -736,10 +897,10 @@
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 339 | \n",
+ " 308 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419420 | \n",
+ " 1704417260 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
@@ -749,10 +910,10 @@
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 340 | \n",
+ " 309 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419420 | \n",
+ " 1704417260 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
@@ -762,10 +923,10 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 341 | \n",
+ " 310 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419420 | \n",
+ " 1704417260 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
@@ -775,67 +936,67 @@
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 380 | \n",
+ " 357 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419520 | \n",
+ " 1704417420 | \n",
" 1 | \n",
" 1 | \n",
" 8 | \n",
" 4 | \n",
- " 24 | \n",
+ " 38 | \n",
" grrrgrrrgGGGGrgrr | \n",
" gGGrgrrrgrrrrrgrr | \n",
"
\n",
" \n",
- " 381 | \n",
+ " 358 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419520 | \n",
+ " 1704417420 | \n",
" 2 | \n",
" 2 | \n",
" 7 | \n",
" 3 | \n",
- " 25 | \n",
+ " 40 | \n",
" grrGgrrrgrrrrrgrr | \n",
" grrrgrrrgrrrrGgrr | \n",
"
\n",
" \n",
- " 382 | \n",
+ " 359 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419520 | \n",
+ " 1704417420 | \n",
" 3 | \n",
" 3 | \n",
" 6 | \n",
" 1 | \n",
- " 18 | \n",
+ " 29 | \n",
" grrrgGGrgrrrrrgrr | \n",
" grrrgrrGgrrrrrgrr | \n",
"
\n",
" \n",
- " 383 | \n",
+ " 360 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419520 | \n",
+ " 1704417420 | \n",
" 3 | \n",
" 4 | \n",
" 6 | \n",
" 2 | \n",
- " 13 | \n",
+ " 20 | \n",
" grrrgGGrgrrrrrgrr | \n",
" grrrgrrrgrrrrrgGr | \n",
"
\n",
" \n",
- " 384 | \n",
+ " 361 | \n",
" 175 | \n",
" i0 | \n",
- " 1704419520 | \n",
+ " 1704417420 | \n",
" 4 | \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
- " 20 | \n",
+ " 33 | \n",
" grrrgrrrgrrrrrgrG | \n",
" grrrgrrrgrrrrrgGr | \n",
"
\n",
@@ -845,81 +1006,71 @@
],
"text/plain": [
" inter_no node_id start_unix phas_A phas_B move_A move_B duration \\\n",
- "0 175 i0 1704418520 1 1 8 4 43 \n",
- "1 175 i0 1704418520 2 2 7 3 45 \n",
- "2 175 i0 1704418520 3 3 6 1 33 \n",
- "3 175 i0 1704418520 3 4 6 2 22 \n",
- "4 175 i0 1704418520 4 4 5 2 37 \n",
- "62 175 i0 1704418699 1 1 8 4 43 \n",
- "63 175 i0 1704418699 2 2 7 3 45 \n",
- "64 175 i0 1704418699 3 3 6 1 33 \n",
- "65 175 i0 1704418699 3 4 6 2 22 \n",
- "66 175 i0 1704418699 4 4 5 2 37 \n",
- "131 175 i0 1704418880 1 1 8 4 43 \n",
- "132 175 i0 1704418880 2 2 7 3 45 \n",
- "133 175 i0 1704418880 3 3 6 1 33 \n",
- "134 175 i0 1704418880 3 4 6 2 22 \n",
- "135 175 i0 1704418880 4 4 5 2 37 \n",
- "193 175 i0 1704419060 1 1 8 4 43 \n",
- "194 175 i0 1704419060 2 2 7 3 45 \n",
- "195 175 i0 1704419060 3 3 6 1 33 \n",
- "196 175 i0 1704419060 3 4 6 2 22 \n",
- "197 175 i0 1704419060 4 4 5 2 37 \n",
- "259 175 i0 1704419240 1 1 8 4 43 \n",
- "260 175 i0 1704419240 2 2 7 3 45 \n",
- "261 175 i0 1704419240 3 3 6 1 33 \n",
- "262 175 i0 1704419240 3 4 6 2 22 \n",
- "263 175 i0 1704419240 4 4 5 2 37 \n",
- "337 175 i0 1704419420 1 1 8 4 43 \n",
- "338 175 i0 1704419420 2 2 7 3 45 \n",
- "339 175 i0 1704419420 3 3 6 1 33 \n",
- "340 175 i0 1704419420 3 4 6 2 22 \n",
- "341 175 i0 1704419420 4 4 5 2 37 \n",
- "380 175 i0 1704419520 1 1 8 4 24 \n",
- "381 175 i0 1704419520 2 2 7 3 25 \n",
- "382 175 i0 1704419520 3 3 6 1 18 \n",
- "383 175 i0 1704419520 3 4 6 2 13 \n",
- "384 175 i0 1704419520 4 4 5 2 20 \n",
+ "44 175 i0 1704416540 1 1 8 4 43 \n",
+ "45 175 i0 1704416540 2 2 7 3 46 \n",
+ "46 175 i0 1704416540 3 3 6 1 33 \n",
+ "47 175 i0 1704416540 3 4 6 2 23 \n",
+ "48 175 i0 1704416540 4 4 5 2 37 \n",
+ "109 175 i0 1704416720 1 1 8 4 43 \n",
+ "110 175 i0 1704416720 2 2 7 3 45 \n",
+ "111 175 i0 1704416720 3 3 6 1 33 \n",
+ "112 175 i0 1704416720 3 4 6 2 22 \n",
+ "113 175 i0 1704416720 4 4 5 2 37 \n",
+ "173 175 i0 1704416900 1 1 8 4 43 \n",
+ "174 175 i0 1704416900 2 2 7 3 45 \n",
+ "175 175 i0 1704416900 3 3 6 1 33 \n",
+ "176 175 i0 1704416900 3 4 6 2 22 \n",
+ "177 175 i0 1704416900 4 4 5 2 37 \n",
+ "244 175 i0 1704417080 1 1 8 4 43 \n",
+ "245 175 i0 1704417080 2 2 7 3 45 \n",
+ "246 175 i0 1704417080 3 3 6 1 33 \n",
+ "247 175 i0 1704417080 3 4 6 2 22 \n",
+ "248 175 i0 1704417080 4 4 5 2 37 \n",
+ "306 175 i0 1704417260 1 1 8 4 43 \n",
+ "307 175 i0 1704417260 2 2 7 3 45 \n",
+ "308 175 i0 1704417260 3 3 6 1 33 \n",
+ "309 175 i0 1704417260 3 4 6 2 22 \n",
+ "310 175 i0 1704417260 4 4 5 2 37 \n",
+ "357 175 i0 1704417420 1 1 8 4 38 \n",
+ "358 175 i0 1704417420 2 2 7 3 40 \n",
+ "359 175 i0 1704417420 3 3 6 1 29 \n",
+ "360 175 i0 1704417420 3 4 6 2 20 \n",
+ "361 175 i0 1704417420 4 4 5 2 33 \n",
"\n",
" state_A state_B \n",
- "0 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "1 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "2 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "3 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "4 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "62 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "63 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "64 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "65 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "66 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "131 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "132 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "133 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "134 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "135 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "193 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "194 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "195 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "196 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "197 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "259 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "260 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "261 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "262 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "263 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "337 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "338 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "339 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "340 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "341 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
- "380 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
- "381 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
- "382 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
- "383 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
- "384 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr "
+ "44 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "45 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "46 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "47 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "48 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ "109 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "110 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "111 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "112 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "113 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ "173 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "174 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "175 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "176 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "177 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ "244 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "245 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "246 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "247 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "248 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ "306 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "307 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "308 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "309 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "310 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr \n",
+ "357 grrrgrrrgGGGGrgrr gGGrgrrrgrrrrrgrr \n",
+ "358 grrGgrrrgrrrrrgrr grrrgrrrgrrrrGgrr \n",
+ "359 grrrgGGrgrrrrrgrr grrrgrrGgrrrrrgrr \n",
+ "360 grrrgGGrgrrrrrgrr grrrgrrrgrrrrrgGr \n",
+ "361 grrrgrrrgrrrrrgrG grrrgrrrgrrrrrgGr "
]
},
- "execution_count": 8,
+ "execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
@@ -1209,6 +1360,7 @@
"metadata": {},
"outputs": [],
"source": [
+ "# 5-2-1 helper function of 5-2\n",
"def get_red(pre_state:str, cur_state:str):\n",
" assert len(pre_state) == len(cur_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n",
" state_r = ''\n",
@@ -1223,6 +1375,7 @@
" raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n",
" return state_r\n",
"\n",
+ "# 5-2-2 helper function of 5-2\n",
"def get_yellow(cur_state:str, nex_state:str):\n",
" assert len(cur_state) == len(nex_state), \"cur_state, nex_state의 길이가 서로 다릅니다.\"\n",
" state_y = ''\n",
@@ -1237,6 +1390,7 @@
" raise ValueError(f\"예상치 못한 신호조합: current={c}, next={n}\")\n",
" return state_y\n",
"\n",
+ "# 5-2-3 helper function of 5-2\n",
"def cumulate(sig, alph):\n",
" csig = [] # cumulated sig\n",
" pre = pd.Series({f'phas_{alph}':None})\n",
@@ -1302,14 +1456,14 @@
},
{
"cell_type": "code",
- "execution_count": 80,
+ "execution_count": 89,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "0.6265964508056641\n"
+ "0.6227824687957764\n"
]
}
],
@@ -1318,7 +1472,7 @@
"now = time.time()\n",
"self.SIGTABLE = []\n",
"for node_id in self.sigtable.node_id.unique():\n",
- " sig = self.sigtable.query('node_id==@Node_id')\n",
+ " sig = self.sigtable.query('node_id==@node_id')\n",
" for i, row in sig.iterrows():\n",
" inter_no = row.inter_no\n",
" phas_A = row.phas_A\n",
@@ -1368,6 +1522,1766 @@
"self.SIGTABLE\n",
"print(time.time() - now)"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n",
+ "2. 중간산출물을 생성합니다.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:14<00:00, 1200.17it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2-1. 매칭 테이블들을 생성했습니다.\n",
+ "2-2. 비보호우회전(g)을 배정했습니다.\n",
+ "2-3. 직진 및 좌회전(G)을 배정했습니다.\n",
+ "2-2. node2num_cycles.json를 저장했습니다.\n",
+ "3. 이슈사항을 저장합니다.\n"
+ ]
+ }
+ ],
+ "source": [
+ "self = DailyPreprocessor()\n",
+ "self.main()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 97,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1. 데이터를 로드합니다.\n",
+ "1-1. 네트워크가 로드되었습니다.\n",
+ "1-2. 테이블들이 로드되었습니다.\n",
+ "1-3. 네트워크의 모든 clean state requirement들을 체크했습니다.\n",
+ "1-4. 테이블들의 무결성 검사를 완료했습니다.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:15<00:00, 1135.80it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "self.load_data()\n",
+ "self.make_match1()\n",
+ "self.make_match2()\n",
+ "self.make_match3()\n",
+ "self.make_match4()\n",
+ "self.make_match5()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 0%| | 0/17280 [00:00, ?it/s]"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "이동류정보 불러오는 중: 100%|██████████| 17280/17280 [00:13<00:00, 1274.30it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2-1. 매칭 테이블들을 생성했습니다.\n"
+ ]
+ }
+ ],
+ "source": [
+ "self.get_matches()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2-2. 비보호우회전(g)을 배정했습니다.\n"
+ ]
+ }
+ ],
+ "source": [
+ "self.initialize_state()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g', 'g']"
+ ]
+ },
+ "execution_count": 142,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.nodes = [self.net.getNode(node_id) for node_id in self.node_ids]\n",
+ "self.node2init = {}\n",
+ "# 모든 노드들을 순회\n",
+ "for node in self.nodes:\n",
+ " node_id = node.getID()\n",
+ " # 모든 connection\n",
+ " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
+ " conns = [c for c in conns if c[0] >= 0]\n",
+ " conns = sorted(conns, key=lambda x: x[0])\n",
+ " state = []\n",
+ " # i번째 connection : ci\n",
+ " for i, ci in conns:\n",
+ " if ci.getTLLinkIndex() < 0:\n",
+ " continue\n",
+ " are_foes = False\n",
+ " # j번째 connection : cj\n",
+ " # 합류지점이 다르면서 상충되는 cj가 존재하면 are_foes = True (r)\n",
+ " # 그외의 경우에는 are_foes = False (g)\n",
+ " for j, cj in conns:\n",
+ " # ci, cj의 합류지점이 같으면 통과\n",
+ " if ci.getTo() == cj.getTo():\n",
+ " continue\n",
+ " # ci, cj가 상충되면 are_foes를 True로 지정.\n",
+ " if node.areFoes(i, j):\n",
+ " are_foes = True\n",
+ " break\n",
+ " state.append('r' if are_foes else 'g')\n",
+ " self.node2init[node_id] = state\n",
+ "\n",
+ "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n",
+ "for _, row in self.matching.iterrows():\n",
+ " node_id = row.node_id\n",
+ " move_no = row.move_no\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " if move_no != 21:\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'\n",
+ "\n",
+ "# 연등교차로\n",
+ "for _, row in self.coord.iterrows():\n",
+ " node_id = row.node_id\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " if not (pd.isna(inc_edge) and pd.isna(out_edge)):\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'\n",
+ "\n",
+ "# 유턴교차로\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " node_id = row.child_id\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " if not (pd.isna(inc_edge) and pd.isna(out_edge)):\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'\n",
+ "\n",
+ "self.node2init['u00']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " parent_id | \n",
+ " child_id | \n",
+ " direction | \n",
+ " condition | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " i0 | \n",
+ " u00 | \n",
+ " 북 | \n",
+ " 좌회전시 | \n",
+ " 571500487_02 | \n",
+ " 571500487_01.32 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " i2 | \n",
+ " u20 | \n",
+ " 북 | \n",
+ " 보행신호시 | \n",
+ " 571542810_01.51 | \n",
+ " 571542810_02 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " i3 | \n",
+ " u30 | \n",
+ " 북 | \n",
+ " 보행신호시 | \n",
+ " 571556452_01 | \n",
+ " 571556452_02 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " i3 | \n",
+ " u31 | \n",
+ " 동 | \n",
+ " 보행신호시 | \n",
+ " 571500475_02 | \n",
+ " 571500475_01.26 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " i3 | \n",
+ " u32 | \n",
+ " 서 | \n",
+ " 보행신호시 | \n",
+ " 571540303_02 | \n",
+ " -571540303_02 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " i6 | \n",
+ " u60 | \n",
+ " 서 | \n",
+ " 좌회전시 | \n",
+ " 571500535_02 | \n",
+ " -571500535_02 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " parent_id child_id direction condition inc_edge out_edge\n",
+ "0 i0 u00 북 좌회전시 571500487_02 571500487_01.32\n",
+ "1 i2 u20 북 보행신호시 571542810_01.51 571542810_02\n",
+ "2 i3 u30 북 보행신호시 571556452_01 571556452_02\n",
+ "3 i3 u31 동 보행신호시 571500475_02 571500475_01.26\n",
+ "4 i3 u32 서 보행신호시 571540303_02 -571540303_02\n",
+ "5 i6 u60 서 좌회전시 571500535_02 -571500535_02"
+ ]
+ },
+ "execution_count": 135,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.uturn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'c30': ['g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'i0': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i1': ['g', 'r', 'r', 'r', 'r', 'r', 'r', 'g', 'r', 'r'],\n",
+ " 'i2': ['r', 'r', 'g', 'r', 'r', 'r', 'r'],\n",
+ " 'i3': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i6': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i7': ['r', 'r', 'r', 'g', 'g', 'r', 'r'],\n",
+ " 'i8': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i9': ['r', 'r', 'r', 'r'],\n",
+ " 'u00': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g', 'g'],\n",
+ " 'u20': ['g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u30': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'],\n",
+ " 'u31': ['g', 'g', 'g', 'g', 'r', 'g', 'g', 'g'],\n",
+ " 'u32': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'r'],\n",
+ " 'u60': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'r']}"
+ ]
+ },
+ "execution_count": 108,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.node2init"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "self.node2inter = dict(zip(self.inter_node['node_id'], self.inter_node['inter_no']))\n",
+ "\n",
+ "self.parent_ids = sorted(self.inter_node[self.inter_node.inter_type=='parent'].node_id.unique())\n",
+ "self.child_ids = sorted(self.inter_node[self.inter_node.inter_type=='child'].node_id.unique())\n",
+ "self.uturn_ids = sorted(self.uturn.child_id.unique())\n",
+ "self.coord_ids = sorted(self.coord.child_id.unique())\n",
+ "\n",
+ "ch2pa = {} # child to parent\n",
+ "for child_id in self.child_ids:\n",
+ " parent_no = self.inter_node[self.inter_node.node_id==child_id].inter_no.iloc[0]\n",
+ " sub_inter_node = self.inter_node[self.inter_node.inter_no==parent_no]\n",
+ " ch2pa[child_id] = sub_inter_node[sub_inter_node.inter_type=='parent'].iloc[0].node_id\n",
+ "directions = ['북', '북동', '동', '남동', '남', '남서', '서', '북서'] # 정북기준 시계방향으로 8방향\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# 각 uturn node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "cmatches = []\n",
+ "for _, row in self.uturn.iterrows():\n",
+ " child_id = row.child_id\n",
+ " parent_id = row.parent_id\n",
+ " direction = row.direction\n",
+ " condition = row.condition\n",
+ " inc_edge_id = row.inc_edge\n",
+ " out_edge_id = row.out_edge\n",
+ " # match5에서 parent_id에 해당하는 행들을 가져옴\n",
+ " cmatch = self.match5.copy()[self.match5.node_id==parent_id] # match dataframe for a child node\n",
+ " cmatch = cmatch.sort_values(by=['phase_no', 'ring_type']).reset_index(drop=True)\n",
+ " cmatch['node_id'] = child_id\n",
+ " cmatch[['inc_edge', 'out_edge']] = np.nan\n",
+ "\n",
+ " # condition 별로 inc_dire, out_dire_A, out_dire_B를 정함\n",
+ " ind = directions.index(direction)\n",
+ " if condition == \"좌회전시\":\n",
+ " inc_dire = direction\n",
+ " out_dire_A = out_dire_B = directions[(ind + 2) % len(directions)]\n",
+ " elif condition == \"보행신호시\":\n",
+ " inc_dire = directions[(ind + 2) % len(directions)]\n",
+ " out_dire_A = directions[(ind - 2) % len(directions)]\n",
+ " out_dire_B = directions[(ind - 2) % len(directions)]\n",
+ "\n",
+ " # (inc_dire, out_dire_A, out_dire_B) 별로 inc_edge_id, out_edge_id를 정함\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " if condition == '보행신호시':\n",
+ " # 이동류번호가 17(보행신호)이면서 유턴노드방향으로 가는 신호가 없으면 (inc_edge_id, out_edge_id)를 부여한다.\n",
+ " cmatch.loc[(cmatch.move_no==17) & (cmatch.out_dir!=direction), ['inc_edge', 'out_edge']] = [inc_edge_id, out_edge_id]\n",
+ " # 유턴신호의 이동류번호를 19로 부여한다.\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_A), 'move_no'] = 19\n",
+ " cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), 'move_no'] = 19\n",
+ " cmatches.append(cmatch)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 178 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 178 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 178 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_01 | \n",
+ " -571542116_02.96 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 178 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 20 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " 571542116_02.96 | \n",
+ " 571542116_02.164 | \n",
+ " c30 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle \\\n",
+ "0 178 1 A 20 NaN NaN NaN \n",
+ "1 178 1 B 20 NaN NaN NaN \n",
+ "2 178 2 A 20 NaN NaN NaN \n",
+ "3 178 2 B 20 NaN NaN NaN \n",
+ "4 178 3 A 20 NaN NaN NaN \n",
+ "5 178 3 B 20 NaN NaN NaN \n",
+ "6 178 4 A 20 NaN NaN NaN \n",
+ "7 178 4 B 20 NaN NaN NaN \n",
+ "\n",
+ " out_angle inc_edge out_edge node_id \n",
+ "0 NaN NaN NaN c30 \n",
+ "1 NaN NaN NaN c30 \n",
+ "2 NaN 571542116_01 -571542116_02.96 c30 \n",
+ "3 NaN 571542116_02.96 571542116_02.164 c30 \n",
+ "4 NaN 571542116_01 -571542116_02.96 c30 \n",
+ "5 NaN 571542116_02.96 571542116_02.164 c30 \n",
+ "6 NaN 571542116_01 -571542116_02.96 c30 \n",
+ "7 NaN 571542116_02.96 571542116_02.164 c30 "
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "# 각 coordination node에 대하여 (inc_edge_id, out_edge_id) 부여\n",
+ "self.coord['inter_no'] = self.coord['parent_id'].map(self.node2inter)\n",
+ "self.coord = self.coord.rename(columns={'child_id':'node_id'})\n",
+ "self.coord[['inc_dir', 'out_dir', 'inc_angle','out_angle']] = np.nan\n",
+ "self.coord['move_no'] = 20\n",
+ "self.coord = self.coord[['inter_no', 'phase_no', 'ring_type', 'move_no', 'inc_dir', 'out_dir', 'inc_angle','out_angle', 'inc_edge', 'out_edge', 'node_id']]\n",
+ "self.coord"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# display(coord)\n",
+ "cmatches = pd.concat(cmatches)\n",
+ "self.match6 = pd.concat([self.match5, cmatches, self.coord]).drop_duplicates().sort_values(by=['inter_no', 'node_id', 'phase_no', 'ring_type'])\n",
+ "# self.match6.to_csv(os.path.join(self.path_intermediates, 'match6.csv'))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'c30': ['g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'i0': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i1': ['g', 'r', 'r', 'g', 'g', 'g', 'r', 'g', 'r', 'r'],\n",
+ " 'i2': ['g', 'g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'i3': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i6': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i7': ['g', 'g', 'r', 'g', 'g', 'r', 'r'],\n",
+ " 'i8': ['g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'g',\n",
+ " 'r',\n",
+ " 'r',\n",
+ " 'r'],\n",
+ " 'i9': ['g', 'g', 'g', 'g'],\n",
+ " 'u00': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u20': ['g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u30': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u31': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u32': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'],\n",
+ " 'u60': ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g']}"
+ ]
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.node2init"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 95,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "self.node2init = {}\n",
+ "node_id = 'c30'\n",
+ "node = self.net.getNode(node_id)\n",
+ "\n",
+ "node_id = node.getID()\n",
+ "# 모든 connection\n",
+ "conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
+ "conns = [c for c in conns if c[0] >= 0]\n",
+ "conns = sorted(conns, key=lambda x: x[0])\n",
+ "state = []\n",
+ "# i번째 connection : ci\n",
+ "for i, ci in conns:\n",
+ " if ci.getTLLinkIndex() < 0:\n",
+ " continue\n",
+ " are_foes = False\n",
+ " # j번째 connection : cj\n",
+ " # 합류지점이 다르면서 상충되는 cj가 존재하면 are_foes = True (r)\n",
+ " # 그외의 경우에는 are_foes = False (g)\n",
+ " for j, cj in conns:\n",
+ " # ci, cj의 합류지점이 같으면 통과\n",
+ " if ci.getTo() == cj.getTo():\n",
+ " continue\n",
+ " # ci, cj가 상충되면 are_foes를 True로 지정.\n",
+ " if node.areFoes(i, j):\n",
+ " are_foes = True\n",
+ " break\n",
+ " state.append('r' if are_foes else 'g')\n",
+ "self.node2init[node_id] = state"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 96,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "'Series' object has no attribute 'inc_edge'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[96], line 34\u001b[0m\n\u001b[0;32m 32\u001b[0m node_id \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mnode_id\n\u001b[0;32m 33\u001b[0m move_no \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mmove_no\n\u001b[1;32m---> 34\u001b[0m inc_edge \u001b[38;5;241m=\u001b[39m \u001b[43mrow\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minc_edge\u001b[49m\n\u001b[0;32m 35\u001b[0m out_edge \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mout_edge\n\u001b[0;32m 36\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m move_no \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m21\u001b[39m:\n",
+ "File \u001b[1;32mc:\\Github\\sts\\sts\\lib\\site-packages\\pandas\\core\\generic.py:5989\u001b[0m, in \u001b[0;36mNDFrame.__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 5982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 5983\u001b[0m name \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_internal_names_set\n\u001b[0;32m 5984\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m name \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_metadata\n\u001b[0;32m 5985\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m name \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_accessors\n\u001b[0;32m 5986\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_info_axis\u001b[38;5;241m.\u001b[39m_can_hold_identifiers_and_holds_name(name)\n\u001b[0;32m 5987\u001b[0m ):\n\u001b[0;32m 5988\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m[name]\n\u001b[1;32m-> 5989\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mobject\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__getattribute__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n",
+ "\u001b[1;31mAttributeError\u001b[0m: 'Series' object has no attribute 'inc_edge'"
+ ]
+ }
+ ],
+ "source": [
+ "self.nodes = [self.net.getNode(node_id) for node_id in self.node_ids]\n",
+ "self.node2init = {}\n",
+ "# 모든 노드들을 순회\n",
+ "for node in self.nodes:\n",
+ " node_id = node.getID()\n",
+ " # 모든 connection\n",
+ " conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
+ " conns = [c for c in conns if c[0] >= 0]\n",
+ " conns = sorted(conns, key=lambda x: x[0])\n",
+ " state = []\n",
+ " # i번째 connection : ci\n",
+ " for i, ci in conns:\n",
+ " if ci.getTLLinkIndex() < 0:\n",
+ " continue\n",
+ " are_foes = False\n",
+ " # j번째 connection : cj\n",
+ " # 합류지점이 다르면서 상충되는 cj가 존재하면 are_foes = True (r)\n",
+ " # 그외의 경우에는 are_foes = False (g)\n",
+ " for j, cj in conns:\n",
+ " # ci, cj의 합류지점이 같으면 통과\n",
+ " if ci.getTo() == cj.getTo():\n",
+ " continue\n",
+ " # ci, cj가 상충되면 are_foes를 True로 지정.\n",
+ " if node.areFoes(i, j):\n",
+ " are_foes = True\n",
+ " break\n",
+ " state.append('r' if are_foes else 'g')\n",
+ " self.node2init[node_id] = state\n",
+ "\n",
+ "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n",
+ "for _, row in self.matching.iterrows():\n",
+ " node_id = row.node_id\n",
+ " move_no = row.move_no\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " if move_no != 21:\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'\n",
+ "\n",
+ "# 연등교차로에도 마찬가지로 신호가 부여되어 있는 경우에 r 부여\n",
+ "for _, row in self.coord.iterrows():\n",
+ " node_id = row.node_id\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'\n",
+ "\n",
+ "\n",
+ "# json 파일로 저장\n",
+ "with open(os.path.join(self.path_intermediates, 'node2init.json'), 'w') as file:\n",
+ " json.dump(self.node2init, file)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "'Pandas' object has no attribute 'inc_edge'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[48], line 9\u001b[0m\n\u001b[0;32m 7\u001b[0m node_id \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mnode_id\n\u001b[0;32m 8\u001b[0m move_no \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mmove_no\n\u001b[1;32m----> 9\u001b[0m inc_edge \u001b[38;5;241m=\u001b[39m \u001b[43mrow\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minc_edge\u001b[49m\n\u001b[0;32m 10\u001b[0m out_edge \u001b[38;5;241m=\u001b[39m row\u001b[38;5;241m.\u001b[39mout_edge\n\u001b[0;32m 11\u001b[0m state \u001b[38;5;241m=\u001b[39m copy\u001b[38;5;241m.\u001b[39mdeepcopy(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnode2init)[node_id]\n",
+ "\u001b[1;31mAttributeError\u001b[0m: 'Pandas' object has no attribute 'inc_edge'"
+ ]
+ }
+ ],
+ "source": [
+ "import copy\n",
+ "# assign signals on matching\n",
+ "self.matching['init_state'] = self.matching['node_id'].map(self.node2init)\n",
+ "self.matching['state'] = self.matching['init_state'].map(lambda x:''.join(x))\n",
+ "# matching의 각 행을 순회\n",
+ "for row in self.matching.itertuples(index=True):\n",
+ " node_id = row.node_id\n",
+ " move_no = row.move_no\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " state = copy.deepcopy(self.node2init)[node_id]\n",
+ "\n",
+ " if move_no != 21:\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " state[index] = 'G'\n",
+ " self.matching.at[row.Index, 'state'] = ''.join(state)\n",
+ "\n",
+ "self.matching = self.matching.dropna(subset='state')\n",
+ "self.matching = self.matching.reset_index(drop=True)\n",
+ "self.matching = self.matching[['inter_no', 'node_id', 'move_no', 'state']]\n",
+ "\n",
+ "# assign signals on match6\n",
+ "\n",
+ "self.match6 = self.match6.reset_index(drop=True)\n",
+ "self.match6['init_state'] = self.match6['node_id'].map(self.node2init)\n",
+ "self.match6['state'] = self.match6['init_state'].map(lambda x:''.join(x))\n",
+ "\n",
+ "# match6의 각 행을 순회\n",
+ "for i, row in self.match6.iterrows():\n",
+ " node_id = row.node_id\n",
+ " move_no = row.move_no\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " state = copy.deepcopy(self.node2init)[node_id]\n",
+ " if (pd.isna(inc_edge)) or (pd.isna(out_edge)):\n",
+ " continue\n",
+ " if (move_no != 21):\n",
+ " # print(i, node_id, move_no, ''.join(state))\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " state[index] = 'G'\n",
+ " # print(i, node_id, move_no, index, ''.join(state))\n",
+ " self.match6.at[i, 'state'] = ''.join(state)\n",
+ "\n",
+ "self.match6 = self.match6.dropna(subset='state')\n",
+ "self.match6 = self.match6.reset_index(drop=True)\n",
+ "self.match6 = self.match6[['inter_no', 'node_id', 'phase_no', 'ring_type', 'move_no', 'state']]\n",
+ "self.match6"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 146,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['g', 'g', 'g', 'g', 'g', 'g', 'g']\n"
+ ]
+ },
+ {
+ "ename": "KeyError",
+ "evalue": "'i0'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[146], line 41\u001b[0m\n\u001b[0;32m 39\u001b[0m index \u001b[38;5;241m=\u001b[39m conn\u001b[38;5;241m.\u001b[39mgetTLLinkIndex()\n\u001b[0;32m 40\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m index \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m---> 41\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnode2init\u001b[49m\u001b[43m[\u001b[49m\u001b[43mnode_id\u001b[49m\u001b[43m]\u001b[49m[index] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 43\u001b[0m \u001b[38;5;66;03m# 연등교차로에도 마찬가지로 신호가 부여되어 있는 경우에 r 부여\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _, row \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcoord\u001b[38;5;241m.\u001b[39miterrows():\n",
+ "\u001b[1;31mKeyError\u001b[0m: 'i0'"
+ ]
+ }
+ ],
+ "source": [
+ "node_id = 'i2'\n",
+ "node = self.net.getNode(node_id)\n",
+ "self.node2init = {}\n",
+ "# 모든 connection\n",
+ "conns = [(c.getJunctionIndex(), c) for c in node.getConnections()]\n",
+ "conns = [c for c in conns if c[0] >= 0]\n",
+ "conns = sorted(conns, key=lambda x: x[0])\n",
+ "state = []\n",
+ "# i번째 connection : ci\n",
+ "for i, ci in conns:\n",
+ " if ci.getTLLinkIndex() < 0:\n",
+ " continue\n",
+ " are_foes = False\n",
+ " # j번째 connection : cj\n",
+ " # 합류지점이 다르면서 상충되는 cj가 존재하면 are_foes = True (r)\n",
+ " # 그외의 경우에는 are_foes = False (g)\n",
+ " for j, cj in conns:\n",
+ " # ci, cj의 합류지점이 같으면 통과\n",
+ " if ci.getTo() == cj.getTo():\n",
+ " continue\n",
+ " # ci, cj가 상충되면 are_foes를 True로 지정.\n",
+ " if node.areFoes(i, j):\n",
+ " are_foes = True\n",
+ " break\n",
+ " state.append('r' if are_foes else 'g')\n",
+ "self.node2init[node_id] = state\n",
+ "print(state)\n",
+ "\n",
+ "# 어떤 연결과도 상충이 일어나지는 않지만, 신호가 부여되어 있는 경우에는 r을 부여\n",
+ "for _, row in self.matching.iterrows():\n",
+ " node_id = row.node_id\n",
+ " move_no = row.move_no\n",
+ " inc_edge = row.inc_edge\n",
+ " out_edge = row.out_edge\n",
+ " if move_no != 21:\n",
+ " inc_edge = self.net.getEdge(inc_edge)\n",
+ " out_edge = self.net.getEdge(out_edge)\n",
+ " for conn in inc_edge.getConnections(out_edge):\n",
+ " index = conn.getTLLinkIndex()\n",
+ " if index >= 0:\n",
+ " self.node2init[node_id][index] = 'r'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 161,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 176 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle\n",
+ "14 177 1 A 8 남 북 180 000\n",
+ "15 177 1 B 4 북 남 001 176\n",
+ "16 177 2 A 7 북 동 000 090\n",
+ "17 177 2 B 3 남 서 179 270\n",
+ "18 177 3 A 17 NaN NaN NaN NaN\n",
+ "19 177 3 B 18 NaN NaN NaN NaN\n",
+ "20 177 4 A 5 서 북 268 000\n",
+ "21 177 4 B 1 동 남 090 180"
+ ]
+ },
+ "execution_count": 161,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.match4[self.match4.inter_no==177]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 160,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 176 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " 571542811_02 | \n",
+ " 571542107_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " -571542809_01 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " 571542107_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "14 177 1 A 8 남 북 180 000 \n",
+ "15 177 1 B 4 북 남 001 176 \n",
+ "16 177 2 A 7 북 동 000 090 \n",
+ "17 177 2 B 3 남 서 179 270 \n",
+ "18 177 3 A 17 NaN NaN NaN NaN \n",
+ "19 177 3 B 18 NaN NaN NaN NaN \n",
+ "20 177 4 A 5 서 북 268 000 \n",
+ "21 177 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "14 -571542809_01 571542811_01 i2 \n",
+ "15 571542811_02 571542809_01 i2 \n",
+ "16 571542811_02 571542107_01 i2 \n",
+ "17 -571542809_01 571542809_01 i2 \n",
+ "18 NaN NaN i2 \n",
+ "19 NaN NaN i2 \n",
+ "20 -571542809_01 571542811_01 i2 \n",
+ "21 571542107_02 571542809_01 i2 "
+ ]
+ },
+ "execution_count": 160,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "\n",
+ "self.match5[self.match5.node_id=='i2']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 151,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " phase_no | \n",
+ " ring_type | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_angle | \n",
+ " out_angle | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " A | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " 180 | \n",
+ " 000 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " B | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 001 | \n",
+ " 176 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " A | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 000 | \n",
+ " 090 | \n",
+ " 571542811_02 | \n",
+ " 571542107_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " B | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " 179 | \n",
+ " 270 | \n",
+ " -571542809_01 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " A | \n",
+ " 17 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " B | \n",
+ " 18 | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " A | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " 268 | \n",
+ " 000 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " B | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 090 | \n",
+ " 180 | \n",
+ " 571542107_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no phase_no ring_type move_no inc_dir out_dir inc_angle out_angle \\\n",
+ "14 177 1 A 8 남 북 180 000 \n",
+ "15 177 1 B 4 북 남 001 176 \n",
+ "16 177 2 A 7 북 동 000 090 \n",
+ "17 177 2 B 3 남 서 179 270 \n",
+ "18 177 3 A 17 NaN NaN NaN NaN \n",
+ "19 177 3 B 18 NaN NaN NaN NaN \n",
+ "20 177 4 A 5 서 북 268 000 \n",
+ "21 177 4 B 1 동 남 090 180 \n",
+ "\n",
+ " inc_edge out_edge node_id \n",
+ "14 -571542809_01 571542811_01 i2 \n",
+ "15 571542811_02 571542809_01 i2 \n",
+ "16 571542811_02 571542107_01 i2 \n",
+ "17 -571542809_01 571542809_01 i2 \n",
+ "18 NaN NaN i2 \n",
+ "19 NaN NaN i2 \n",
+ "20 -571542809_01 571542811_01 i2 \n",
+ "21 571542107_02 571542809_01 i2 "
+ ]
+ },
+ "execution_count": 151,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.match5[self.match5.node_id=='i2']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 148,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " inter_no | \n",
+ " move_no | \n",
+ " inc_dir | \n",
+ " out_dir | \n",
+ " inc_edge | \n",
+ " out_edge | \n",
+ " node_id | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 19 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ " 동 | \n",
+ " 남 | \n",
+ " 571542107_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " 177 | \n",
+ " 2 | \n",
+ " 서 | \n",
+ " 동 | \n",
+ " -571542809_01 | \n",
+ " 571542107_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " 177 | \n",
+ " 3 | \n",
+ " 남 | \n",
+ " 서 | \n",
+ " -571542809_01 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " 177 | \n",
+ " 4 | \n",
+ " 북 | \n",
+ " 남 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " 177 | \n",
+ " 5 | \n",
+ " 서 | \n",
+ " 북 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " 177 | \n",
+ " 6 | \n",
+ " 동 | \n",
+ " 서 | \n",
+ " 571542107_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " 177 | \n",
+ " 7 | \n",
+ " 북 | \n",
+ " 동 | \n",
+ " 571542811_02 | \n",
+ " 571542107_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " 177 | \n",
+ " 8 | \n",
+ " 남 | \n",
+ " 북 | \n",
+ " -571542809_01 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " 177 | \n",
+ " 21 | \n",
+ " 북 | \n",
+ " 서 | \n",
+ " 571542811_02 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " 177 | \n",
+ " 21 | \n",
+ " 서 | \n",
+ " 남 | \n",
+ " -571542809_01 | \n",
+ " 571542809_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " 177 | \n",
+ " 21 | \n",
+ " 남 | \n",
+ " 동 | \n",
+ " -571542809_01 | \n",
+ " 571542107_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ " 30 | \n",
+ " 177 | \n",
+ " 21 | \n",
+ " 동 | \n",
+ " 북 | \n",
+ " 571542107_02 | \n",
+ " 571542811_01 | \n",
+ " i2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " inter_no move_no inc_dir out_dir inc_edge out_edge node_id\n",
+ "19 177 1 동 남 571542107_02 571542809_01 i2\n",
+ "20 177 2 서 동 -571542809_01 571542107_01 i2\n",
+ "21 177 3 남 서 -571542809_01 571542809_01 i2\n",
+ "22 177 4 북 남 571542811_02 571542809_01 i2\n",
+ "23 177 5 서 북 -571542809_01 571542811_01 i2\n",
+ "24 177 6 동 서 571542107_02 571542809_01 i2\n",
+ "25 177 7 북 동 571542811_02 571542107_01 i2\n",
+ "26 177 8 남 북 -571542809_01 571542811_01 i2\n",
+ "27 177 21 북 서 571542811_02 571542809_01 i2\n",
+ "28 177 21 서 남 -571542809_01 571542809_01 i2\n",
+ "29 177 21 남 동 -571542809_01 571542107_01 i2\n",
+ "30 177 21 동 북 571542107_02 571542811_01 i2"
+ ]
+ },
+ "execution_count": 148,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "self.matching[self.matching.node_id=='i2']"
+ ]
}
],
"metadata": {
diff --git a/Intermediates/match6.csv b/Intermediates/match6.csv
index 7ef0e2cda..7cce5e6d9 100644
--- a/Intermediates/match6.csv
+++ b/Intermediates/match6.csv
@@ -29,22 +29,22 @@
27,177,i2,3,B,18,rrgrrrr
28,177,i2,4,A,5,rrgrGGG
29,177,i2,4,B,1,rrgrrrr
-30,177,u20,1,A,8,gggggg
-31,177,u20,1,B,4,gggggg
-32,177,u20,2,A,7,gggggg
-33,177,u20,2,B,3,gggggg
+30,177,u20,1,A,8,ggrggg
+31,177,u20,1,B,4,ggrggg
+32,177,u20,2,A,7,ggrggg
+33,177,u20,2,B,3,ggrggg
34,177,u20,3,A,17,ggGggg
-35,177,u20,3,B,18,gggggg
-36,177,u20,4,A,5,gggggg
-37,177,u20,4,B,1,gggggg
-38,178,c30,1,A,20,gggggg
-39,178,c30,1,B,20,gggggg
-40,178,c30,2,A,20,GGGggg
-41,178,c30,2,B,20,gggGGG
-42,178,c30,3,A,20,GGGggg
-43,178,c30,3,B,20,gggGGG
-44,178,c30,4,A,20,GGGggg
-45,178,c30,4,B,20,gggGGG
+35,177,u20,3,B,18,ggrggg
+36,177,u20,4,A,5,ggrggg
+37,177,u20,4,B,1,ggrggg
+38,178,c30,1,A,20,rrrrrr
+39,178,c30,1,B,20,rrrrrr
+40,178,c30,2,A,20,GGGrrr
+41,178,c30,2,B,20,rrrGGG
+42,178,c30,3,A,20,GGGrrr
+43,178,c30,3,B,20,rrrGGG
+44,178,c30,4,A,20,GGGrrr
+45,178,c30,4,B,20,rrrGGG
46,178,i3,1,A,8,grrrrgrrrrgGGGrgrrrr
47,178,i3,1,B,4,gGGGrgrrrrgrrrrgrrrr
48,178,i3,2,A,7,grrrGgrrrrgrrrrgrrrr
diff --git a/Intermediates/node2init.json b/Intermediates/node2init.json
index 1465cd2e7..dbdab239b 100644
--- a/Intermediates/node2init.json
+++ b/Intermediates/node2init.json
@@ -1 +1 @@
-{"c30": ["g", "g", "g", "g", "g", "g"], "i0": ["g", "r", "r", "r", "g", "r", "r", "r", "g", "r", "r", "r", "r", "r", "g", "r", "r"], "i1": ["g", "r", "r", "r", "r", "r", "r", "g", "r", "r"], "i2": ["r", "r", "g", "r", "r", "r", "r"], "i3": ["g", "r", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "r", "r"], "i6": ["g", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "g", "r", "r", "r"], "i7": ["r", "r", "r", "g", "g", "r", "r"], "i8": ["g", "r", "r", "r", "r", "r", "r", "r", "g", "r", "r", "r", "g", "r", "r", "r"], "i9": ["r", "r", "r", "r"], "u00": ["g", "g", "g", "g", "r", "g", "g", "g", "g"], "u20": ["g", "g", "g", "g", "g", "g"], "u30": ["g", "g", "g", "g", "r", "g", "g", "g"], "u31": ["g", "g", "g", "g", "r", "g", "g", "g"], "u32": ["g", "g", "g", "g", "g", "g", "g", "r"], "u60": ["g", "g", "g", "g", "g", "g", "g", "g", "r"]}
\ No newline at end of file
+{"c30": ["r", "r", "r", "r", "r", "r"], "i0": ["g", "r", "r", "r", "g", "r", "r", "r", "g", "r", "r", "r", "r", "r", "g", "r", "r"], "i1": ["g", "r", "r", "r", "r", "r", "r", "g", "r", "r"], "i2": ["r", "r", "g", "r", "r", "r", "r"], "i3": ["g", "r", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "r", "r"], "i6": ["g", "r", "r", "r", "g", "r", "r", "r", "r", "g", "r", "r", "g", "r", "r", "r"], "i7": ["r", "r", "r", "g", "g", "r", "r"], "i8": ["g", "r", "r", "r", "r", "r", "r", "r", "g", "r", "r", "r", "g", "r", "r", "r"], "i9": ["r", "r", "r", "r"], "u00": ["g", "g", "g", "g", "r", "g", "g", "g", "g"], "u20": ["g", "g", "r", "g", "g", "g"], "u30": ["g", "g", "g", "g", "r", "g", "g", "g"], "u31": ["g", "g", "g", "g", "r", "g", "g", "g"], "u32": ["g", "g", "g", "g", "g", "g", "g", "r"], "u60": ["g", "g", "g", "g", "g", "g", "g", "g", "r"]}
\ No newline at end of file
diff --git a/Results/sn_1704417000.add.xml b/Results/sn_1704417000.add.xml
index c0eea6bc8..516cc7008 100644
--- a/Results/sn_1704417000.add.xml
+++ b/Results/sn_1704417000.add.xml
@@ -1,8 +1,8 @@
-
-
-
+
+
+
@@ -10,11 +10,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -22,11 +22,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -34,11 +34,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -49,240 +49,240 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -334,63 +334,63 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -462,52 +462,52 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
diff --git a/Results/sn_1704419700.add.xml b/Results/sn_1704419700.add.xml
index a9bcfc21c..dfcd98954 100644
--- a/Results/sn_1704419700.add.xml
+++ b/Results/sn_1704419700.add.xml
@@ -1,62 +1,59 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
-
+
-
+
@@ -68,10 +65,10 @@
-
+
-
+
@@ -83,17 +80,12 @@
-
-
-
-
-
-
-
+
+
-
+
@@ -124,12 +116,9 @@
-
-
-
-
+
@@ -172,120 +161,112 @@
-
-
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
@@ -328,72 +309,66 @@
-
-
-
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
@@ -412,12 +387,9 @@
-
-
-
-
+
@@ -454,263 +426,244 @@
-
-
-
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/Scripts/generate_signals.py b/Scripts/generate_signals.py
index 95841aa74..56e195b6d 100644
--- a/Scripts/generate_signals.py
+++ b/Scripts/generate_signals.py
@@ -537,34 +537,27 @@ class SignalGenerator():
node_id = row.node_id
move_A = row.move_A
move_B = row.move_B
-
+
# A링의 state 지정
if (node_id, move_A) in mapping_dict:
state_A = mapping_dict[(node_id, move_A)]
else:
state_A = ''.join(self.node2init[node_id])
+ self.histid.at[i, 'state_A'] = state_A
# B링의 state 지정
if (node_id, move_B) in mapping_dict:
state_B = mapping_dict[(node_id, move_B)]
else:
state_B = ''.join(self.node2init[node_id])
-
- # 통합된 state 지정
- state = ''
- for a, b in zip(state_A,state_B):
- if a == b:
- state += a
- elif (a == 'G') or (b == 'G'):
- state += 'G'
- self.histid.at[i, 'state'] = state
+ self.histid.at[i, 'state_B'] = state_B
# 4-3. histids
def attach_children(self):
new_histids = []
for parent_id in self.parent_ids:
for child_id in self.pa2ch[parent_id]:
- new_histid = self.histid.copy()[self.histid.node_id==parent_id].drop(columns='state')
+ new_histid = self.histid.copy()[self.histid.node_id==parent_id].drop(columns=['state_A', 'state_B'])
# new_histid[['inc_edge_A', 'out_edge_A', 'inc_edge_B', 'out_edge_B']] = np.nan
for i, row in new_histid.iterrows():
phas_A = row.phas_A
@@ -574,27 +567,116 @@ class SignalGenerator():
# A링의 state 지정
state_A = Arow.iloc[0].state
- # new_histid.at[i, 'state_A'] = state_A
+ new_histid.at[i, 'state_A'] = state_A
# B링의 state 지정
Brow = new_match[(new_match.phase_no==phas_B) & (new_match.ring_type=='B')]
state_B = Brow.iloc[0].state
- # new_histid.at[i, 'state_B'] = state_B
-
- # 통합된 state 지정
- state = ''
- for a, b in zip(state_A,state_B):
- if a == b:
- state += a
- elif (a == 'G') or (b == 'G'):
- state += 'G'
- new_histid.at[i, 'state'] = state
+ new_histid.at[i, 'state_B'] = state_B
+
new_histid.at[i, 'node_id'] = child_id
new_histids.append(new_histid)
+
new_histids = pd.concat(new_histids)
self.histids = pd.concat([self.histid.copy(), new_histids])
self.histids = self.histids.sort_values(by=['start_unix', 'node_id', 'phas_A', 'phas_B']).reset_index(drop=True)
- self.histids = self.histids[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration', 'state']]
+ self.histids = self.histids[['inter_no', 'node_id', 'start_unix', 'phas_A', 'phas_B', 'move_A', 'move_B', 'duration', 'state_A', 'state_B']]
+
+
+ # 5-2-1 helper function of 5-2
+ def get_red(self, pre_state:str, cur_state:str):
+ assert len(pre_state) == len(cur_state), "cur_state, nex_state의 길이가 서로 다릅니다."
+ state_r = ''
+ for p, c in zip(pre_state, cur_state):
+ if p == c:
+ state_r += p
+ elif (p == 'r') and (c == 'G'):
+ state_r += 'r'
+ elif (p == 'G') and (c == 'r'):
+ state_r += 'r'
+ else:
+ raise ValueError(f"예상치 못한 신호조합: previous={p}, current={c}")
+ return state_r
+
+ # 5-2-2 helper function of 5-2
+ def get_yellow(self, cur_state:str, nex_state:str):
+ assert len(cur_state) == len(nex_state), "cur_state, nex_state의 길이가 서로 다릅니다."
+ state_y = ''
+ for c, n in zip(cur_state, nex_state):
+ if c == n:
+ state_y += c
+ elif (c == 'r') and (n == 'G'):
+ state_y += 'r'
+ elif (c == 'G') and (n == 'r'):
+ state_y += 'y'
+ else:
+ print(c, n)
+ print(cur_state, nex_state)
+ raise ValueError(f"예상치 못한 신호조합: current={c}, next={n}")
+ return state_y
+
+ # 5-2-3 helper function of 5-2
+ def cumulate(self, sig, alph):
+ csig = [] # cumulated sig
+ pre = pd.Series({f'phas_{alph}':None})
+
+ start_time = 0
+ elapsed = 0
+ for i, cur in sig.iterrows():
+ start_unix = cur.start_unix
+
+ # pre, nex
+ if i != 0:
+ pre = sig.iloc[i-1]
+
+ if i != len(sig) - 1:
+ nex = sig.iloc[i+1]
+
+ # duration
+ if cur[f'phas_{alph}'] == nex[f'phas_{alph}']:
+ continue
+ if cur[f'phas_{alph}'] == pre[f'phas_{alph}']:
+ duration = cur.duration + pre.duration
+ else:
+ duration = cur.duration
+ start_times = []
+ states = []
+ phases = []
+
+ # red
+ if i != 0:
+ start_time += elapsed
+ start_times.append(start_time)
+ states.append(self.get_red(pre[f'state_{alph}'], cur[f'state_{alph}']))
+ phases.append(f'{cur[f"phas_{alph}"]}r')
+
+ elapsed = cur[f'red_{alph}']
+
+ # green
+ if i == 0:
+ start_time = 0
+ else:
+ start_time += elapsed
+ start_times.append(start_time)
+ states.append(cur[f'state_{alph}'])
+ phases.append(f'{cur[f"phas_{alph}"]}g')
+ if i == 0:
+ elapsed = duration - cur[f'yellow_{alph}']
+ else:
+ elapsed = duration - cur[f'yellow_{alph}'] - cur[f'red_{alph}']
+
+ # yellow
+ if i != len(sig) - 1:
+ start_time += elapsed
+ start_times.append(start_time)
+ states.append(self.get_yellow(cur[f'state_{alph}'], nex[f'state_{alph}']))
+ phases.append(f'{cur[f"phas_{alph}"]}y')
+ elapsed = cur[f'yellow_{alph}']
+ sig_ = pd.DataFrame({'start_time':start_times, f'phas_{alph}':phases, f'state_{alph}':states})
+ sig_['start_unix'] = start_unix
+ csig.append(sig_)
+ csig = pd.concat(csig).reset_index(drop=True)
+ return csig
# 5. 신호 생성
def get_signals(self):
@@ -638,36 +720,56 @@ class SignalGenerator():
* 녹황적세부현시번호란 세부현시번호에 r, g, y 옵션까지 포함된 현시번호를 뜻함.
'''
self.SIGTABLE = []
- for node_id, group in self.sigtable.groupby('node_id'):
- new_rows_list = []
- for i in range(1, len(group)):
- prev_row = group.iloc[i-1:i].copy()
- next_row = group.iloc[i:i+1].copy()
- new_rows = pd.concat([prev_row, prev_row, next_row]).reset_index(drop=True)
- new_rows.loc[0, 'phase_sumo'] = str(prev_row.phase_sumo.iloc[0]) + '_g'
- new_rows.loc[0, 'duration'] = new_rows.loc[0, 'duration'] - 5
- new_rows.loc[1, 'phase_sumo'] = str(prev_row.phase_sumo.iloc[0]) + '_y'
- new_rows.loc[1, 'duration'] = 4
- yellow_state = ''
- red_state = ''
- for a, b in zip(prev_row.state.iloc[0], next_row.state.iloc[0]):
- if a == 'G' and b == 'r':
- yellow_state += 'y'
- red_state += 'r'
+ for node_id in self.node_ids:
+ sig = self.sigtable.query('node_id==@node_id')
+ for i, row in sig.iterrows():
+ inter_no = row.inter_no
+ phas_A = row.phas_A
+ phas_B = row.phas_B
+ start_unix = row.start_unix
+ prow = self.load_prow(inter_no, start_unix)[1].iloc[0]
+ red_A = prow[f'red_A{phas_A}']
+ yellow_A = prow[f'yellow_A{phas_A}']
+ red_B = prow[f'red_B{phas_B}']
+ yellow_B = prow[f'yellow_B{phas_B}']
+ sig.loc[i, ['red_A', 'red_B', 'yellow_A', 'yellow_B']] = red_A, red_B, yellow_A, yellow_B
+ sig = sig.astype({'red_A': int, 'red_B': int, 'yellow_A': int, 'yellow_B': int,
+ 'phas_A':str, 'phas_B':str})
+ sig = sig.drop(['move_A','move_B'], axis=1)
+
+ sig_A = sig[['start_unix', 'phas_A', 'duration', 'state_A', 'red_A', 'yellow_A']].reset_index(drop=True)
+ sig_B = sig[['start_unix', 'phas_B', 'duration', 'state_B', 'red_B', 'yellow_B']].reset_index(drop=True)
+
+ csig_A = self.cumulate(sig_A, 'A')
+ csig_B = self.cumulate(sig_B, 'B')
+
+ SIG = pd.merge(csig_A, csig_B, on=['start_time', 'start_unix'], how='outer')
+ SIG = SIG.sort_values(by='start_time').reset_index(drop=True)
+ SIG[['phas_A', 'state_A']] = SIG[['phas_A', 'state_A']].fillna(method='ffill')
+ SIG[['phas_B', 'state_B']] = SIG[['phas_B', 'state_B']].fillna(method='ffill')
+ SIG['phase'] = SIG['phas_A'] + "_" + SIG['phas_B']
+ SIG['node_id'] = node_id
+ SIG = SIG[['node_id', 'start_unix', 'start_time', 'phase', 'state_A', 'state_B']]
+ SIG['duration'] = SIG['start_time'].shift(-1) - SIG['start_time']
+ SIG = SIG[:-1]
+ SIG['duration'] = SIG['duration'].astype(int)
+ for row in SIG.itertuples():
+ state = ''
+ for a, b, in zip(row.state_A, row.state_B):
+ if a == 'r':
+ state += b
+ elif b == 'r':
+ state += a
+ elif a == b:
+ state += a
else:
- yellow_state += a
- red_state += a
- new_rows.loc[2, 'phase_sumo'] = str(next_row.phase_sumo.iloc[0]) + '__r'
- new_rows.loc[2, 'duration'] = 1
- new_rows.loc[1, 'state'] = yellow_state
- new_rows.loc[2, 'state'] = red_state
- new_rows_list.append(new_rows)
- next_row['phase_sumo'] = str(next_row.phase_sumo.iloc[0]) + '_g'
- next_row['duration'] -= 5
- new_rows_list.append(next_row)
- new_rows = pd.concat(new_rows_list)
- self.SIGTABLE.append(new_rows)
- self.SIGTABLE = pd.concat(self.SIGTABLE).sort_values(by=['node_id', 'start_unix', 'phase_sumo'])
+ raise ValueError(f"예상되지 않은 조합 발생: a={a}, b={b}")
+ SIG.at[row.Index, 'state'] = state
+ SIG = SIG.drop(columns=['start_time', 'state_A', 'state_B'])
+ self.SIGTABLE.append(SIG)
+ self.SIGTABLE = pd.concat(self.SIGTABLE)
+ self.SIGTABLE
+
# 5-3. 신호파일 생성
def make_tl_file(self):
diff --git a/Scripts/preprocess_daily.py b/Scripts/preprocess_daily.py
index 68d0bb4d7..da8c83c2f 100644
--- a/Scripts/preprocess_daily.py
+++ b/Scripts/preprocess_daily.py
@@ -475,13 +475,13 @@ class DailyPreprocessor():
cmatch.loc[(cmatch.inc_dir==inc_dire) & (cmatch.out_dir==out_dire_B), 'move_no'] = 19
cmatches.append(cmatch)
- # 각 coordination node에 대하여 (inc_edge_id, out_edge_id) 부여
+ # 각 연등교차로(coordination node)에 대하여 (inc_edge_id, out_edge_id) 부여
self.coord['inter_no'] = self.coord['parent_id'].map(self.node2inter)
self.coord = self.coord.rename(columns={'child_id':'node_id'})
self.coord[['inc_dir', 'out_dir', 'inc_angle','out_angle']] = np.nan
self.coord['move_no'] = 20
self.coord = self.coord[['inter_no', 'phase_no', 'ring_type', 'move_no', 'inc_dir', 'out_dir', 'inc_angle','out_angle', 'inc_edge', 'out_edge', 'node_id']]
-
+
# display(coord)
cmatches = pd.concat(cmatches)
self.match6 = pd.concat([self.match5, cmatches, self.coord]).drop_duplicates().sort_values(by=['inter_no', 'node_id', 'phase_no', 'ring_type'])
@@ -632,6 +632,31 @@ class DailyPreprocessor():
if index >= 0:
self.node2init[node_id][index] = 'r'
+ # 연등교차로
+ for _, row in self.coord.iterrows():
+ node_id = row.node_id
+ inc_edge = row.inc_edge
+ out_edge = row.out_edge
+ if not (pd.isna(inc_edge) and pd.isna(out_edge)):
+ inc_edge = self.net.getEdge(inc_edge)
+ out_edge = self.net.getEdge(out_edge)
+ for conn in inc_edge.getConnections(out_edge):
+ index = conn.getTLLinkIndex()
+ if index >= 0:
+ self.node2init[node_id][index] = 'r'
+ # 유턴교차로
+ for _, row in self.uturn.iterrows():
+ node_id = row.child_id
+ inc_edge = row.inc_edge
+ out_edge = row.out_edge
+ if not (pd.isna(inc_edge) and pd.isna(out_edge)):
+ inc_edge = self.net.getEdge(inc_edge)
+ out_edge = self.net.getEdge(out_edge)
+ for conn in inc_edge.getConnections(out_edge):
+ index = conn.getTLLinkIndex()
+ if index >= 0:
+ self.node2init[node_id][index] = 'r'
+
# json 파일로 저장
with open(os.path.join(self.path_intermediates, 'node2init.json'), 'w') as file:
json.dump(self.node2init, file)
diff --git a/cmd.txt b/cmd.txt
index 741104615..67766821f 100644
--- a/cmd.txt
+++ b/cmd.txt
@@ -1,3 +1,5 @@
+sumo-gui -n Data/networks/sn.net.xml -a Results/sn_1704419700.add.xml -r Data/networks/sn.rou.xml -d 100
+
sumo-gui -n Data/networks/sn.net.xml -a Results/sn_1704440700.add.xml -r Data/networks/sn.rou.xml -d 100 --save-state.times 300
sumo-gui -n Data/networks/sn.net.xml -a Results/sn_1704441000.add.xml -r Data/networks/sn.rou.xml -d 100 --load-state state_300.00.xml.gz
\ No newline at end of file