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})";
}
}
}