Arpit-Bansal's picture
updated schedule response
9ed4879
# GreedyOptim API Integration Guide
## Endpoints
### GET /health
Response:
```json
{
"status": "healthy",
"timestamp": "2025-11-25T00:17:15.053513",
"service": "greedyoptim-api"
}
```
---
### GET /methods
Response:
```json
{
"available_methods": {
"ga": {
"name": "Genetic Algorithm",
"description": "Evolutionary optimization using selection, crossover, and mutation",
"typical_time": "medium",
"solution_quality": "high"
},
"cmaes": {
"name": "CMA-ES",
"description": "Covariance Matrix Adaptation Evolution Strategy",
"typical_time": "medium-high",
"solution_quality": "very high"
},
"pso": {
"name": "Particle Swarm Optimization",
"description": "Swarm intelligence-based optimization",
"typical_time": "medium",
"solution_quality": "high"
},
"sa": {
"name": "Simulated Annealing",
"description": "Probabilistic optimization inspired by metallurgy",
"typical_time": "medium",
"solution_quality": "medium-high"
},
"nsga2": {
"name": "NSGA-II",
"description": "Non-dominated Sorting Genetic Algorithm (multi-objective)",
"typical_time": "high",
"solution_quality": "very high"
},
"adaptive": {
"name": "Adaptive Optimizer",
"description": "Automatically selects best algorithm",
"typical_time": "high",
"solution_quality": "very high"
},
"ensemble": {
"name": "Ensemble Optimizer",
"description": "Runs multiple algorithms in parallel",
"typical_time": "high",
"solution_quality": "highest"
}
},
"default_method": "ga",
"recommended_for_speed": "ga",
"recommended_for_quality": "ensemble"
}
```
---
## POST /schedule - Full Schedule Response Structure
The `/schedule` endpoint returns a comprehensive schedule with service blocks and timing details.
### Response Structure Overview
```
FullScheduleResponse
β”œβ”€β”€ schedule_id: string
β”œβ”€β”€ generated_at: string (ISO datetime)
β”œβ”€β”€ valid_from: string (ISO datetime)
β”œβ”€β”€ valid_until: string (ISO datetime)
β”œβ”€β”€ depot: string
β”œβ”€β”€ trainsets: TrainsetScheduleResponse[]
β”œβ”€β”€ fleet_summary: FleetSummaryResponse
β”œβ”€β”€ optimization_metrics: OptimizationMetricsResponse
└── alerts: AlertResponse[]
```
---
### TrainsetScheduleResponse
Each trainset in the schedule has the following structure:
| Field | Type | Description |
|-------|------|-------------|
| `trainset_id` | string | Unique identifier (e.g., "TS-001") |
| `status` | string | Current status: `REVENUE_SERVICE`, `STANDBY`, `MAINTENANCE` |
| `readiness_score` | float | Score from 0.0 to 1.0 indicating operational readiness |
| `daily_km_allocation` | float | Planned kilometers for the day |
| `cumulative_km` | float | Total kilometers accumulated |
| `assigned_duty` | string? | Duty assignment identifier |
| `priority_rank` | int? | Priority ranking for service assignment |
| `service_blocks` | ServiceBlockResponse[]? | List of assigned service blocks (for REVENUE_SERVICE) |
| `stabling_bay` | string? | Assigned stabling bay (for STANDBY) |
| `standby_reason` | string? | Reason for standby status |
| `maintenance_type` | string? | Type of maintenance: `PREVENTIVE`, `CORRECTIVE`, `OVERHAUL` |
| `ibl_bay` | string? | IBL bay assignment (for MAINTENANCE) |
| `estimated_completion` | string? | Estimated maintenance completion time |
| `alerts` | string[]? | List of alerts for this trainset |
---
### ServiceBlockResponse
Service blocks represent scheduled work periods for a trainset:
| Field | Type | Description |
|-------|------|-------------|
| `block_id` | string | Unique block identifier (e.g., "BLK-001") |
| `departure_time` | string | Block start time (HH:MM format) |
| `origin` | string | Starting station |
| `destination` | string | Ending station |
| `trip_count` | int | Number of trips in this block |
| `estimated_km` | float | Total kilometers for this block |
| `journey_time_minutes` | float? | Total journey time in minutes |
| `period` | string? | Time period: `EARLY_MORNING`, `MORNING_PEAK`, `MIDDAY`, `EVENING_PEAK`, `LATE_EVENING` |
| `is_peak` | bool | Whether this is a peak hour block |
| `trips` | TripResponse[]? | Detailed trip information |
---
### TripResponse
Each trip within a service block:
| Field | Type | Description |
|-------|------|-------------|
| `trip_id` | string | Unique trip identifier |
| `trip_number` | int | Sequential trip number |
| `direction` | string | Direction: `UP` or `DOWN` |
| `origin` | string | Origin station |
| `destination` | string | Destination station |
| `departure_time` | string | Departure time (HH:MM) |
| `arrival_time` | string | Arrival time (HH:MM) |
| `stops` | StationStopResponse[] | List of all station stops |
---
### StationStopResponse
Each station stop within a trip:
| Field | Type | Description |
|-------|------|-------------|
| `station_code` | string | Station code (e.g., "ALV") |
| `station_name` | string | Full station name (e.g., "Aluva") |
| `arrival_time` | string? | Arrival time at this station |
| `departure_time` | string? | Departure time from this station |
| `distance_from_origin_km` | float | Distance from trip origin in km |
| `platform` | int? | Platform number |
---
### FleetSummaryResponse
| Field | Type | Description |
|-------|------|-------------|
| `total_trainsets` | int | Total number of trainsets in fleet |
| `revenue_service` | int | Number in revenue service |
| `standby` | int | Number on standby |
| `maintenance` | int | Number in maintenance |
| `availability_percent` | float | Fleet availability percentage |
---
### OptimizationMetricsResponse
| Field | Type | Description |
|-------|------|-------------|
| `fitness_score` | float | Overall optimization fitness score |
| `method` | string | Optimization method used (ga, pso, cmaes, etc.) |
| `mileage_variance_coefficient` | float | Variance in mileage distribution |
| `total_planned_km` | float | Total planned kilometers for the day |
| `optimization_runtime_ms` | int | Time taken for optimization in milliseconds |
---
### AlertResponse
| Field | Type | Description |
|-------|------|-------------|
| `trainset_id` | string | Trainset this alert relates to |
| `severity` | string | Alert severity: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL` |
| `alert_type` | string | Type of alert |
| `message` | string | Human-readable alert message |
---
## Example Response (Simplified)
```json
{
"schedule_id": "SCH-20251202-001",
"generated_at": "2025-12-02T10:30:00",
"valid_from": "2025-12-02T05:00:00",
"valid_until": "2025-12-02T23:30:00",
"depot": "Muttom Depot",
"trainsets": [
{
"trainset_id": "TS-001",
"status": "REVENUE_SERVICE",
"readiness_score": 0.95,
"daily_km_allocation": 280.5,
"cumulative_km": 125000.0,
"assigned_duty": "DUTY-A1",
"priority_rank": 1,
"service_blocks": [
{
"block_id": "BLK-001",
"departure_time": "06:00",
"origin": "Aluva",
"destination": "Pettah",
"trip_count": 4,
"estimated_km": 104.8,
"journey_time_minutes": 180,
"period": "MORNING_PEAK",
"is_peak": true,
"trips": [
{
"trip_id": "TRIP-001",
"trip_number": 1,
"direction": "DOWN",
"origin": "Aluva",
"destination": "Pettah",
"departure_time": "06:00",
"arrival_time": "06:45",
"stops": [
{
"station_code": "ALV",
"station_name": "Aluva",
"arrival_time": null,
"departure_time": "06:00",
"distance_from_origin_km": 0.0,
"platform": 1
},
{
"station_code": "PTH",
"station_name": "Pettah",
"arrival_time": "06:45",
"departure_time": null,
"distance_from_origin_km": 26.2,
"platform": 2
}
]
}
]
}
],
"alerts": []
},
{
"trainset_id": "TS-015",
"status": "STANDBY",
"readiness_score": 0.88,
"daily_km_allocation": 0.0,
"cumulative_km": 98000.0,
"stabling_bay": "BAY-03",
"standby_reason": "Reserve for peak hours",
"alerts": []
},
{
"trainset_id": "TS-020",
"status": "MAINTENANCE",
"readiness_score": 0.0,
"daily_km_allocation": 0.0,
"cumulative_km": 150000.0,
"maintenance_type": "PREVENTIVE",
"ibl_bay": "IBL-02",
"estimated_completion": "2025-12-03T14:00:00",
"alerts": ["Scheduled wheel profiling"]
}
],
"fleet_summary": {
"total_trainsets": 25,
"revenue_service": 18,
"standby": 4,
"maintenance": 3,
"availability_percent": 88.0
},
"optimization_metrics": {
"fitness_score": 0.92,
"method": "ga",
"mileage_variance_coefficient": 0.08,
"total_planned_km": 4850.0,
"optimization_runtime_ms": 1250
},
"alerts": [
{
"trainset_id": "TS-007",
"severity": "MEDIUM",
"alert_type": "CERTIFICATE_EXPIRY",
"message": "Safety certificate expires in 5 days"
}
]
}
```
Why Use Blocks Instead of Individual Trips?
Crew Scheduling - A crew can be assigned to a block, not individual trips
Efficiency - Easier to manage and optimize at block level
Peak Hour Management - Blocks can be marked as is_peak: true to differentiate peak vs off-peak operations
Mileage Tracking - Each block has estimated_km for easy daily mileage calculation