신호생성 repo (24. 1. 5 ~).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

697 lines
24 KiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import pandas as pd\n",
"import numpy as np\n",
"import sys\n",
"import copy\n",
"sys.path.append('../../Scripts')\n",
"from preprocess_daily import DailyPreprocessor\n",
"from generate_signals import SignalGenerator"
]
},
{
"cell_type": "code",
"execution_count": 2,
"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",
"1-5. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n",
"2-1. 매칭 테이블들을 생성했습니다.\n",
"2-2. 초기화 신호가 지정되었습니다. (우회전 : g)\n",
"2-3. 유턴 인덱스 / 비보호좌회전 인덱스를 지정했습니다.\n"
]
},
{
"data": {
"text/plain": [
"{'i0': {},\n",
" 'i1': {},\n",
" 'i2': {},\n",
" 'i3': {},\n",
" 'i6': {8: ['-571542115_01']},\n",
" 'i7': {2: ['571542073_01']},\n",
" 'i8': {},\n",
" 'i9': {}}"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data() # 1. 데이터 불러오기\n",
"self.get_matches() # 2-1\n",
"self.initialize_state() # 2-2\n",
"self.assign_indices() # 2-3\n",
"self.p2UPLindices2inc_edge_ids"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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",
"1-5. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n",
"2-1. 매칭 테이블들을 생성했습니다.\n",
"2-2. 초기화 신호가 지정되었습니다. (우회전 : g)\n",
"2-3. 유턴 인덱스 / 비보호좌회전 인덱스를 지정했습니다.\n"
]
}
],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data() # 1. 데이터 불러오기\n",
"self.get_matches() # 2-1\n",
"self.initialize_state() # 2-2\n",
"self.assign_indices() # 2-3\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_id = row.inc_edge_id\n",
" out_edge_id = row.out_edge_id\n",
" state_list = copy.deepcopy(self.node2init[node_id])\n",
" self.match6.at[i, 'state'] = ''.join(state_list)\n",
" if (pd.isna(inc_edge_id)) or (pd.isna(out_edge_id)):\n",
" continue\n",
" inc_edge = self.net.getEdge(inc_edge_id)\n",
" out_edge = self.net.getEdge(out_edge_id)\n",
" for conn in inc_edge.getConnections(out_edge):\n",
" index = conn.getTLLinkIndex()\n",
" if index >= 0:\n",
" state_list[index] = 'G'\n",
" self.match6.at[i, 'state'] = ''.join(state_list)\n",
"\n",
"# mactch6 : 비보호좌회전 신호 배정\n",
"for i, row in self.match6[self.match6.node_id.isin(self.parent_ids)].iterrows():\n",
" parent_id = row.node_id\n",
" state = row.state\n",
" UPLindices2inc_edge_ids = self.p2UPLindices2inc_edge_ids[parent_id]\n",
" for UPLindex in UPLindices2inc_edge_ids:\n",
" inc_edge_ids = UPLindices2inc_edge_ids[UPLindex]\n",
" if inc_edge_ids:\n",
" if inc_edge_id in inc_edge_ids:\n",
" state = state[:UPLindex] + 'g' + state[UPLindex+1:]\n",
" self.match6.at[i, 'state'] = state\n",
" else: # modify_match1.py : self.match1.at[7, 'move_A'] = 17\n",
" raise Exception(\n",
" f\"비보호좌회전 신호를 부여할 수 없습니다. \\\n",
" 신호가 부여되어 있지 않은 직진 또는 좌회전 연결이 존재하는데\\\n",
" (node_id : {parent_id}, index : {UPLindex})\\\n",
" 이 연결의 진입엣지(inc_edge_id : {inc_edge_id})에 부여된 신호가 없습니다.\")\n",
"\n",
"# mactch6 : 유턴 신호가 한번도 배정되지 않은 경우에 대해서는 유턴이동류의 신호를 항상 g로 배정\n",
"for node_id in self.u_turn_ids:\n",
" m6 = self.match6[self.match6.node_id==node_id]\n",
" if not len(m6):\n",
" continue\n",
" state_list = copy.deepcopy(self.node2init[node_id])\n",
" state = ''.join(state_list)\n",
" uindex = self.u2uindex[node_id]\n",
" values_at_uindex = [state[uindex] for state in m6.state]\n",
" uturn_assigned = ('G' in values_at_uindex)\n",
" if not uturn_assigned:\n",
" print('uturn not assigned')\n",
" state = state[:uindex] + 'g' + state[uindex+1:]\n",
" print(i, state)\n",
" self.match6.loc[self.match6.node_id==node_id, 'state'] = state"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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",
"1-5. 주요 객체 (리스트, 딕셔너리)들을 저장했습니다.\n",
"2-1. 매칭 테이블들을 생성했습니다.\n",
"2-2. 초기화 신호가 지정되었습니다. (우회전 : g)\n",
"2-3. 유턴 인덱스 / 비보호좌회전 인덱스를 지정했습니다.\n"
]
}
],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data() # 1. 데이터 불러오기\n",
"self.get_matches() # 2-1\n",
"self.initialize_state() # 2-2\n",
"self.assign_indices() # 2-3\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_id = row.inc_edge_id\n",
" out_edge_id = row.out_edge_id\n",
" state = copy.deepcopy(self.node2init)[node_id]\n",
"\n",
" if move_no != 21:\n",
" inc_edge = self.net.getEdge(inc_edge_id)\n",
" out_edge = self.net.getEdge(out_edge_id)\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"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data() # 1. 데이터 불러오기\n",
"self.get_matches() # 2-1\n",
"self.initialize_state() # 2-2\n",
"self.assign_indices() # 2-3\n",
"\n",
"for i, row in self.matching.iterrows():\n",
" node_id = row.node_id\n",
" move_no = row.move_no\n",
" inc_edge_id = row.inc_edge_id\n",
" out_edge_id = row.out_edge_id\n",
" state_list = copy.deepcopy(self.node2init[node_id])\n",
" self.matching.at[i, 'state'] = ''.join(state_list)\n",
" if (pd.isna(inc_edge_id)) or (pd.isna(out_edge_id)):\n",
" continue\n",
" inc_edge = self.net.getEdge(inc_edge_id)\n",
" out_edge = self.net.getEdge(out_edge_id)\n",
" for conn in inc_edge.getConnections(out_edge):\n",
" index = conn.getTLLinkIndex()\n",
" if index >= 0:\n",
" state_list[index] = 'G'\n",
" self.matching.at[i, 'state'] = ''.join(state_list)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"self = DailyPreprocessor()\n",
"self.load_data() # 1. 데이터 불러오기\n",
"self.get_matches() # 2-1\n",
"self.initialize_state() # 2-2\n",
"self.assign_indices() # 2-3\n",
"\n",
"# matching : 신호 배정\n",
"for i, row in self.matching.iterrows():\n",
" node_id = row.node_id\n",
" move_no = row.move_no\n",
" inc_edge_id = row.inc_edge_id\n",
" out_edge_id = row.out_edge_id\n",
" state_list = copy.deepcopy(self.node2init[node_id])\n",
" self.matching.at[i, 'state'] = ''.join(state_list)\n",
" if (pd.isna(inc_edge_id)) or (pd.isna(out_edge_id)):\n",
" continue\n",
" inc_edge = self.net.getEdge(inc_edge_id)\n",
" out_edge = self.net.getEdge(out_edge_id)\n",
" for conn in inc_edge.getConnections(out_edge):\n",
" index = conn.getTLLinkIndex()\n",
" if index >= 0:\n",
" state_list[index] = 'G'\n",
" self.matching.at[i, 'state'] = ''.join(state_list)\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4\n",
"True\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>inc_dire</th>\n",
" <th>out_dire</th>\n",
" <th>inc_angle</th>\n",
" <th>out_angle</th>\n",
" <th>inc_edge_id</th>\n",
" <th>out_edge_id</th>\n",
" <th>node_id</th>\n",
" <th>turn_type</th>\n",
" <th>state</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>179</td>\n",
" <td>000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>001</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" <td>001</td>\n",
" <td>090</td>\n",
" <td>571500487_02</td>\n",
" <td>571500487_01.32</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGGGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>179</td>\n",
" <td>270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>동</td>\n",
" <td>서</td>\n",
" <td>090</td>\n",
" <td>270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>동</td>\n",
" <td>남</td>\n",
" <td>090</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>270</td>\n",
" <td>000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>서</td>\n",
" <td>동</td>\n",
" <td>270</td>\n",
" <td>090</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGrGGGG</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
"8 175 1 A 8 남 북 179 \n",
"9 175 1 B 4 북 남 001 \n",
"10 175 2 A 7 북 동 001 \n",
"11 175 2 B 3 남 서 179 \n",
"12 175 3 A 6 동 서 090 \n",
"13 175 3 B 1 동 남 090 \n",
"14 175 4 A 5 서 북 270 \n",
"15 175 4 B 2 서 동 270 \n",
"\n",
" out_angle inc_edge_id out_edge_id node_id turn_type state \n",
"8 000 NaN NaN u00 straight GGGGrGGGG \n",
"9 180 NaN NaN u00 straight GGGGrGGGG \n",
"10 090 571500487_02 571500487_01.32 u00 left GGGGGGGGG \n",
"11 270 NaN NaN u00 left GGGGrGGGG \n",
"12 270 NaN NaN u00 straight GGGGrGGGG \n",
"13 180 NaN NaN u00 left GGGGrGGGG \n",
"14 000 NaN NaN u00 left GGGGrGGGG \n",
"15 090 NaN NaN u00 straight GGGGrGGGG "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>inter_no</th>\n",
" <th>phase_no</th>\n",
" <th>ring_type</th>\n",
" <th>move_no</th>\n",
" <th>inc_dire</th>\n",
" <th>out_dire</th>\n",
" <th>inc_angle</th>\n",
" <th>out_angle</th>\n",
" <th>inc_edge_id</th>\n",
" <th>out_edge_id</th>\n",
" <th>node_id</th>\n",
" <th>turn_type</th>\n",
" <th>state</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>A</td>\n",
" <td>8</td>\n",
" <td>남</td>\n",
" <td>북</td>\n",
" <td>179</td>\n",
" <td>000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>175</td>\n",
" <td>1</td>\n",
" <td>B</td>\n",
" <td>4</td>\n",
" <td>북</td>\n",
" <td>남</td>\n",
" <td>001</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>A</td>\n",
" <td>7</td>\n",
" <td>북</td>\n",
" <td>동</td>\n",
" <td>001</td>\n",
" <td>090</td>\n",
" <td>571500487_02</td>\n",
" <td>571500487_01.32</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>175</td>\n",
" <td>2</td>\n",
" <td>B</td>\n",
" <td>3</td>\n",
" <td>남</td>\n",
" <td>서</td>\n",
" <td>179</td>\n",
" <td>270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>A</td>\n",
" <td>6</td>\n",
" <td>동</td>\n",
" <td>서</td>\n",
" <td>090</td>\n",
" <td>270</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>175</td>\n",
" <td>3</td>\n",
" <td>B</td>\n",
" <td>1</td>\n",
" <td>동</td>\n",
" <td>남</td>\n",
" <td>090</td>\n",
" <td>180</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>A</td>\n",
" <td>5</td>\n",
" <td>서</td>\n",
" <td>북</td>\n",
" <td>270</td>\n",
" <td>000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>left</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>175</td>\n",
" <td>4</td>\n",
" <td>B</td>\n",
" <td>2</td>\n",
" <td>서</td>\n",
" <td>동</td>\n",
" <td>270</td>\n",
" <td>090</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>u00</td>\n",
" <td>straight</td>\n",
" <td>GGGGgGGGG</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" inter_no phase_no ring_type move_no inc_dire out_dire inc_angle \\\n",
"8 175 1 A 8 남 북 179 \n",
"9 175 1 B 4 북 남 001 \n",
"10 175 2 A 7 북 동 001 \n",
"11 175 2 B 3 남 서 179 \n",
"12 175 3 A 6 동 서 090 \n",
"13 175 3 B 1 동 남 090 \n",
"14 175 4 A 5 서 북 270 \n",
"15 175 4 B 2 서 동 270 \n",
"\n",
" out_angle inc_edge_id out_edge_id node_id turn_type state \n",
"8 000 NaN NaN u00 straight GGGGgGGGG \n",
"9 180 NaN NaN u00 straight GGGGgGGGG \n",
"10 090 571500487_02 571500487_01.32 u00 left GGGGgGGGG \n",
"11 270 NaN NaN u00 left GGGGgGGGG \n",
"12 270 NaN NaN u00 straight GGGGgGGGG \n",
"13 180 NaN NaN u00 left GGGGgGGGG \n",
"14 000 NaN NaN u00 left GGGGgGGGG \n",
"15 090 NaN NaN u00 straight GGGGgGGGG "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"node_id = self.u_turn_ids[0]\n",
"uindex = self.u2uindex[node_id]\n",
"m6 = self.match6[self.match6.node_id==node_id]\n",
"values_at_uindex = [state[uindex] for state in m6.state]\n",
"uturn_not_assigned = 'G' not in values_at_uindex\n",
"print(uindex)\n",
"print(uturn_not_assigned)\n",
"display(m6)\n",
"# if uturn_not_assigned:\n",
"for i, row in m6.iterrows():\n",
" state = row.state\n",
" state = state[:uindex] + 'g' + state[uindex+1:]\n",
" m6.at[i, 'state'] = state\n",
"display(m6)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "sts",
"language": "python",
"name": "sts"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}