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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -463,23 +624,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -489,23 +650,23 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -515,10 +676,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -528,10 +689,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -541,10 +702,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -554,10 +715,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -567,10 +728,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -580,10 +741,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -593,10 +754,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -606,10 +767,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -619,10 +780,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -632,10 +793,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -645,10 +806,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -658,10 +819,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -671,10 +832,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -684,10 +845,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -697,10 +858,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -710,10 +871,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -723,10 +884,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -736,10 +897,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -749,10 +910,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -762,10 +923,10 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -775,67 +936,67 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \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= 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", + "
inter_nonode_idstart_unixphas_Aphas_Bmove_Amove_Bdurationstate_Astate_B
44175i017044186991704416540118gGGrgrrrgrrrrrgrr
6345175i01704418699170441654022734546grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
6446175i017044186991704416540336grrrgrrGgrrrrrgrr
6547175i01704418699170441654034622223grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
6648175i017044186991704416540445grrrgrrrgrrrrrgGr
131109175i017044188801704416720118gGGrgrrrgrrrrrgrr
132110175i017044188801704416720227grrrgrrrgrrrrGgrr
133111175i017044188801704416720336grrrgrrGgrrrrrgrr
134112175i017044188801704416720346grrrgrrrgrrrrrgGr
135113175i017044188801704416720445grrrgrrrgrrrrrgGr
193173175i017044190601704416900118gGGrgrrrgrrrrrgrr
194174175i017044190601704416900227grrrgrrrgrrrrGgrr
195175175i017044190601704416900336grrrgrrGgrrrrrgrr
196176175i017044190601704416900346grrrgrrrgrrrrrgGr
197177175i017044190601704416900445grrrgrrrgrrrrrgGr
259244175i017044192401704417080118gGGrgrrrgrrrrrgrr
260245175i017044192401704417080227grrrgrrrgrrrrGgrr
261246175i017044192401704417080336grrrgrrGgrrrrrgrr
262247175i017044192401704417080346grrrgrrrgrrrrrgGr
263248175i017044192401704417080445grrrgrrrgrrrrrgGr
337306175i017044194201704417260118gGGrgrrrgrrrrrgrr
338307175i017044194201704417260227grrrgrrrgrrrrGgrr
339308175i017044194201704417260336grrrgrrGgrrrrrgrr
340309175i017044194201704417260346grrrgrrrgrrrrrgGr
341310175i017044194201704417260445grrrgrrrgrrrrrgGr
380357175i01704419520170441742011842438grrrgrrrgGGGGrgrrgGGrgrrrgrrrrrgrr
381358175i01704419520170441742022732540grrGgrrrgrrrrrgrrgrrrgrrrgrrrrGgrr
382359175i01704419520170441742033611829grrrgGGrgrrrrrgrrgrrrgrrGgrrrrrgrr
383360175i01704419520170441742034621320grrrgGGrgrrrrrgrrgrrrgrrrgrrrrrgGr
384361175i01704419520170441742044522033grrrgrrrgrrrrrgrGgrrrgrrrgrrrrrgGr
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parent_idchild_iddirectionconditioninc_edgeout_edge
0i0u00좌회전시571500487_02571500487_01.32
1i2u20보행신호시571542810_01.51571542810_02
2i3u30보행신호시571556452_01571556452_02
3i3u31보행신호시571500475_02571500475_01.26
4i3u32보행신호시571540303_02-571540303_02
5i6u60좌회전시571500535_02-571500535_02
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
01781A20NaNNaNNaNNaNNaNNaNc30
11781B20NaNNaNNaNNaNNaNNaNc30
21782A20NaNNaNNaNNaN571542116_01-571542116_02.96c30
31782B20NaNNaNNaNNaN571542116_02.96571542116_02.164c30
41783A20NaNNaNNaNNaN571542116_01-571542116_02.96c30
51783B20NaNNaNNaNNaN571542116_02.96571542116_02.164c30
61784A20NaNNaNNaNNaN571542116_01-571542116_02.96c30
71784B20NaNNaNNaNNaN571542116_02.96571542116_02.164c30
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angle
141771A8180000
151771B4001176
161772A7000090
171772B3179270
181773A17NaNNaNNaNNaN
191773B18NaNNaNNaNNaN
201774A5268000
211774B1090180
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
141771A8180000-571542809_01571542811_01i2
151771B4001176571542811_02571542809_01i2
161772A7000090571542811_02571542107_01i2
171772B3179270-571542809_01571542809_01i2
181773A17NaNNaNNaNNaNNaNNaNi2
191773B18NaNNaNNaNNaNNaNNaNi2
201774A5268000-571542809_01571542811_01i2
211774B1090180571542107_02571542809_01i2
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nophase_noring_typemove_noinc_dirout_dirinc_angleout_angleinc_edgeout_edgenode_id
141771A8180000-571542809_01571542811_01i2
151771B4001176571542811_02571542809_01i2
161772A7000090571542811_02571542107_01i2
171772B3179270-571542809_01571542809_01i2
181773A17NaNNaNNaNNaNNaNNaNi2
191773B18NaNNaNNaNNaNNaNNaNi2
201774A5268000-571542809_01571542811_01i2
211774B1090180571542107_02571542809_01i2
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
inter_nomove_noinc_dirout_dirinc_edgeout_edgenode_id
191771571542107_02571542809_01i2
201772-571542809_01571542107_01i2
211773-571542809_01571542809_01i2
221774571542811_02571542809_01i2
231775-571542809_01571542811_01i2
241776571542107_02571542809_01i2
251777571542811_02571542107_01i2
261778-571542809_01571542811_01i2
2717721571542811_02571542809_01i2
2817721-571542809_01571542809_01i2
2917721-571542809_01571542107_01i2
3017721571542107_02571542811_01i2
\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