import numpy as np from src.config import cfg def get_final_coverage_matrix(schedule, employees): """ Proietta il genoma ottimizzato (la schedule finale) sulla matrice temporale. Genera il tensore 2D di copertura reale (Staffing effettivo) utilizzato per il rendering grafico su UI e l'analisi finale degli scostamenti. """ num_days = 7 num_slots = cfg.daily_slots # Inizializzazione matrice globale di copertura coverage = np.zeros((num_days, num_slots), dtype=int) for i, emp in enumerate(employees): # Estrazione del fenotipo (firma oraria comprensiva di pause VDT) mask = emp['mask'] for day in range(num_days): start = schedule[i, day] # Applicazione solo se il dipendente รจ schedulato (esclude OFF/Assenze) if start >= 0: # Boundary check: tronca la maschera se il turno sforerebbe la griglia oraria del giorno end = min(start + len(mask), num_slots) real_len = end - start # Proiezione algebrica della maschera operativa sulla coverage globale if real_len > 0: coverage[day, start:end] += mask[:real_len] return coverage