# 유턴신호 부여 로직
## 입력 1. `self.match5`
- 컬럼목록 : 노드id, 현시번호, 링타입, 이동류번호, 진입/진출방향, 진입/진출엣지id
- 설명 : 부모교차로에 대한 매칭정보
![match5](https://i.imgur.com/ggy3AqY.png)

## 입력 2. `self.uturn`
- 컬럼목록 : 부모노드id, 자식노드id, 진입방향, 조건, 진입/진출방향
- 설명 : 유턴에 대한 정보
- 여기에서 조건이란 "좌회전시" 또는 "보행신호시" 또는 ""(지정되지 않음) 중 하나임.
![uturn](https://i.imgur.com/kUe9etr.png)

## 출력 : `self.match6`
- 컬럼목록 : `self.match5와` 같음
- 설명 : 부모 및 자식교차로에 대한 매칭정보 (자식교차로 : 유턴교차로, 연등교차로)
![match6](https://i.imgur.com/jOtBkNx.png)

## 유턴신호 부여 알고리즘

## 요약 :
각 유턴노드별로 `self.match5`에서 해당되는 행들을 가져오고 (이것을 `cmatch`라고 한다.)
조건별로 `cmatch`에서 해당되는 행에 진입/진출엣지id를 지정한다.      

## 상세:
각 유턴 노드에 대하여 `cmatch`를 다음과 같이 정한다.

- (1) `cmatch`
  - (1-1) 부모노드의 `self.match5`에 해당하는 데이터프레임(`cmatch`)을 가져온다.
  - (1-2) `node_id`는 자식노드id로 부여하고, 진입/진출엣지id는 `np.nan`으로 초기화한다.
- (2) 조건이 "좌회전시", "보행신호시"이면
  - (2-1) 그에 따라 진입/진출방향을 정한다. (8방위)
  - (2-2) `cmatch`에서 진입/진출방향에 대응되는 행에 진입/진출엣지id를 지정한다.
- (3) 조건이 지정되지 않았거나,
    조건이 지정되었어도 진입/진출방향에 대응되는 행이 존재하지 않으면
    좌회전시 → 보행신호시 → 보행신호이동류발생시 → 신호없음이동류발생시 순으로 유턴신호를 정한다.
  - (3-1) 좌회전시
    
    3-1에 해당하지 않고
    좌회전에 대응되는 진입/진출방향에 대한 행이 `cmatch`에 존재하면
    해당 행에 진입/진출엣지id를 지정한다.
  - (3-2) 보행신호시
    
    보행신호에 대응되는 진입/진출방향에 대한 행이 `cmatch`에 존재하면
    해당 행에 진입/진출엣지id를 지정한다.
  - (3-3) 보행신호이동류발생시
    
    3-1, 3-2에 해당하지 않고, 이동류번호가 17(보행신호이동류)인 행이 `cmatch`에 존재하며
    유턴노드 방향으로 진출하는 신호가 없으면
    해당 행에 진입/진출엣지id를 지정한다.
  - (3-4) 신호없음이동류발생시
    
    3-1, 3-2, 3-3에 해당하지 않고, 이동류번호가 18(신호없음)인 행이 `cmatch`에 존재하며
    유턴노드 방향으로 진출하는 신호가 없으면
    해당 행에 진입/진출엣지id를 지정한다.
  - (3-5) 3-1 ~ 3-4에 해당되지 않는다면 유턴신호를 g로 지정한다.

## 이후과정:
각 유턴노드에 대한 `cmatch`들을 리스트 형태로 저장한 후 `pd.concat`하여 합친다 (`cmatches`).
연동교차로에 대해서도 비슷한 종류의 테이블을 만들어둔다. (`self.coord`, 상세 생성과정 생략)
`self.match5`, `cmatches`, `self.coord를` `pd.concat`하여 `self.match6`를 만든다.