File size: 1,305 Bytes
9e62f55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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