File size: 1,978 Bytes
fcf8749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""
AllocationRun database model.
High-level metadata per /allocate execution.
"""

import enum
import uuid
from datetime import datetime, date
from typing import Optional

from sqlalchemy import Integer, Float, Text, Date, DateTime, Enum
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base, GUID


class AllocationRunStatus(str, enum.Enum):
    """Status of an allocation run."""
    PENDING = "PENDING"
    SUCCESS = "SUCCESS"
    FAILED = "FAILED"


class AllocationRun(Base):
    """
    AllocationRun model for high-level allocation metadata.
    Tracks each allocation execution with global metrics.
    """
    __tablename__ = "allocation_runs"

    id: Mapped[uuid.UUID] = mapped_column(
        GUID(),
        primary_key=True,
        default=uuid.uuid4,
    )
    date: Mapped[date] = mapped_column(Date, nullable=False, index=True)
    num_drivers: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    num_routes: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    num_packages: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    
    # Global fairness metrics
    global_gini_index: Mapped[float] = mapped_column(Float, default=0.0)
    global_std_dev: Mapped[float] = mapped_column(Float, default=0.0)
    global_max_gap: Mapped[float] = mapped_column(Float, default=0.0)
    
    status: Mapped[AllocationRunStatus] = mapped_column(
        Enum(AllocationRunStatus),
        nullable=False,
        default=AllocationRunStatus.SUCCESS,
    )
    error_message: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    
    started_at: Mapped[datetime] = mapped_column(
        DateTime,
        default=datetime.utcnow,
        nullable=False,
    )
    finished_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime,
        nullable=True,
    )

    def __repr__(self) -> str:
        return f"<AllocationRun(id={self.id}, date={self.date}, status={self.status})>"