using System.Collections.Generic; using AGVNavigationCore.Models; namespace AGVNavigationCore.PathFinding.Validation { /// /// 경로 검증 결과 (되돌아가기 패턴 검증 포함) /// public class PathValidationResult { /// /// 경로 검증이 필요한지 여부 /// public bool IsValidationRequired { get; set; } /// /// 경로 검증 통과 여부 /// public bool IsValid { get; set; } /// /// 검증된 경로 /// public List ValidatedPath { get; set; } /// /// 검출된 되돌아가기 패턴 목록 (A → B → A 형태) /// public List BacktrackingPatterns { get; set; } /// /// 갈림길 노드 목록 /// public List JunctionNodes { get; set; } /// /// 시작 노드 ID /// public string StartNodeId { get; set; } /// /// 목표 노드 ID /// public string TargetNodeId { get; set; } /// /// 갈림길 노드 ID (방향 전환용) /// public string JunctionNodeId { get; set; } /// /// 검증 오류 메시지 (실패시) /// public string ValidationError { get; set; } /// /// 기본 생성자 /// public PathValidationResult() { IsValidationRequired = false; IsValid = true; ValidatedPath = new List(); BacktrackingPatterns = new List(); JunctionNodes = new List(); StartNodeId = string.Empty; TargetNodeId = string.Empty; JunctionNodeId = string.Empty; ValidationError = string.Empty; } /// /// 검증 불필요한 경우 생성 /// public static PathValidationResult CreateNotRequired() { return new PathValidationResult { IsValidationRequired = false, IsValid = true }; } /// /// 검증 성공 결과 생성 /// public static PathValidationResult CreateValid(List path, string startNodeId, string targetNodeId, string junctionNodeId = "") { return new PathValidationResult { IsValidationRequired = true, IsValid = true, ValidatedPath = new List(path), StartNodeId = startNodeId, TargetNodeId = targetNodeId, JunctionNodeId = junctionNodeId }; } /// /// 검증 실패 결과 생성 (되돌아가기 패턴 검출) /// public static PathValidationResult CreateInvalidWithBacktracking( List path, List backtrackingPatterns, string startNodeId, string targetNodeId, string junctionNodeId, string error) { return new PathValidationResult { IsValidationRequired = true, IsValid = false, ValidatedPath = new List(path), BacktrackingPatterns = new List(backtrackingPatterns), StartNodeId = startNodeId, TargetNodeId = targetNodeId, JunctionNodeId = junctionNodeId, ValidationError = error }; } /// /// 일반 검증 실패 결과 생성 /// public static PathValidationResult CreateInvalid(string startNodeId, string targetNodeId, string error) { return new PathValidationResult { IsValidationRequired = true, IsValid = false, StartNodeId = startNodeId, TargetNodeId = targetNodeId, ValidationError = error }; } } /// /// 되돌아가기 패턴 정보 (A → B → A) /// public class BacktrackingPattern { /// /// 시작 노드 (A) /// public string StartNode { get; set; } /// /// 중간 노드 (B) /// public string MiddleNode { get; set; } /// /// 되돌아간 노드 (다시 A) /// public string ReturnNode { get; set; } /// /// 경로에서의 시작 인덱스 /// public int StartIndex { get; set; } /// /// 경로에서의 종료 인덱스 /// public int EndIndex { get; set; } /// /// 기본 생성자 /// public BacktrackingPattern() { StartNode = string.Empty; MiddleNode = string.Empty; ReturnNode = string.Empty; StartIndex = -1; EndIndex = -1; } /// /// 되돌아가기 패턴 생성 /// public static BacktrackingPattern Create(string startNode, string middleNode, string returnNode, int startIndex, int endIndex) { return new BacktrackingPattern { StartNode = startNode, MiddleNode = middleNode, ReturnNode = returnNode, StartIndex = startIndex, EndIndex = endIndex }; } /// /// 패턴 설명 문자열 /// public override string ToString() { return $"{StartNode} → {MiddleNode} → {ReturnNode} (인덱스: {StartIndex}-{EndIndex})"; } } }