param( [string[]]$Routes = @(), [string]$RouteListPath = "", [string[]]$SimulationMaps = @("yandex"), [string[]]$InterframeMethods = @("optical-flow", "orb", "akaze", "sift", "brisk"), [string[]]$LandmarkMethods = @("orb", "akaze", "sift", "brisk"), [string[]]$UseSianSimilarityValues = @("false"), [string[]]$UseGanValues = @("false"), [string[]]$UseLandmarksValues = @("true"), [double[]]$RefMinDistances = @(100), [switch]$UseSianSimilarity, [switch]$UseGan, [switch]$DryRun ) $ErrorActionPreference = "Stop" $ProjectRoot = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location $ProjectRoot function Expand-List { param([string[]]$Values) $Expanded = @() foreach ($Value in $Values) { $Expanded += $Value -split "," | ForEach-Object { $_.Trim() } | Where-Object { $_ } } return $Expanded } $Routes = Expand-List $Routes $SimulationMaps = Expand-List $SimulationMaps $InterframeMethods = Expand-List $InterframeMethods $LandmarkMethods = Expand-List $LandmarkMethods $UseSianSimilarityValues = Expand-List $UseSianSimilarityValues $UseGanValues = Expand-List $UseGanValues $UseLandmarksValues = Expand-List $UseLandmarksValues if ($UseSianSimilarity) { $UseSianSimilarityValues = @("true") } if ($UseGan) { $UseGanValues = @("true") } function Convert-ToBool { param([string]$Value) $Normalized = $Value.Trim().ToLowerInvariant() if ($Normalized -in @("true", "1", "yes", "y", "on")) { return $true } if ($Normalized -in @("false", "0", "no", "n", "off")) { return $false } throw "Не удалось распознать boolean значение: $Value" } if ($RouteListPath) { if (-not (Test-Path $RouteListPath)) { throw "Файл со списком маршрутов не найден: $RouteListPath" } $RoutesFromFile = Get-Content -Path $RouteListPath | ForEach-Object { ($_ -split "#")[0].Trim() } | Where-Object { $_ } $Routes += $RoutesFromFile $Routes = $Routes | Select-Object -Unique } if ($Routes.Count -eq 0) { $Routes = Get-ChildItem -Path "trajectories" -Directory | Where-Object { Test-Path (Join-Path $_.FullName "positions.pkl") } | Sort-Object Name | Select-Object -ExpandProperty Name } if ($Routes.Count -eq 0) { throw "Не найдено маршрутов в trajectories. Сначала выполните build хотя бы для одного маршрута." } $Python = Join-Path $ProjectRoot ".venv\Scripts\python.exe" if (-not (Test-Path $Python)) { $Python = "python" } $Total = $Routes.Count * $SimulationMaps.Count * $InterframeMethods.Count * $LandmarkMethods.Count * $UseSianSimilarityValues.Count * $UseGanValues.Count * $UseLandmarksValues.Count * $RefMinDistances.Count $RunIndex = 0 Write-Host "Batch run started" Write-Host "Routes: $($Routes -join ', ')" Write-Host "Total runs: $Total" foreach ($Route in $Routes) { foreach ($SimulationMap in $SimulationMaps) { foreach ($RefMinDistance in $RefMinDistances) { foreach ($InterframeMethod in $InterframeMethods) { foreach ($LandmarkMethod in $LandmarkMethods) { foreach ($UseSianSimilarityValue in $UseSianSimilarityValues) { foreach ($UseGanValue in $UseGanValues) { foreach ($UseLandmarksValue in $UseLandmarksValues) { $SianEnabled = Convert-ToBool $UseSianSimilarityValue $GanEnabled = Convert-ToBool $UseGanValue $LandmarksEnabled = Convert-ToBool $UseLandmarksValue $RunIndex += 1 $Args = @( "main.py", "--mode", "run", "--name", $Route, "--simulation", $SimulationMap, "--ref-min-distance", "$RefMinDistance", "--interframe-method", $InterframeMethod, "--landmark-method", $LandmarkMethod ) if ($SianEnabled) { $Args += "--use-sian-similarity" } if ($GanEnabled) { $Args += "--use-gan" } if (-not $LandmarksEnabled) { $Args += "--no-landmarks" } Write-Host "" Write-Host "[$RunIndex/$Total] route=$Route simulation=$SimulationMap ref=$RefMinDistance interframe=$InterframeMethod landmark=$LandmarkMethod landmarks=$LandmarksEnabled sian=$SianEnabled gan=$GanEnabled" Write-Host "$Python $($Args -join ' ')" if (-not $DryRun) { & $Python @Args if ($LASTEXITCODE -ne 0) { throw "Run failed with exit code $LASTEXITCODE" } } } } } } } } } } Write-Host "" Write-Host "Batch run finished. Results are saved by main.py into test_runs."