File size: 4,224 Bytes
03a506a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
66
67
68
69
70
71
72
### Core Module — Domain and Scheduling Algorithm

Directory: `scheduler/core/`

This package defines the domain objects (cases, hearings, courtrooms, judges), the ripeness classifier, policy interfaces, and the main scheduling algorithm that orchestrates daily scheduling.

#### Files overview

- `algorithm.py`
  - Purpose: Implements the daily scheduling pipeline.
  - Key classes:
    - `SchedulingResult`: Aggregates scheduled cases, unscheduled reasons, applied overrides, and explanations.
    - `SchedulingAlgorithm`: Orchestrates the day’s scheduling.
      - `schedule_day(cases, courtrooms, current_date, overrides, preferences, max_explanations_unscheduled)`
        - Flow:
          1) Compute judge preference overrides (if provided).
          2) Filter by ripeness (via `RipenessClassifier`), tracking unscheduled reasons for unripe cases.
          3) Filter eligibility (age gaps, disposed, same‑day constraints) and compute priority.
          4) Apply manual overrides (add/remove cases; capacity changes).
          5) Allocate cases to courtrooms (via allocator interface used in simulation layer).
          6) Generate explanations for unscheduled cases (up to cap) and successful allocations.
        - Inputs: list of `Case`, list of `Courtroom`, `date`, optional `Override` list, optional `JudgePreferences`.
        - Outputs: `SchedulingResult` with scheduled list and explanations.
      - Internal helpers: `_filter_by_ripeness`, `_filter_eligible`, `_get_preference_overrides`, `_apply_manual_overrides`, `_allocate_cases`, `_clear_temporary_case_flags`.
  - Interactions: `core.ripeness`, `control.overrides`, `simulation.allocator`.

- `case.py`
  - Purpose: Core case model and priority logic.
  - Key classes:
    - `CaseStatus`: Enum of lifecycle statuses.
    - `Case`: Fields describe type, stage, history, last hearing, etc.
      - Selected methods: `progress_to_stage`, `record_hearing`, `update_age`, `compute_readiness_score`, `is_ready_for_scheduling`, `needs_alert`, `get_priority_score`, `mark_unripe`, `mark_ripe`, `mark_scheduled`, `is_disposed`, `to_dict`.
  - Interactions: Used by ripeness classifier, scheduler, and simulation.

- `courtroom.py`
  - Purpose: Represents courtroom capacity and scheduling slots.
  - Typical members: courtroom identifier, capacity/availability for a given `date`.
  - Interactions: Allocator consumes courtroom capacity when placing cases.

- `hearing.py`
  - Purpose: Hearing record representation (date, outcome, adjournment, etc.).
  - Interactions: Case history and scheduler eligibility checks (min gap, outcomes).

- `judge.py`
  - Purpose: Judge metadata and optional preference hooks.
  - Interactions: `control.overrides.JudgePreferences` integrates with algorithm preference overrides.

- `policy.py`
  - Purpose: Defines the scheduling policy interface and default implementations for prioritization heuristics.
  - Interactions: Injected into `SchedulingAlgorithm` to determine case ordering.

- `ripeness.py`
  - Purpose: Ripeness classifier and thresholds.
  - Key elements:
    - `RipenessStatus` enum with helpers `is_ripe()` and `is_unripe()`.
    - `RipenessClassifier` with methods:
      - `classify(case, current_date)`: returns `RipenessStatus` and sets reasons.
      - `get_ripeness_priority(case, current_date)`: numeric priority for scheduling.
      - `is_schedulable(case, current_date)`: boolean gate for eligibility.
      - `get_ripeness_reason(status)`: human‑readable reason strings.
      - `estimate_ripening_time(case, current_date)`: expected time until ready.
      - `set_thresholds(new_thresholds)`, `get_current_thresholds()`.
  - Interactions: Used both by `algorithm.py` and the simulation engine.

#### Core flow (within `SchedulingAlgorithm.schedule_day`)
1) Collect inputs (cases, courtrooms, date, optional overrides/preferences).  
2) Ripeness filter: mark unripe with reasons; compute ripeness‑based priority.  
3) Eligibility filter: ensure min gap since last hearing, exclude disposed, enforce capacity constraints.  
4) Apply overrides (manual changes and judge preferences).  
5) Allocate to courtrooms; finalize schedule.  
6) Produce explanations and a `SchedulingResult`.